diff options
author | David Kalnischkies <kalnischkies@gmail.com> | 2010-05-31 00:28:14 +0200 |
---|---|---|
committer | David Kalnischkies <kalnischkies@gmail.com> | 2010-05-31 00:28:14 +0200 |
commit | 78c325968642255fd2325003f19729b617477666 (patch) | |
tree | 15377eeef85975ae51216bb21be26cdda41dda10 /apt-pkg | |
parent | ffee1c2bed4accfe25b2ac9e9f0ab9a0ebae9b5b (diff) |
move cmdline parsing from apt-cache to new FromCommandLine method
Diffstat (limited to 'apt-pkg')
-rw-r--r-- | apt-pkg/packageset.cc | 42 | ||||
-rw-r--r-- | apt-pkg/packageset.h | 53 |
2 files changed, 73 insertions, 22 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); + } + + + /*}}}*/ }; /*}}}*/ |