Package: apt
Version: 0.7.21
Severity: wishlist
Tags: patch

Hi,

attached is a patch I would like to get included eventually in apt
that adds the ability to download and process index files for multiple
architectures. This patch has 2 purposes:

1) I believe this will be the first thing that needs to be added to
implement multiarch. So it will be needed at some point anyway.

2) This will remove the hacks ia32-apt-get needs to pull over apt-get.
Ia32-apt-get can then be implemented by setting APT::Architectures and
adding a Apt::Update::Post-Invoke script.


The patch is not yet 100% complete and you will see some FIXMEs in the
patch and in the details below. Things I haven't been able to test yet
like adding a i386 CDrom on amd64 or things I'm unsure about. Any help
there would be appreciated.

On that note: How do I mark the *.bin files as incompatible? The
change in policy breaks compatibility I believe.


What the patch does in detail:

- Add APT::Architectures:: config option and initialize with
  APT::Architecture if unset.

- Declare the unused [vendor] field in sources.list as option
  field, e.g.
    deb [arch=amd64,i386;keyring=blubber.key;have=fun]
  FIXME: Parsing of this field is still missing but I pass a
  map<string,string> for it around where needed.

- When fetching index files download them for all APT::Architectures
  FIXME: use Options["arch"] to override the default

- Enter packages of all APT::Architectures into the package cache.

- Add the architecture to status and progress informations:
  Get:1 http://chocos sid/main i386 Packages [7788kB]

- Add b= (Build architecture) to policy:
  499 http://chocos sid/main i386 Packages
      release v=4.3,o=Debian,a=unstable,l=Debian,c=main,b=i386

- Decrease the pin of the non native archs by 1 and increase default
  pin of experimental to 2 (so non-native experimental is 1).
  FIXME:   99 /var/lib/dpkg/status
  This is so that the native arch will always be prefered unless the
  user pins it differently.


As said above the patch is not 100% yet but I feel it is ready for
others to test and comment and maybe help.

MfG
        Goswin

-- System Information:
Debian Release: squeeze/sid
  APT prefers unstable
  APT policy: (500, 'unstable'), (499, 'unstable')
Architecture: amd64 (x86_64)

Kernel: Linux 2.6.29.4-frosties-1
Locale: LANG=C, LC_CTYPE=de_DE (charmap=ISO-8859-1)
Shell: /bin/sh linked to /bin/bash

Versions of packages apt depends on:
ii  debian-archive-keyring        2009.01.31 GnuPG archive keys of the Debian a
ii  libc6                         2.9-18     GNU C Library: Shared libraries
ii  libgcc1                       1:4.4.0-10 GCC support library
ii  libstdc++6                    4.4.0-10   The GNU Standard C++ Library v3

apt recommends no packages.

Versions of packages apt suggests:
ii  apt-doc                   0.7.21         Documentation for APT
ii  aptitude                  0.4.11.11-1+b1 terminal-based package manager
ii  bzip2                     1.0.5-3        high-quality block-sorting file co
ii  dpkg-dev                  1.15.3         Debian package development tools
ii  lzma                      4.43-14        Compression method of 7z format in
ii  python-apt                0.7.10.4       Python interface to libapt-pkg
ii  synaptic                  0.62.7         Graphical package manager

-- no debconf information
diff -Nru apt-0.7.21/apt-pkg/cdrom.cc apt-0.7.21a0.mrvn.1/apt-pkg/cdrom.cc
--- apt-0.7.21/apt-pkg/cdrom.cc	2009-04-14 14:20:29.000000000 +0200
+++ apt-0.7.21a0.mrvn.1/apt-pkg/cdrom.cc	2009-07-06 22:44:07.000000000 +0200
@@ -217,33 +217,41 @@
 /* Here we drop everything that is not this machines arch */
 bool pkgCdrom::DropBinaryArch(vector<string> &List)
 {
-   char S[300];
-   snprintf(S,sizeof(S),"/binary-%s/",
-	    _config->Find("Apt::Architecture").c_str());
-   
+   string Arch = _config->Find("Apt::Architecture");
+   vector<string> Archs = _config->FindList("Apt::Architectures");
+
    for (unsigned int I = 0; I < List.size(); I++)
    {
       const char *Str = List[I].c_str();
       
-      const char *Res;
-      if ((Res = strstr(Str,"/binary-")) == 0)
+      const char *Start, *End;
+      char Tmp[300];
+      if ((Start = strstr(Str,"/binary-")) == 0)
 	 continue;
+      Start += 8;
+      if ((End = strstr(Start,"/")) == 0 || Start == End)
+	 continue;
+      --End;
+
+      // Create temp string
+      strncpy(Tmp,Start,End-Start);
+      Tmp[End-Start] = 0;
+
+      // Check if arch matches
+      bool matching = false;
+      if (Arch == Tmp) matching = true;
+      for(vector<string>::const_iterator J = Archs.begin();
+	  !matching && J != Archs.end(); ++J) {
+	  if (*J == Tmp) matching = true;
+      }
 
       // Weird, remove it.
-      if (strlen(Res) < strlen(S))
+      if (!matching)
       {
 	 List.erase(List.begin() + I);
 	 I--;
 	 continue;
       }
-	  
-      // See if it is our arch
-      if (stringcmp(Res,Res + strlen(S),S) == 0)
-	 continue;
-      
-      // Erase it
-      List.erase(List.begin() + I);
-      I--;
    }
    
    return true;
diff -Nru apt-0.7.21/apt-pkg/clean.cc apt-0.7.21a0.mrvn.1/apt-pkg/clean.cc
--- apt-0.7.21/apt-pkg/clean.cc	2008-06-09 23:10:08.000000000 +0200
+++ apt-0.7.21a0.mrvn.1/apt-pkg/clean.cc	2009-07-06 22:38:05.000000000 +0200
@@ -77,8 +77,9 @@
       if (*I != '.')
 	 continue;
       string Arch = DeQuoteString(string(Start,I-Start));
-      
-      if (Arch != "all" && Arch != MyArch)
+
+      if (Arch != "all" && Arch != MyArch
+	  && !_config->Member("APT::architectures", Arch))
 	 continue;
       
       // Lookup the package
diff -Nru apt-0.7.21/apt-pkg/contrib/configuration.cc apt-0.7.21a0.mrvn.1/apt-pkg/contrib/configuration.cc
--- apt-0.7.21/apt-pkg/contrib/configuration.cc	2009-04-08 22:58:28.000000000 +0200
+++ apt-0.7.21a0.mrvn.1/apt-pkg/contrib/configuration.cc	2009-07-06 16:45:30.000000000 +0200
@@ -223,6 +223,27 @@
    return Res;
 }
 									/*}}}*/
+// Configuration::FindList - Find a list of values		        /*{{{*/
+// ---------------------------------------------------------------------
+/* */
+vector<string> Configuration::FindList(const string Name) const
+{
+   vector<string> Vec;
+   const Item *Top = Lookup(Name.c_str());
+   if (Top == 0 || Top->Child == 0)
+      return Vec;
+
+   Item *I;
+   I = Top->Child;
+
+   while(I != NULL)
+   {
+      Vec.push_back(I->Value);
+      I = I->Next;
+   }
+   return Vec;
+}
+									/*}}}*/
 // Configuration::FindI - Find an integer value				/*{{{*/
 // ---------------------------------------------------------------------
 /* */
@@ -370,6 +391,30 @@
      
 }
 									/*}}}*/
+// Configuration::Member - Check if Value is member of a list	        /*{{{*/
+// ---------------------------------------------------------------------
+/* */
+bool Configuration::Member(const string Name, string Value)
+{
+   Item *Top = Lookup(Name.c_str(),false);
+   if (Top == 0 || Top->Child == 0)
+      return false;
+
+   Item *I;
+   I = Top->Child;
+
+   while(I != NULL)
+   {
+      if(I->Value == Value)
+      {
+	 return true;
+      } else {
+	 I = I->Next;
+      }
+   }
+   return false;
+}
+									/*}}}*/
 // Configuration::Clear - Clear an entire tree				/*{{{*/
 // ---------------------------------------------------------------------
 /* */
diff -Nru apt-0.7.21/apt-pkg/contrib/configuration.h apt-0.7.21a0.mrvn.1/apt-pkg/contrib/configuration.h
--- apt-0.7.21/apt-pkg/contrib/configuration.h	2008-06-09 23:10:08.000000000 +0200
+++ apt-0.7.21a0.mrvn.1/apt-pkg/contrib/configuration.h	2009-07-06 16:43:14.000000000 +0200
@@ -32,8 +32,10 @@
 
 #include <string>
 #include <iostream>
+#include <vector>
 
 using std::string;
+using std::vector;
 
 class Configuration
 {
@@ -70,6 +72,7 @@
    string Find(const string Name,const char *Default = 0) const {return Find(Name.c_str(),Default);};
    string FindFile(const char *Name,const char *Default = 0) const;
    string FindDir(const char *Name,const char *Default = 0) const;
+   vector<string> FindList(const string Name) const;
    int FindI(const char *Name,int Default = 0) const;
    int FindI(const string Name,int Default = 0) const {return FindI(Name.c_str(),Default);};
    bool FindB(const char *Name,bool Default = false) const;
@@ -92,6 +95,9 @@
    void Clear(const string List, string Value);
    void Clear(const string List, int Value);
 
+   // check if Value is member of a list
+   bool Member(const string Name, const string Value);
+
    inline const Item *Tree(const char *Name) const {return Lookup(Name);};
 
    inline void Dump() { Dump(std::clog); };
diff -Nru apt-0.7.21/apt-pkg/deb/debindexfile.cc apt-0.7.21a0.mrvn.1/apt-pkg/deb/debindexfile.cc
--- apt-0.7.21/apt-pkg/deb/debindexfile.cc	2008-06-09 23:10:08.000000000 +0200
+++ apt-0.7.21a0.mrvn.1/apt-pkg/deb/debindexfile.cc	2009-07-06 22:41:51.000000000 +0200
@@ -28,7 +28,7 @@
 // ---------------------------------------------------------------------
 /* */
 debSourcesIndex::debSourcesIndex(string URI,string Dist,string Section,bool Trusted) :
-     pkgIndexFile(Trusted), URI(URI), Dist(Dist), Section(Section)
+   pkgIndexFile(Trusted, "source"), URI(URI), Dist(Dist), Section(Section)
 {
 }
 									/*}}}*/
@@ -149,8 +149,8 @@
 // PackagesIndex::debPackagesIndex - Contructor				/*{{{*/
 // ---------------------------------------------------------------------
 /* */
-debPackagesIndex::debPackagesIndex(string URI,string Dist,string Section,bool Trusted) : 
-                  pkgIndexFile(Trusted), URI(URI), Dist(Dist), Section(Section)
+debPackagesIndex::debPackagesIndex(string URI,string Dist,string Section,bool Trusted,string Architecture) : 
+    pkgIndexFile(Trusted,Architecture), URI(URI), Dist(Dist), Section(Section)
 {
 }
 									/*}}}*/
@@ -171,6 +171,8 @@
    Res += " ";
    Res += Ver.ParentPkg().Name();
    Res += " ";
+   Res += Ver.Arch();
+   Res += " ";
    Res += Ver.VerStr();
    return Res;
 }
@@ -204,6 +206,8 @@
    else
       Info += Dist + '/' + Section;   
    Info += " ";
+   Info += Arch;
+   Info += " ";
    Info += Type;
    return Info;
 }
@@ -227,7 +231,7 @@
    }
    else
       Res = URI + "dists/" + Dist + '/' + Section +
-      "/binary-" + _config->Find("APT::Architecture") + '/';
+      "/binary-" + Arch + '/';
    
    Res += Type;
    return Res;
@@ -280,13 +284,13 @@
       return _error->Error("Problem with MergeList %s",PackageFile.c_str());
 
    // Check the release file
-   string ReleaseFile = debReleaseIndex(URI,Dist).MetaIndexFile("Release");
+   string ReleaseFile = debReleaseIndex(URI,Dist,Arch).MetaIndexFile("Release");
    if (FileExists(ReleaseFile) == true)
    {
       FileFd Rel(ReleaseFile,FileFd::ReadOnly);
       if (_error->PendingError() == true)
 	 return false;
-      Parser.LoadReleaseInfo(File,Rel,Section);
+      Parser.LoadReleaseInfo(File,Rel,Section,Arch);
    }
    
    return true;
@@ -320,7 +324,7 @@
 // ---------------------------------------------------------------------
 /* */
 debTranslationsIndex::debTranslationsIndex(string URI,string Dist,string Section) : 
-                  pkgIndexFile(true), URI(URI), Dist(Dist), Section(Section)
+    pkgIndexFile(true,"translation"), URI(URI), Dist(Dist), Section(Section)
 {
 }
 									/*}}}*/
@@ -483,7 +487,7 @@
 // StatusIndex::debStatusIndex - Constructor				/*{{{*/
 // ---------------------------------------------------------------------
 /* */
-debStatusIndex::debStatusIndex(string File) : pkgIndexFile(true), File(File)
+debStatusIndex::debStatusIndex(string File) : pkgIndexFile(true,"status"), File(File)
 {
 }
 									/*}}}*/
diff -Nru apt-0.7.21/apt-pkg/deb/debindexfile.h apt-0.7.21a0.mrvn.1/apt-pkg/deb/debindexfile.h
--- apt-0.7.21/apt-pkg/deb/debindexfile.h	2008-06-09 23:10:08.000000000 +0200
+++ apt-0.7.21a0.mrvn.1/apt-pkg/deb/debindexfile.h	2009-07-06 17:07:58.000000000 +0200
@@ -60,7 +60,7 @@
    virtual string ArchiveURI(string File) const {return URI + File;};
    
    // Interface for acquire
-   virtual string Describe(bool Short) const;   
+   virtual string Describe(bool Short) const;
    
    // Interface for the Cache Generator
    virtual bool Exists() const;
@@ -69,7 +69,7 @@
    virtual bool Merge(pkgCacheGenerator &Gen,OpProgress &Prog) const;
    virtual pkgCache::PkgFileIterator FindInCache(pkgCache &Cache) const;
 
-   debPackagesIndex(string URI,string Dist,string Section,bool Trusted);
+   debPackagesIndex(string URI,string Dist,string Section,bool Trusted,string Architecture);
 };
 
 class debTranslationsIndex : public pkgIndexFile
@@ -89,7 +89,7 @@
    virtual const Type *GetType() const;
 
    // Interface for acquire
-   virtual string Describe(bool Short) const;   
+   virtual string Describe(bool Short) const;
    virtual bool GetIndexes(pkgAcquire *Owner) const;
    
    // Interface for the Cache Generator
@@ -122,7 +122,7 @@
    virtual string ArchiveURI(string File) const {return URI + File;};
    
    // Interface for acquire
-   virtual string Describe(bool Short) const;   
+   virtual string Describe(bool Short) const;
 
    // Interface for the record parsers
    virtual pkgSrcRecords::Parser *CreateSrcParser() const;
diff -Nru apt-0.7.21/apt-pkg/deb/deblistparser.cc apt-0.7.21a0.mrvn.1/apt-pkg/deb/deblistparser.cc
--- apt-0.7.21/apt-pkg/deb/deblistparser.cc	2008-06-09 23:10:09.000000000 +0200
+++ apt-0.7.21a0.mrvn.1/apt-pkg/deb/deblistparser.cc	2009-07-06 22:12:15.000000000 +0200
@@ -34,7 +34,9 @@
 /* */
 debListParser::debListParser(FileFd *File) : Tags(File)
 {
+   // FIXME: get arch from options field?
    Arch = _config->Find("APT::architecture");
+   Archs = _config->FindList("APT::architectures");
 }
 									/*}}}*/
 // ListParser::UniqFindTagWrite - Find the tag and write a unq string	/*{{{*/
@@ -439,6 +441,7 @@
 
    if (ParseArchFlags == true)
    {
+      // FIXME: needs investigating
       string arch = _config->Find("APT::Architecture");
 
       // Parse an architecture
@@ -604,6 +607,12 @@
       if (stringcmp(Start,Stop,"all") == 0)
 	 return true;
 
+      for (vector<string>::const_iterator I = Archs.begin();
+	   I != Archs.end(); ++I) {
+	 if (stringcmp(*I,Start,Stop) == 0)
+	    return true;
+      }
+
       iOffset = Tags.Offset();
    }   
    return false;
@@ -613,15 +622,15 @@
 // ---------------------------------------------------------------------
 /* */
 bool debListParser::LoadReleaseInfo(pkgCache::PkgFileIterator FileI,
-				    FileFd &File, string component)
+				    FileFd &File, string component,
+				    string Arch)
 {
    pkgTagFile Tags(&File, File.Size() + 256); // XXX
    pkgTagSection Section;
    if (Tags.Step(Section) == false)
       return false;
 
-   //mvo: I don't think we need to fill that in (it's unused since apt-0.6)
-   //FileI->Architecture = WriteUniqString(Arch);
+   FileI->Architecture = WriteUniqString(Arch);
    
    // apt-secure does no longer download individual (per-section) Release
    // file. to provide Component pinning we use the section name now
diff -Nru apt-0.7.21/apt-pkg/deb/deblistparser.h apt-0.7.21a0.mrvn.1/apt-pkg/deb/deblistparser.h
--- apt-0.7.21/apt-pkg/deb/deblistparser.h	2008-06-09 23:10:09.000000000 +0200
+++ apt-0.7.21a0.mrvn.1/apt-pkg/deb/deblistparser.h	2009-07-06 22:02:03.000000000 +0200
@@ -11,10 +11,14 @@
 #ifndef PKGLIB_DEBLISTPARSER_H
 #define PKGLIB_DEBLISTPARSER_H
 
+#include <vector>
+
 #include <apt-pkg/pkgcachegen.h>
 #include <apt-pkg/indexfile.h>
 #include <apt-pkg/tagfile.h>
 
+using std::vector;
+
 class debListParser : public pkgCacheGenerator::ListParser
 {
    public:
@@ -32,7 +36,8 @@
    pkgTagSection Section;
    unsigned long iOffset;
    string Arch;
-   
+   vector<string> Archs;
+
    unsigned long UniqFindTagWrite(const char *Tag);
    bool ParseStatus(pkgCache::PkgIterator Pkg,pkgCache::VerIterator Ver);
    bool ParseDepends(pkgCache::VerIterator Ver,const char *Tag,
@@ -60,7 +65,7 @@
    virtual bool Step();
    
    bool LoadReleaseInfo(pkgCache::PkgFileIterator FileI,FileFd &File,
-			string section);
+			string section,string Arch);
    
    static const char *ParseDepends(const char *Start,const char *Stop,
 			    string &Package,string &Ver,unsigned int &Op,
diff -Nru apt-0.7.21/apt-pkg/deb/debmetaindex.cc apt-0.7.21a0.mrvn.1/apt-pkg/deb/debmetaindex.cc
--- apt-0.7.21/apt-pkg/deb/debmetaindex.cc	2008-06-09 23:10:09.000000000 +0200
+++ apt-0.7.21a0.mrvn.1/apt-pkg/deb/debmetaindex.cc	2009-07-06 20:06:07.000000000 +0200
@@ -5,11 +5,10 @@
 #include <apt-pkg/strutl.h>
 #include <apt-pkg/acquire-item.h>
 #include <apt-pkg/configuration.h>
-#include <apt-pkg/error.h>
 
 using namespace std;
 
-string debReleaseIndex::Info(const char *Type, const string Section) const
+string debReleaseIndex::Info(const char *Type, const string Section, const string Arch) const
 {
    string Info = ::URI::SiteOnly(URI) + ' ';
    if (Dist[Dist.size() - 1] == '/')
@@ -20,6 +19,8 @@
    else
       Info += Dist + '/' + Section;   
    Info += " ";
+   Info += Arch;
+   Info += " ";
    Info += Type;
    return Info;
 }
@@ -60,16 +61,16 @@
    return Res;
 }
 
-string debReleaseIndex::IndexURISuffix(const char *Type, const string Section) const
+string debReleaseIndex::IndexURISuffix(const char *Type, const string Section, const string Arch) const
 {
    string Res ="";
    if (Dist[Dist.size() - 1] != '/')
-      Res += Section + "/binary-" + _config->Find("APT::Architecture") + '/';
+      Res += Section + "/binary-" + Arch + '/';
    return Res + Type;
 }
    
 
-string debReleaseIndex::IndexURI(const char *Type, const string Section) const
+string debReleaseIndex::IndexURI(const char *Type, const string Section, const string Architecture) const
 {
    if (Dist[Dist.size() - 1] == '/')
    {
@@ -81,7 +82,7 @@
       return Res + Type;
    }
    else
-      return URI + "dists/" + Dist + '/' + IndexURISuffix(Type, Section);
+      return URI + "dists/" + Dist + '/' + IndexURISuffix(Type, Section, Architecture);
  }
 
 string debReleaseIndex::SourceIndexURISuffix(const char *Type, const string Section) const
@@ -107,7 +108,15 @@
       return URI + "dists/" + Dist + "/" + SourceIndexURISuffix(Type, Section);
 }
 
-debReleaseIndex::debReleaseIndex(string URI,string Dist)
+debReleaseIndex::debReleaseIndex(string URI,string Dist,vector<string> Archs) : metaIndex(Archs)
+{
+   this->URI = URI;
+   this->Dist = Dist;
+   this->Indexes = NULL;
+   this->Type = "deb";
+}
+
+debReleaseIndex::debReleaseIndex(string URI,string Dist,string Arch) : metaIndex(Arch)
 {
    this->URI = URI;
    this->Dist = Dist;
@@ -122,17 +131,30 @@
 	I != SectionEntries.end();
 	I++)
    {
-      IndexTarget * Target = new IndexTarget();
-      Target->ShortDesc = (*I)->IsSrc ? "Sources" : "Packages";
-      Target->MetaKey
-	= (*I)->IsSrc ? SourceIndexURISuffix(Target->ShortDesc.c_str(), (*I)->Section)
-	              : IndexURISuffix(Target->ShortDesc.c_str(), (*I)->Section);
-      Target->URI 
-	= (*I)->IsSrc ? SourceIndexURI(Target->ShortDesc.c_str(), (*I)->Section)
-	              : IndexURI(Target->ShortDesc.c_str(), (*I)->Section);
+       if ((*I)->IsSrc) {
+	  IndexTarget * Target = new IndexTarget();
+	  Target->ShortDesc = "Sources";
+	  Target->MetaKey
+	      = SourceIndexURISuffix(Target->ShortDesc.c_str(), (*I)->Section);
+	  Target->URI 
+	      = SourceIndexURI(Target->ShortDesc.c_str(), (*I)->Section);
+	  Target->Description
+	      = Info (Target->ShortDesc.c_str(), (*I)->Section, "source");
+	  IndexTargets->push_back (Target);
+       } else {
+	  for (vector<string>::const_iterator J = Archs.begin();
+	       J != Archs.end(); ++J) {
+	     IndexTarget * Target = new IndexTarget();
+	     Target->ShortDesc = "Packages";
+	     Target->MetaKey
+		 = IndexURISuffix(Target->ShortDesc.c_str(), (*I)->Section, *J);
+	     Target->URI
+		 = IndexURI(Target->ShortDesc.c_str(), (*I)->Section, *J);
       
-      Target->Description = Info (Target->ShortDesc.c_str(), (*I)->Section);
-      IndexTargets->push_back (Target);
+	     Target->Description = Info (Target->ShortDesc.c_str(), (*I)->Section, *J);
+	     IndexTargets->push_back (Target);
+	  }
+       }
    }
    return IndexTargets;
 }
@@ -201,7 +223,10 @@
          Indexes->push_back(new debSourcesIndex (URI, Dist, (*I)->Section, IsTrusted()));
       else 
       {
-         Indexes->push_back(new debPackagesIndex (URI, Dist, (*I)->Section, IsTrusted()));
+	  for (vector<string>::const_iterator J = Archs.begin();
+	      J != Archs.end(); ++J) {
+	    Indexes->push_back(new debPackagesIndex (URI, Dist, (*I)->Section, IsTrusted(),*J));
+	 }
 	 Indexes->push_back(new debTranslationsIndex(URI, Dist, (*I)->Section));
       }
    }
@@ -223,8 +248,9 @@
 {
    protected:
 
-   bool CreateItemInternal(vector<metaIndex *> &List,string URI,
-			   string Dist,string Section,
+   bool CreateItemInternal(vector<metaIndex *> &List,
+			   map<string, string> Options,
+			   string URI,string Dist,string Section,
 			   bool IsSrc) const
    {
       for (vector<metaIndex *>::const_iterator I = List.begin(); 
@@ -242,13 +268,16 @@
 	    if (Deb->GetURI() == URI && Deb->GetDist() == Dist)
 	    {
 	       Deb->PushSectionEntry(new debReleaseIndex::debSectionEntry(Section, IsSrc));
+	       // FIXME: push archs
 	       return true;
 	    }
 	 }
       }
       // No currently created Release file indexes this entry, so we create a new one.
       // XXX determine whether this release is trusted or not
-      debReleaseIndex *Deb = new debReleaseIndex(URI,Dist);
+      // FIXME: get archs from options
+      vector<string> Archs = _config->FindList("APT::architectures");
+      debReleaseIndex *Deb = new debReleaseIndex(URI,Dist,Archs);
       Deb->PushSectionEntry (new debReleaseIndex::debSectionEntry(Section, IsSrc));
       List.push_back(Deb);
       return true;
@@ -259,10 +288,10 @@
 {
    public:
 
-   bool CreateItem(vector<metaIndex *> &List,string URI,
-		   string Dist,string Section) const
+   bool CreateItem(vector<metaIndex *> &List,map<string,string> Options,
+		   string URI,string Dist,string Section) const
    {
-      return CreateItemInternal(List, URI, Dist, Section, false);
+      return CreateItemInternal(List, Options, URI, Dist, Section, false);
    }
 
    debSLTypeDeb()
@@ -276,10 +305,10 @@
 {
    public:
 
-   bool CreateItem(vector<metaIndex *> &List,string URI,
-		   string Dist,string Section) const 
+   bool CreateItem(vector<metaIndex *> &List,map<string,string> Options,
+		   string URI,string Dist,string Section) const 
    {
-      return CreateItemInternal(List, URI, Dist, Section, true);
+      return CreateItemInternal(List, Options, URI, Dist, Section, true);
    }
    
    debSLTypeDebSrc()
diff -Nru apt-0.7.21/apt-pkg/deb/debmetaindex.h apt-0.7.21a0.mrvn.1/apt-pkg/deb/debmetaindex.h
--- apt-0.7.21/apt-pkg/deb/debmetaindex.h	2008-06-09 23:10:09.000000000 +0200
+++ apt-0.7.21a0.mrvn.1/apt-pkg/deb/debmetaindex.h	2009-07-06 20:05:49.000000000 +0200
@@ -21,17 +21,18 @@
 
    public:
 
-   debReleaseIndex(string URI, string Dist);
+   debReleaseIndex(string URI,string Dist,vector<string> Archs);
+   debReleaseIndex(string URI,string Dist,string Arch);
 
    virtual string ArchiveURI(string File) const {return URI + File;};
    virtual bool GetIndexes(pkgAcquire *Owner, bool GetAll=false) const;
    vector <struct IndexTarget *>* ComputeIndexTargets() const;
-   string Info(const char *Type, const string Section) const;
+   string Info(const char *Type, const string Section, const string Arch) const;
    string MetaIndexInfo(const char *Type) const;
    string MetaIndexFile(const char *Types) const;
    string MetaIndexURI(const char *Type) const;
-   string IndexURI(const char *Type, const string Section) const;
-   string IndexURISuffix(const char *Type, const string Section) const;
+   string IndexURI(const char *Type, const string Section, const string Architecture) const;
+   string IndexURISuffix(const char *Type, const string Section, const string Architecture) const;
    string SourceIndexURI(const char *Type, const string Section) const;
    string SourceIndexURISuffix(const char *Type, const string Section) const;
    virtual vector <pkgIndexFile *> *GetIndexFiles();
diff -Nru apt-0.7.21/apt-pkg/indexcopy.cc apt-0.7.21a0.mrvn.1/apt-pkg/indexcopy.cc
--- apt-0.7.21/apt-pkg/indexcopy.cc	2009-04-14 14:20:29.000000000 +0200
+++ apt-0.7.21a0.mrvn.1/apt-pkg/indexcopy.cc	2009-07-06 22:53:42.000000000 +0200
@@ -378,6 +378,7 @@
 void IndexCopy::ConvertToSourceList(string CD,string &Path)
 {
    char S[300];
+   // FIXME: allow for APT::Architectures
    snprintf(S,sizeof(S),"binary-%s",_config->Find("Apt::Architecture").c_str());
    
    // Strip the cdrom base path
diff -Nru apt-0.7.21/apt-pkg/indexfile.h apt-0.7.21a0.mrvn.1/apt-pkg/indexfile.h
--- apt-0.7.21/apt-pkg/indexfile.h	2008-06-09 23:10:08.000000000 +0200
+++ apt-0.7.21a0.mrvn.1/apt-pkg/indexfile.h	2009-07-06 17:40:08.000000000 +0200
@@ -37,7 +37,8 @@
 {
    protected:
    bool Trusted;
-     
+   string Arch;
+
    public:
 
    class Type
@@ -83,8 +84,9 @@
    static string LanguageCode();
 
    bool IsTrusted() const { return Trusted; };
-   
-   pkgIndexFile(bool Trusted): Trusted(Trusted) {};
+   string GetArch() const { return Arch; };
+
+   pkgIndexFile(bool Trusted,string Arch): Trusted(Trusted), Arch(Arch) {};
    virtual ~pkgIndexFile() {};
 };
 
diff -Nru apt-0.7.21/apt-pkg/init.cc apt-0.7.21a0.mrvn.1/apt-pkg/init.cc
--- apt-0.7.21/apt-pkg/init.cc	2008-06-09 23:10:08.000000000 +0200
+++ apt-0.7.21a0.mrvn.1/apt-pkg/init.cc	2009-07-06 18:30:19.000000000 +0200
@@ -95,7 +95,12 @@
    
    if (Res == false)
       return false;
-   
+
+   // If APT::Architectures is unset initialize with APT::Architecture
+   if (Cnf.Tree("APT::Architectures::") == NULL) {
+      Cnf.Set("APT::Architectures::", Cnf.Find("APT::Architecture"));
+   }
+
    if (Cnf.FindB("Debug::pkgInitConfig",false) == true)
       Cnf.Dump();
    
diff -Nru apt-0.7.21/apt-pkg/metaindex.h apt-0.7.21a0.mrvn.1/apt-pkg/metaindex.h
--- apt-0.7.21/apt-pkg/metaindex.h	2008-06-09 23:10:08.000000000 +0200
+++ apt-0.7.21a0.mrvn.1/apt-pkg/metaindex.h	2009-07-06 22:54:29.000000000 +0200
@@ -3,6 +3,7 @@
 
 
 #include <string>
+#include <vector>
 #include <apt-pkg/pkgcache.h>
 #include <apt-pkg/srcrecords.h>
 #include <apt-pkg/pkgrecords.h>
@@ -10,6 +11,7 @@
 #include <apt-pkg/vendor.h>
     
 using std::string;
+using std::vector;
 
 class pkgAcquire;
 class pkgCacheGenerator;
@@ -23,6 +25,7 @@
    string URI;
    string Dist;
    bool Trusted;
+   vector<string> Archs;
 
    public:
 
@@ -39,6 +42,8 @@
    virtual vector<pkgIndexFile *> *GetIndexFiles() = 0; 
    virtual bool IsTrusted() const = 0;
 
+   metaIndex(vector<string> Archs) : Archs(Archs) { };
+   metaIndex(string Arch) { Archs.push_back(Arch); };
    virtual ~metaIndex() {};
 };
 
diff -Nru apt-0.7.21/apt-pkg/pkgcache.cc apt-0.7.21a0.mrvn.1/apt-pkg/pkgcache.cc
--- apt-0.7.21/apt-pkg/pkgcache.cc	2009-04-09 04:31:56.000000000 +0200
+++ apt-0.7.21a0.mrvn.1/apt-pkg/pkgcache.cc	2009-07-06 22:03:25.000000000 +0200
@@ -147,7 +147,8 @@
        (VS = pkgVersioningSystem::GetVS(StrP + HeaderP->VerSysName)) == 0)
       return _error->Error(_("This APT does not support the versioning system '%s'"),StrP + HeaderP->VerSysName);
 
-   // Chcek the arhcitecture
+   // Check the architecture
+   // FIXME: Should this check architectures?
    if (HeaderP->Architecture == 0 ||
        _config->Find("APT::Architecture") != StrP + HeaderP->Architecture)
       return _error->Error(_("The package cache was built for a different architecture"));
@@ -611,6 +612,8 @@
       Res = Res + (Res.empty() == true?"l=":",l=")  + Label();
    if (Component() != 0)
       Res = Res + (Res.empty() == true?"c=":",c=")  + Component();
+   if (Architecture() != 0)
+      Res = Res + (Res.empty() == true?"b=":",b=")  + Architecture();
    return Res;
 }
 									/*}}}*/
diff -Nru apt-0.7.21/apt-pkg/policy.cc apt-0.7.21a0.mrvn.1/apt-pkg/policy.cc
--- apt-0.7.21/apt-pkg/policy.cc	2008-06-09 23:10:08.000000000 +0200
+++ apt-0.7.21a0.mrvn.1/apt-pkg/policy.cc	2009-07-06 22:10:05.000000000 +0200
@@ -71,7 +71,10 @@
 	 PFPriority[I->ID] = 100;
       else
 	 if ((I->Flags & pkgCache::Flag::NotAutomatic) == pkgCache::Flag::NotAutomatic)
-	    PFPriority[I->ID] = 1;
+	    PFPriority[I->ID] = 2;
+      // FIXME: reduce priority if not native arch
+      if (I.Architecture() == 0 || (I.Architecture() != string("all") && I.Architecture() != string("amd64")))
+         --PFPriority[I->ID];
    }
 
    // Apply the defaults..
diff -Nru apt-0.7.21/apt-pkg/sourcelist.cc apt-0.7.21a0.mrvn.1/apt-pkg/sourcelist.cc
--- apt-0.7.21/apt-pkg/sourcelist.cc	2008-06-09 23:10:08.000000000 +0200
+++ apt-0.7.21a0.mrvn.1/apt-pkg/sourcelist.cc	2009-07-06 16:37:14.000000000 +0200
@@ -79,6 +79,7 @@
    Weird types may override this. */
 bool pkgSourceList::Type::ParseLine(vector<metaIndex *> &List,
 				    const char *Buffer,
+				    map<string, string> Options,
 				    unsigned long CurLine,
 				    string File) const
 {
@@ -100,7 +101,7 @@
       if (ParseQuoteWord(Buffer,Section) == true)
 	 return _error->Error(_("Malformed line %lu in source list %s (absolute dist)"),CurLine,File.c_str());
       Dist = SubstVar(Dist,"$(ARCH)",_config->Find("APT::Architecture"));
-      return CreateItem(List,URI,Dist,Section);
+      return CreateItem(List,Options,URI,Dist,Section);
    }
    
    // Grab the rest of the dists
@@ -109,7 +110,7 @@
    
    do
    {
-      if (CreateItem(List,URI,Dist,Section) == false)
+      if (CreateItem(List,Options,URI,Dist,Section) == false)
 	 return false;
    }
    while (ParseQuoteWord(Buffer,Section) == true);
@@ -239,7 +240,8 @@
       if (Parse == 0)
 	 return _error->Error(_("Type '%s' is not known on line %u in source list %s"),LineType.c_str(),CurLine,File.c_str());
       
-      // Vendor name specified
+      // FIXME: Parse options
+      map<string,string> Options;
       if (C[0] == '[')
       {
 	 string VendorID;
@@ -268,7 +270,7 @@
 // 				 VendorID.c_str(),CurLine,File.c_str());
       }
 
-      if (Parse->ParseLine(SrcList,C,CurLine,File) == false)
+      if (Parse->ParseLine(SrcList,C,Options,CurLine,File) == false)
 	 return false;
    }
    return true;
diff -Nru apt-0.7.21/apt-pkg/sourcelist.h apt-0.7.21a0.mrvn.1/apt-pkg/sourcelist.h
--- apt-0.7.21/apt-pkg/sourcelist.h	2008-06-09 23:10:08.000000000 +0200
+++ apt-0.7.21a0.mrvn.1/apt-pkg/sourcelist.h	2009-07-06 16:34:11.000000000 +0200
@@ -29,12 +29,13 @@
 
 #include <string>
 #include <vector>
+#include <map>
 #include <apt-pkg/pkgcache.h>
 #include <apt-pkg/metaindex.h>
 
 using std::string;
 using std::vector;
-    
+using std::map;
 
 class pkgAquire;
 class pkgSourceList
@@ -57,8 +58,10 @@
       bool FixupURI(string &URI) const;
       virtual bool ParseLine(vector<metaIndex *> &List,
 			     const char *Buffer,
+			     map<string, string> Options,
 			     unsigned long CurLine,string File) const;
-      virtual bool CreateItem(vector<metaIndex *> &List,string URI,
+      virtual bool CreateItem(vector<metaIndex *> &List,
+			      map<string, string> Options, string URI,
 			      string Dist,string Section) const = 0;
       Type();
       virtual ~Type() {};
diff -Nru apt-0.7.21/apt-pkg/versionmatch.cc apt-0.7.21a0.mrvn.1/apt-pkg/versionmatch.cc
--- apt-0.7.21/apt-pkg/versionmatch.cc	2008-11-24 10:32:23.000000000 +0100
+++ apt-0.7.21a0.mrvn.1/apt-pkg/versionmatch.cc	2009-07-06 21:41:34.000000000 +0200
@@ -98,6 +98,8 @@
 	    RelLabel = Fragments[J]+2;
 	 else if (stringcasecmp(Fragments[J],Fragments[J]+2,"c=") == 0)
 	    RelComponent = Fragments[J]+2;
+	 else if (stringcasecmp(Fragments[J],Fragments[J]+2,"b=") == 0)
+	    RelArch = Fragments[J]+2;
       }
       
       if (RelVerStr.end()[-1] == '*')
@@ -175,7 +177,7 @@
       
       if (RelVerStr.empty() == true && RelOrigin.empty() == true &&
 	  RelArchive.empty() == true && RelLabel.empty() == true &&
-	  RelComponent.empty() == true)
+	  RelComponent.empty() == true && RelArch.empty() == true)
 	 return false;
       
       if (RelVerStr.empty() == false)
@@ -200,6 +202,9 @@
 	 if (File->Component == 0 ||
 	     stringcasecmp(RelComponent,File.Component()) != 0)
 	    return false;
+      // FIXME:
+      // if (RelArch.empty() == false)
+      // compare arch
       return true;
    }
    
diff -Nru apt-0.7.21/apt-pkg/versionmatch.h apt-0.7.21a0.mrvn.1/apt-pkg/versionmatch.h
--- apt-0.7.21/apt-pkg/versionmatch.h	2008-06-09 23:10:08.000000000 +0200
+++ apt-0.7.21a0.mrvn.1/apt-pkg/versionmatch.h	2009-07-06 21:39:32.000000000 +0200
@@ -20,6 +20,7 @@
       Archive (a=)
       Label (l=)
       Component (c=)
+      Build architecture (b=)
    If there are no equals signs in the string then it is scanned in short
    form - if it starts with a number it is Version otherwise it is an 
    Archive.
@@ -50,6 +51,7 @@
    string RelArchive;
    string RelLabel;
    string RelComponent;
+   string RelArch;
    bool MatchAll;
    
    // Origin Matching
diff -Nru apt-0.7.21/cmdline/apt-get.cc apt-0.7.21a0.mrvn.1/cmdline/apt-get.cc
--- apt-0.7.21/cmdline/apt-get.cc	2009-04-14 14:20:29.000000000 +0200
+++ apt-0.7.21a0.mrvn.1/cmdline/apt-get.cc	2009-07-06 22:57:22.000000000 +0200
@@ -1360,7 +1360,7 @@
    
    // Create the progress
    AcqTextStatus Stat(ScreenWidth,_config->FindI("quiet",0));
-      
+   
    // Just print out the uris an exit if the --print-uris flag was used
    if (_config->FindB("APT::Get::Print-URIs") == true)
    {
diff -Nru apt-0.7.21/configure apt-0.7.21a0.mrvn.1/configure
--- apt-0.7.21/configure	2009-04-14 14:21:45.000000000 +0200
+++ apt-0.7.21a0.mrvn.1/configure	2009-07-06 18:11:14.000000000 +0200
@@ -1901,7 +1901,7 @@
 
 
 cat >>confdefs.h <<_ACEOF
-#define VERSION "0.7.21"
+#define VERSION "0.7.21a0.mrvn.1"
 _ACEOF
 
 PACKAGE="apt"
diff -Nru apt-0.7.21/configure.in apt-0.7.21a0.mrvn.1/configure.in
--- apt-0.7.21/configure.in	2009-04-14 14:21:18.000000000 +0200
+++ apt-0.7.21a0.mrvn.1/configure.in	2009-07-06 18:11:13.000000000 +0200
@@ -18,7 +18,7 @@
 AC_CONFIG_HEADER(include/config.h:buildlib/config.h.in include/apti18n.h:buildlib/apti18n.h.in)
 
 dnl -- SET THIS TO THE RELEASE VERSION --
-AC_DEFINE_UNQUOTED(VERSION,"0.7.21")
+AC_DEFINE_UNQUOTED(VERSION,"0.7.21a0.mrvn.1")
 PACKAGE="apt"
 AC_DEFINE_UNQUOTED(PACKAGE,"$PACKAGE")
 AC_SUBST(PACKAGE)
diff -Nru apt-0.7.21/debian/changelog apt-0.7.21a0.mrvn.1/debian/changelog
--- apt-0.7.21/debian/changelog	2009-04-14 14:20:29.000000000 +0200
+++ apt-0.7.21a0.mrvn.1/debian/changelog	2009-07-06 15:44:09.000000000 +0200
@@ -1,3 +1,10 @@
+apt (0.7.21a0.mrvn.1) unstable; urgency=low
+
+  [ Goswin von Brederlow ]
+  * Add architectures config option
+
+ -- Goswin von Brederlow <goswin-...@web.de>  Mon, 06 Jul 2009 15:39:48 +0200
+
 apt (0.7.21) unstable; urgency=low
 
   [ Christian Perrier ]

Reply via email to