]> git.saurik.com Git - apt.git/commitdiff
support special release-modifier 'installed' and 'candidate'
authorDavid Kalnischkies <kalnischkies@gmail.com>
Sat, 5 Jun 2010 16:00:00 +0000 (18:00 +0200)
committerDavid Kalnischkies <kalnischkies@gmail.com>
Sat, 5 Jun 2010 16:00:00 +0000 (18:00 +0200)
apt-pkg/cacheset.cc
apt-pkg/cacheset.h
debian/changelog

index 8fcffaf9a47690108070124d0f8c64fac852a4c5..c0b06ba323c58b17d5dde95c9bcdf1c7b704c53d 100644 (file)
@@ -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) {
index 4f7be4caa4875ff2491f6685ca203f77537af03b..0f3a87a3d8b3d03dc619242c05ef653766d922f0 100644 (file)
@@ -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);
+
                                                                        /*}}}*/
 };                                                                     /*}}}*/
 }
index 6c9faf119e5fd848a56d4f32f7b72f3e4e1d251f..21093b05608a1cbcd11a31670c8e018082b52514 100644 (file)
@@ -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: