Browse Source

move cmdline parsing from apt-cache to new FromCommandLine method

debian/1.8.y
David Kalnischkies 12 years ago
parent
commit
78c3259686
  1. 42
      apt-pkg/packageset.cc
  2. 53
      apt-pkg/packageset.h
  3. 80
      cmdline/apt-cache.cc
  4. 1
      debian/changelog

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

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

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

Loading…
Cancel
Save