Michael Vogt пре 15 година
родитељ
комит
e9ecab0f97
38 измењених фајлова са 497 додато и 834 уклоњено
  1. 3 53
      README.MultiArch
  2. 29 13
      apt-inst/deb/debfile.cc
  3. 0 64
      apt-pkg/algorithms.cc
  4. 84 3
      apt-pkg/aptconfiguration.cc
  5. 29 0
      apt-pkg/aptconfiguration.h
  6. 2 6
      apt-pkg/cacheiterators.h
  7. 2 2
      apt-pkg/cacheset.h
  8. 1 1
      apt-pkg/contrib/configuration.h
  9. 29 55
      apt-pkg/deb/deblistparser.cc
  10. 6 2
      apt-pkg/deb/debsrcrecords.cc
  11. 17 2
      apt-pkg/deb/dpkgpm.cc
  12. 1 303
      apt-pkg/depcache.cc
  13. 5 3
      apt-pkg/depcache.h
  14. 0 4
      apt-pkg/orderlist.cc
  15. 6 29
      apt-pkg/packagemanager.cc
  16. 2 16
      apt-pkg/pkgcache.cc
  17. 2 2
      apt-pkg/pkgcache.h
  18. 13 36
      apt-pkg/pkgcachegen.cc
  19. 0 7
      apt-pkg/policy.cc
  20. 1 9
      cmdline/apt-cache.cc
  21. 1 14
      cmdline/apt-get.cc
  22. 1 1
      debian/apt.symbols
  23. 33 1
      debian/changelog
  24. 7 4
      doc/apt-ftparchive.1.xml
  25. 2 0
      ftparchive/apt-ftparchive.cc
  26. 3 24
      ftparchive/contents.cc
  27. 28 30
      ftparchive/multicompress.cc
  28. 5 16
      ftparchive/multicompress.h
  29. 95 56
      ftparchive/writer.cc
  30. 3 3
      ftparchive/writer.h
  31. 8 2
      methods/makefile
  32. 5 4
      test/integration/framework
  33. 2 2
      test/integration/test-bug-549968-install-depends-of-not-installed
  34. 4 4
      test/integration/test-bug-590438-broken-provides-thanks-to-remove-order
  35. 8 8
      test/integration/test-bug-593360-modifiers-in-names
  36. 5 3
      test/integration/test-bug-595691-empty-and-broken-archive-files
  37. 40 37
      test/integration/test-bug-612099-multiarch-conflicts
  38. 15 15
      test/integration/test-release-candidate-switching

+ 3 - 53
README.MultiArch

@@ -47,67 +47,17 @@ and also to MultiArch as a Group consists of possible many packages which
 all have the same name and are therefore out of interest for pkgnames.
 all have the same name and are therefore out of interest for pkgnames.
 
 
 
 
-Caused by the paragraph "Dependencies involving Architecture: all packages"
-in the MultiArch spec we have a second major conceptional change
-which could even break existing applications, but we hope for the best…
-An Architecture: all package is internally split into pseudo packages
-for all MultiArch Architectures and additional a package with the
-architecture "all" with no dependencies which is a dependency of all
-these architecture depending packages. While the architecture depending
-packages are mainly used for dependency resolution (a package of arch A which
-depends on an arch all package assumes that the dependencies of this package
-are also from arch A. Packages also sometimes change from any to all or v.v.)
-the arch "all" package is used for scheduling download/installation of the
-underlying "real" package. Note that the architecture depending packages can
-be detected with Pseudo() while the "all" package reports exactly this arch
-as package architecture and as pseudo architecture of the versions of this pkg.
-Beware: All versions of a "real" architecture all package will be report "all"
-as their architecture if asked with Arch() regardless if they are the "all" or
-the architecture depending packages. If you want to know the architecture this
-pseudo package was created for call Arch(true). Also, while the spec say that
-arch:all packages are not allowed to have a MultiArch flag APT assigns a
-special value to them: MultiArch: all.
-
-
-As you might guess this arch:all handling has a few problems (but we think so
-far that the problems are minor compared to the problems we would have with
-other implementations.)
-APT doesn't know which pseudo packages of such an arch all package are
-"installed" (to satisfy dependencies), so APT will generate a Cache in which
-all these pseudo packages are installed (e.g. apt-cache policy will display
-them all as installed). Later in the DepCache step it will "remove"
-all pseudo packages whose dependencies are not satisfied.
-The expense is that if the package state is broken APT could come to the
-conclusion to "remove" too many pseudo packages, but in a stable environment
-APT should never end up in a broken system state…
-
-
 Given all these internal changes it is quite interesting that the actual
 Given all these internal changes it is quite interesting that the actual
 implementation of MultiArch is trivial: Some implicit dependencies and a few
 implementation of MultiArch is trivial: Some implicit dependencies and a few
 more provides are all changes needed to get it working. Especially noteworthy
 more provides are all changes needed to get it working. Especially noteworthy
 is that it wasn't needed to change the resolver in any way and other parts only
 is that it wasn't needed to change the resolver in any way and other parts only
-need to be told about ignoring pseudo packages or using GrpIterator instead of
-PkgIterator, so chances are good that libapt-applications will proceed to work
-without or at least only require minor changes, but your mileage may vary…
+need to be told about using GrpIterator instead of PkgIterator, so chances are
+good that libapt-applications will proceed to work without or at least only
+require minor changes, but your mileage may vary…
 
 
 
 
 Known Issues and/or noteworthy stuff:
 Known Issues and/or noteworthy stuff:
 * The implementation is mostly untested, so it is very likely that APT will
 * The implementation is mostly untested, so it is very likely that APT will
   eat your kids if you aren't as lucky as the author of these patches.
   eat your kids if you aren't as lucky as the author of these patches.
-* the (install)size of a pseudo package is always NULL - if you want to know
-  the (install)size you need to get the info from the arch "all" package.
-* It is maybe confusing, but the arch "all" package does have the same versions
-  and in general roughly the same information with one subtil difference:
-  It doesn't have any dependency, regardless of the type. The pseudo packages
-  depend on this package.
-* apt-cache policy foobar on installed architecture all package foobar will
-  report all architecture depending packages as installed. Displaying here the
-  correct information would require to build the complete DepCache…
-* [BUG] An installed package which changes the architecture from any to all
-  (and v.v.) shows up in the NEW packages section instead of UPGRADE.
-* [TODO] Investigate the DepCache pseudo-package killer heuristic:
-  e.g. add more safety guards…
-* [FIXME] a few corner cases/missing features marked as FIXME in the code
-
 
 
 [0] https://wiki.ubuntu.com/MultiarchSpec
 [0] https://wiki.ubuntu.com/MultiarchSpec

+ 29 - 13
apt-inst/deb/debfile.cc

@@ -20,6 +20,7 @@
 #include <apt-pkg/extracttar.h>
 #include <apt-pkg/extracttar.h>
 #include <apt-pkg/error.h>
 #include <apt-pkg/error.h>
 #include <apt-pkg/deblistparser.h>
 #include <apt-pkg/deblistparser.h>
+#include <apt-pkg/aptconfiguration.h>
 
 
 #include <sys/stat.h>
 #include <sys/stat.h>
 #include <unistd.h>
 #include <unistd.h>
@@ -46,7 +47,9 @@ debDebFile::debDebFile(FileFd &File) : File(File), AR(File)
 
 
    if (!CheckMember("data.tar.gz") &&
    if (!CheckMember("data.tar.gz") &&
        !CheckMember("data.tar.bz2") &&
        !CheckMember("data.tar.bz2") &&
-       !CheckMember("data.tar.lzma")) {
+       !CheckMember("data.tar.lzma") &&
+       !CheckMember("data.tar.xz")) {
+      // FIXME: add data.tar.xz here - adding it now would require a Translation round for a very small gain
       _error->Error(_("This is not a valid DEB archive, it has no '%s', '%s' or '%s' member"), "data.tar.gz", "data.tar.bz2", "data.tar.lzma");
       _error->Error(_("This is not a valid DEB archive, it has no '%s', '%s' or '%s' member"), "data.tar.gz", "data.tar.bz2", "data.tar.lzma");
       return;
       return;
    }
    }
@@ -125,22 +128,35 @@ bool debDebFile::ExtractControl(pkgDataBase &DB)
 /* Simple wrapper around tar.. */
 /* Simple wrapper around tar.. */
 bool debDebFile::ExtractArchive(pkgDirStream &Stream)
 bool debDebFile::ExtractArchive(pkgDirStream &Stream)
 {
 {
-   // Get the archive member and positition the file 
-   const ARArchive::Member *Member = AR.FindMember("data.tar.gz");
-   const char *Compressor = "gzip";
-   if (Member == 0) {
-      Member = AR.FindMember("data.tar.bz2");
-      Compressor = "bzip2";
+   // Get the archive member
+   const ARArchive::Member *Member = NULL;
+   std::string Compressor;
+
+   std::string const data = "data.tar";
+   std::vector<APT::Configuration::Compressor> compressor = APT::Configuration::getCompressors();
+   for (std::vector<APT::Configuration::Compressor>::const_iterator c = compressor.begin();
+	c != compressor.end(); ++c)
+   {
+      Member = AR.FindMember(std::string(data).append(c->Extension).c_str());
+      if (Member == NULL)
+	 continue;
+      Compressor = c->Binary;
+      break;
    }
    }
-   if (Member == 0) {
-      Member = AR.FindMember("data.tar.lzma");
-      Compressor = "lzma";
+
+   if (Member == NULL)
+   {
+      std::string ext = "data.tar.{";
+      for (std::vector<APT::Configuration::Compressor>::const_iterator c = compressor.begin();
+	   c != compressor.end(); ++c)
+	 ext.append(c->Extension.substr(1));
+      ext.append("}");
+      return _error->Error(_("Internal error, could not locate member %s"), ext.c_str());
    }
    }
-   if (Member == 0)
-      return _error->Error(_("Internal error, could not locate member"));   
+
    if (File.Seek(Member->Start) == false)
    if (File.Seek(Member->Start) == false)
       return false;
       return false;
-      
+
    // Prepare Tar
    // Prepare Tar
    ExtractTar Tar(File,Member->Size,Compressor);
    ExtractTar Tar(File,Member->Size,Compressor);
    if (_error->PendingError() == true)
    if (_error->PendingError() == true)

+ 0 - 64
apt-pkg/algorithms.cc

@@ -90,21 +90,6 @@ bool pkgSimulate::Install(PkgIterator iPkg,string /*File*/)
    Describe(Pkg,cout,true,true);
    Describe(Pkg,cout,true,true);
    Sim.MarkInstall(Pkg,false);
    Sim.MarkInstall(Pkg,false);
 
 
-   if (strcmp(Pkg.Arch(),"all") == 0)
-   {
-      pkgCache::GrpIterator G = Pkg.Group();
-      pkgCache::GrpIterator iG = iPkg.Group();
-      for (pkgCache::PkgIterator P = G.FindPkg("any"); P.end() != true; P = G.NextPkg(P))
-      {
-	 if (strcmp(P.Arch(), "all") == 0)
-	    continue;
-	 if (iG.FindPkg(P.Arch())->CurrentVer == 0)
-	    continue;
-	 Flags[P->ID] = 1;
-	 Sim.MarkInstall(P, false);
-      }
-   }
-
    // Look for broken conflicts+predepends.
    // Look for broken conflicts+predepends.
    for (PkgIterator I = Sim.PkgBegin(); I.end() == false; I++)
    for (PkgIterator I = Sim.PkgBegin(); I.end() == false; I++)
    {
    {
@@ -150,40 +135,6 @@ bool pkgSimulate::Configure(PkgIterator iPkg)
    
    
    Flags[Pkg->ID] = 2;
    Flags[Pkg->ID] = 2;
 
 
-   if (strcmp(Pkg.Arch(),"all") == 0)
-   {
-      pkgCache::GrpIterator G = Pkg.Group();
-      for (pkgCache::PkgIterator P = G.FindPkg("any"); P.end() != true; P = G.NextPkg(P))
-      {
-	 if (strcmp(P.Arch(), "all") == 0)
-	    continue;
-	 if (Flags[P->ID] == 1)
-	    Flags[P->ID] = 2;
-      }
-   }
-
-   if (Sim[Pkg].InstBroken() == true)
-   {
-      /* We don't call Configure for Pseudo packages and if the 'all' is already installed
-         the simulation will think the pseudo package is not installed, so if something is
-         broken we walk over the dependencies and search for not installed pseudo packages */
-      for (pkgCache::DepIterator D = Sim[Pkg].InstVerIter(Sim).DependsList(); D.end() == false; D++)
-      {
-	 if (Sim.IsImportantDep(D) == false || 
-	     (Sim[D] & pkgDepCache::DepInstall) != 0)
-	    continue;
-	 pkgCache::PkgIterator T = D.TargetPkg();
-	 if (T.end() == true || T->CurrentVer != 0 || Flags[T->ID] != 0)
-	    continue;
-	 pkgCache::PkgIterator A = T.Group().FindPkg("all");
-	 if (A.end() == true || A->VersionList == 0 || A->CurrentVer == 0 ||
-	     Cache.VS().CheckDep(A.CurVersion(), pkgCache::Dep::Equals, T.CandVersion()) == false)
-	    continue;
-	 Sim.MarkInstall(T, false);
-	 Flags[T->ID] = 2;
-      }
-   }
-
    if (Sim[Pkg].InstBroken() == true)
    if (Sim[Pkg].InstBroken() == true)
    {
    {
       cout << "Conf " << Pkg.FullName(false) << " broken" << endl;
       cout << "Conf " << Pkg.FullName(false) << " broken" << endl;
@@ -235,21 +186,6 @@ bool pkgSimulate::Remove(PkgIterator iPkg,bool Purge)
    Flags[Pkg->ID] = 3;
    Flags[Pkg->ID] = 3;
    Sim.MarkDelete(Pkg);
    Sim.MarkDelete(Pkg);
 
 
-   if (strcmp(Pkg.Arch(),"all") == 0)
-   {
-      pkgCache::GrpIterator G = Pkg.Group();
-      pkgCache::GrpIterator iG = iPkg.Group();
-      for (pkgCache::PkgIterator P = G.FindPkg("any"); P.end() != true; P = G.NextPkg(P))
-      {
-	 if (strcmp(P.Arch(), "all") == 0)
-	    continue;
-	 if (iG.FindPkg(P.Arch())->CurrentVer == 0)
-	    continue;
-	 Flags[P->ID] = 3;
-	 Sim.MarkDelete(P);
-      }
-   }
-
    if (Purge == true)
    if (Purge == true)
       cout << "Purg ";
       cout << "Purg ";
    else
    else

+ 84 - 3
apt-pkg/aptconfiguration.cc

@@ -38,12 +38,11 @@ const Configuration::getCompressionTypes(bool const &Cached) {
 
 
 	// setup the defaults for the compressiontypes => method mapping
 	// setup the defaults for the compressiontypes => method mapping
 	_config->CndSet("Acquire::CompressionTypes::bz2","bzip2");
 	_config->CndSet("Acquire::CompressionTypes::bz2","bzip2");
+	_config->CndSet("Acquire::CompressionTypes::xz","xz");
 	_config->CndSet("Acquire::CompressionTypes::lzma","lzma");
 	_config->CndSet("Acquire::CompressionTypes::lzma","lzma");
 	_config->CndSet("Acquire::CompressionTypes::gz","gzip");
 	_config->CndSet("Acquire::CompressionTypes::gz","gzip");
 
 
-	// Set default application paths to check for optional compression types
-	_config->CndSet("Dir::Bin::lzma", "/usr/bin/lzma");
-	_config->CndSet("Dir::Bin::bzip2", "/bin/bzip2");
+	setDefaultConfigurationForCompressors();
 
 
 	// accept non-list order as override setting for config settings on commandline
 	// accept non-list order as override setting for config settings on commandline
 	std::string const overrideOrder = _config->Find("Acquire::CompressionTypes::Order","");
 	std::string const overrideOrder = _config->Find("Acquire::CompressionTypes::Order","");
@@ -344,4 +343,86 @@ bool const Configuration::checkArchitecture(std::string const &Arch) {
 	return (std::find(archs.begin(), archs.end(), Arch) != archs.end());
 	return (std::find(archs.begin(), archs.end(), Arch) != archs.end());
 }
 }
 									/*}}}*/
 									/*}}}*/
+// setDefaultConfigurationForCompressors				/*{{{*/
+void Configuration::setDefaultConfigurationForCompressors() {
+	// Set default application paths to check for optional compression types
+	_config->CndSet("Dir::Bin::lzma", "/usr/bin/lzma");
+	_config->CndSet("Dir::Bin::xz", "/usr/bin/xz");
+	_config->CndSet("Dir::Bin::bzip2", "/bin/bzip2");
+}
+									/*}}}*/
+// getCompressors - Return Vector of usbale compressors			/*{{{*/
+// ---------------------------------------------------------------------
+/* return a vector of compressors used by apt-ftparchive in the
+   multicompress functionality or to detect data.tar files */
+std::vector<APT::Configuration::Compressor>
+const Configuration::getCompressors(bool const Cached) {
+	static std::vector<APT::Configuration::Compressor> compressors;
+	if (compressors.empty() == false) {
+		if (Cached == true)
+			return compressors;
+		else
+			compressors.clear();
+	}
+
+	setDefaultConfigurationForCompressors();
+
+	compressors.push_back(Compressor(".", "", "", "", "", 1));
+	if (_config->Exists("Dir::Bin::gzip") == false || FileExists(_config->FindFile("Dir::Bin::gzip")) == true)
+		compressors.push_back(Compressor("gzip",".gz","gzip","-9n","-d",2));
+	if (_config->Exists("Dir::Bin::bzip2") == false || FileExists(_config->FindFile("Dir::Bin::bzip2")) == true)
+		compressors.push_back(Compressor("bzip2",".bz2","bzip2","-9","-d",3));
+	if (_config->Exists("Dir::Bin::lzma") == false || FileExists(_config->FindFile("Dir::Bin::lzma")) == true)
+		compressors.push_back(Compressor("lzma",".lzma","lzma","-9","-d",4));
+	if (_config->Exists("Dir::Bin::xz") == false || FileExists(_config->FindFile("Dir::Bin::xz")) == true)
+		compressors.push_back(Compressor("xz",".xz","xz","-6","-d",5));
+
+	std::vector<std::string> const comp = _config->FindVector("APT::Compressor");
+	for (std::vector<std::string>::const_iterator c = comp.begin();
+	     c != comp.end(); ++c) {
+		if (*c == "." || *c == "gzip" || *c == "bzip2" || *c == "lzma" || *c == "xz")
+			continue;
+		compressors.push_back(Compressor(c->c_str(), std::string(".").append(*c).c_str(), c->c_str(), "-9", "-d", 100));
+	}
+
+	return compressors;
+}
+									/*}}}*/
+// getCompressorExtensions - supported data.tar extensions		/*{{{*/
+// ---------------------------------------------------------------------
+/* */
+std::vector<std::string> const Configuration::getCompressorExtensions() {
+	std::vector<APT::Configuration::Compressor> const compressors = getCompressors();
+	std::vector<std::string> ext;
+	for (std::vector<APT::Configuration::Compressor>::const_iterator c = compressors.begin();
+	     c != compressors.end(); ++c)
+		if (c->Extension.empty() == false && c->Extension != ".")
+			ext.push_back(c->Extension);
+	return ext;
+}
+									/*}}}*/
+// Compressor constructor						/*{{{*/
+// ---------------------------------------------------------------------
+/* */
+Configuration::Compressor::Compressor(char const *name, char const *extension,
+				      char const *binary,
+				      char const *compressArg, char const *uncompressArg,
+				      unsigned short const cost) {
+	std::string const config = string("APT:Compressor::").append(name).append("::");
+	Name = _config->Find(std::string(config).append("Name"), name);
+	Extension = _config->Find(std::string(config).append("Extension"), extension);
+	Binary = _config->Find(std::string(config).append("Binary"), binary);
+	Cost = _config->FindI(std::string(config).append("Cost"), cost);
+	std::string const compConf = std::string(config).append("CompressArg");
+	if (_config->Exists(compConf) == true)
+		CompressArgs = _config->FindVector(compConf);
+	else if (compressArg != NULL)
+		CompressArgs.push_back(compressArg);
+	std::string const uncompConf = std::string(config).append("UncompressArg");
+	if (_config->Exists(uncompConf) == true)
+		UncompressArgs = _config->FindVector(uncompConf);
+	else if (uncompressArg != NULL)
+		UncompressArgs.push_back(uncompressArg);
+}
+									/*}}}*/
 }
 }

+ 29 - 0
apt-pkg/aptconfiguration.h

@@ -82,6 +82,35 @@ public:									/*{{{*/
 	 */
 	 */
 	bool static const checkArchitecture(std::string const &Arch);
 	bool static const checkArchitecture(std::string const &Arch);
 
 
+	/** \brief Representation of supported compressors */
+	struct Compressor {
+		std::string Name;
+		std::string Extension;
+		std::string Binary;
+		std::vector<std::string> CompressArgs;
+		std::vector<std::string> UncompressArgs;
+		unsigned short Cost;
+
+		Compressor(char const *name, char const *extension, char const *binary,
+			   char const *compressArg, char const *uncompressArg,
+			   unsigned short const cost);
+		Compressor() {};
+	};
+
+	/** \brief Return a vector of Compressors supported for data.tar's
+	 *
+	 *  \param Cached saves the result so we need to calculated it only once
+	 *                this parameter should ony be used for testing purposes.
+	 *
+	 *  \return a vector of Compressors
+	 */
+	std::vector<Compressor> static const getCompressors(bool const Cached = true);
+
+	/** \brief Return a vector of extensions supported for data.tar's */
+	std::vector<std::string> static const getCompressorExtensions();
+									/*}}}*/
+	private:							/*{{{*/
+	void static setDefaultConfigurationForCompressors();
 									/*}}}*/
 									/*}}}*/
 };
 };
 									/*}}}*/
 									/*}}}*/

+ 2 - 6
apt-pkg/cacheiterators.h

@@ -206,13 +206,9 @@ class pkgCache::VerIterator : public Iterator<Version, VerIterator> {
 	inline const char *VerStr() const {return S->VerStr == 0?0:Owner->StrP + S->VerStr;};
 	inline const char *VerStr() const {return S->VerStr == 0?0:Owner->StrP + S->VerStr;};
 	inline const char *Section() const {return S->Section == 0?0:Owner->StrP + S->Section;};
 	inline const char *Section() const {return S->Section == 0?0:Owner->StrP + S->Section;};
 	inline const char *Arch() const {
 	inline const char *Arch() const {
-		if(S->MultiArch == pkgCache::Version::All)
-			return "all";
 		return S->ParentPkg == 0?0:Owner->StrP + ParentPkg()->Arch;
 		return S->ParentPkg == 0?0:Owner->StrP + ParentPkg()->Arch;
 	};
 	};
-	inline const char *Arch(bool const pseudo) const {
-		if(pseudo == false)
-			return Arch();
+	__deprecated inline const char *Arch(bool const pseudo) const {
 		return S->ParentPkg == 0?0:Owner->StrP + ParentPkg()->Arch;
 		return S->ParentPkg == 0?0:Owner->StrP + ParentPkg()->Arch;
 	};
 	};
 	inline PkgIterator ParentPkg() const {return PkgIterator(*Owner,Owner->PkgP + S->ParentPkg);};
 	inline PkgIterator ParentPkg() const {return PkgIterator(*Owner,Owner->PkgP + S->ParentPkg);};
@@ -227,7 +223,7 @@ class pkgCache::VerIterator : public Iterator<Version, VerIterator> {
 	string RelStr() const;
 	string RelStr() const;
 
 
 	bool Automatic() const;
 	bool Automatic() const;
-	bool Pseudo() const;
+	__deprecated bool Pseudo() const;
 	VerFileIterator NewestFile() const;
 	VerFileIterator NewestFile() const;
 
 
 	inline VerIterator(pkgCache &Owner,Version *Trg = 0) : Iterator<Version, VerIterator>(Owner, Trg) {
 	inline VerIterator(pkgCache &Owner,Version *Trg = 0) : Iterator<Version, VerIterator>(Owner, Trg) {

+ 2 - 2
apt-pkg/cacheset.h

@@ -257,7 +257,7 @@ public:									/*{{{*/
 		inline const char *VerStr() const { return (**this).VerStr(); };
 		inline const char *VerStr() const { return (**this).VerStr(); };
 		inline const char *Section() const { return (**this).Section(); };
 		inline const char *Section() const { return (**this).Section(); };
 		inline const char *Arch() const { return (**this).Arch(); };
 		inline const char *Arch() const { return (**this).Arch(); };
-		inline const char *Arch(bool const pseudo) const { return (**this).Arch(pseudo); };
+		__deprecated inline const char *Arch(bool const pseudo) const { return (**this).Arch(); };
 		inline pkgCache::PkgIterator ParentPkg() const { return (**this).ParentPkg(); };
 		inline pkgCache::PkgIterator ParentPkg() const { return (**this).ParentPkg(); };
 		inline pkgCache::DescIterator DescriptionList() const { return (**this).DescriptionList(); };
 		inline pkgCache::DescIterator DescriptionList() const { return (**this).DescriptionList(); };
 		inline pkgCache::DescIterator TranslatedDescription() const { return (**this).TranslatedDescription(); };
 		inline pkgCache::DescIterator TranslatedDescription() const { return (**this).TranslatedDescription(); };
@@ -268,7 +268,7 @@ public:									/*{{{*/
 		inline const char *PriorityType() const { return (**this).PriorityType(); };
 		inline const char *PriorityType() const { return (**this).PriorityType(); };
 		inline string RelStr() const { return (**this).RelStr(); };
 		inline string RelStr() const { return (**this).RelStr(); };
 		inline bool Automatic() const { return (**this).Automatic(); };
 		inline bool Automatic() const { return (**this).Automatic(); };
-		inline bool Pseudo() const { return (**this).Pseudo(); };
+		__deprecated inline bool Pseudo() const { return false; };
 		inline pkgCache::VerFileIterator NewestFile() const { return (**this).NewestFile(); };
 		inline pkgCache::VerFileIterator NewestFile() const { return (**this).NewestFile(); };
 	};
 	};
 									/*}}}*/
 									/*}}}*/

+ 1 - 1
apt-pkg/contrib/configuration.h

@@ -72,8 +72,8 @@ class Configuration
    string Find(string const &Name, string const &Default) const {return Find(Name.c_str(),Default.c_str());};
    string Find(string const &Name, string const &Default) const {return Find(Name.c_str(),Default.c_str());};
    string FindFile(const char *Name,const char *Default = 0) const;
    string FindFile(const char *Name,const char *Default = 0) const;
    string FindDir(const char *Name,const char *Default = 0) const;
    string FindDir(const char *Name,const char *Default = 0) const;
-   std::vector<string> FindVector(string const &Name) const;
    std::vector<string> FindVector(const char *Name) const;
    std::vector<string> FindVector(const char *Name) const;
+   std::vector<string> FindVector(string const &Name) const { return FindVector(Name.c_str()); };
    int FindI(const char *Name,int const &Default = 0) const;
    int FindI(const char *Name,int const &Default = 0) const;
    int FindI(string const &Name,int const &Default = 0) const {return FindI(Name.c_str(),Default);};
    int FindI(string const &Name,int const &Default = 0) const {return FindI(Name.c_str(),Default);};
    bool FindB(const char *Name,bool const &Default = false) const;
    bool FindB(const char *Name,bool const &Default = false) const;

+ 29 - 55
apt-pkg/deb/deblistparser.cc

@@ -67,23 +67,12 @@ string debListParser::Package() {
 									/*}}}*/
 									/*}}}*/
 // ListParser::Architecture - Return the package arch			/*{{{*/
 // ListParser::Architecture - Return the package arch			/*{{{*/
 // ---------------------------------------------------------------------
 // ---------------------------------------------------------------------
-/* This will return the Architecture of the package this section describes
-   Note that architecture "all" packages will get the architecture of the
-   Packages file parsed here. */
+/* This will return the Architecture of the package this section describes */
 string debListParser::Architecture() {
 string debListParser::Architecture() {
-   string const Result = Section.FindS("Architecture");
-   if (Result.empty() == true || Result == "all")
-   {
-      if (Arch.empty() == true)
-	 /* FIXME: this is a problem for installed arch all
-	    packages as we don't know from which arch this
-	    package was installed - and therefore which
-	    dependency this package resolves. */
-	 return _config->Find("APT::Architecture");
-      else
-	 return Arch;
-   }
-   return Result;
+   std::string const Arch = Section.FindS("Architecture");
+   if (Arch.empty() == true)
+      return _config->Find("APT::Architecture");
+   return Arch;
 }
 }
 									/*}}}*/
 									/*}}}*/
 // ListParser::ArchitectureAll						/*{{{*/
 // ListParser::ArchitectureAll						/*{{{*/
@@ -112,27 +101,30 @@ bool debListParser::NewVersion(pkgCache::VerIterator &Ver)
    Ver->Section = UniqFindTagWrite("Section");
    Ver->Section = UniqFindTagWrite("Section");
 
 
    // Parse multi-arch
    // Parse multi-arch
-   if (Section.FindS("Architecture") == "all")
-      /* Arch all packages can't have a Multi-Arch field,
-         but we need a special treatment for them nonetheless */
-      Ver->MultiArch = pkgCache::Version::All;
-   else
-   {
-      string const MultiArch = Section.FindS("Multi-Arch");
-      if (MultiArch.empty() == true)
-	 Ver->MultiArch = pkgCache::Version::None;
-      else if (MultiArch == "same")
-	 Ver->MultiArch = pkgCache::Version::Same;
-      else if (MultiArch == "foreign")
-	 Ver->MultiArch = pkgCache::Version::Foreign;
-      else if (MultiArch == "allowed")
-	 Ver->MultiArch = pkgCache::Version::Allowed;
-      else
+   string const MultiArch = Section.FindS("Multi-Arch");
+   if (MultiArch.empty() == true)
+      Ver->MultiArch = pkgCache::Version::None;
+   else if (MultiArch == "same") {
+      // Parse multi-arch
+      if (Section.FindS("Architecture") == "all")
       {
       {
-	 _error->Warning("Unknown Multi-Arch type »%s« for package »%s«",
-			MultiArch.c_str(), Section.FindS("Package").c_str());
+	 /* Arch all packages can't be Multi-Arch: same */
+	 _error->Warning("Architecture: all package '%s' can't be Multi-Arch: same",
+			Section.FindS("Package").c_str());
 	 Ver->MultiArch = pkgCache::Version::None;
 	 Ver->MultiArch = pkgCache::Version::None;
       }
       }
+      else
+	 Ver->MultiArch = pkgCache::Version::Same;
+   }
+   else if (MultiArch == "foreign")
+      Ver->MultiArch = pkgCache::Version::Foreign;
+   else if (MultiArch == "allowed")
+      Ver->MultiArch = pkgCache::Version::Allowed;
+   else
+   {
+      _error->Warning("Unknown Multi-Arch type '%s' for package '%s'",
+			MultiArch.c_str(), Section.FindS("Package").c_str());
+      Ver->MultiArch = pkgCache::Version::None;
    }
    }
 
 
    // Archive Size
    // Archive Size
@@ -150,24 +142,6 @@ bool debListParser::NewVersion(pkgCache::VerIterator &Ver)
 	 Ver->Priority = pkgCache::State::Extra;
 	 Ver->Priority = pkgCache::State::Extra;
    }
    }
 
 
-   if (Ver->MultiArch == pkgCache::Version::All)
-   {
-      /* We maintain a "pseudo" arch=all package for architecture all versions
-	 on which these versions can depend on. This pseudo package is many used
-	 for downloading/installing: The other pseudo-packages will degenerate
-	 to a NOP in the download/install step - this package will ensure that
-	 it is downloaded only one time and installed only one time -- even if
-	 the architecture bound versions coming in and out on regular basis. */
-      if (strcmp(Ver.Arch(true),"all") == 0)
-	 return true;
-      else if (MultiArchEnabled == true)
-      {
-	 // our pseudo packages have no size to not confuse the fetcher
-	 Ver->Size = 0;
-	 Ver->InstalledSize = 0;
-      }
-   }
-
    if (ParseDepends(Ver,"Depends",pkgCache::Dep::Depends) == false)
    if (ParseDepends(Ver,"Depends",pkgCache::Dep::Depends) == false)
       return false;
       return false;
    if (ParseDepends(Ver,"Pre-Depends",pkgCache::Dep::PreDepends) == false)
    if (ParseDepends(Ver,"Pre-Depends",pkgCache::Dep::PreDepends) == false)
@@ -644,7 +618,7 @@ bool debListParser::ParseDepends(pkgCache::VerIterator &Ver,
       return true;
       return true;
 
 
    string Package;
    string Package;
-   string const pkgArch = Ver.Arch(true);
+   string const pkgArch = Ver.Arch();
    string Version;
    string Version;
    unsigned int Op;
    unsigned int Op;
 
 
@@ -683,7 +657,7 @@ bool debListParser::ParseProvides(pkgCache::VerIterator &Ver)
    {
    {
       string Package;
       string Package;
       string Version;
       string Version;
-      string const Arch = Ver.Arch(true);
+      string const Arch = Ver.Arch();
       unsigned int Op;
       unsigned int Op;
 
 
       while (1)
       while (1)
@@ -768,7 +742,7 @@ bool debListParser::Step()
 	 if (Architecture == Arch)
 	 if (Architecture == Arch)
 	    return true;
 	    return true;
 
 
-	 if (Architecture == "all")
+	 if (Architecture == "all" && Arch == _config->Find("APT::Architecture"))
 	    return true;
 	    return true;
       }
       }
 
 

+ 6 - 2
apt-pkg/deb/debsrcrecords.cc

@@ -14,6 +14,7 @@
 #include <apt-pkg/error.h>
 #include <apt-pkg/error.h>
 #include <apt-pkg/strutl.h>
 #include <apt-pkg/strutl.h>
 #include <apt-pkg/configuration.h>
 #include <apt-pkg/configuration.h>
+#include <apt-pkg/aptconfiguration.h>
 
 
 using std::max;
 using std::max;
 									/*}}}*/
 									/*}}}*/
@@ -111,7 +112,9 @@ bool debSrcRecordParser::Files(vector<pkgSrcRecords::File> &List)
    string Base = Sect.FindS("Directory");
    string Base = Sect.FindS("Directory");
    if (Base.empty() == false && Base[Base.length()-1] != '/')
    if (Base.empty() == false && Base[Base.length()-1] != '/')
       Base += '/';
       Base += '/';
-   
+
+   std::vector<std::string> const compExts = APT::Configuration::getCompressorExtensions();
+
    // Iterate over the entire list grabbing each triplet
    // Iterate over the entire list grabbing each triplet
    const char *C = Files.c_str();
    const char *C = Files.c_str();
    while (*C != 0)
    while (*C != 0)
@@ -144,7 +147,8 @@ bool debSrcRecordParser::Files(vector<pkgSrcRecords::File> &List)
 	 }
 	 }
 	 F.Type = string(F.Path,Tmp+1,Pos-Tmp);
 	 F.Type = string(F.Path,Tmp+1,Pos-Tmp);
 	 
 	 
-	 if (F.Type == "gz" || F.Type == "bz2" || F.Type == "lzma" || F.Type == "tar")
+	 if (std::find(compExts.begin(), compExts.end(), std::string(".").append(F.Type)) != compExts.end() ||
+	     F.Type == "tar")
 	 {
 	 {
 	    Pos = Tmp-1;
 	    Pos = Tmp-1;
 	    continue;
 	    continue;

+ 17 - 2
apt-pkg/deb/dpkgpm.cc

@@ -881,7 +881,10 @@ bool pkgDPkgPM::Go(int OutStatusFd)
 
 
       // Generate the argument list
       // Generate the argument list
       const char *Args[MaxArgs + 50];
       const char *Args[MaxArgs + 50];
-      
+      // keep track of allocated strings for multiarch package names
+      char *Packages[MaxArgs + 50];
+      unsigned int pkgcount = 0;
+
       // Now check if we are within the MaxArgs limit
       // Now check if we are within the MaxArgs limit
       //
       //
       // this code below is problematic, because it may happen that
       // this code below is problematic, because it may happen that
@@ -989,13 +992,20 @@ bool pkgDPkgPM::Go(int OutStatusFd)
       }      
       }      
       else
       else
       {
       {
+	 string const nativeArch = _config->Find("APT::Architecture");
 	 for (;I != J && Size < MaxArgBytes; I++)
 	 for (;I != J && Size < MaxArgBytes; I++)
 	 {
 	 {
 	    if((*I).Pkg.end() == true)
 	    if((*I).Pkg.end() == true)
 	       continue;
 	       continue;
 	    if (I->Op == Item::Configure && disappearedPkgs.find(I->Pkg.Name()) != disappearedPkgs.end())
 	    if (I->Op == Item::Configure && disappearedPkgs.find(I->Pkg.Name()) != disappearedPkgs.end())
 	       continue;
 	       continue;
-	    Args[n++] = I->Pkg.Name();
+	    if (I->Pkg.Arch() == nativeArch || !strcmp(I->Pkg.Arch(), "all"))
+	       Args[n++] = I->Pkg.Name();
+	    else
+	    {
+	       Packages[pkgcount] = strdup(I->Pkg.FullName(false).c_str());
+	       Args[n++] = Packages[pkgcount++];
+	    }
 	    Size += strlen(Args[n-1]);
 	    Size += strlen(Args[n-1]);
 	 }	 
 	 }	 
       }      
       }      
@@ -1145,6 +1155,11 @@ bool pkgDPkgPM::Go(int OutStatusFd)
       sigemptyset(&sigmask);
       sigemptyset(&sigmask);
       sigprocmask(SIG_BLOCK,&sigmask,&original_sigmask);
       sigprocmask(SIG_BLOCK,&sigmask,&original_sigmask);
 
 
+      /* clean up the temporary allocation for multiarch package names in
+         the parent, so we don't leak memory when we return. */
+      for (unsigned int i = 0; i < pkgcount; i++)
+	 free(Packages[i]);
+
       // the result of the waitpid call
       // the result of the waitpid call
       int res;
       int res;
       int select_ret;
       int select_ret;

+ 1 - 303
apt-pkg/depcache.cc

@@ -705,107 +705,6 @@ void pkgDepCache::UpdateVerState(PkgIterator Pkg)
    }
    }
 }
 }
 									/*}}}*/
 									/*}}}*/
-// DepCache::RemovePseudoInstalledPkg - MultiArch helper for Update()	/*{{{*/
-// ---------------------------------------------------------------------
-/* We "install" arch all packages for all archs if it is installed. Many
-   of these will be broken. This method will look at these broken Pkg and
-   "remove" it. */
-bool pkgDepCache::RemovePseudoInstalledPkg(PkgIterator &Pkg, std::set<unsigned long> &recheck) {
-   if (unlikely(Pkg->CurrentVer == 0))
-      return false;
-
-   VerIterator V = Pkg.CurrentVer();
-   if (V->MultiArch != Version::All)
-      return false;
-
-   // Never ever kill an "all" package - they have no dependency so they can't be broken
-   if (strcmp(Pkg.Arch(),"all") == 0)
-      return false;
-
-   unsigned char const CurDepState = VersionState(V.DependsList(),DepInstall,DepInstMin,DepInstPolicy);
-   if ((CurDepState & DepInstMin) == DepInstMin) {
-      // okay, the package isn't broken, but is the package also required?
-      // If it has no real dependencies, no installed rdepends and doesn't
-      // provide something of value, we will kill it as not required.
-      // These pseudopackages have otherwise interesting effects if they get
-      // a new dependency in a newer version…
-      for (pkgCache::DepIterator D = V.DependsList();
-	   D.end() != true; ++D)
-	 if (D.IsCritical() == true && D.ParentPkg()->Group != Pkg->Group)
-	    return false;
-      for (DepIterator D = Pkg.RevDependsList(); D.end() != true; ++D)
-      {
-	 if (D.IsCritical() == false)
-	    continue;
-	 PkgIterator const P = D.ParentPkg();
-	 if (P->Group == Pkg->Group)
-	    continue;
-	 if (P->CurrentVer != 0)
-	    return false;
-      }
-      for (PrvIterator Prv = V.ProvidesList(); Prv.end() != true; Prv++)
-	 for (DepIterator d = Prv.ParentPkg().RevDependsList();
-	      d.end() != true; ++d)
-	 {
-	    PkgIterator const P = d.ParentPkg();
-	    if (P->CurrentVer != 0 &&
-	        P->Group != Pkg->Group)
-	       return false;
-	 }
-   }
-
-   // Dependencies for this arch all package are not statisfied
-   // so we installed it only for our convenience: get right of it now.
-   RemoveSizes(Pkg);
-   RemoveStates(Pkg);
-
-   Pkg->CurrentVer = 0;
-   PkgState[Pkg->ID].InstallVer = 0;
-
-   AddStates(Pkg);
-   Update(Pkg);
-   AddSizes(Pkg);
-
-   // After the remove previously satisfied pseudo pkg could be now
-   // no longer satisfied, so we need to recheck the reverse dependencies
-   for (DepIterator d = Pkg.RevDependsList(); d.end() != true; ++d)
-   {
-      PkgIterator const P = d.ParentPkg();
-      if (P->CurrentVer != 0)
-	 recheck.insert(P.Index());
-   }
-
-   for (DepIterator d = V.DependsList(); d.end() != true; ++d)
-   {
-      PkgIterator const P = d.TargetPkg();
-      for (PrvIterator Prv = P.ProvidesList(); Prv.end() != true; ++Prv)
-      {
-	 PkgIterator const O = Prv.OwnerPkg();
-	 if (O->CurrentVer != 0)
-	    recheck.insert(O.Index());
-      }
-
-      if (P->CurrentVer != 0)
-	 recheck.insert(P.Index());
-   }
-
-   for (PrvIterator Prv = V.ProvidesList(); Prv.end() != true; Prv++)
-   {
-      for (DepIterator d = Prv.ParentPkg().RevDependsList();
-	   d.end() != true; ++d)
-      {
-	 PkgIterator const P = d.ParentPkg();
-	 if (P->CurrentVer == 0)
-	    continue;
-
-	    recheck.insert(P.Index());
-      }
-   }
-
-
-   return true;
-}
-									/*}}}*/
 // DepCache::Update - Figure out all the state information		/*{{{*/
 // DepCache::Update - Figure out all the state information		/*{{{*/
 // ---------------------------------------------------------------------
 // ---------------------------------------------------------------------
 /* This will figure out the state of all the packages and all the 
 /* This will figure out the state of all the packages and all the 
@@ -820,12 +719,8 @@ void pkgDepCache::Update(OpProgress *Prog)
    iBrokenCount = 0;
    iBrokenCount = 0;
    iBadCount = 0;
    iBadCount = 0;
 
 
-   std::set<unsigned long> recheck;
-
    // Perform the depends pass
    // Perform the depends pass
    int Done = 0;
    int Done = 0;
-   bool const checkMultiArch = APT::Configuration::getArchitectures().size() > 1;
-   unsigned long killed = 0;
    for (PkgIterator I = PkgBegin(); I.end() != true; I++,Done++)
    for (PkgIterator I = PkgBegin(); I.end() != true; I++,Done++)
    {
    {
       if (Prog != 0 && Done%20 == 0)
       if (Prog != 0 && Done%20 == 0)
@@ -858,69 +753,6 @@ void pkgDepCache::Update(OpProgress *Prog)
       AddSizes(I);
       AddSizes(I);
       UpdateVerState(I);
       UpdateVerState(I);
       AddStates(I);
       AddStates(I);
-
-      if (checkMultiArch != true || I->CurrentVer == 0)
-	 continue;
-
-      VerIterator const V = I.CurrentVer();
-      if (V->MultiArch != Version::All)
-	 continue;
-
-      recheck.insert(I.Index());
-      --Done; // no progress if we need to recheck the package
-   }
-
-   if (checkMultiArch == true) {
-      /* FIXME: recheck breaks proper progress reporting as we don't know
-		how many packages we need to recheck. To lower the effect
-		a bit we increase with a kill, but we should do something more clever… */
-      while(recheck.empty() == false)
-	 for (std::set<unsigned long>::const_iterator p = recheck.begin();
-	     p != recheck.end();) {
-	    if (Prog != 0 && Done%20 == 0)
-	       Prog->Progress(Done);
-	    PkgIterator P = PkgIterator(*Cache, Cache->PkgP + *p);
-	    if (RemovePseudoInstalledPkg(P, recheck) == true) {
-	       ++killed;
-	       ++Done;
-	    }
-	    recheck.erase(p++);
-	 }
-
-      /* Okay, we have killed a great amount of pseudopackages -
-	 we have killed so many that we have now arch "all" packages
-	 without an installed pseudo package, but we NEED an installed
-	 pseudo package, so we will search now for a pseudo package
-	 we can install without breaking everything. */
-      for (GrpIterator G = Cache->GrpBegin(); G.end() != true; ++G)
-      {
-	 PkgIterator P = G.FindPkg("all");
-	 if (P.end() == true)
-	    continue;
-	 if (P->CurrentVer == 0)
-	    continue;
-	 bool installed = false;
-	 for (P = G.FindPkg("any"); P.end() != true; P = G.NextPkg(P))
-	 {
-	    if (strcmp(P.Arch(), "all") == 0)
-	       continue;
-	    if (P->CurrentVer == 0)
-	       continue;
-	    installed = true;
-	    break;
-	 }
-	 if (installed == false)
-	    recheck.insert(G.Index());
-      }
-
-      while (recheck.empty() != true)
-      {
-	 std::set<unsigned long>::const_iterator g = recheck.begin();
-	 unsigned long const G = *g;
-	 recheck.erase(g);
-	 if (unlikely(ReInstallPseudoForGroup(G, recheck) == false))
-	    _error->Warning(_("Internal error, group '%s' has no installable pseudo package"), GrpIterator(*Cache, Cache->GrpP + G).Name());
-      }
    }
    }
 
 
    if (Prog != 0)
    if (Prog != 0)
@@ -929,80 +761,6 @@ void pkgDepCache::Update(OpProgress *Prog)
    readStateFile(Prog);
    readStateFile(Prog);
 }
 }
 									/*}}}*/
 									/*}}}*/
-// DepCache::ReInstallPseudoForGroup - MultiArch helper for Update()	/*{{{*/
-// ---------------------------------------------------------------------
-/* RemovePseudoInstalledPkg() is very successful. It even kills packages
-   to an amount that no pseudo package is left, but we need a pseudo package
-   for upgrading senarios so we need to reinstall one pseudopackage which
-   doesn't break everything. Thankfully we can't have architecture depending
-   negative dependencies so this problem is already eliminated */
-bool pkgDepCache::ReInstallPseudoForGroup(pkgCache::PkgIterator const &P, std::set<unsigned long> &recheck)
-{
-   if (P->CurrentVer != 0)
-      return true;
-   // recursive call for packages which provide this package
-   for (pkgCache::PrvIterator Prv = P.ProvidesList(); Prv.end() != true; ++Prv)
-      ReInstallPseudoForGroup(Prv.OwnerPkg(), recheck);
-   // check if we actually need to look at this group
-   unsigned long const G = P->Group;
-   std::set<unsigned long>::const_iterator Pi = recheck.find(G);
-   if (Pi == recheck.end())
-      return true;
-   recheck.erase(Pi); // remove here, so we can't fall into an endless loop
-   if (unlikely(ReInstallPseudoForGroup(G, recheck) == false))
-   {
-      recheck.insert(G);
-      return false;
-   }
-   return true;
-}
-bool pkgDepCache::ReInstallPseudoForGroup(unsigned long const &G, std::set<unsigned long> &recheck)
-{
-   std::vector<std::string> static const Archs = APT::Configuration::getArchitectures();
-   pkgCache::GrpIterator Grp(*Cache, Cache->GrpP + G);
-   if (unlikely(Grp.end() == true))
-      return false;
-   for (std::vector<std::string>::const_iterator a = Archs.begin();
-        a != Archs.end(); ++a)
-   {
-      pkgCache::PkgIterator P = Grp.FindPkg(*a);
-      if (P.end() == true)
-	 continue;
-      pkgCache::VerIterator allV = Grp.FindPkg("all").CurrentVer();
-      for (VerIterator V = P.VersionList(); V.end() != true; ++V)
-      {
-	 // search for the same version as the all package
-	 if (allV->Hash != V->Hash || strcmp(allV.VerStr(),V.VerStr()) != 0)
-	    continue;
-	 unsigned char const CurDepState = VersionState(V.DependsList(),DepInstall,DepInstMin,DepInstPolicy);
-	 // If it is broken, try to install dependencies first before retry
-	 if ((CurDepState & DepInstMin) != DepInstMin)
-	 {
-	    for (pkgCache::DepIterator D = V.DependsList(); D.end() != true; ++D)
-	    {
-	       if (D->Type != pkgCache::Dep::PreDepends && D->Type != pkgCache::Dep::Depends)
-		  continue;
-	       ReInstallPseudoForGroup(D.TargetPkg(), recheck);
-	    }
-	    unsigned char const CurDepState = VersionState(V.DependsList(),DepInstall,DepInstMin,DepInstPolicy);
-	    // if package ist still broken… try another arch
-	    if ((CurDepState & DepInstMin) != DepInstMin)
-	       break;
-	 }
-	 // dependencies satisfied: reinstall the package
-	 RemoveSizes(P);
-	 RemoveStates(P);
-	 P->CurrentVer = V.Index();
-	 PkgState[P->ID].InstallVer = V;
-	 AddStates(P);
-	 Update(P);
-	 AddSizes(P);
-	 return true;
-      }
-   }
-   return false;
-}
-									/*}}}*/
 // DepCache::Update - Update the deps list of a package	   		/*{{{*/
 // DepCache::Update - Update the deps list of a package	   		/*{{{*/
 // ---------------------------------------------------------------------
 // ---------------------------------------------------------------------
 /* This is a helper for update that only does the dep portion of the scan. 
 /* This is a helper for update that only does the dep portion of the scan. 
@@ -1165,18 +923,6 @@ void pkgDepCache::MarkDelete(PkgIterator const &Pkg, bool rPurge,
    Update(Pkg);
    Update(Pkg);
    AddSizes(Pkg);
    AddSizes(Pkg);
 
 
-   // if we remove the pseudo package, we also need to remove the "real"
-   if (Pkg->CurrentVer != 0 && Pkg.CurrentVer().Pseudo() == true)
-      MarkDelete(Pkg.Group().FindPkg("all"), rPurge, Depth+1, FromUser);
-   else if (rPurge == true && Pkg->CurrentVer == 0 &&
-	    Pkg->CurrentState != pkgCache::State::NotInstalled &&
-	    strcmp(Pkg.Arch(), "all") != 0)
-   {
-      PkgIterator const allPkg = Pkg.Group().FindPkg("all");
-      if (allPkg.end() == false && allPkg->CurrentVer == 0 &&
-	  allPkg->CurrentState != pkgCache::State::NotInstalled)
-	 MarkDelete(allPkg, rPurge, Depth+1, FromUser);
-   }
 }
 }
 									/*}}}*/
 									/*}}}*/
 // DepCache::IsDeleteOk - check if it is ok to remove this package	/*{{{*/
 // DepCache::IsDeleteOk - check if it is ok to remove this package	/*{{{*/
@@ -1276,10 +1022,6 @@ void pkgDepCache::MarkInstall(PkgIterator const &Pkg,bool AutoInst,
    Update(Pkg);
    Update(Pkg);
    AddSizes(Pkg);
    AddSizes(Pkg);
 
 
-   // always trigger the install of the all package for a pseudo package
-   if (P.CandidateVerIter(*Cache).Pseudo() == true)
-      MarkInstall(Pkg.Group().FindPkg("all"), AutoInst, Depth, FromUser, ForceImportantDeps);
-
    if (AutoInst == false)
    if (AutoInst == false)
       return;
       return;
 
 
@@ -1499,7 +1241,7 @@ void pkgDepCache::SetReInstall(PkgIterator const &Pkg,bool To)
    AddStates(Pkg);
    AddStates(Pkg);
    AddSizes(Pkg);
    AddSizes(Pkg);
 
 
-   if (unlikely(Pkg.CurrentVer().end() == true) || Pkg.CurrentVer().Pseudo() == false)
+   if (unlikely(Pkg.CurrentVer().end() == true))
       return;
       return;
 
 
    SetReInstall(Pkg.Group().FindPkg("all"), To);
    SetReInstall(Pkg.Group().FindPkg("all"), To);
@@ -1510,7 +1252,6 @@ void pkgDepCache::SetReInstall(PkgIterator const &Pkg,bool To)
 /* */
 /* */
 void pkgDepCache::SetCandidateVersion(VerIterator TargetVer, bool const &Pseudo)
 void pkgDepCache::SetCandidateVersion(VerIterator TargetVer, bool const &Pseudo)
 {
 {
-
    pkgCache::PkgIterator Pkg = TargetVer.ParentPkg();
    pkgCache::PkgIterator Pkg = TargetVer.ParentPkg();
    StateCache &P = PkgState[Pkg->ID];
    StateCache &P = PkgState[Pkg->ID];
 
 
@@ -1531,27 +1272,6 @@ void pkgDepCache::SetCandidateVersion(VerIterator TargetVer, bool const &Pseudo)
    Update(Pkg);
    Update(Pkg);
    AddSizes(Pkg);
    AddSizes(Pkg);
 
 
-   if (TargetVer.Pseudo() == false || Pseudo == false)
-      return;
-
-   // the version was pseudo: set all other pseudos also
-   pkgCache::GrpIterator Grp = Pkg.Group();
-   for (Pkg = Grp.FindPkg("any"); Pkg.end() == false; ++Pkg)
-   {
-      StateCache &P = PkgState[Pkg->ID];
-      if (TargetVer.SimilarVer(P.CandidateVerIter(*this)) == true ||
-	  (P.CandidateVerIter(*this).Pseudo() == false &&
-	   strcmp(Pkg.Arch(), "all") != 0))
-	 continue;
-
-      for (pkgCache::VerIterator Ver = Pkg.VersionList(); Ver.end() == false; ++Ver)
-      {
-	 if (TargetVer.SimilarVer(Ver) == false)
-	    continue;
-	 SetCandidateVersion(Ver, false);
-	 break;
-      }
-   }
 }
 }
 									/*}}}*/
 									/*}}}*/
 // DepCache::SetCandidateRelease - Change the candidate version		/*{{{*/
 // DepCache::SetCandidateRelease - Change the candidate version		/*{{{*/
@@ -1967,28 +1687,6 @@ void pkgDepCache::MarkPackage(const pkgCache::PkgIterator &pkg,
    if(ver.end() == true)
    if(ver.end() == true)
       return;
       return;
 
 
-   // If the version belongs to a Multi-Arch all package
-   // we will mark all others in this Group with this version also
-   if (ver->MultiArch == pkgCache::Version::All &&
-	strcmp(ver.Arch(true), "all") == 0)
-   {
-      GrpIterator G = pkg.Group();
-      const char* const VerStr = ver.VerStr();
-      for (PkgIterator P = G.FindPkg("any");
-	   P.end() != true; P = G.NextPkg(P))
-      {
-	 for (VerIterator V = P.VersionList();
-	      V.end() != true; ++V)
-	 {
-	    if (ver->Hash != V->Hash ||
-		strcmp(VerStr, V.VerStr()) != 0)
-	       continue;
-	    MarkPackage(P, V, follow_recommends, follow_suggests);
-	    break;
-	 }
-      }
-   }
-
      for(DepIterator d = ver.DependsList(); !d.end(); ++d)
      for(DepIterator d = ver.DependsList(); !d.end(); ++d)
      {
      {
 	if(d->Type == Dep::Depends ||
 	if(d->Type == Dep::Depends ||

+ 5 - 3
apt-pkg/depcache.h

@@ -395,6 +395,7 @@ class pkgDepCache : protected pkgCache::Namespace
 		    bool ForceImportantDeps = false);
 		    bool ForceImportantDeps = false);
 
 
    void SetReInstall(PkgIterator const &Pkg,bool To);
    void SetReInstall(PkgIterator const &Pkg,bool To);
+   // FIXME: Remove the unused boolean parameter on abi break
    void SetCandidateVersion(VerIterator TargetVer, bool const &Pseudo = true);
    void SetCandidateVersion(VerIterator TargetVer, bool const &Pseudo = true);
    bool SetCandidateRelease(pkgCache::VerIterator TargetVer,
    bool SetCandidateRelease(pkgCache::VerIterator TargetVer,
 				std::string const &TargetRel);
 				std::string const &TargetRel);
@@ -481,9 +482,10 @@ class pkgDepCache : protected pkgCache::Namespace
 
 
    private:
    private:
    // Helper for Update(OpProgress) to remove pseudoinstalled arch all packages
    // Helper for Update(OpProgress) to remove pseudoinstalled arch all packages
-   bool RemovePseudoInstalledPkg(PkgIterator &Pkg, std::set<unsigned long> &recheck);
-   bool ReInstallPseudoForGroup(unsigned long const &Grp, std::set<unsigned long> &recheck);
-   bool ReInstallPseudoForGroup(pkgCache::PkgIterator const &P, std::set<unsigned long> &recheck);
+   // FIXME: they are private so shouldn't affect abi, but just in case…
+   __deprecated bool RemovePseudoInstalledPkg(PkgIterator &Pkg, std::set<unsigned long> &recheck) { return true; };
+   __deprecated bool ReInstallPseudoForGroup(unsigned long const &Grp, std::set<unsigned long> &recheck) { return true; };
+   __deprecated bool ReInstallPseudoForGroup(pkgCache::PkgIterator const &P, std::set<unsigned long> &recheck) { return true; };
 };
 };
 
 
 #endif
 #endif

+ 0 - 4
apt-pkg/orderlist.cc

@@ -128,10 +128,6 @@ bool pkgOrderList::IsMissing(PkgIterator Pkg)
    if (FileList[Pkg->ID].empty() == false)
    if (FileList[Pkg->ID].empty() == false)
       return false;
       return false;
 
 
-   // Missing Pseudo packages are missing if the real package is missing
-   if (pkgCache::VerIterator(Cache, Cache[Pkg].CandidateVer).Pseudo() == true)
-      return IsMissing(Pkg.Group().FindPkg("all"));
-
    return true;
    return true;
 }
 }
 									/*}}}*/
 									/*}}}*/

+ 6 - 29
apt-pkg/packagemanager.cc

@@ -81,9 +81,6 @@ bool pkgPackageManager::GetArchives(pkgAcquire *Owner,pkgSourceList *Sources,
       if (List->IsNow(Pkg) == false)
       if (List->IsNow(Pkg) == false)
 	 continue;
 	 continue;
 
 
-      if (pkgCache::VerIterator(Cache, Cache[Pkg].CandidateVer).Pseudo() == true)
-	 continue;
-
       new pkgAcqArchive(Owner,Sources,Recs,Cache[Pkg].InstVerIter(Cache),
       new pkgAcqArchive(Owner,Sources,Recs,Cache[Pkg].InstVerIter(Cache),
 			FileNames[Pkg->ID]);
 			FileNames[Pkg->ID]);
    }
    }
@@ -281,9 +278,7 @@ bool pkgPackageManager::ConfigureAll()
    {
    {
       PkgIterator Pkg(Cache,*I);
       PkgIterator Pkg(Cache,*I);
 
 
-      if (ConfigurePkgs == true &&
-	  pkgCache::VerIterator(Cache, Cache[Pkg].CandidateVer).Pseudo() == false &&
-	  Configure(Pkg) == false)
+      if (ConfigurePkgs == true && Configure(Pkg) == false)
 	 return false;
 	 return false;
       
       
       List->Flag(Pkg,pkgOrderList::Configured,pkgOrderList::States);
       List->Flag(Pkg,pkgOrderList::Configured,pkgOrderList::States);
@@ -318,9 +313,7 @@ bool pkgPackageManager::SmartConfigure(PkgIterator Pkg)
    {
    {
       PkgIterator Pkg(Cache,*I);
       PkgIterator Pkg(Cache,*I);
       
       
-      if (ConfigurePkgs == true &&
-	  pkgCache::VerIterator(Cache, Cache[Pkg].CandidateVer).Pseudo() == false &&
-	  Configure(Pkg) == false)
+      if (ConfigurePkgs == true && Configure(Pkg) == false)
 	 return false;
 	 return false;
       
       
       List->Flag(Pkg,pkgOrderList::Configured,pkgOrderList::States);
       List->Flag(Pkg,pkgOrderList::Configured,pkgOrderList::States);
@@ -473,10 +466,7 @@ bool pkgPackageManager::SmartRemove(PkgIterator Pkg)
 
 
    List->Flag(Pkg,pkgOrderList::Configured,pkgOrderList::States);
    List->Flag(Pkg,pkgOrderList::Configured,pkgOrderList::States);
 
 
-   if (pkgCache::VerIterator(Cache, Cache[Pkg].CandidateVer).Pseudo() == false)
-      return Remove(Pkg,(Cache[Pkg].iFlags & pkgDepCache::Purge) == pkgDepCache::Purge);
-   else
-      return SmartRemove(Pkg.Group().FindPkg("all"));
+   return Remove(Pkg,(Cache[Pkg].iFlags & pkgDepCache::Purge) == pkgDepCache::Purge);
    return true;
    return true;
 }
 }
 									/*}}}*/
 									/*}}}*/
@@ -592,22 +582,9 @@ bool pkgPackageManager::SmartUnPack(PkgIterator Pkg)
 	P.end() == false; P++)
 	P.end() == false; P++)
       CheckRConflicts(Pkg,P.ParentPkg().RevDependsList(),P.ProvideVersion());
       CheckRConflicts(Pkg,P.ParentPkg().RevDependsList(),P.ProvideVersion());
 
 
-   if (pkgCache::VerIterator(Cache, Cache[Pkg].CandidateVer).Pseudo() == false)
-   {
-      if(Install(Pkg,FileNames[Pkg->ID]) == false)
-         return false;
-   } else {
-      // Pseudo packages will not be unpacked - instead we will do this
-      // for the "real" package, but only once and if it is already
-      // configured we don't need to unpack it again…
-      PkgIterator const P = Pkg.Group().FindPkg("all");
-      if (List->IsFlag(P,pkgOrderList::UnPacked) != true &&
-	  List->IsFlag(P,pkgOrderList::Configured) != true &&
-	  P.State() != pkgCache::PkgIterator::NeedsNothing) {
-	 if (SmartUnPack(P) == false)
-	    return false;
-      }
-   }
+   if(Install(Pkg,FileNames[Pkg->ID]) == false)
+      return false;
+
    List->Flag(Pkg,pkgOrderList::UnPacked,pkgOrderList::States);
    List->Flag(Pkg,pkgOrderList::UnPacked,pkgOrderList::States);
    
    
    // Perform immedate configuration of the package.
    // Perform immedate configuration of the package.

+ 2 - 16
apt-pkg/pkgcache.cc

@@ -737,22 +737,8 @@ bool pkgCache::VerIterator::Automatic() const
    return false;
    return false;
 }
 }
 									/*}}}*/
 									/*}}}*/
-// VerIterator::Pseudo - Check if this version is a pseudo one		/*{{{*/
-// ---------------------------------------------------------------------
-/* Sometimes you have the need to express dependencies with versions
-   which doesn't really exist or exist multiply times for "different"
-   packages. We need these versions for dependency resolution but they
-   are a problem everytime we need to download/install something. */
-bool pkgCache::VerIterator::Pseudo() const
-{
-   if (S->MultiArch == pkgCache::Version::All &&
-	   strcmp(Arch(true),"all") != 0)
-   {
-	   GrpIterator const Grp = ParentPkg().Group();
-	   return (Grp->LastPackage != Grp->FirstPackage);
-   }
-   return false;
-}
+// VerIterator::Pseudo - deprecated no-op method			/*{{{*/
+bool pkgCache::VerIterator::Pseudo() const { return false; }
 									/*}}}*/
 									/*}}}*/
 // VerIterator::NewestFile - Return the newest file version relation	/*{{{*/
 // VerIterator::NewestFile - Return the newest file version relation	/*{{{*/
 // ---------------------------------------------------------------------
 // ---------------------------------------------------------------------

+ 2 - 2
apt-pkg/pkgcache.h

@@ -505,8 +505,8 @@ struct pkgCache::Version
        Foreign means that this version can fulfill dependencies even
        Foreign means that this version can fulfill dependencies even
        if it is built for another architecture as the requester.
        if it is built for another architecture as the requester.
        Same indicates that builds for different architectures can
        Same indicates that builds for different architectures can
-       be co-installed on the system and All is the marker for a
-       version with the Architecture: all. */
+       be co-installed on the system */
+   // FIXME: remove All on abi break
    enum {None, All, Foreign, Same, Allowed} MultiArch;
    enum {None, All, Foreign, Same, Allowed} MultiArch;
 
 
    /** \brief references all the PackageFile's that this version came from
    /** \brief references all the PackageFile's that this version came from

+ 13 - 36
apt-pkg/pkgcachegen.cc

@@ -178,23 +178,17 @@ bool pkgCacheGenerator::MergeList(ListParser &List,
       if (PackageName.empty() == true)
       if (PackageName.empty() == true)
 	 return false;
 	 return false;
 
 
-      /* As we handle Arch all packages as architecture bounded
-         we add all information to every (simulated) arch package */
-      std::vector<string> genArch;
-      if (List.ArchitectureAll() == true) {
-	 genArch = APT::Configuration::getArchitectures();
-	 if (genArch.size() != 1)
-	    genArch.push_back("all");
-      } else
-	 genArch.push_back(List.Architecture());
-
-      for (std::vector<string>::const_iterator arch = genArch.begin();
-	   arch != genArch.end(); ++arch)
-      {
+      /* Treat Arch all packages as the same as the native arch. */
+      string Arch;
+      if (List.ArchitectureAll() == true)
+	 Arch = _config->Find("APT::Architecture");
+      else
+	 Arch = List.Architecture();
+ 
       // Get a pointer to the package structure
       // Get a pointer to the package structure
       pkgCache::PkgIterator Pkg;
       pkgCache::PkgIterator Pkg;
       Dynamic<pkgCache::PkgIterator> DynPkg(Pkg);
       Dynamic<pkgCache::PkgIterator> DynPkg(Pkg);
-      if (NewPackage(Pkg, PackageName, *arch) == false)
+      if (NewPackage(Pkg, PackageName, Arch) == false)
 	 return _error->Error(_("Error occurred while processing %s (NewPackage)"),PackageName.c_str());
 	 return _error->Error(_("Error occurred while processing %s (NewPackage)"),PackageName.c_str());
       Counter++;
       Counter++;
       if (Counter % 100 == 0 && Progress != 0)
       if (Counter % 100 == 0 && Progress != 0)
@@ -351,7 +345,6 @@ bool pkgCacheGenerator::MergeList(ListParser &List,
 
 
       if ((*LastDesc == 0 && _error->PendingError()) || NewFileDesc(Desc,List) == false)
       if ((*LastDesc == 0 && _error->PendingError()) || NewFileDesc(Desc,List) == false)
 	 return _error->Error(_("Error occurred while processing %s (NewFileDesc2)"),PackageName.c_str());
 	 return _error->Error(_("Error occurred while processing %s (NewFileDesc2)"),PackageName.c_str());
-      }
    }
    }
 
 
    FoundFileDeps |= List.HasFileDeps();
    FoundFileDeps |= List.HasFileDeps();
@@ -650,10 +643,7 @@ bool pkgCacheGenerator::FinishCache(OpProgress *Progress)
 		- MultiArch: same → Co-Installable if they have the same version
 		- MultiArch: same → Co-Installable if they have the same version
 		- Architecture: all → Need to be Co-Installable for internal reasons
 		- Architecture: all → Need to be Co-Installable for internal reasons
 		- All others conflict with all other group members */
 		- All others conflict with all other group members */
-	       bool const coInstall = ((V->MultiArch == pkgCache::Version::All && strcmp(Arch, "all") != 0) ||
-					V->MultiArch == pkgCache::Version::Same);
-	       if (V->MultiArch == pkgCache::Version::All && allPkg.end() == true)
-		  allPkg = G.FindPkg("all");
+	       bool const coInstall = (V->MultiArch == pkgCache::Version::Same);
 	       for (vector<string>::const_iterator A = archs.begin(); A != archs.end(); ++A)
 	       for (vector<string>::const_iterator A = archs.begin(); A != archs.end(); ++A)
 	       {
 	       {
 		  if (*A == Arch)
 		  if (*A == Arch)
@@ -675,24 +665,11 @@ bool pkgCacheGenerator::FinishCache(OpProgress *Progress)
 		     NewDepends(D, V, V.VerStr(),
 		     NewDepends(D, V, V.VerStr(),
 				pkgCache::Dep::NotEquals, pkgCache::Dep::DpkgBreaks,
 				pkgCache::Dep::NotEquals, pkgCache::Dep::DpkgBreaks,
 				OldDepLast);
 				OldDepLast);
-		     if (V->MultiArch == pkgCache::Version::All)
-		     {
-			// Depend on ${self}:all which does depend on nothing
-			NewDepends(allPkg, V, V.VerStr(),
-				   pkgCache::Dep::Equals, pkgCache::Dep::Depends,
-				   OldDepLast);
-		     }
 		  } else {
 		  } else {
 			// Conflicts: ${self}:other
 			// Conflicts: ${self}:other
-			if (strcmp(Arch, "all") == 0) {
-				NewDepends(D, V, V.VerStr(),
-					   pkgCache::Dep::NotEquals, pkgCache::Dep::Conflicts,
-					   OldDepLast);
-			} else {
-				NewDepends(D, V, "",
-					   pkgCache::Dep::NoOp, pkgCache::Dep::Conflicts,
-					   OldDepLast);
-			}
+			NewDepends(D, V, "",
+				   pkgCache::Dep::NoOp, pkgCache::Dep::Conflicts,
+				   OldDepLast);
 		  }
 		  }
 	       }
 	       }
 	    }
 	    }
@@ -810,7 +787,7 @@ bool pkgCacheGenerator::ListParser::NewProvides(pkgCache::VerIterator &Ver,
    pkgCache &Cache = Owner->Cache;
    pkgCache &Cache = Owner->Cache;
 
 
    // We do not add self referencing provides
    // We do not add self referencing provides
-   if (Ver.ParentPkg().Name() == PkgName && PkgArch == Ver.Arch(true))
+   if (Ver.ParentPkg().Name() == PkgName && PkgArch == Ver.Arch())
       return true;
       return true;
    
    
    // Get a structure
    // Get a structure

+ 0 - 7
apt-pkg/policy.cc

@@ -152,13 +152,6 @@ pkgCache::VerIterator pkgPolicy::GetCandidateVer(pkgCache::PkgIterator const &Pk
    {
    {
       /* Lets see if this version is the installed version */
       /* Lets see if this version is the installed version */
       bool instVer = (Pkg.CurrentVer() == Ver);
       bool instVer = (Pkg.CurrentVer() == Ver);
-      if (Ver.Pseudo() == true && instVer == false)
-      {
-	 pkgCache::PkgIterator const allPkg = Ver.ParentPkg().Group().FindPkg("all");
-	 if (allPkg->CurrentVer != 0 && allPkg.CurrentVer()->Hash == Ver->Hash &&
-	     strcmp(allPkg.CurVersion(), Ver.VerStr()) == 0)
-	    instVer = true;
-      }
 
 
       for (pkgCache::VerFileIterator VF = Ver.FileList(); VF.end() == false; VF++)
       for (pkgCache::VerFileIterator VF = Ver.FileList(); VF.end() == false; VF++)
       {
       {

+ 1 - 9
cmdline/apt-cache.cc

@@ -1519,7 +1519,6 @@ bool Policy(CommandLine &CmdL)
       return true;
       return true;
    }
    }
 
 
-   string const myArch = _config->Find("APT::Architecture");
    char const * const msgInstalled = _("  Installed: ");
    char const * const msgInstalled = _("  Installed: ");
    char const * const msgCandidate = _("  Candidate: ");
    char const * const msgCandidate = _("  Candidate: ");
    short const InstalledLessCandidate =
    short const InstalledLessCandidate =
@@ -1532,14 +1531,8 @@ bool Policy(CommandLine &CmdL)
    // Print out detailed information for each package
    // Print out detailed information for each package
    APT::CacheSetHelper helper(true, GlobalError::NOTICE);
    APT::CacheSetHelper helper(true, GlobalError::NOTICE);
    APT::PackageSet pkgset = APT::PackageSet::FromCommandLine(CacheFile, CmdL.FileList + 1, helper);
    APT::PackageSet pkgset = APT::PackageSet::FromCommandLine(CacheFile, CmdL.FileList + 1, helper);
-   for (APT::PackageSet::const_iterator I = pkgset.begin(); I != pkgset.end(); ++I)
+   for (APT::PackageSet::const_iterator Pkg = pkgset.begin(); Pkg != pkgset.end(); ++Pkg)
    {
    {
-      pkgCache::PkgIterator Pkg = I.Group().FindPkg("any");
-
-      for (; Pkg.end() != true; Pkg = I.Group().NextPkg(Pkg)) {
-      if (strcmp(Pkg.Arch(),"all") == 0)
-	 continue;
-
       cout << Pkg.FullName(true) << ":" << endl;
       cout << Pkg.FullName(true) << ":" << endl;
 
 
       // Installed version
       // Installed version
@@ -1588,7 +1581,6 @@ bool Policy(CommandLine &CmdL)
 		   Indx->Describe(true).c_str());
 		   Indx->Describe(true).c_str());
 	 }
 	 }
       }
       }
-      }
    }
    }
    
    
    return true;
    return true;

+ 1 - 14
cmdline/apt-get.cc

@@ -382,8 +382,6 @@ void ShowNew(ostream &out,CacheFile &Cache)
    {
    {
       pkgCache::PkgIterator I(Cache,Cache.List[J]);
       pkgCache::PkgIterator I(Cache,Cache.List[J]);
       if (Cache[I].NewInstall() == true) {
       if (Cache[I].NewInstall() == true) {
-	 if (Cache[I].CandidateVerIter(Cache).Pseudo() == true)
-	    continue;
          List += I.FullName(true) + " ";
          List += I.FullName(true) + " ";
          VersionsList += string(Cache[I].CandVersion) + "\n";
          VersionsList += string(Cache[I].CandVersion) + "\n";
       }
       }
@@ -406,8 +404,6 @@ void ShowDel(ostream &out,CacheFile &Cache)
       pkgCache::PkgIterator I(Cache,Cache.List[J]);
       pkgCache::PkgIterator I(Cache,Cache.List[J]);
       if (Cache[I].Delete() == true)
       if (Cache[I].Delete() == true)
       {
       {
-	 if (Cache[I].CandidateVerIter(Cache).Pseudo() == true)
-	    continue;
 	 if ((Cache[I].iFlags & pkgDepCache::Purge) == pkgDepCache::Purge)
 	 if ((Cache[I].iFlags & pkgDepCache::Purge) == pkgDepCache::Purge)
 	    List += I.FullName(true) + "* ";
 	    List += I.FullName(true) + "* ";
 	 else
 	 else
@@ -456,8 +452,6 @@ void ShowUpgraded(ostream &out,CacheFile &Cache)
       // Not interesting
       // Not interesting
       if (Cache[I].Upgrade() == false || Cache[I].NewInstall() == true)
       if (Cache[I].Upgrade() == false || Cache[I].NewInstall() == true)
 	 continue;
 	 continue;
-      if (Cache[I].CandidateVerIter(Cache).Pseudo() == true)
-	 continue;
 
 
       List += I.FullName(true) + " ";
       List += I.FullName(true) + " ";
       VersionsList += string(Cache[I].CurVersion) + " => " + Cache[I].CandVersion + "\n";
       VersionsList += string(Cache[I].CurVersion) + " => " + Cache[I].CandVersion + "\n";
@@ -479,8 +473,6 @@ bool ShowDowngraded(ostream &out,CacheFile &Cache)
       // Not interesting
       // Not interesting
       if (Cache[I].Downgrade() == false || Cache[I].NewInstall() == true)
       if (Cache[I].Downgrade() == false || Cache[I].NewInstall() == true)
 	 continue;
 	 continue;
-      if (Cache[I].CandidateVerIter(Cache).Pseudo() == true)
-	 continue;
 
 
       List += I.FullName(true) + " ";
       List += I.FullName(true) + " ";
       VersionsList += string(Cache[I].CurVersion) + " => " + Cache[I].CandVersion + "\n";
       VersionsList += string(Cache[I].CurVersion) + " => " + Cache[I].CandVersion + "\n";
@@ -584,9 +576,6 @@ void Stats(ostream &out,pkgDepCache &Dep)
    unsigned long ReInstall = 0;
    unsigned long ReInstall = 0;
    for (pkgCache::PkgIterator I = Dep.PkgBegin(); I.end() == false; I++)
    for (pkgCache::PkgIterator I = Dep.PkgBegin(); I.end() == false; I++)
    {
    {
-      if (pkgCache::VerIterator(Dep, Dep[I].CandidateVer).Pseudo() == true)
-	 continue;
-
       if (Dep[I].NewInstall() == true)
       if (Dep[I].NewInstall() == true)
 	 Install++;
 	 Install++;
       else
       else
@@ -1718,7 +1707,7 @@ bool DoAutomaticRemove(CacheFile &Cache)
 		   R->Type != pkgCache::Dep::PreDepends)
 		   R->Type != pkgCache::Dep::PreDepends)
 		  continue;
 		  continue;
 	       pkgCache::PkgIterator N = R.ParentPkg();
 	       pkgCache::PkgIterator N = R.ParentPkg();
-	       if (N.end() == true || N->CurrentVer == 0)
+	       if (N.end() == true || (N->CurrentVer == 0 && (*Cache)[N].Install() == false))
 		  continue;
 		  continue;
 	       if (Debug == true)
 	       if (Debug == true)
 		  std::clog << "Save " << P << " as another installed garbage package depends on it" << std::endl;
 		  std::clog << "Save " << P << " as another installed garbage package depends on it" << std::endl;
@@ -1916,8 +1905,6 @@ bool DoInstall(CommandLine &CmdL)
 	 if ((*Cache)[I].Install() == false)
 	 if ((*Cache)[I].Install() == false)
 	    continue;
 	    continue;
 	 pkgCache::VerIterator Cand = Cache[I].CandidateVerIter(Cache);
 	 pkgCache::VerIterator Cand = Cache[I].CandidateVerIter(Cache);
-	 if (Cand.Pseudo() == true)
-	    continue;
 
 
 	 if (verset[MOD_INSTALL].find(Cand) != verset[MOD_INSTALL].end())
 	 if (verset[MOD_INSTALL].find(Cand) != verset[MOD_INSTALL].end())
 	    continue;
 	    continue;

+ 1 - 1
debian/apt.symbols

@@ -277,7 +277,7 @@ libapt-pkg.so.4.10 libapt-pkg4.10
  (c++)"pkgDepCache::DefaultRootSetFunc::InRootSet(pkgCache::PkgIterator const&)@Base" 0.8.0
  (c++)"pkgDepCache::DefaultRootSetFunc::InRootSet(pkgCache::PkgIterator const&)@Base" 0.8.0
  (c++)"pkgDepCache::DefaultRootSetFunc::~DefaultRootSetFunc()@Base" 0.8.0
  (c++)"pkgDepCache::DefaultRootSetFunc::~DefaultRootSetFunc()@Base" 0.8.0
  (c++)"pkgDepCache::MarkFollowsSuggests()@Base" 0.8.0
  (c++)"pkgDepCache::MarkFollowsSuggests()@Base" 0.8.0
- (c++)"pkgDepCache::SetCandidateVersion(pkgCache::VerIterator, bool const&)@Base" 0.8.0
+ (c++)"pkgDepCache::SetCandidateVersion(pkgCache::VerIterator)@Base" 0.8.0
  (c++)"pkgDepCache::MarkFollowsRecommends()@Base" 0.8.0
  (c++)"pkgDepCache::MarkFollowsRecommends()@Base" 0.8.0
  (c++)"pkgDepCache::ReInstallPseudoForGroup(pkgCache::PkgIterator const&, std::set<unsigned long, std::less<unsigned long>, std::allocator<unsigned long> >&)@Base" 0.8.0
  (c++)"pkgDepCache::ReInstallPseudoForGroup(pkgCache::PkgIterator const&, std::set<unsigned long, std::less<unsigned long>, std::allocator<unsigned long> >&)@Base" 0.8.0
  (c++)"pkgDepCache::ReInstallPseudoForGroup(unsigned long const&, std::set<unsigned long, std::less<unsigned long>, std::allocator<unsigned long> >&)@Base" 0.8.0
  (c++)"pkgDepCache::ReInstallPseudoForGroup(unsigned long const&, std::set<unsigned long, std::less<unsigned long>, std::allocator<unsigned long> >&)@Base" 0.8.0

+ 33 - 1
debian/changelog

@@ -1,11 +1,43 @@
 apt (0.8.11.6) UNRELEASED; urgency=low
 apt (0.8.11.6) UNRELEASED; urgency=low
 
 
+  [ Christian Perrier ]
   * Fix error in French translation of manpages (apt_preferences(5)).
   * Fix error in French translation of manpages (apt_preferences(5)).
     Merci, Rémi Vanicat. Closes: #613689
     Merci, Rémi Vanicat. Closes: #613689
   * Complete French manpage translation
   * Complete French manpage translation
   * Italian translation update (Milo Casagrande). Closes: #614395
   * Italian translation update (Milo Casagrande). Closes: #614395
 
 
- -- Christian Perrier <bubulle@debian.org>  Fri, 18 Feb 2011 05:53:49 +0100
+  [ David Kalnischkies ]
+  * ftparchive/multicompress.cc, apt-inst/deb/debfile.cc:
+    - support xz compressor to create xz-compressed Indexes and be able
+      to open data.tar.xz files
+    - load the supported compressors from configuration
+  * ftparchive/writer.cc:
+    - ensure that Date and Valid-Until time strings are not localised
+    - add options to disable specific checksums for Indexes
+    - include xz-compressed Packages and Sources files in Release file
+  * apt-pkg/aptconfiguration.cc:
+    - support download of xz-compressed indexes files
+    - support adding new compressors by configuration
+  * apt-pkg/deb/debsrcrecords.cc:
+    - support xz-compressed source v3 debian.tar files
+    - support every compression we have a compressor configured
+  * ftparchive/contents.cc:
+    - remove ExtractArchive codecopy from apt-inst/deb/debfile.cc
+  * apt-inst/deb/debfile.cc:
+    - support data.tar's compressed with any configured compressor
+  * cmdline/apt-get.cc:
+    - reinstall dependencies of reinstalled "garbage" (Closes: #617257)
+
+  [ Steve Langasek ]
+  * apt-pkg/deb/dpkgpm.cc:
+    - make sure that for multiarch packages, we are passing the full
+      qualified package name to dpkg for removals. (Closes: #614298)
+  * Remove the "pseudopackage" handling of Architecture: all packages for
+    Multi-Arch; instead, Arch: all packages only satisfy dependencies for
+    the native arch, except where the Arch: all package is declared
+    Multi-Arch: foreign.  (Closes: #613584)
+
+ -- David Kalnischkies <kalnischkies@gmail.com>  Tue, 08 Mar 2011 19:20:56 +0100
 
 
 apt (0.8.11.5) unstable; urgency=low
 apt (0.8.11.5) unstable; urgency=low
 
 

+ 7 - 4
doc/apt-ftparchive.1.xml

@@ -526,11 +526,14 @@ for i in Sections do
    &apt-cmdblurb;
    &apt-cmdblurb;
    
    
    <variablelist>
    <variablelist>
-     <varlistentry><term><option>--md5</option></term>
+     <varlistentry><term><option>--md5</option>, <option>--sha1</option>, <option>--sha256</option></term>
      <listitem><para>
      <listitem><para>
-     Generate MD5 sums. This defaults to on, when turned off the generated 
-     index files will not have MD5Sum fields where possible.
-     Configuration Item: <literal>APT::FTPArchive::MD5</literal></para></listitem>
+     Generate the given checksum. These options default to on, when turned off the generated
+     index files will not have the checksum fields where possible.
+     Configuration Items: <literal>APT::FTPArchive::<replaceable>Checksum</replaceable></literal> and
+     <literal>APT::FTPArchive::<replaceable>Index</replaceable>::<replaceable>Checksum</replaceable></literal> where
+     <literal>Index</literal> can be <literal>Packages</literal>, <literal>Sources</literal> or <literal>Release</literal> and
+     <literal>Checksum</literal> can be <literal>MD5</literal>, <literal>SHA1</literal> or <literal>SHA256</literal>.</para></listitem>
      </varlistentry>
      </varlistentry>
 
 
      <varlistentry><term><option>-d</option></term><term><option>--db</option></term>
      <varlistentry><term><option>-d</option></term><term><option>--db</option></term>

+ 2 - 0
ftparchive/apt-ftparchive.cc

@@ -949,6 +949,8 @@ int main(int argc, const char *argv[])
    CommandLine::Args Args[] = {
    CommandLine::Args Args[] = {
       {'h',"help","help",0},
       {'h',"help","help",0},
       {0,"md5","APT::FTPArchive::MD5",0},
       {0,"md5","APT::FTPArchive::MD5",0},
+      {0,"sha1","APT::FTPArchive::SHA1",0},
+      {0,"sha256","APT::FTPArchive::SHA256",0},
       {'v',"version","version",0},
       {'v',"version","version",0},
       {'d',"db","APT::FTPArchive::DB",CommandLine::HasArg},
       {'d',"db","APT::FTPArchive::DB",CommandLine::HasArg},
       {'s',"source-override","APT::FTPArchive::SourceOverride",CommandLine::HasArg},
       {'s',"source-override","APT::FTPArchive::SourceOverride",CommandLine::HasArg},

+ 3 - 24
ftparchive/contents.cc

@@ -36,12 +36,13 @@
 #include "contents.h"
 #include "contents.h"
 
 
 #include <apti18n.h>
 #include <apti18n.h>
+#include <apt-pkg/debfile.h>
 #include <apt-pkg/extracttar.h>
 #include <apt-pkg/extracttar.h>
 #include <apt-pkg/error.h>
 #include <apt-pkg/error.h>
 #include <stdio.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <stdlib.h>
 #include <string.h>
 #include <string.h>
-#include <malloc.h>    
+#include <malloc.h>
 									/*}}}*/
 									/*}}}*/
 
 
 // GenContents::~GenContents - Free allocated memory			/*{{{*/
 // GenContents::~GenContents - Free allocated memory			/*{{{*/
@@ -305,29 +306,7 @@ void GenContents::DoPrint(FILE *Out,GenContents::Node *Top, char *Buf)
 bool ContentsExtract::Read(debDebFile &Deb)
 bool ContentsExtract::Read(debDebFile &Deb)
 {
 {
    Reset();
    Reset();
-   
-   // Get the archive member and positition the file 
-   const ARArchive::Member *Member = Deb.GotoMember("data.tar.gz");
-   const char *Compressor = "gzip";
-   if (Member == 0) {
-      Member = Deb.GotoMember("data.tar.bz2");
-      Compressor = "bzip2";
-   }
-   if (Member == 0) {
-      Member = Deb.GotoMember("data.tar.lzma");
-      Compressor = "lzma";
-   }
-   if (Member == 0) {
-      _error->Error(_("Internal error, could not locate member %s"),
-		    "data.tar.{gz,bz2,lzma}");
-      return false;
-   }
-      
-   // Extract it.
-   ExtractTar Tar(Deb.GetFile(),Member->Size,Compressor);
-   if (Tar.Go(*this) == false)
-      return false;   
-   return true;   
+   return Deb.ExtractArchive(*this);
 }
 }
 									/*}}}*/
 									/*}}}*/
 // ContentsExtract::DoItem - Extract an item				/*{{{*/
 // ContentsExtract::DoItem - Extract an item				/*{{{*/

+ 28 - 30
ftparchive/multicompress.cc

@@ -30,12 +30,6 @@
 
 
 using namespace std;
 using namespace std;
 
 
-const MultiCompress::CompType MultiCompress::Compressors[] =
-      {{".","",0,0,0,1},
-       {"gzip",".gz","gzip","-9n","-d",2},
-       {"bzip2",".bz2","bzip2","-9","-d",3},
-       {"lzma",".lzma","lzma","-9","-d",4},
-       {}};
 
 
 // MultiCompress::MultiCompress - Constructor				/*{{{*/
 // MultiCompress::MultiCompress - Constructor				/*{{{*/
 // ---------------------------------------------------------------------
 // ---------------------------------------------------------------------
@@ -48,7 +42,7 @@ MultiCompress::MultiCompress(string const &Output,string const &Compress,
    Outputter = -1;
    Outputter = -1;
    Input = 0;
    Input = 0;
    UpdateMTime = 0;
    UpdateMTime = 0;
-   
+
    /* Parse the compression string, a space separated lists of compresison
    /* Parse the compression string, a space separated lists of compresison
       types */
       types */
    string::const_iterator I = Compress.begin();
    string::const_iterator I = Compress.begin();
@@ -61,13 +55,14 @@ MultiCompress::MultiCompress(string const &Output,string const &Compress,
       for (; I != Compress.end() && !isspace(*I); I++);
       for (; I != Compress.end() && !isspace(*I); I++);
 
 
       // Find the matching compressor
       // Find the matching compressor
-      const CompType *Comp = Compressors;
-      for (; Comp->Name != 0; Comp++)
-	 if (stringcmp(Start,I,Comp->Name) == 0)
+      std::vector<APT::Configuration::Compressor> Compressors = APT::Configuration::getCompressors();
+      std::vector<APT::Configuration::Compressor>::const_iterator Comp = Compressors.begin();
+      for (; Comp != Compressors.end(); ++Comp)
+	 if (stringcmp(Start,I,Comp->Name.c_str()) == 0)
 	    break;
 	    break;
 
 
       // Hmm.. unknown.
       // Hmm.. unknown.
-      if (Comp->Name == 0)
+      if (Comp == Compressors.end())
       {
       {
 	 _error->Warning(_("Unknown compression algorithm '%s'"),string(Start,I).c_str());
 	 _error->Warning(_("Unknown compression algorithm '%s'"),string(Start,I).c_str());
 	 continue;
 	 continue;
@@ -77,7 +72,7 @@ MultiCompress::MultiCompress(string const &Output,string const &Compress,
       Files *NewOut = new Files;
       Files *NewOut = new Files;
       NewOut->Next = Outputs;
       NewOut->Next = Outputs;
       Outputs = NewOut;
       Outputs = NewOut;
-      NewOut->CompressProg = Comp;
+      NewOut->CompressProg = *Comp;
       NewOut->Output = Output+Comp->Extension;
       NewOut->Output = Output+Comp->Extension;
       
       
       struct stat St;
       struct stat St;
@@ -141,13 +136,14 @@ bool MultiCompress::GetStat(string const &Output,string const &Compress,struct s
       for (; I != Compress.end() && !isspace(*I); I++);
       for (; I != Compress.end() && !isspace(*I); I++);
 
 
       // Find the matching compressor
       // Find the matching compressor
-      const CompType *Comp = Compressors;
-      for (; Comp->Name != 0; Comp++)
-	 if (stringcmp(Start,I,Comp->Name) == 0)
+      std::vector<APT::Configuration::Compressor> Compressors = APT::Configuration::getCompressors();
+      std::vector<APT::Configuration::Compressor>::const_iterator Comp = Compressors.begin();
+      for (; Comp != Compressors.end(); ++Comp)
+	 if (stringcmp(Start,I,Comp->Name.c_str()) == 0)
 	    break;
 	    break;
 
 
       // Hmm.. unknown.
       // Hmm.. unknown.
-      if (Comp->Name == 0)
+      if (Comp == Compressors.end())
 	 continue;
 	 continue;
 
 
       string Name = Output+Comp->Extension;
       string Name = Output+Comp->Extension;
@@ -268,13 +264,13 @@ bool MultiCompress::Finalize(unsigned long &OutSize)
 /* This opens the compressor, either in compress mode or decompress 
 /* This opens the compressor, either in compress mode or decompress 
    mode. FileFd is always the compressor input/output file, 
    mode. FileFd is always the compressor input/output file, 
    OutFd is the created pipe, Input for Compress, Output for Decompress. */
    OutFd is the created pipe, Input for Compress, Output for Decompress. */
-bool MultiCompress::OpenCompress(const CompType *Prog,pid_t &Pid,int const &FileFd,
-				 int &OutFd,bool const &Comp)
+bool MultiCompress::OpenCompress(APT::Configuration::Compressor const &Prog,
+				 pid_t &Pid,int const &FileFd,int &OutFd,bool const &Comp)
 {
 {
    Pid = -1;
    Pid = -1;
    
    
    // No compression
    // No compression
-   if (Prog->Binary == 0)
+   if (Prog.Binary.empty() == true)
    {
    {
       OutFd = dup(FileFd);
       OutFd = dup(FileFd);
       return true;
       return true;
@@ -309,15 +305,17 @@ bool MultiCompress::OpenCompress(const CompType *Prog,pid_t &Pid,int const &File
       
       
       SetCloseExec(STDOUT_FILENO,false);
       SetCloseExec(STDOUT_FILENO,false);
       SetCloseExec(STDIN_FILENO,false);
       SetCloseExec(STDIN_FILENO,false);
-      
-      const char *Args[3];
-      Args[0] = Prog->Binary;
-      if (Comp == true)
-	 Args[1] = Prog->CompArgs;
-      else
-	 Args[1] = Prog->UnCompArgs;
-      Args[2] = 0;
-      execvp(Args[0],(char **)Args);
+
+      std::vector<char const*> Args;
+      Args.push_back(Prog.Binary.c_str());
+      std::vector<std::string> const * const addArgs =
+		(Comp == true) ? &(Prog.CompressArgs) : &(Prog.UncompressArgs);
+      for (std::vector<std::string>::const_iterator a = addArgs->begin();
+	   a != addArgs->end(); ++a)
+	 Args.push_back(a->c_str());
+      Args.push_back(NULL);
+
+      execvp(Args[0],(char **)&Args[0]);
       cerr << _("Failed to exec compressor ") << Args[0] << endl;
       cerr << _("Failed to exec compressor ") << Args[0] << endl;
       _exit(100);
       _exit(100);
    };      
    };      
@@ -335,7 +333,7 @@ bool MultiCompress::OpenOld(int &Fd,pid_t &Proc)
 {
 {
    Files *Best = Outputs;
    Files *Best = Outputs;
    for (Files *I = Outputs; I != 0; I = I->Next)
    for (Files *I = Outputs; I != 0; I = I->Next)
-      if (Best->CompressProg->Cost > I->CompressProg->Cost)
+      if (Best->CompressProg.Cost > I->CompressProg.Cost)
 	 Best = I;
 	 Best = I;
 
 
    // Open the file
    // Open the file
@@ -414,7 +412,7 @@ bool MultiCompress::Child(int const &FD)
    for (Files *I = Outputs; I != 0; I = I->Next)
    for (Files *I = Outputs; I != 0; I = I->Next)
    {
    {
       if (I->CompressProc != -1)
       if (I->CompressProc != -1)
-	 ExecWait(I->CompressProc,I->CompressProg->Binary,false);
+	 ExecWait(I->CompressProc, I->CompressProg.Binary.c_str(), false);
    }
    }
    
    
    if (_error->PendingError() == true)
    if (_error->PendingError() == true)

+ 5 - 16
ftparchive/multicompress.h

@@ -20,28 +20,18 @@
 
 
 #include <string>
 #include <string>
 #include <apt-pkg/fileutl.h>
 #include <apt-pkg/fileutl.h>
+#include <apt-pkg/aptconfiguration.h>
 #include <stdio.h>
 #include <stdio.h>
 #include <sys/types.h>
 #include <sys/types.h>
     
     
 class MultiCompress
 class MultiCompress
 {
 {
-   // Enumeration of all supported compressors
-   struct CompType
-   {
-      const char *Name;
-      const char *Extension;
-      const char *Binary;
-      const char *CompArgs;
-      const char *UnCompArgs;
-      unsigned char Cost;
-   };
-
    // An output file
    // An output file
    struct Files
    struct Files
    {
    {
       string Output;
       string Output;
-      const CompType *CompressProg;
-      Files *Next;      
+      APT::Configuration::Compressor CompressProg;
+      Files *Next;
       FileFd TmpFile;
       FileFd TmpFile;
       pid_t CompressProc;
       pid_t CompressProc;
       time_t OldMTime;
       time_t OldMTime;
@@ -51,10 +41,9 @@ class MultiCompress
    Files *Outputs;
    Files *Outputs;
    pid_t Outputter;
    pid_t Outputter;
    mode_t Permissions;
    mode_t Permissions;
-   static const CompType Compressors[];
 
 
-   bool OpenCompress(const CompType *Prog,pid_t &Pid,int const &FileFd,
-		     int &OutFd,bool const &Comp);
+   bool OpenCompress(APT::Configuration::Compressor const &Prog,
+		     pid_t &Pid,int const &FileFd, int &OutFd,bool const &Comp);
    bool Child(int const &Fd);
    bool Child(int const &Fd);
    bool Start();
    bool Start();
    bool Die();
    bool Die();

+ 95 - 56
ftparchive/writer.cc

@@ -17,6 +17,7 @@
 #include <apt-pkg/strutl.h>
 #include <apt-pkg/strutl.h>
 #include <apt-pkg/error.h>
 #include <apt-pkg/error.h>
 #include <apt-pkg/configuration.h>
 #include <apt-pkg/configuration.h>
+#include <apt-pkg/aptconfiguration.h>
 #include <apt-pkg/md5.h>
 #include <apt-pkg/md5.h>
 #include <apt-pkg/sha1.h>
 #include <apt-pkg/sha1.h>
 #include <apt-pkg/sha256.h>
 #include <apt-pkg/sha256.h>
@@ -59,6 +60,10 @@ FTWScanner::FTWScanner(string const &Arch): Arch(Arch)
 {
 {
    ErrorPrinted = false;
    ErrorPrinted = false;
    NoLinkAct = !_config->FindB("APT::FTPArchive::DeLinkAct",true);
    NoLinkAct = !_config->FindB("APT::FTPArchive::DeLinkAct",true);
+
+   DoMD5 = _config->FindB("APT::FTPArchive::MD5",true);
+   DoSHA1 = _config->FindB("APT::FTPArchive::SHA1",true);
+   DoSHA256 = _config->FindB("APT::FTPArchive::SHA256",true);
 }
 }
 									/*}}}*/
 									/*}}}*/
 // FTWScanner::Scanner - FTW Scanner					/*{{{*/
 // FTWScanner::Scanner - FTW Scanner					/*{{{*/
@@ -308,9 +313,9 @@ PackagesWriter::PackagesWriter(string const &DB,string const &Overrides,string c
    DeLinkLimit = 0;
    DeLinkLimit = 0;
 
 
    // Process the command line options
    // Process the command line options
-   DoMD5 = _config->FindB("APT::FTPArchive::MD5",true);
-   DoSHA1 = _config->FindB("APT::FTPArchive::SHA1",true);
-   DoSHA256 = _config->FindB("APT::FTPArchive::SHA256",true);
+   DoMD5 = _config->FindB("APT::FTPArchive::Packages::MD5",DoMD5);
+   DoSHA1 = _config->FindB("APT::FTPArchive::Packages::SHA1",DoSHA1);
+   DoSHA256 = _config->FindB("APT::FTPArchive::Packages::SHA256",DoSHA256);
    DoAlwaysStat = _config->FindB("APT::FTPArchive::AlwaysStat", false);
    DoAlwaysStat = _config->FindB("APT::FTPArchive::AlwaysStat", false);
    DoContents = _config->FindB("APT::FTPArchive::Contents",true);
    DoContents = _config->FindB("APT::FTPArchive::Contents",true);
    NoOverride = _config->FindB("APT::FTPArchive::NoOverrideMsg",false);
    NoOverride = _config->FindB("APT::FTPArchive::NoOverrideMsg",false);
@@ -435,9 +440,12 @@ bool PackagesWriter::DoPackage(string FileName)
 
 
    unsigned int End = 0;
    unsigned int End = 0;
    SetTFRewriteData(Changes[End++], "Size", Size);
    SetTFRewriteData(Changes[End++], "Size", Size);
-   SetTFRewriteData(Changes[End++], "MD5sum", Db.MD5Res.c_str());
-   SetTFRewriteData(Changes[End++], "SHA1", Db.SHA1Res.c_str());
-   SetTFRewriteData(Changes[End++], "SHA256", Db.SHA256Res.c_str());
+   if (DoMD5 == true)
+      SetTFRewriteData(Changes[End++], "MD5sum", Db.MD5Res.c_str());
+   if (DoSHA1 == true)
+      SetTFRewriteData(Changes[End++], "SHA1", Db.SHA1Res.c_str());
+   if (DoSHA256 == true)
+      SetTFRewriteData(Changes[End++], "SHA256", Db.SHA256Res.c_str());
    SetTFRewriteData(Changes[End++], "Filename", NewFileName.c_str());
    SetTFRewriteData(Changes[End++], "Filename", NewFileName.c_str());
    SetTFRewriteData(Changes[End++], "Priority", OverItem->Priority.c_str());
    SetTFRewriteData(Changes[End++], "Priority", OverItem->Priority.c_str());
    SetTFRewriteData(Changes[End++], "Status", 0);
    SetTFRewriteData(Changes[End++], "Status", 0);
@@ -559,6 +567,9 @@ SourcesWriter::SourcesWriter(string const &BOverrides,string const &SOverrides,
    BufSize = 0;
    BufSize = 0;
    
    
    // Process the command line options
    // Process the command line options
+   DoMD5 = _config->FindB("APT::FTPArchive::Sources::MD5",DoMD5);
+   DoSHA1 = _config->FindB("APT::FTPArchive::Sources::SHA1",DoSHA1);
+   DoSHA256 = _config->FindB("APT::FTPArchive::Sources::SHA256",DoSHA256);
    NoOverride = _config->FindB("APT::FTPArchive::NoOverrideMsg",false);
    NoOverride = _config->FindB("APT::FTPArchive::NoOverrideMsg",false);
 
 
    // Read the override file
    // Read the override file
@@ -608,13 +619,17 @@ bool SourcesWriter::DoPackage(string FileName)
    // Hash the file
    // Hash the file
    char *Start = Buffer;
    char *Start = Buffer;
    char *BlkEnd = Buffer + St.st_size;
    char *BlkEnd = Buffer + St.st_size;
-   MD5Summation MD5;
-   MD5.Add((unsigned char *)Start,BlkEnd - Start);
 
 
+   MD5Summation MD5;
    SHA1Summation SHA1;
    SHA1Summation SHA1;
    SHA256Summation SHA256;
    SHA256Summation SHA256;
-   SHA1.Add((unsigned char *)Start,BlkEnd - Start);
-   SHA256.Add((unsigned char *)Start,BlkEnd - Start);
+
+   if (DoMD5 == true)
+      MD5.Add((unsigned char *)Start,BlkEnd - Start);
+   if (DoSHA1 == true)
+      SHA1.Add((unsigned char *)Start,BlkEnd - Start);
+   if (DoSHA256 == true)
+      SHA256.Add((unsigned char *)Start,BlkEnd - Start);
 
 
    // Add an extra \n to the end, just in case
    // Add an extra \n to the end, just in case
    *BlkEnd++ = '\n';
    *BlkEnd++ = '\n';
@@ -708,19 +723,19 @@ bool SourcesWriter::DoPackage(string FileName)
    // Add the dsc to the files hash list
    // Add the dsc to the files hash list
    string const strippedName = flNotDir(FileName);
    string const strippedName = flNotDir(FileName);
    std::ostringstream ostreamFiles;
    std::ostringstream ostreamFiles;
-   if (Tags.Exists("Files"))
+   if (DoMD5 == true && Tags.Exists("Files"))
       ostreamFiles << "\n " << string(MD5.Result()) << " " << St.st_size << " "
       ostreamFiles << "\n " << string(MD5.Result()) << " " << St.st_size << " "
 		   << strippedName << "\n " << Tags.FindS("Files");
 		   << strippedName << "\n " << Tags.FindS("Files");
    string const Files = ostreamFiles.str();
    string const Files = ostreamFiles.str();
 
 
    std::ostringstream ostreamSha1;
    std::ostringstream ostreamSha1;
-   if (Tags.Exists("Checksums-Sha1"))
+   if (DoSHA1 == true && Tags.Exists("Checksums-Sha1"))
       ostreamSha1 << "\n " << string(SHA1.Result()) << " " << St.st_size << " "
       ostreamSha1 << "\n " << string(SHA1.Result()) << " " << St.st_size << " "
 		   << strippedName << "\n " << Tags.FindS("Checksums-Sha1");
 		   << strippedName << "\n " << Tags.FindS("Checksums-Sha1");
    string const ChecksumsSha1 = ostreamSha1.str();
    string const ChecksumsSha1 = ostreamSha1.str();
 
 
    std::ostringstream ostreamSha256;
    std::ostringstream ostreamSha256;
-   if (Tags.Exists("Checksums-Sha256"))
+   if (DoSHA256 == true && Tags.Exists("Checksums-Sha256"))
       ostreamSha256 << "\n " << string(SHA256.Result()) << " " << St.st_size << " "
       ostreamSha256 << "\n " << string(SHA256.Result()) << " " << St.st_size << " "
 		   << strippedName << "\n " << Tags.FindS("Checksums-Sha256");
 		   << strippedName << "\n " << Tags.FindS("Checksums-Sha256");
    string const ChecksumsSha256 = ostreamSha256.str();
    string const ChecksumsSha256 = ostreamSha256.str();
@@ -774,9 +789,12 @@ bool SourcesWriter::DoPackage(string FileName)
 
 
    unsigned int End = 0;
    unsigned int End = 0;
    SetTFRewriteData(Changes[End++],"Source",Package.c_str(),"Package");
    SetTFRewriteData(Changes[End++],"Source",Package.c_str(),"Package");
-   SetTFRewriteData(Changes[End++],"Files",Files.c_str());
-   SetTFRewriteData(Changes[End++],"Checksums-Sha1",ChecksumsSha1.c_str());
-   SetTFRewriteData(Changes[End++],"Checksums-Sha256",ChecksumsSha256.c_str());
+   if (Files.empty() == false)
+      SetTFRewriteData(Changes[End++],"Files",Files.c_str());
+   if (ChecksumsSha1.empty() == false)
+      SetTFRewriteData(Changes[End++],"Checksums-Sha1",ChecksumsSha1.c_str());
+   if (ChecksumsSha256.empty() == false)
+      SetTFRewriteData(Changes[End++],"Checksums-Sha256",ChecksumsSha256.c_str());
    if (Directory != "./")
    if (Directory != "./")
       SetTFRewriteData(Changes[End++],"Directory",Directory.c_str());
       SetTFRewriteData(Changes[End++],"Directory",Directory.c_str());
    SetTFRewriteData(Changes[End++],"Priority",BestPrio.c_str());
    SetTFRewriteData(Changes[End++],"Priority",BestPrio.c_str());
@@ -913,10 +931,12 @@ ReleaseWriter::ReleaseWriter(string const &DB)
       AddPattern("Packages.gz");
       AddPattern("Packages.gz");
       AddPattern("Packages.bz2");
       AddPattern("Packages.bz2");
       AddPattern("Packages.lzma");
       AddPattern("Packages.lzma");
+      AddPattern("Packages.xz");
       AddPattern("Sources");
       AddPattern("Sources");
       AddPattern("Sources.gz");
       AddPattern("Sources.gz");
       AddPattern("Sources.bz2");
       AddPattern("Sources.bz2");
       AddPattern("Sources.lzma");
       AddPattern("Sources.lzma");
+      AddPattern("Sources.xz");
       AddPattern("Release");
       AddPattern("Release");
       AddPattern("Index");
       AddPattern("Index");
       AddPattern("md5sum.txt");
       AddPattern("md5sum.txt");
@@ -925,6 +945,9 @@ ReleaseWriter::ReleaseWriter(string const &DB)
 
 
    Output = stdout;
    Output = stdout;
    time_t const now = time(NULL);
    time_t const now = time(NULL);
+
+   setlocale(LC_TIME, "C");
+
    char datestr[128];
    char datestr[128];
    if (strftime(datestr, sizeof(datestr), "%a, %d %b %Y %H:%M:%S UTC",
    if (strftime(datestr, sizeof(datestr), "%a, %d %b %Y %H:%M:%S UTC",
                 gmtime(&now)) == 0)
                 gmtime(&now)) == 0)
@@ -941,6 +964,8 @@ ReleaseWriter::ReleaseWriter(string const &DB)
       validstr[0] = '\0';
       validstr[0] = '\0';
    }
    }
 
 
+   setlocale(LC_TIME, "");
+
    map<string,string> Fields;
    map<string,string> Fields;
    Fields["Origin"] = "";
    Fields["Origin"] = "";
    Fields["Label"] = "";
    Fields["Label"] = "";
@@ -964,6 +989,10 @@ ReleaseWriter::ReleaseWriter(string const &DB)
 
 
       fprintf(Output, "%s: %s\n", (*I).first.c_str(), Value.c_str());
       fprintf(Output, "%s: %s\n", (*I).first.c_str(), Value.c_str());
    }
    }
+
+   DoMD5 = _config->FindB("APT::FTPArchive::Release::MD5",DoMD5);
+   DoSHA1 = _config->FindB("APT::FTPArchive::Release::SHA1",DoSHA1);
+   DoSHA256 = _config->FindB("APT::FTPArchive::Release::SHA256",DoSHA256);
 }
 }
 									/*}}}*/
 									/*}}}*/
 // ReleaseWriter::DoPackage - Process a single package			/*{{{*/
 // ReleaseWriter::DoPackage - Process a single package			/*{{{*/
@@ -996,19 +1025,26 @@ bool ReleaseWriter::DoPackage(string FileName)
 
 
    CheckSums[NewFileName].size = fd.Size();
    CheckSums[NewFileName].size = fd.Size();
 
 
-   MD5Summation MD5;
-   MD5.AddFD(fd.Fd(), fd.Size());
-   CheckSums[NewFileName].MD5 = MD5.Result();
-
-   fd.Seek(0);
-   SHA1Summation SHA1;
-   SHA1.AddFD(fd.Fd(), fd.Size());
-   CheckSums[NewFileName].SHA1 = SHA1.Result();
-
-   fd.Seek(0);
-   SHA256Summation SHA256;
-   SHA256.AddFD(fd.Fd(), fd.Size());
-   CheckSums[NewFileName].SHA256 = SHA256.Result();
+   if (DoMD5 == true)
+   {
+      MD5Summation MD5;
+      MD5.AddFD(fd.Fd(), fd.Size());
+      CheckSums[NewFileName].MD5 = MD5.Result();
+      fd.Seek(0);
+   }
+   if (DoSHA1 == true)
+   {
+      SHA1Summation SHA1;
+      SHA1.AddFD(fd.Fd(), fd.Size());
+      CheckSums[NewFileName].SHA1 = SHA1.Result();
+      fd.Seek(0);
+   }
+   if (DoSHA256 == true)
+   {
+      SHA256Summation SHA256;
+      SHA256.AddFD(fd.Fd(), fd.Size());
+      CheckSums[NewFileName].SHA256 = SHA256.Result();
+   }
 
 
    fd.Close();
    fd.Close();
    
    
@@ -1020,37 +1056,40 @@ bool ReleaseWriter::DoPackage(string FileName)
 // ---------------------------------------------------------------------
 // ---------------------------------------------------------------------
 void ReleaseWriter::Finish()
 void ReleaseWriter::Finish()
 {
 {
-   fprintf(Output, "MD5Sum:\n");
-   for(map<string,struct CheckSum>::const_iterator I = CheckSums.begin();
-       I != CheckSums.end();
-       ++I)
+   if (DoMD5 == true)
    {
    {
-      fprintf(Output, " %s %16ld %s\n",
-              (*I).second.MD5.c_str(),
-              (*I).second.size,
-              (*I).first.c_str());
+      fprintf(Output, "MD5Sum:\n");
+      for(map<string,struct CheckSum>::const_iterator I = CheckSums.begin();
+	  I != CheckSums.end(); ++I)
+      {
+	 fprintf(Output, " %s %16ld %s\n",
+		 (*I).second.MD5.c_str(),
+		 (*I).second.size,
+		 (*I).first.c_str());
+      }
    }
    }
-
-   fprintf(Output, "SHA1:\n");
-   for(map<string,struct CheckSum>::const_iterator I = CheckSums.begin();
-       I != CheckSums.end();
-       ++I)
+   if (DoSHA1 == true)
    {
    {
-      fprintf(Output, " %s %16ld %s\n",
-              (*I).second.SHA1.c_str(),
-              (*I).second.size,
-              (*I).first.c_str());
+      fprintf(Output, "SHA1:\n");
+      for(map<string,struct CheckSum>::const_iterator I = CheckSums.begin();
+	  I != CheckSums.end(); ++I)
+      {
+	 fprintf(Output, " %s %16ld %s\n",
+		 (*I).second.SHA1.c_str(),
+		 (*I).second.size,
+		 (*I).first.c_str());
+      }
    }
    }
-
-   fprintf(Output, "SHA256:\n");
-   for(map<string,struct CheckSum>::const_iterator I = CheckSums.begin();
-       I != CheckSums.end();
-       ++I)
+   if (DoSHA256 == true)
    {
    {
-      fprintf(Output, " %s %16ld %s\n",
-              (*I).second.SHA256.c_str(),
-              (*I).second.size,
-              (*I).first.c_str());
+      fprintf(Output, "SHA256:\n");
+      for(map<string,struct CheckSum>::const_iterator I = CheckSums.begin();
+	  I != CheckSums.end(); ++I)
+      {
+	 fprintf(Output, " %s %16ld %s\n",
+		 (*I).second.SHA256.c_str(),
+		 (*I).second.size,
+		 (*I).first.c_str());
+      }
    }
    }
 }
 }
-

+ 3 - 3
ftparchive/writer.h

@@ -60,6 +60,9 @@ class FTWScanner
    }
    }
    
    
    public:
    public:
+   bool DoMD5;
+   bool DoSHA1;
+   bool DoSHA256;
 
 
    unsigned long DeLinkLimit;
    unsigned long DeLinkLimit;
    string InternalPrefix;
    string InternalPrefix;
@@ -103,9 +106,6 @@ class PackagesWriter : public FTWScanner
    public:
    public:
 
 
    // Some flags
    // Some flags
-   bool DoMD5;
-   bool DoSHA1;
-   bool DoSHA256;
    bool DoAlwaysStat;
    bool DoAlwaysStat;
    bool NoOverride;
    bool NoOverride;
    bool DoContents;
    bool DoContents;

+ 8 - 2
methods/makefile

@@ -94,8 +94,8 @@ SOURCE = bzip2.cc
 include $(PROGRAM_H)
 include $(PROGRAM_H)
 
 
 # SSH and lzma method symlink
 # SSH and lzma method symlink
-binary: $(BIN)/ssh $(BIN)/lzma
-veryclean: clean-$(BIN)/ssh clean-$(BIN)/lzma
+binary: $(BIN)/ssh $(BIN)/lzma $(BIN)/xz
+veryclean: clean-$(BIN)/ssh clean-$(BIN)/lzma clean-$(BIN)/xz
 
 
 $(BIN)/ssh:
 $(BIN)/ssh:
 	echo "Installing ssh method link"
 	echo "Installing ssh method link"
@@ -108,3 +108,9 @@ $(BIN)/lzma:
 	ln -fs bzip2 $(BIN)/lzma
 	ln -fs bzip2 $(BIN)/lzma
 clean-$(BIN)/lzma:
 clean-$(BIN)/lzma:
 	-rm $(BIN)/lzma
 	-rm $(BIN)/lzma
+
+$(BIN)/xz:
+	echo "Installing xz method link"
+	ln -fs bzip2 $(BIN)/xz
+clean-$(BIN)/xz:
+	-rm $(BIN)/xz

+ 5 - 4
test/integration/framework

@@ -328,10 +328,10 @@ createaptftparchiveconfig() {
 	echo -n '";
 	echo -n '";
 };
 };
 Default {
 Default {
-	Packages::Compress ". gzip bzip2 lzma";
-	Sources::Compress ". gzip bzip2 lzma";
-	Contents::Compress ". gzip bzip2 lzma";
-	Translation::Compress ". gzip bzip2 lzma";
+	Packages::Compress ". gzip bzip2 lzma xz";
+	Sources::Compress ". gzip bzip2 lzma xz";
+	Contents::Compress ". gzip bzip2 lzma xz";
+	Translation::Compress ". gzip bzip2 lzma xz";
 	LongDescription "false";
 	LongDescription "false";
 };
 };
 TreeDefault {
 TreeDefault {
@@ -438,6 +438,7 @@ buildaptarchivefromfiles() {
 		cat ${line} | gzip > ${line}.gz
 		cat ${line} | gzip > ${line}.gz
 		cat ${line} | bzip2 > ${line}.bz2
 		cat ${line} | bzip2 > ${line}.bz2
 		cat ${line} | lzma > ${line}.lzma
 		cat ${line} | lzma > ${line}.lzma
+		cat ${line} | xz > ${line}.xz
 		msgdone "info"
 		msgdone "info"
 	done
 	done
 	generatereleasefiles
 	generatereleasefiles

+ 2 - 2
test/integration/test-bug-549968-install-depends-of-not-installed

@@ -22,5 +22,5 @@ Package extracoolstuff is not installed, so not removed
 The following NEW packages will be installed:
 The following NEW packages will be installed:
   coolstuff
   coolstuff
 0 upgraded, 1 newly installed, 0 to remove and 0 not upgraded.
 0 upgraded, 1 newly installed, 0 to remove and 0 not upgraded.
-Inst coolstuff (1.0 unstable [all])
-Conf coolstuff (1.0 unstable [all])' aptget install coolstuff extracoolstuff- -o Debug::pkgDepCache::Marker=1 -s
+Inst coolstuff (1.0 unstable [i386])
+Conf coolstuff (1.0 unstable [i386])' aptget install coolstuff extracoolstuff- -o Debug::pkgDepCache::Marker=1 -s

+ 4 - 4
test/integration/test-bug-590438-broken-provides-thanks-to-remove-order

@@ -62,13 +62,13 @@ predependsgawk2() {
 	echo "$pkgbasefile
 	echo "$pkgbasefile
 Pre-Depends: $1
 Pre-Depends: $1
 " >> rootdir/var/lib/dpkg/status
 " >> rootdir/var/lib/dpkg/status
-	testequalor2 "Inst coolstuff (1-1 localhost [all])
-Conf coolstuff (1-1 localhost [all])
+	testequalor2 "Inst coolstuff (1-1 localhost [i386])
+Conf coolstuff (1-1 localhost [i386])
 Inst gawk2 (1:3.1.7.dfsg-5 localhost [i386])
 Inst gawk2 (1:3.1.7.dfsg-5 localhost [i386])
 Conf gawk2 (1:3.1.7.dfsg-5 localhost [i386])
 Conf gawk2 (1:3.1.7.dfsg-5 localhost [i386])
-Remv mawk [1.3.3-15]" "Inst coolstuff (1-1 localhost [all])
+Remv mawk [1.3.3-15]" "Inst coolstuff (1-1 localhost [i386])
 Inst gawk2 (1:3.1.7.dfsg-5 localhost [i386])
 Inst gawk2 (1:3.1.7.dfsg-5 localhost [i386])
-Conf coolstuff (1-1 localhost [all])
+Conf coolstuff (1-1 localhost [i386])
 Conf gawk2 (1:3.1.7.dfsg-5 localhost [i386])
 Conf gawk2 (1:3.1.7.dfsg-5 localhost [i386])
 Remv mawk [1.3.3-15]" aptget install gawk2 mawk- -sqq -o PreDepends=$(echo "$1" | sed 's/ //g')
 Remv mawk [1.3.3-15]" aptget install gawk2 mawk- -sqq -o PreDepends=$(echo "$1" | sed 's/ //g')
 }
 }

+ 8 - 8
test/integration/test-bug-593360-modifiers-in-names

@@ -36,29 +36,29 @@ Building dependency tree...
 The following NEW packages will be installed:
 The following NEW packages will be installed:
   apt
   apt
 0 upgraded, 1 newly installed, 0 to remove and 0 not upgraded.
 0 upgraded, 1 newly installed, 0 to remove and 0 not upgraded.
-Inst apt (0.8.8 localhost [all])
-Conf apt (0.8.8 localhost [all])' aptget install apt -s
+Inst apt (0.8.8 localhost [i386])
+Conf apt (0.8.8 localhost [i386])' aptget install apt -s
 
 
 testequal 'Reading package lists...
 testequal 'Reading package lists...
 Building dependency tree...
 Building dependency tree...
 The following NEW packages will be installed:
 The following NEW packages will be installed:
   apt+
   apt+
 0 upgraded, 1 newly installed, 0 to remove and 0 not upgraded.
 0 upgraded, 1 newly installed, 0 to remove and 0 not upgraded.
-Inst apt+ (0.8.8 localhost [all])
-Conf apt+ (0.8.8 localhost [all])' aptget install apt+ -s
+Inst apt+ (0.8.8 localhost [i386])
+Conf apt+ (0.8.8 localhost [i386])' aptget install apt+ -s
 
 
 testequal 'Reading package lists...
 testequal 'Reading package lists...
 Building dependency tree...
 Building dependency tree...
 The following NEW packages will be installed:
 The following NEW packages will be installed:
   apt+
   apt+
 0 upgraded, 1 newly installed, 0 to remove and 0 not upgraded.
 0 upgraded, 1 newly installed, 0 to remove and 0 not upgraded.
-Inst apt+ (0.8.8 localhost [all])
-Conf apt+ (0.8.8 localhost [all])' aptget install apt++ -s
+Inst apt+ (0.8.8 localhost [i386])
+Conf apt+ (0.8.8 localhost [i386])' aptget install apt++ -s
 
 
 testequal 'Reading package lists...
 testequal 'Reading package lists...
 Building dependency tree...
 Building dependency tree...
 The following NEW packages will be installed:
 The following NEW packages will be installed:
   apt+
   apt+
 0 upgraded, 1 newly installed, 0 to remove and 0 not upgraded.
 0 upgraded, 1 newly installed, 0 to remove and 0 not upgraded.
-Inst apt+ (0.8.8 localhost [all])
-Conf apt+ (0.8.8 localhost [all])' aptget purge apt++ -s
+Inst apt+ (0.8.8 localhost [i386])
+Conf apt+ (0.8.8 localhost [i386])' aptget purge apt++ -s

+ 5 - 3
test/integration/test-bug-595691-empty-and-broken-archive-files

@@ -54,12 +54,14 @@ setupcompressor() {
 	gzip) COMPRESS="gz";;
 	gzip) COMPRESS="gz";;
 	bzip2) COMPRESS="bz2";;
 	bzip2) COMPRESS="bz2";;
 	lzma) COMPRESS="lzma";;
 	lzma) COMPRESS="lzma";;
+	xz) COMPRESS="xz";;
 	esac
 	esac
 	echo "Acquire::CompressionTypes::Order { \"${COMPRESS}\"; };
 	echo "Acquire::CompressionTypes::Order { \"${COMPRESS}\"; };
 Dir::Bin::uncompressed \"/does/not/exist\";
 Dir::Bin::uncompressed \"/does/not/exist\";
 Dir::Bin::gzip \"/does/not/exist\";
 Dir::Bin::gzip \"/does/not/exist\";
 Dir::Bin::bzip2 \"/does/not/exist\";
 Dir::Bin::bzip2 \"/does/not/exist\";
-Dir::Bin::lzma \"/does/not/exist\";" > rootdir/etc/apt/apt.conf.d/00compressor
+Dir::Bin::lzma \"/does/not/exist\";
+Dir::Bin::xz \"/does/not/exist\";" > rootdir/etc/apt/apt.conf.d/00compressor
 	if [ -e "/bin/${COMPRESSOR}" ]; then
 	if [ -e "/bin/${COMPRESSOR}" ]; then
 		echo "Dir::Bin::${COMPRESSOR} \"/bin/${COMPRESSOR}\";" >> rootdir/etc/apt/apt.conf.d/00compressor
 		echo "Dir::Bin::${COMPRESSOR} \"/bin/${COMPRESSOR}\";" >> rootdir/etc/apt/apt.conf.d/00compressor
 	elif [ -e "/usr/bin/${COMPRESSOR}" ]; then
 	elif [ -e "/usr/bin/${COMPRESSOR}" ]; then
@@ -134,9 +136,9 @@ W: Failed to fetch ${COMPRESSOR}:$(readlink -f rootdir/var/lib/apt/lists/partial
 E: Some index files failed to download. They have been ignored, or old ones used instead." "empty file Packages.$COMPRESS over http"
 E: Some index files failed to download. They have been ignored, or old ones used instead." "empty file Packages.$COMPRESS over http"
 }
 }
 
 
-for COMPRESSOR in 'gzip' 'bzip2' 'lzma'; do testoverfile $COMPRESSOR; done
+for COMPRESSOR in 'gzip' 'bzip2' 'lzma' 'xz'; do testoverfile $COMPRESSOR; done
 
 
 # do the same again with http instead of file
 # do the same again with http instead of file
 changetowebserver
 changetowebserver
 
 
-for COMPRESSOR in 'gzip' 'bzip2' 'lzma'; do testoverhttp $COMPRESSOR; done
+for COMPRESSOR in 'gzip' 'bzip2' 'lzma' 'xz'; do testoverhttp $COMPRESSOR; done

+ 40 - 37
test/integration/test-bug-612099-multiarch-conflicts

@@ -59,29 +59,27 @@ Inst foobar:amd64 (1.0 stable [amd64])
 Conf libc6:amd64 (1.0 stable [amd64])
 Conf libc6:amd64 (1.0 stable [amd64])
 Conf foobar:amd64 (1.0 stable [amd64])' aptget install foobar:amd64 -st stable
 Conf foobar:amd64 (1.0 stable [amd64])' aptget install foobar:amd64 -st stable
 
 
-# FIXME: libc6:i386 is installed, we are switching to libc6:all
 testequal 'Reading package lists...
 testequal 'Reading package lists...
 Building dependency tree...
 Building dependency tree...
 Reading state information...
 Reading state information...
-The following extra packages will be installed:
-  libc6
 The following NEW packages will be installed:
 The following NEW packages will be installed:
-  foobar libc6
-0 upgraded, 2 newly installed, 0 to remove and 0 not upgraded.
-Inst libc6 (2.0 testing, testing [all])
+  foobar
+The following packages will be upgraded:
+  libc6
+1 upgraded, 1 newly installed, 0 to remove and 0 not upgraded.
+Inst libc6 [1.0] (2.0 testing [i386])
 Inst foobar (1.0 stable [i386])
 Inst foobar (1.0 stable [i386])
-Conf libc6 (2.0 testing, testing [all])
+Conf libc6 (2.0 testing [i386])
 Conf foobar (1.0 stable [i386])' aptget install foobar/stable libc6 -st testing
 Conf foobar (1.0 stable [i386])' aptget install foobar/stable libc6 -st testing
 
 
-# FIXME: libc6:i386 is installed, we are switching to libc6:all
 testequal 'Reading package lists...
 testequal 'Reading package lists...
 Building dependency tree...
 Building dependency tree...
 Reading state information...
 Reading state information...
-The following NEW packages will be installed:
+The following packages will be upgraded:
   libc6
   libc6
-0 upgraded, 1 newly installed, 0 to remove and 0 not upgraded.
-Inst libc6 (2.0 testing, testing [all])
-Conf libc6 (2.0 testing, testing [all])' aptget upgrade -t testing -s
+1 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.
+Inst libc6 [1.0] (2.0 testing [i386])
+Conf libc6 (2.0 testing [i386])' aptget upgrade -t testing -s
 aptget upgrade -y -qq 2>&1 > /dev/null
 aptget upgrade -y -qq 2>&1 > /dev/null
 testdpkginstalled libc6
 testdpkginstalled libc6
 
 
@@ -91,31 +89,34 @@ Reading state information...
 The following NEW packages will be installed:
 The following NEW packages will be installed:
   foobar
   foobar
 0 upgraded, 1 newly installed, 0 to remove and 0 not upgraded.
 0 upgraded, 1 newly installed, 0 to remove and 0 not upgraded.
-Inst foobar (1.0 stable [i386]) []
+Inst foobar (1.0 stable [i386])
 Conf foobar (1.0 stable [i386])' aptget install foobar/stable -st testing
 Conf foobar (1.0 stable [i386])' aptget install foobar/stable -st testing
 
 
 testequal 'Reading package lists...
 testequal 'Reading package lists...
 Building dependency tree...
 Building dependency tree...
 Reading state information...
 Reading state information...
+The following extra packages will be installed:
+  libc6:amd64
+The following packages will be REMOVED:
+  libc6
 The following NEW packages will be installed:
 The following NEW packages will be installed:
-  foobar:amd64
-0 upgraded, 1 newly installed, 0 to remove and 0 not upgraded.
+  foobar:amd64 libc6:amd64
+0 upgraded, 2 newly installed, 1 to remove and 0 not upgraded.
+Remv libc6 [2.0]
+Inst libc6:amd64 (1.0 stable [amd64])
 Inst foobar:amd64 (1.0 stable [amd64])
 Inst foobar:amd64 (1.0 stable [amd64])
+Conf libc6:amd64 (1.0 stable [amd64])
 Conf foobar:amd64 (1.0 stable [amd64])' aptget install foobar:amd64/stable -st testing
 Conf foobar:amd64 (1.0 stable [amd64])' aptget install foobar:amd64/stable -st testing
 
 
 
 
-# FIXME: the display is a strange (its a downgrade), but the handling itself correct
 testequal "Reading package lists...
 testequal "Reading package lists...
 Building dependency tree...
 Building dependency tree...
 Reading state information...
 Reading state information...
 Selected version '1.0' (stable [i386]) for 'libc6'
 Selected version '1.0' (stable [i386]) for 'libc6'
-The following packages will be REMOVED:
+The following packages will be DOWNGRADED:
   libc6
   libc6
-The following NEW packages will be installed:
-  libc6
-0 upgraded, 1 newly installed, 2 to remove and 0 not upgraded.
-Remv libc6 [2.0]
-Inst libc6 (1.0 stable [i386])
+0 upgraded, 0 newly installed, 1 downgraded, 0 to remove and 0 not upgraded.
+Inst libc6 [2.0] (1.0 stable [i386])
 Conf libc6 (1.0 stable [i386])" aptget install libc6/stable -s -q=0
 Conf libc6 (1.0 stable [i386])" aptget install libc6/stable -s -q=0
 
 
 
 
@@ -164,30 +165,25 @@ Conf libc6-same:amd64 (1.0 stable [amd64])' aptget install libc6-same:amd64 -s -
 
 
 # FIXME: We should test installing libc6-same:amd64 here, but dpkg doesn't allow it currently
 # FIXME: We should test installing libc6-same:amd64 here, but dpkg doesn't allow it currently
 
 
-# FIXME: upgrade any to all as above
 testequal 'Reading package lists...
 testequal 'Reading package lists...
 Building dependency tree...
 Building dependency tree...
 Reading state information...
 Reading state information...
-The following NEW packages will be installed:
+The following packages will be upgraded:
   libc6-same
   libc6-same
-0 upgraded, 1 newly installed, 0 to remove and 0 not upgraded.
-Inst libc6-same (2.0 testing, testing [all])
-Conf libc6-same (2.0 testing, testing [all])' aptget upgrade -t testing -s
+1 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.
+Inst libc6-same [1.0] (2.0 testing [i386])
+Conf libc6-same (2.0 testing [i386])' aptget upgrade -t testing -s
 aptget upgrade -y -qq 2>&1 > /dev/null
 aptget upgrade -y -qq 2>&1 > /dev/null
 testdpkginstalled libc6-same
 testdpkginstalled libc6-same
 
 
-# FIXME: the display is a strange (its a downgrade), but the handling itself correct
 testequal "Reading package lists...
 testequal "Reading package lists...
 Building dependency tree...
 Building dependency tree...
 Reading state information...
 Reading state information...
 Selected version '1.0' (stable [i386]) for 'libc6-same'
 Selected version '1.0' (stable [i386]) for 'libc6-same'
-The following packages will be REMOVED:
+The following packages will be DOWNGRADED:
   libc6-same
   libc6-same
-The following NEW packages will be installed:
-  libc6-same
-0 upgraded, 1 newly installed, 2 to remove and 0 not upgraded.
-Remv libc6-same [2.0]
-Inst libc6-same (1.0 stable [i386])
+0 upgraded, 0 newly installed, 1 downgraded, 0 to remove and 0 not upgraded.
+Inst libc6-same [2.0] (1.0 stable [i386])
 Conf libc6-same (1.0 stable [i386])" aptget install libc6-same/stable -s -q=0
 Conf libc6-same (1.0 stable [i386])" aptget install libc6-same/stable -s -q=0
 
 
 testequal 'Reading package lists...
 testequal 'Reading package lists...
@@ -196,14 +192,21 @@ Reading state information...
 The following NEW packages will be installed:
 The following NEW packages will be installed:
   foobar-same
   foobar-same
 0 upgraded, 1 newly installed, 0 to remove and 0 not upgraded.
 0 upgraded, 1 newly installed, 0 to remove and 0 not upgraded.
-Inst foobar-same (1.0 stable [i386]) []
+Inst foobar-same (1.0 stable [i386])
 Conf foobar-same (1.0 stable [i386])' aptget install foobar-same/stable -st testing
 Conf foobar-same (1.0 stable [i386])' aptget install foobar-same/stable -st testing
 
 
 testequal 'Reading package lists...
 testequal 'Reading package lists...
 Building dependency tree...
 Building dependency tree...
 Reading state information...
 Reading state information...
+The following extra packages will be installed:
+  libc6-same:amd64
+The following packages will be REMOVED:
+  libc6-same
 The following NEW packages will be installed:
 The following NEW packages will be installed:
-  foobar-same:amd64
-0 upgraded, 1 newly installed, 0 to remove and 0 not upgraded.
+  foobar-same:amd64 libc6-same:amd64
+0 upgraded, 2 newly installed, 1 to remove and 0 not upgraded.
+Remv libc6-same [2.0]
+Inst libc6-same:amd64 (1.0 stable [amd64])
 Inst foobar-same:amd64 (1.0 stable [amd64])
 Inst foobar-same:amd64 (1.0 stable [amd64])
+Conf libc6-same:amd64 (1.0 stable [amd64])
 Conf foobar-same:amd64 (1.0 stable [amd64])' aptget install foobar-same:amd64/stable -st testing
 Conf foobar-same:amd64 (1.0 stable [amd64])' aptget install foobar-same:amd64/stable -st testing

+ 15 - 15
test/integration/test-release-candidate-switching

@@ -95,7 +95,7 @@ E: Trivial Only specified but this is not a trivial operation." aptget install a
 testequal "Reading package lists...
 testequal "Reading package lists...
 Building dependency tree...
 Building dependency tree...
 Selected version '2.3.2-2+exp' (experimental [i386]) for 'amarok'
 Selected version '2.3.2-2+exp' (experimental [i386]) for 'amarok'
-Selected version '2.3.2-2+exp' (experimental [all]) for 'amarok-common' because of 'amarok'
+Selected version '2.3.2-2+exp' (experimental [i386]) for 'amarok-common' because of 'amarok'
 Selected version '2.3.2-2+exp' (experimental [i386]) for 'amarok-utils' because of 'amarok'
 Selected version '2.3.2-2+exp' (experimental [i386]) for 'amarok-utils' because of 'amarok'
 The following extra packages will be installed:
 The following extra packages will be installed:
    amarok-common (2.3.2-2+exp)
    amarok-common (2.3.2-2+exp)
@@ -117,7 +117,7 @@ E: Trivial Only specified but this is not a trivial operation." aptget install a
 testequal "Reading package lists...
 testequal "Reading package lists...
 Building dependency tree...
 Building dependency tree...
 Selected version '2.3.2-2+exp' (experimental [i386]) for 'amarok-null'
 Selected version '2.3.2-2+exp' (experimental [i386]) for 'amarok-null'
-Selected version '2.3.2-2+exp' (experimental [all]) for 'amarok-common' because of 'amarok-null'
+Selected version '2.3.2-2+exp' (experimental [i386]) for 'amarok-common' because of 'amarok-null'
 Selected version '2.3.2-2+exp' (experimental [i386]) for 'amarok-utils' because of 'amarok-null'
 Selected version '2.3.2-2+exp' (experimental [i386]) for 'amarok-utils' because of 'amarok-null'
 The following extra packages will be installed:
 The following extra packages will be installed:
    amarok-common (2.3.2-2+exp)
    amarok-common (2.3.2-2+exp)
@@ -140,7 +140,7 @@ E: Trivial Only specified but this is not a trivial operation." aptget install a
 testequal "Reading package lists...
 testequal "Reading package lists...
 Building dependency tree...
 Building dependency tree...
 Selected version '2.3.2-2+exp' (experimental [i386]) for 'amarok'
 Selected version '2.3.2-2+exp' (experimental [i386]) for 'amarok'
-Selected version '2.3.2-2+exp' (experimental [all]) for 'amarok-common' because of 'amarok'
+Selected version '2.3.2-2+exp' (experimental [i386]) for 'amarok-common' because of 'amarok'
 Selected version '2.3.2-2+exp' (experimental [i386]) for 'amarok-utils' because of 'amarok'
 Selected version '2.3.2-2+exp' (experimental [i386]) for 'amarok-utils' because of 'amarok'
 Selected version '2.3.2-2+exp' (experimental [i386]) for 'amarok-null'
 Selected version '2.3.2-2+exp' (experimental [i386]) for 'amarok-null'
 The following extra packages will be installed:
 The following extra packages will be installed:
@@ -170,7 +170,7 @@ Building dependency tree...
 Selected version '2.3.2-2+exp' (experimental2 [i386]) for 'amarok-less'
 Selected version '2.3.2-2+exp' (experimental2 [i386]) for 'amarok-less'
 Selected version '5:4.6.0+exp' (experimental [i386]) for 'phonon-backend-xine' because of 'amarok-less'
 Selected version '5:4.6.0+exp' (experimental [i386]) for 'phonon-backend-xine' because of 'amarok-less'
 Selected version '2.3.2-2+exp' (experimental [i386]) for 'amarok-higher'
 Selected version '2.3.2-2+exp' (experimental [i386]) for 'amarok-higher'
-Selected version '2.3.2-2+exp' (experimental [all]) for 'amarok-common' because of 'amarok-higher'
+Selected version '2.3.2-2+exp' (experimental [i386]) for 'amarok-common' because of 'amarok-higher'
 Selected version '5:4.6.0+exp' (experimental [i386]) for 'phonon-backend-xine' because of 'amarok-higher'
 Selected version '5:4.6.0+exp' (experimental [i386]) for 'phonon-backend-xine' because of 'amarok-higher'
 Selected version '2.3.2-2+exp' (experimental [i386]) for 'amarok-utils' because of 'amarok-higher'
 Selected version '2.3.2-2+exp' (experimental [i386]) for 'amarok-utils' because of 'amarok-higher'
 The following extra packages will be installed:
 The following extra packages will be installed:
@@ -195,7 +195,7 @@ E: Trivial Only specified but this is not a trivial operation." aptget install a
 testequal "Reading package lists...
 testequal "Reading package lists...
 Building dependency tree...
 Building dependency tree...
 Selected version '2.3.2-2+exp' (experimental [i386]) for 'amarok-null2'
 Selected version '2.3.2-2+exp' (experimental [i386]) for 'amarok-null2'
-Selected version '2.3.2-2+exp' (experimental [all]) for 'amarok-common' because of 'amarok-null2'
+Selected version '2.3.2-2+exp' (experimental [i386]) for 'amarok-common' because of 'amarok-null2'
 Selected version '2.3.2-2+exp' (experimental [i386]) for 'amarok-utils' because of 'amarok-null2'
 Selected version '2.3.2-2+exp' (experimental [i386]) for 'amarok-utils' because of 'amarok-null2'
 The following extra packages will be installed:
 The following extra packages will be installed:
    amarok-common (2.3.2-2+exp)
    amarok-common (2.3.2-2+exp)
@@ -218,7 +218,7 @@ E: Trivial Only specified but this is not a trivial operation." aptget install a
 testequal "Reading package lists...
 testequal "Reading package lists...
 Building dependency tree...
 Building dependency tree...
 Selected version '2.3.2-2+exp' (experimental [i386]) for 'amarok-xine'
 Selected version '2.3.2-2+exp' (experimental [i386]) for 'amarok-xine'
-Selected version '2.3.2-2+exp' (experimental [all]) for 'amarok-common' because of 'amarok-xine'
+Selected version '2.3.2-2+exp' (experimental [i386]) for 'amarok-common' because of 'amarok-xine'
 Selected version '5:4.6.0+exp' (experimental [i386]) for 'phonon-backend-xine' because of 'amarok-xine'
 Selected version '5:4.6.0+exp' (experimental [i386]) for 'phonon-backend-xine' because of 'amarok-xine'
 Selected version '2.3.2-2+exp' (experimental [i386]) for 'amarok-utils' because of 'amarok-xine'
 Selected version '2.3.2-2+exp' (experimental [i386]) for 'amarok-utils' because of 'amarok-xine'
 The following extra packages will be installed:
 The following extra packages will be installed:
@@ -242,7 +242,7 @@ E: Trivial Only specified but this is not a trivial operation." aptget install a
 testequal "Reading package lists...
 testequal "Reading package lists...
 Building dependency tree...
 Building dependency tree...
 Selected version '2.3.2-2+exp' (experimental [i386]) for 'amarok-xine2'
 Selected version '2.3.2-2+exp' (experimental [i386]) for 'amarok-xine2'
-Selected version '2.3.2-2+exp' (experimental [all]) for 'amarok-common' because of 'amarok-xine2'
+Selected version '2.3.2-2+exp' (experimental [i386]) for 'amarok-common' because of 'amarok-xine2'
 Selected version '5:4.20.0+exp' (experimental [i386]) for 'phonon-backend-null' because of 'amarok-xine2'
 Selected version '5:4.20.0+exp' (experimental [i386]) for 'phonon-backend-null' because of 'amarok-xine2'
 Selected version '2.3.2-2+exp' (experimental [i386]) for 'amarok-utils' because of 'amarok-xine2'
 Selected version '2.3.2-2+exp' (experimental [i386]) for 'amarok-utils' because of 'amarok-xine2'
 The following extra packages will be installed:
 The following extra packages will be installed:
@@ -266,9 +266,9 @@ E: Trivial Only specified but this is not a trivial operation." aptget install a
 testequal "Reading package lists...
 testequal "Reading package lists...
 Building dependency tree...
 Building dependency tree...
 Selected version '2.3.2-2+exp' (experimental [i386]) for 'amarok-xine3'
 Selected version '2.3.2-2+exp' (experimental [i386]) for 'amarok-xine3'
-Selected version '2.3.2-2+exp' (experimental [all]) for 'amarok-common' because of 'amarok-xine3'
+Selected version '2.3.2-2+exp' (experimental [i386]) for 'amarok-common' because of 'amarok-xine3'
 Selected version '5:4.6.0+exp' (experimental [i386]) for 'phonon-backend-xine3' because of 'amarok-xine3'
 Selected version '5:4.6.0+exp' (experimental [i386]) for 'phonon-backend-xine3' because of 'amarok-xine3'
-Selected version '2.0' (experimental [all]) for 'intermediatepkg' because of 'phonon-backend-xine3'
+Selected version '2.0' (experimental [i386]) for 'intermediatepkg' because of 'phonon-backend-xine3'
 Selected version '2.3.2-2+exp' (experimental [i386]) for 'amarok-utils' because of 'amarok-xine3'
 Selected version '2.3.2-2+exp' (experimental [i386]) for 'amarok-utils' because of 'amarok-xine3'
 The following extra packages will be installed:
 The following extra packages will be installed:
    amarok-common (2.3.2-2+exp)
    amarok-common (2.3.2-2+exp)
@@ -293,7 +293,7 @@ E: Trivial Only specified but this is not a trivial operation." aptget install a
 testequal "Reading package lists...
 testequal "Reading package lists...
 Building dependency tree...
 Building dependency tree...
 Selected version '2.3.2-2+exp' (experimental [i386]) for 'amarok-xine4'
 Selected version '2.3.2-2+exp' (experimental [i386]) for 'amarok-xine4'
-Selected version '2.3.2-2+exp' (experimental [all]) for 'amarok-common' because of 'amarok-xine4'
+Selected version '2.3.2-2+exp' (experimental [i386]) for 'amarok-common' because of 'amarok-xine4'
 Selected version '5:4.20.0+exp' (experimental [i386]) for 'phonon-backend-null' because of 'amarok-xine4'
 Selected version '5:4.20.0+exp' (experimental [i386]) for 'phonon-backend-null' because of 'amarok-xine4'
 Selected version '2.3.2-2+exp' (experimental [i386]) for 'amarok-utils' because of 'amarok-xine4'
 Selected version '2.3.2-2+exp' (experimental [i386]) for 'amarok-utils' because of 'amarok-xine4'
 The following extra packages will be installed:
 The following extra packages will be installed:
@@ -317,7 +317,7 @@ E: Trivial Only specified but this is not a trivial operation." aptget install a
 testequal "Reading package lists...
 testequal "Reading package lists...
 Building dependency tree...
 Building dependency tree...
 Selected version '2.3.2-2+exp' (experimental [i386]) for 'amarok-broken'
 Selected version '2.3.2-2+exp' (experimental [i386]) for 'amarok-broken'
-Selected version '2.3.2-2+exp' (experimental [all]) for 'amarok-common' because of 'amarok-broken'
+Selected version '2.3.2-2+exp' (experimental [i386]) for 'amarok-common' because of 'amarok-broken'
 Selected version '5:4.20.0+exp' (experimental [i386]) for 'phonon-backend-null' because of 'amarok-broken'
 Selected version '5:4.20.0+exp' (experimental [i386]) for 'phonon-backend-null' because of 'amarok-broken'
 Selected version '2.3.2-2+exp' (experimental [i386]) for 'amarok-utils' because of 'amarok-broken'
 Selected version '2.3.2-2+exp' (experimental [i386]) for 'amarok-utils' because of 'amarok-broken'
 The following extra packages will be installed:
 The following extra packages will be installed:
@@ -341,7 +341,7 @@ E: Trivial Only specified but this is not a trivial operation." aptget install a
 testequal "Reading package lists...
 testequal "Reading package lists...
 Building dependency tree...
 Building dependency tree...
 Selected version '2.3.2-2+exp' (experimental [i386]) for 'amarok-recommends'
 Selected version '2.3.2-2+exp' (experimental [i386]) for 'amarok-recommends'
-Selected version '2.3.2-2+exp' (experimental [all]) for 'amarok-common' because of 'amarok-recommends'
+Selected version '2.3.2-2+exp' (experimental [i386]) for 'amarok-common' because of 'amarok-recommends'
 Selected version '2.3.2-2+exp' (experimental [i386]) for 'amarok-utils' because of 'amarok-recommends'
 Selected version '2.3.2-2+exp' (experimental [i386]) for 'amarok-utils' because of 'amarok-recommends'
 The following extra packages will be installed:
 The following extra packages will be installed:
    amarok-common (2.3.2-2+exp)
    amarok-common (2.3.2-2+exp)
@@ -364,7 +364,7 @@ E: Trivial Only specified but this is not a trivial operation." aptget install a
 testequal "Reading package lists...
 testequal "Reading package lists...
 Building dependency tree...
 Building dependency tree...
 Selected version '2.3.2-2+exp' (experimental [i386]) for 'amarok-recommends'
 Selected version '2.3.2-2+exp' (experimental [i386]) for 'amarok-recommends'
-Selected version '2.3.2-2+exp' (experimental [all]) for 'amarok-common' because of 'amarok-recommends'
+Selected version '2.3.2-2+exp' (experimental [i386]) for 'amarok-common' because of 'amarok-recommends'
 The following extra packages will be installed:
 The following extra packages will be installed:
    amarok-common (2.3.2-2+exp)
    amarok-common (2.3.2-2+exp)
 Recommended packages:
 Recommended packages:
@@ -385,7 +385,7 @@ E: Trivial Only specified but this is not a trivial operation." aptget install a
 testequal "Reading package lists...
 testequal "Reading package lists...
 Building dependency tree...
 Building dependency tree...
 Selected version '2.3.2-2+exp' (experimental [i386]) for 'amarok-recommends2'
 Selected version '2.3.2-2+exp' (experimental [i386]) for 'amarok-recommends2'
-Selected version '2.3.2-2+exp' (experimental [all]) for 'amarok-common' because of 'amarok-recommends2'
+Selected version '2.3.2-2+exp' (experimental [i386]) for 'amarok-common' because of 'amarok-recommends2'
 The following extra packages will be installed:
 The following extra packages will be installed:
    amarok-common (2.3.2-2+exp)
    amarok-common (2.3.2-2+exp)
    libc6 (2.11.2-7+sid)
    libc6 (2.11.2-7+sid)
@@ -406,7 +406,7 @@ E: Trivial Only specified but this is not a trivial operation." aptget install a
 # if one depends doesn't work, we don't need to look deeper…
 # if one depends doesn't work, we don't need to look deeper…
 testequal "Reading package lists...
 testequal "Reading package lists...
 Building dependency tree...
 Building dependency tree...
-Selected version '1.0' (experimental [all]) for 'uninstallablepkg'
+Selected version '1.0' (experimental [i386]) for 'uninstallablepkg'
 Some packages could not be installed. This may mean that you have
 Some packages could not be installed. This may mean that you have
 requested an impossible situation or if you are using the unstable
 requested an impossible situation or if you are using the unstable
 distribution that some required packages have not yet been created
 distribution that some required packages have not yet been created