Ver código fonte

handle :arch modifier in PackageSet::FromString correctly

David Kalnischkies 16 anos atrás
pai
commit
fe870febbf
2 arquivos alterados com 22 adições e 8 exclusões
  1. 20 6
      apt-pkg/cacheset.cc
  2. 2 2
      apt-pkg/cacheset.h

+ 20 - 6
apt-pkg/cacheset.cc

@@ -87,17 +87,31 @@ PackageSet PackageSet::FromCommandLine(pkgCacheFile &Cache, const char **cmdline
 }
 }
 									/*}}}*/
 									/*}}}*/
 // FromString - Return all packages matching a specific string		/*{{{*/
 // FromString - Return all packages matching a specific string		/*{{{*/
-PackageSet PackageSet::FromString(pkgCacheFile &Cache, const char * const str, std::ostream &out) {
-	pkgCache::GrpIterator Grp = Cache.GetPkgCache()->FindGrp(str);
-	if (Grp.end() == false) {
-		pkgCache::PkgIterator Pkg = Grp.FindPreferredPkg();
+PackageSet PackageSet::FromString(pkgCacheFile &Cache, std::string const &str, std::ostream &out) {
+	std::string pkg = str;
+	size_t archfound = pkg.find_last_of(':');
+	std::string arch;
+	if (archfound != std::string::npos) {
+		arch = pkg.substr(archfound+1);
+		pkg.erase(archfound);
+	}
+
+	pkgCache::PkgIterator Pkg;
+	if (arch.empty() == true) {
+		pkgCache::GrpIterator Grp = Cache.GetPkgCache()->FindGrp(pkg);
+		if (Grp.end() == false)
+			Pkg = Grp.FindPreferredPkg();
+	} else
+		Pkg = Cache.GetPkgCache()->FindPkg(pkg, arch);
+
+	if (Pkg.end() == false) {
 		PackageSet pkgset;
 		PackageSet pkgset;
 		pkgset.insert(Pkg);
 		pkgset.insert(Pkg);
 		return pkgset;
 		return pkgset;
 	}
 	}
 	PackageSet regex = FromRegEx(Cache, str, out);
 	PackageSet regex = FromRegEx(Cache, str, out);
 	if (regex.empty() == true)
 	if (regex.empty() == true)
-		_error->Warning(_("Unable to locate package %s"), str);
+		_error->Warning(_("Unable to locate package %s"), str.c_str());
 	return regex;
 	return regex;
 }
 }
 									/*}}}*/
 									/*}}}*/
@@ -188,7 +202,7 @@ pkgCache::VerIterator VersionSet::getCandidateVer(pkgCacheFile &Cache,
 		pkgCache::PkgIterator const &Pkg, bool const &AllowError) {
 		pkgCache::PkgIterator const &Pkg, bool const &AllowError) {
 	if (unlikely(Cache.BuildDepCache() == false))
 	if (unlikely(Cache.BuildDepCache() == false))
 		return pkgCache::VerIterator(*Cache);
 		return pkgCache::VerIterator(*Cache);
-	pkgCache::VerIterator Cand = Cache[Pkg].InstVerIter(Cache);
+	pkgCache::VerIterator Cand = Cache[Pkg].CandidateVerIter(Cache);
 	if (AllowError == false && Cand.end() == true)
 	if (AllowError == false && Cand.end() == true)
 		_error->Error(_("Can't select candidate version from package %s as it has no candidate"), Pkg.FullName(true).c_str());
 		_error->Error(_("Can't select candidate version from package %s as it has no candidate"), Pkg.FullName(true).c_str());
 	return Cand;
 	return Cand;

+ 2 - 2
apt-pkg/cacheset.h

@@ -83,8 +83,8 @@ public:									/*{{{*/
 	    \param Cache the packages are in
 	    \param Cache the packages are in
 	    \param string String the package name(s) should be extracted from
 	    \param string String the package name(s) should be extracted from
 	    \param out stream to print various notices to */
 	    \param out stream to print various notices to */
-	static APT::PackageSet FromString(pkgCacheFile &Cache, const char * const string, std::ostream &out);
-	static APT::PackageSet FromString(pkgCacheFile &Cache, const char * const string) {
+	static APT::PackageSet FromString(pkgCacheFile &Cache, std::string const &string, std::ostream &out);
+	static APT::PackageSet FromString(pkgCacheFile &Cache, std::string const &string) {
 		std::ostream out (std::ofstream("/dev/null").rdbuf());
 		std::ostream out (std::ofstream("/dev/null").rdbuf());
 		return APT::PackageSet::FromString(Cache, string, out);
 		return APT::PackageSet::FromString(Cache, string, out);
 	}
 	}