summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--apt-pkg/packageset.cc42
-rw-r--r--apt-pkg/packageset.h53
-rw-r--r--cmdline/apt-cache.cc80
-rw-r--r--debian/changelog1
4 files changed, 95 insertions, 81 deletions
diff --git a/apt-pkg/packageset.cc b/apt-pkg/packageset.cc
index f452bc052..baa1c211b 100644
--- a/apt-pkg/packageset.cc
+++ b/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,12 +47,18 @@ 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);
}
@@ -59,4 +68,29 @@ PackageSet PackageSet::FromRegEx(pkgCache &Cache, const char * const pattern, st
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;
+}
+ /*}}}*/
}
diff --git a/apt-pkg/packageset.h b/apt-pkg/packageset.h
index cd1430a2a..0bd60c56b 100644
--- a/apt-pkg/packageset.h
+++ b/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);
+ }
+
+
+
/*}}}*/
};
/*}}}*/
diff --git a/cmdline/apt-cache.cc b/cmdline/apt-cache.cc
index 10dbf44d2..95f185b4f 100644
--- a/cmdline/apt-cache.cc
+++ b/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() << " | "
diff --git a/debian/changelog b/debian/changelog
index 023d513be..79768a779 100644
--- a/debian/changelog
+++ b/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