move cmdline parsing from apt-cache to new FromCommandLine method
authorDavid Kalnischkies <kalnischkies@gmail.com>
Sun, 30 May 2010 22:28:14 +0000 (00:28 +0200)
committerDavid Kalnischkies <kalnischkies@gmail.com>
Sun, 30 May 2010 22:28:14 +0000 (00:28 +0200)
apt-pkg/packageset.cc
apt-pkg/packageset.h
cmdline/apt-cache.cc
debian/changelog

index f452bc0..baa1c21 100644 (file)
@@ -9,12 +9,15 @@
    ##################################################################### */
                                                                        /*}}}*/
 // Include Files                                                       /*{{{*/
+#include <apt-pkg/aptconfiguration.h>
 #include <apt-pkg/error.h>
 #include <apt-pkg/packageset.h>
 #include <apt-pkg/strutl.h>
 
 #include <apti18n.h>
 
+#include <vector>
+
 #include <regex.h>
                                                                        /*}}}*/
 namespace APT {
@@ -44,18 +47,49 @@ PackageSet PackageSet::FromRegEx(pkgCache &Cache, const char * const pattern, st
                if (regexec(&Pattern, Grp.Name(), 0, 0, 0) != 0)
                        continue;
                pkgCache::PkgIterator Pkg = Grp.FindPkg("native");
-               if (unlikely(Pkg.end() == true))
-                       // FIXME: Fallback to different architectures here?
-                       continue;
+               if (Pkg.end() == true) {
+                       std::vector<std::string> archs = APT::Configuration::getArchitectures();
+                       for (std::vector<std::string>::const_iterator a = archs.begin();
+                            a != archs.end() || Pkg.end() != true; ++a) {
+                               Pkg = Grp.FindPkg(*a);
+                       }
+                       if (Pkg.end() == true)
+                               continue;
+               }
 
                ioprintf(out, _("Note, selecting %s for regex '%s'\n"),
-                        Pkg.Name(), pattern);
+                        Pkg.FullName(true).c_str(), pattern);
 
                pkgset.insert(Pkg);
        }
 
        regfree(&Pattern);
 
+       return pkgset;
+}
+                                                                       /*}}}*/
+// FromCommandLine - Return all packages specified on commandline      /*{{{*/
+PackageSet PackageSet::FromCommandLine(pkgCache &Cache, const char **cmdline, std::ostream &out) {
+       PackageSet pkgset;
+       for (const char **I = cmdline + 1; *I != 0; I++) {
+               pkgCache::PkgIterator Pkg = Cache.FindPkg(*I);
+               if (Pkg.end() == true) {
+                       std::vector<std::string> archs = APT::Configuration::getArchitectures();
+                       for (std::vector<std::string>::const_iterator a = archs.begin();
+                            a != archs.end() || Pkg.end() != true; ++a) {
+                               Pkg = Cache.FindPkg(*I, *a);
+                       }
+                       if (Pkg.end() == true) {
+                               PackageSet regex = FromRegEx(Cache, *I, out);
+                               if (regex.empty() == true)
+                                       _error->Warning(_("Unable to locate package %s"),*I);
+                               else
+                                       pkgset.insert(regex.begin(), regex.end());
+                               continue;
+                       }
+               }
+               pkgset.insert(Pkg);
+       }
        return pkgset;
 }
                                                                        /*}}}*/
index cd1430a..0bd60c5 100644 (file)
@@ -28,27 +28,29 @@ public:                                                                     /*{{{*/
 
                operator pkgCache::PkgIterator(void) { return **this; }
 
-               inline const char *Name() const {return (*this)->Name(); }
-               inline std::string FullName(bool const &Pretty) const { return (*this)->FullName(Pretty); }
-               inline std::string FullName() const { return (*this)->FullName(); }
-               inline const char *Section() const {return (*this)->Section(); }
-               inline bool Purge() const {return (*this)->Purge(); }
-               inline const char *Arch() const {return (*this)->Arch(); }
-               inline pkgCache::GrpIterator Group() const { return (*this)->Group(); }
-               inline pkgCache::VerIterator VersionList() const { return (*this)->VersionList(); }
-               inline pkgCache::VerIterator CurrentVer() const { return (*this)->CurrentVer(); }
-               inline pkgCache::DepIterator RevDependsList() const { return (*this)->RevDependsList(); }
-               inline pkgCache::PrvIterator ProvidesList() const { return (*this)->ProvidesList(); }
-               inline pkgCache::PkgIterator::OkState State() const { return (*this)->State(); }
-               inline const char *CandVersion() const { return (*this)->CandVersion(); }
-               inline const char *CurVersion() const { return (*this)->CurVersion(); }
-               inline pkgCache *Cache() const { return (*this)->Cache(); };
-               inline unsigned long Index() const {return (*this)->Index();};
+               inline const char *Name() const {return (**this).Name(); }
+               inline std::string FullName(bool const &Pretty) const { return (**this).FullName(Pretty); }
+               inline std::string FullName() const { return (**this).FullName(); }
+               inline const char *Section() const {return (**this).Section(); }
+               inline bool Purge() const {return (**this).Purge(); }
+               inline const char *Arch() const {return (**this).Arch(); }
+               inline pkgCache::GrpIterator Group() const { return (**this).Group(); }
+               inline pkgCache::VerIterator VersionList() const { return (**this).VersionList(); }
+               inline pkgCache::VerIterator CurrentVer() const { return (**this).CurrentVer(); }
+               inline pkgCache::DepIterator RevDependsList() const { return (**this).RevDependsList(); }
+               inline pkgCache::PrvIterator ProvidesList() const { return (**this).ProvidesList(); }
+               inline pkgCache::PkgIterator::OkState State() const { return (**this).State(); }
+               inline const char *CandVersion() const { return (**this).CandVersion(); }
+               inline const char *CurVersion() const { return (**this).CurVersion(); }
+               inline pkgCache *Cache() const { return (**this).Cache(); };
+               inline unsigned long Index() const {return (**this).Index();};
+               // we have only valid iterators here
+               inline bool end() const { return false; };
 
                friend std::ostream& operator<<(std::ostream& out, const_iterator i) { return operator<<(out, (*i)); }
 
-               inline pkgCache::PkgIterator const * operator->() const {
-                       return &**this;
+               inline pkgCache::Package const * operator->() const {
+                       return &***this;
                };
        };
        // 103. set::iterator is required to be modifiable, but this allows modification of keys
@@ -68,6 +70,21 @@ public:                                                                      /*{{{*/
                return APT::PackageSet::FromRegEx(Cache, pattern, out);
        }
 
+       /** \brief returns all packages specified on the commandline
+
+           Get all package names from the commandline and executes regex's if needed.
+           No special package command is supported, just plain names.
+           \param Cache the packages are in
+           \param cmdline Command line the package names should be extracted from
+           \param out stream to print various notices to */
+       static APT::PackageSet FromCommandLine(pkgCache &Cache, const char **cmdline, std::ostream &out);
+       static APT::PackageSet FromCommandLine(pkgCache &Cache, const char **cmdline) {
+               std::ostream out (std::ofstream("/dev/null").rdbuf());
+               return APT::PackageSet::FromCommandLine(Cache, cmdline, out);
+       }
+
+
+
                                                                        /*}}}*/
 };
                                                                        /*}}}*/
index 10dbf44..95f185b 100644 (file)
@@ -29,6 +29,7 @@
 #include <apt-pkg/tagfile.h>
 #include <apt-pkg/algorithms.h>
 #include <apt-pkg/sptr.h>
+#include <apt-pkg/packageset.h>
 
 #include <config.h>
 #include <apti18n.h>
@@ -175,15 +176,10 @@ bool UnMet(CommandLine &CmdL)
 bool DumpPackage(CommandLine &CmdL)
 {   
    pkgCache &Cache = *GCache;
-   for (const char **I = CmdL.FileList + 1; *I != 0; I++)
-   {
-      pkgCache::PkgIterator Pkg = Cache.FindPkg(*I);
-      if (Pkg.end() == true)
-      {
-        _error->Warning(_("Unable to locate package %s"),*I);
-        continue;
-      }
+   APT::PackageSet pkgset = APT::PackageSet::FromCommandLine(Cache, CmdL.FileList);
 
+   for (APT::PackageSet::const_iterator Pkg = pkgset.begin(); Pkg != pkgset.end(); ++Pkg)
+   {
       cout << "Package: " << Pkg.FullName(true) << endl;
       cout << "Versions: " << endl;
       for (pkgCache::VerIterator Cur = Pkg.VersionList(); Cur.end() != true; Cur++)
@@ -545,18 +541,11 @@ bool Depends(CommandLine &CmdL)
    pkgCache &Cache = *GCache;
    SPtrArray<unsigned> Colours = new unsigned[Cache.Head().PackageCount];
    memset(Colours,0,sizeof(*Colours)*Cache.Head().PackageCount);
-   
-   for (const char **I = CmdL.FileList + 1; *I != 0; I++)
-   {
-      pkgCache::PkgIterator Pkg = Cache.FindPkg(*I);
-      if (Pkg.end() == true)
-      {
-        _error->Warning(_("Unable to locate package %s"),*I);
-        continue;
-      }
+
+   APT::PackageSet pkgset = APT::PackageSet::FromCommandLine(Cache, CmdL.FileList);
+   for (APT::PackageSet::const_iterator Pkg = pkgset.begin(); Pkg != pkgset.end(); ++Pkg)
       Colours[Pkg->ID] = 1;
-   }
-   
+
    bool Recurse = _config->FindB("APT::Cache::RecurseDepends",false);
    bool Installed = _config->FindB("APT::Cache::Installed",false);
    bool Important = _config->FindB("APT::Cache::Important",false);
@@ -639,18 +628,11 @@ bool RDepends(CommandLine &CmdL)
    pkgCache &Cache = *GCache;
    SPtrArray<unsigned> Colours = new unsigned[Cache.Head().PackageCount];
    memset(Colours,0,sizeof(*Colours)*Cache.Head().PackageCount);
-   
-   for (const char **I = CmdL.FileList + 1; *I != 0; I++)
-   {
-      pkgCache::PkgIterator Pkg = Cache.FindPkg(*I);
-      if (Pkg.end() == true)
-      {
-        _error->Warning(_("Unable to locate package %s"),*I);
-        continue;
-      }
+
+   APT::PackageSet pkgset = APT::PackageSet::FromCommandLine(Cache, CmdL.FileList);
+   for (APT::PackageSet::const_iterator Pkg = pkgset.begin(); Pkg != pkgset.end(); ++Pkg)
       Colours[Pkg->ID] = 1;
-   }
-   
+
    bool Recurse = _config->FindB("APT::Cache::RecurseDepends",false);
    bool Installed = _config->FindB("APT::Cache::Installed",false);
    bool DidSomething;
@@ -1440,23 +1422,9 @@ bool ShowPackage(CommandLine &CmdL)
    pkgCache &Cache = *GCache;
    pkgDepCache::Policy Plcy;
 
-   unsigned found = 0;
-   
-   for (const char **I = CmdL.FileList + 1; *I != 0; I++)
+   APT::PackageSet pkgset = APT::PackageSet::FromCommandLine(Cache, CmdL.FileList);
+   for (APT::PackageSet::const_iterator Pkg = pkgset.begin(); Pkg != pkgset.end(); ++Pkg)
    {
-      // FIXME: Handle the case in which pkgname name:arch is not found
-      pkgCache::PkgIterator Pkg = Cache.FindPkg(*I);
-      if (Pkg.end() == true)
-      {
-        Pkg = Cache.FindPkg(*I, "any");
-        if (Pkg.end() == true) {
-               _error->Warning(_("Unable to locate package %s"),*I);
-               continue;
-        }
-      }
-
-      ++found;
-
       // Find the proper version to use.
       if (_config->FindB("APT::Cache::AllVersions","true") == true)
       {
@@ -1477,7 +1445,7 @@ bool ShowPackage(CommandLine &CmdL)
       }      
    }
 
-   if (found > 0)
+   if (pkgset.empty() == false)
         return true;
    return _error->Error(_("No packages found"));
 }
@@ -1622,15 +1590,10 @@ bool Policy(CommandLine &CmdL)
                (InstalledLessCandidate > 0 ? (InstalledLessCandidate) : 0) - 1;
 
    // Print out detailed information for each package
-   for (const char **I = CmdL.FileList + 1; *I != 0; I++)
+   APT::PackageSet pkgset = APT::PackageSet::FromCommandLine(Cache, CmdL.FileList);
+   for (APT::PackageSet::const_iterator I = pkgset.begin(); I != pkgset.end(); ++I)
    {
-      pkgCache::GrpIterator Grp = Cache.FindGrp(*I);
-      pkgCache::PkgIterator Pkg = Grp.FindPkg("any");
-      if (Pkg.end() == true)
-      {
-        _error->Warning(_("Unable to locate package %s"),*I);
-        continue;
-      }
+      pkgCache::PkgIterator Pkg = I.Group().FindPkg("any");
 
       for (; Pkg.end() != true; Pkg = Grp.NextPkg(Pkg)) {
       if (strcmp(Pkg.Arch(),"all") == 0)
@@ -1708,10 +1671,9 @@ bool Madison(CommandLine &CmdL)
    if (_error->PendingError() == true)
       _error->Discard();
 
-   for (const char **I = CmdL.FileList + 1; *I != 0; I++)
+   APT::PackageSet pkgset = APT::PackageSet::FromCommandLine(Cache, CmdL.FileList);
+   for (APT::PackageSet::const_iterator Pkg = pkgset.begin(); Pkg != pkgset.end(); ++Pkg)
    {
-      pkgCache::PkgIterator Pkg = Cache.FindPkg(*I);
-
       if (Pkg.end() == false)
       {
          for (pkgCache::VerIterator V = Pkg.VersionList(); V.end() == false; V++)
@@ -1746,7 +1708,7 @@ bool Madison(CommandLine &CmdL)
       
       SrcRecs.Restart();
       pkgSrcRecords::Parser *SrcParser;
-      while ((SrcParser = SrcRecs.Find(*I,false)) != 0)
+      while ((SrcParser = SrcRecs.Find(Pkg.Name(),false)) != 0)
       {
          // Maybe support Release info here too eventually
          cout << setw(10) << SrcParser->Package() << " | "
index 023d513..79768a7 100644 (file)
@@ -25,6 +25,7 @@ apt (0.7.26~exp6) UNRELEASED; urgency=low
   * apt-pkg/packageset.h:
     - add a simple wrapper around std::set for packages with it
     - move regex magic from apt-get to new FromRegEx method
+    - move cmdline parsing from apt-cache to new FromCommandLine method
 
  -- David Kalnischkies <kalnischkies@gmail.com>  Sat, 29 May 2010 19:09:05 +0200