Преглед изворни кода

support special release-modifier 'installed' and 'candidate'

David Kalnischkies пре 16 година
родитељ
комит
84910ad509
3 измењених фајлова са 83 додато и 49 уклоњено
  1. 77 49
      apt-pkg/cacheset.cc
  2. 5 0
      apt-pkg/cacheset.h
  3. 1 0
      debian/changelog

+ 77 - 49
apt-pkg/cacheset.cc

@@ -132,10 +132,19 @@ APT::VersionSet VersionSet::FromCommandLine(pkgCacheFile &Cache, const char **cm
 		PackageSet pkgset = PackageSet::FromString(Cache, pkg.c_str(), out);
 		for (PackageSet::const_iterator P = pkgset.begin();
 		     P != pkgset.end(); ++P) {
-			if (vertag != string::npos) {
+			if (vertag == string::npos) {
+				AddSelectedVersion(Cache, verset, P, fallback);
+				continue;
+			}
+			pkgCache::VerIterator V;
+			if (ver == "installed")
+				V = getInstalledVer(Cache, P);
+			else if (ver == "candidate")
+				V = getCandidateVer(Cache, P);
+			else {
 				pkgVersionMatch Match(ver, (verIsRel == true ? pkgVersionMatch::Release :
-							pkgVersionMatch::Version));
-				pkgCache::VerIterator V = Match.Find(P);
+						pkgVersionMatch::Version));
+				V = Match.Find(P);
 				if (V.end() == true) {
 					if (verIsRel == true)
 						_error->Error(_("Release '%s' for '%s' was not found"),
@@ -145,58 +154,77 @@ APT::VersionSet VersionSet::FromCommandLine(pkgCacheFile &Cache, const char **cm
 								ver.c_str(), P.FullName(true).c_str());
 					continue;
 				}
-				if (strcmp(ver.c_str(), V.VerStr()) != 0)
-					ioprintf(out, _("Selected version %s (%s) for %s\n"),
-						 V.VerStr(), V.RelStr().c_str(), P.FullName(true).c_str());
-				verset.insert(V);
-			} else {
-				pkgCache::VerIterator V;
-				switch(fallback) {
-				case VersionSet::ALL:
-					for (V = P.VersionList(); V.end() != true; ++V)
-						verset.insert(V);
-					break;
-				case VersionSet::CANDANDINST:
-					verset.insert(getInstalledVer(Cache, P));
-					verset.insert(getCandidateVer(Cache, P));
-					break;
-				case VersionSet::CANDIDATE:
-					verset.insert(getCandidateVer(Cache, P));
-					break;
-				case VersionSet::INSTALLED:
-					verset.insert(getInstalledVer(Cache, P));
-					break;
-				case VersionSet::CANDINST:
-					V = getCandidateVer(Cache, P, true);
-					if (V.end() == true)
-						V = getInstalledVer(Cache, P, true);
-					if (V.end() == false)
-						verset.insert(V);
-					else
-						_error->Error(_("Can't select installed nor candidate version from package %s as it has neither of them"), P.FullName(true).c_str());
-					break;
-				case VersionSet::INSTCAND:
-					V = getInstalledVer(Cache, P, true);
-					if (V.end() == true)
-						V = getCandidateVer(Cache, P, true);
-					if (V.end() == false)
-						verset.insert(V);
-					else
-						_error->Error(_("Can't select installed nor candidate version from package %s as it has neither of them"), P.FullName(true).c_str());
-					break;
-				case VersionSet::NEWEST:
-					if (P->VersionList != 0)
-						verset.insert(P.VersionList());
-					else
-						_error->Error(_("Can't select newest version from package %s as it is purely virtual"), P.FullName(true).c_str());
-					break;
-				}
 			}
+			if (V.end() == true)
+				continue;
+			if (ver == V.VerStr())
+				ioprintf(out, _("Selected version '%s' (%s) for '%s'\n"),
+					 V.VerStr(), V.RelStr().c_str(), P.FullName(true).c_str());
+			verset.insert(V);
 		}
 	}
 	return verset;
 }
 									/*}}}*/
+// AddSelectedVersion - add version from package based on fallback	/*{{{*/
+bool VersionSet::AddSelectedVersion(pkgCacheFile &Cache, VersionSet &verset,
+		pkgCache::PkgIterator const &P, VersionSet::Version const &fallback,
+		bool const &AllowError) {
+	pkgCache::VerIterator V;
+	switch(fallback) {
+	case VersionSet::ALL:
+		if (P->VersionList != 0)
+			for (V = P.VersionList(); V.end() != true; ++V)
+				verset.insert(V);
+		else if (AllowError == false)
+			return _error->Error(_("Can't select versions from package '%s' as it purely virtual"), P.FullName(true).c_str());
+		else
+			return false;
+		break;
+	case VersionSet::CANDANDINST:
+		verset.insert(getInstalledVer(Cache, P, AllowError));
+		verset.insert(getCandidateVer(Cache, P, AllowError));
+		break;
+	case VersionSet::CANDIDATE:
+		verset.insert(getCandidateVer(Cache, P, AllowError));
+		break;
+	case VersionSet::INSTALLED:
+		verset.insert(getInstalledVer(Cache, P, AllowError));
+		break;
+	case VersionSet::CANDINST:
+		V = getCandidateVer(Cache, P, true);
+		if (V.end() == true)
+			V = getInstalledVer(Cache, P, true);
+		if (V.end() == false)
+			verset.insert(V);
+		else if (AllowError == false)
+			return _error->Error(_("Can't select installed nor candidate version from package '%s' as it has neither of them"), P.FullName(true).c_str());
+		else
+			return false;
+		break;
+	case VersionSet::INSTCAND:
+		V = getInstalledVer(Cache, P, true);
+		if (V.end() == true)
+			V = getCandidateVer(Cache, P, true);
+		if (V.end() == false)
+			verset.insert(V);
+		else if (AllowError == false)
+			return _error->Error(_("Can't select installed nor candidate version from package '%s' as it has neither of them"), P.FullName(true).c_str());
+		else
+			return false;
+		break;
+	case VersionSet::NEWEST:
+		if (P->VersionList != 0)
+			verset.insert(P.VersionList());
+		else if (AllowError == false)
+			return _error->Error(_("Can't select newest version from package '%s' as it is purely virtual"), P.FullName(true).c_str());
+		else
+			return false;
+		break;
+	}
+	return true;
+}
+									/*}}}*/
 // getCandidateVer - Returns the candidate version of the given package	/*{{{*/
 pkgCache::VerIterator VersionSet::getCandidateVer(pkgCacheFile &Cache,
 		pkgCache::PkgIterator const &Pkg, bool const &AllowError) {

+ 5 - 0
apt-pkg/cacheset.h

@@ -205,6 +205,11 @@ protected:								/*{{{*/
 	static pkgCache::VerIterator getInstalledVer(pkgCacheFile &Cache,
 		pkgCache::PkgIterator const &Pkg, bool const &AllowError = false);
 
+
+	static bool AddSelectedVersion(pkgCacheFile &Cache, VersionSet &verset,
+		pkgCache::PkgIterator const &P, VersionSet::Version const &fallback,
+		bool const &AllowError = false);
+
 									/*}}}*/
 };									/*}}}*/
 }

+ 1 - 0
debian/changelog

@@ -25,6 +25,7 @@ apt (0.7.26~exp6) UNRELEASED; urgency=low
     - add simple wrapper around std::set for cache structures
     - move regex magic from apt-get to new FromRegEx method
     - move cmdline parsing from apt-cache to new FromCommandLine method
+    - support special release-modifier 'installed' and 'candidate'
   * apt-pkg/contrib/cmdline.cc:
     - fix segfault in SaveInConfig caused by writing over char[] sizes
   * apt-pkg/pkgcache.cc: