Julian Andres Klode 15 роки тому
батько
коміт
076b71228a
4 змінених файлів з 23 додано та 7 видалено
  1. 9 5
      apt-pkg/pkgcache.cc
  2. 6 0
      apt-pkg/pkgcache.h
  3. 3 2
      apt-pkg/pkgcachegen.cc
  4. 5 0
      debian/changelog

+ 9 - 5
apt-pkg/pkgcache.cc

@@ -217,6 +217,9 @@ pkgCache::PkgIterator pkgCache::FindPkg(const string &Name) {
 	if (found == string::npos)
 	if (found == string::npos)
 		return FindPkg(Name, "native");
 		return FindPkg(Name, "native");
 	string const Arch = Name.substr(found+1);
 	string const Arch = Name.substr(found+1);
+	/* Beware: This is specialcased to handle pkg:any in dependencies as
+	   these are linked to virtual pkg:any named packages with all archs.
+	   If you want any arch from a given pkg, use FindPkg(pkg,arch) */
 	if (Arch == "any")
 	if (Arch == "any")
 		return FindPkg(Name, "any");
 		return FindPkg(Name, "any");
 	return FindPkg(Name.substr(0, found), Arch);
 	return FindPkg(Name.substr(0, found), Arch);
@@ -228,7 +231,7 @@ pkgCache::PkgIterator pkgCache::FindPkg(const string &Name) {
 pkgCache::PkgIterator pkgCache::FindPkg(const string &Name, string const &Arch) {
 pkgCache::PkgIterator pkgCache::FindPkg(const string &Name, string const &Arch) {
 	if (MultiArchCache() == false) {
 	if (MultiArchCache() == false) {
 		if (Arch == "native" || Arch == "all" || Arch == "any" ||
 		if (Arch == "native" || Arch == "all" || Arch == "any" ||
-		    Arch == _config->Find("APT::Architecture"))
+		    Arch == NativeArch())
 			return SingleArchFindPkg(Name);
 			return SingleArchFindPkg(Name);
 		else
 		else
 			return PkgIterator(*this,0);
 			return PkgIterator(*this,0);
@@ -322,15 +325,15 @@ pkgCache::PkgIterator pkgCache::GrpIterator::FindPkg(string Arch) const {
 	if (Arch == "any")
 	if (Arch == "any")
 		return PkgIterator(*Owner, Owner->PkgP + S->FirstPackage);
 		return PkgIterator(*Owner, Owner->PkgP + S->FirstPackage);
 
 
-	static string const myArch = _config->Find("APT::Architecture");
+	char const* const myArch = Owner->NativeArch();
 	/* Most of the time the package for our native architecture is
 	/* Most of the time the package for our native architecture is
 	   the one we add at first to the cache, but this would be the
 	   the one we add at first to the cache, but this would be the
 	   last one we check, so we do it now. */
 	   last one we check, so we do it now. */
 	if (Arch == "native" || Arch == myArch || Arch == "all") {
 	if (Arch == "native" || Arch == myArch || Arch == "all") {
-		Arch = myArch;
 		pkgCache::Package *Pkg = Owner->PkgP + S->LastPackage;
 		pkgCache::Package *Pkg = Owner->PkgP + S->LastPackage;
-		if (stringcasecmp(Arch, Owner->StrP + Pkg->Arch) == 0)
+		if (strcasecmp(myArch, Owner->StrP + Pkg->Arch) == 0)
 			return PkgIterator(*Owner, Pkg);
 			return PkgIterator(*Owner, Pkg);
+		Arch = myArch;
 	}
 	}
 
 
 	/* Iterate over the list to find the matching arch
 	/* Iterate over the list to find the matching arch
@@ -503,7 +506,8 @@ std::string pkgCache::PkgIterator::FullName(bool const &Pretty) const
 {
 {
    string fullname = Name();
    string fullname = Name();
    if (Pretty == false ||
    if (Pretty == false ||
-       (strcmp(Arch(), "all") != 0 && _config->Find("APT::Architecture") != Arch()))
+       (strcmp(Arch(), "all") != 0 &&
+	strcmp(Owner->NativeArch(), Arch()) != 0))
       return fullname.append(":").append(Arch());
       return fullname.append(":").append(Arch());
    return fullname;
    return fullname;
 }
 }

+ 6 - 0
apt-pkg/pkgcache.h

@@ -215,6 +215,7 @@ class pkgCache								/*{{{*/
 private:
 private:
    bool MultiArchEnabled;
    bool MultiArchEnabled;
    PkgIterator SingleArchFindPkg(const string &Name);
    PkgIterator SingleArchFindPkg(const string &Name);
+   inline char const * const NativeArch() const;
 };
 };
 									/*}}}*/
 									/*}}}*/
 // Header structure							/*{{{*/
 // Header structure							/*{{{*/
@@ -649,6 +650,11 @@ struct pkgCache::StringItem
    map_ptrloc NextItem;      // StringItem
    map_ptrloc NextItem;      // StringItem
 };
 };
 									/*}}}*/
 									/*}}}*/
+
+
+inline char const * const pkgCache::NativeArch() const
+	{ return StrP + HeaderP->Architecture; };
+
 #include <apt-pkg/cacheiterators.h>
 #include <apt-pkg/cacheiterators.h>
 
 
 inline pkgCache::GrpIterator pkgCache::GrpBegin() 
 inline pkgCache::GrpIterator pkgCache::GrpBegin() 

+ 3 - 2
apt-pkg/pkgcachegen.cc

@@ -479,7 +479,8 @@ bool pkgCacheGenerator::NewPackage(pkgCache::PkgIterator &Pkg,const string &Name
    // Set the name, arch and the ID
    // Set the name, arch and the ID
    Pkg->Name = Grp->Name;
    Pkg->Name = Grp->Name;
    Pkg->Group = Grp.Index();
    Pkg->Group = Grp.Index();
-   map_ptrloc const idxArch = WriteUniqString((Arch == "all") ? _config->Find("APT::Architecture") : Arch.c_str());
+   // all is mapped to the native architecture
+   map_ptrloc const idxArch = (Arch == "all") ? Cache.HeaderP->Architecture : WriteUniqString(Arch.c_str());
    if (unlikely(idxArch == 0))
    if (unlikely(idxArch == 0))
       return false;
       return false;
    Pkg->Arch = idxArch;
    Pkg->Arch = idxArch;
@@ -783,7 +784,7 @@ bool pkgCacheGenerator::ListParser::NewProvides(pkgCache::VerIterator &Ver,
 
 
    // We do not add self referencing provides
    // We do not add self referencing provides
    if (Ver.ParentPkg().Name() == PkgName && (PkgArch == Ver.ParentPkg().Arch() ||
    if (Ver.ParentPkg().Name() == PkgName && (PkgArch == Ver.ParentPkg().Arch() ||
-	(PkgArch == "all" && _config->Find("APT::Architecture") == Ver.ParentPkg().Arch())))
+	(PkgArch == "all" && strcmp((Cache.StrP + Cache.HeaderP->Architecture), Ver.ParentPkg().Arch()) == 0)))
       return true;
       return true;
    
    
    // Get a structure
    // Get a structure

+ 5 - 0
debian/changelog

@@ -24,6 +24,11 @@ apt (0.8.14) UNRELEASED; urgency=low
     - run unattended-upgrades even if there was a error during
     - run unattended-upgrades even if there was a error during
       the apt-get update (LP: #676295)
       the apt-get update (LP: #676295)
 
 
+  [ David Kalnischkies ]
+  * apt-pkg/pkgcache.cc:
+    - use the native Architecture stored in the cache header instead of
+      loading it from configuration as suggested by Julian Andres Klode
+
  -- Julian Andres Klode <jak@debian.org>  Thu, 07 Apr 2011 11:48:46 +0200
  -- Julian Andres Klode <jak@debian.org>  Thu, 07 Apr 2011 11:48:46 +0200
 
 
 apt (0.8.13.2) unstable; urgency=low
 apt (0.8.13.2) unstable; urgency=low