Przeglądaj źródła

move cmdline parsing from apt-cache to new FromCommandLine method

David Kalnischkies 16 lat temu
rodzic
commit
78c3259686
4 zmienionych plików z 95 dodań i 81 usunięć
  1. 38 4
      apt-pkg/packageset.cc
  2. 35 18
      apt-pkg/packageset.h
  3. 21 59
      cmdline/apt-cache.cc
  4. 1 0
      debian/changelog

+ 38 - 4
apt-pkg/packageset.cc

@@ -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;
 }
 									/*}}}*/

+ 35 - 18
apt-pkg/packageset.h

@@ -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);
+	}
+
+
+
 									/*}}}*/
 };
 									/*}}}*/

+ 21 - 59
cmdline/apt-cache.cc

@@ -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() << " | "

+ 1 - 0
debian/changelog

@@ -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