summaryrefslogtreecommitdiff
path: root/apt-private
diff options
context:
space:
mode:
authorJulian Andres Klode <julian.klode@canonical.com>2019-08-15 11:47:00 +0200
committerJulian Andres Klode <julian.klode@canonical.com>2019-08-15 20:21:34 +0200
commit08b61197f418883ea20563e2251fb60779c0ba87 (patch)
tree6a3bd0c40526d0094e5eec38b15e7e4eaf516068 /apt-private
parent7e22425c2cf937fd45160c6bbbda9210ea5d52ba (diff)
Add pattern tree parser infra and connect with cacheset and apt list
This adds a transformation from parse tree into a CacheFilter and connects it with cachesets and the apt list command.
Diffstat (limited to 'apt-private')
-rw-r--r--apt-private/private-list.cc23
1 files changed, 16 insertions, 7 deletions
diff --git a/apt-private/private-list.cc b/apt-private/private-list.cc
index 7c8c89777..6071129a7 100644
--- a/apt-private/private-list.cc
+++ b/apt-private/private-list.cc
@@ -39,17 +39,26 @@ struct PackageSortAlphabetic /*{{{*/
class PackageNameMatcher : public Matcher
{
+ pkgCacheFile &cacheFile;
public:
- explicit PackageNameMatcher(const char **patterns)
+ explicit PackageNameMatcher(pkgCacheFile &cacheFile, const char **patterns)
+ : cacheFile(cacheFile)
{
for(int i=0; patterns[i] != NULL; ++i)
{
std::string pattern = patterns[i];
- APT::CacheFilter::PackageMatcher *cachefilter = NULL;
- if(_config->FindB("APT::Cmd::Use-Regexp", false) == true)
+ APT::CacheFilter::Matcher *cachefilter = NULL;
+ if (pattern.size() > 0 && pattern[0] == '?')
+ cachefilter = APT::CacheFilter::ParsePattern(pattern, &cacheFile).release();
+ else if(_config->FindB("APT::Cmd::Use-Regexp", false) == true)
cachefilter = new APT::CacheFilter::PackageNameMatchesRegEx(pattern);
else
cachefilter = new APT::CacheFilter::PackageNameMatchesFnmatch(pattern);
+
+ if (cachefilter == nullptr) {
+ return;
+ filters.clear();
+ }
filters.push_back(cachefilter);
}
}
@@ -62,7 +71,7 @@ class PackageNameMatcher : public Matcher
{
for(J=filters.begin(); J != filters.end(); ++J)
{
- APT::CacheFilter::PackageMatcher *cachefilter = *J;
+ APT::CacheFilter::Matcher *cachefilter = *J;
if((*cachefilter)(P))
return true;
}
@@ -70,8 +79,8 @@ class PackageNameMatcher : public Matcher
}
private:
- std::vector<APT::CacheFilter::PackageMatcher*> filters;
- std::vector<APT::CacheFilter::PackageMatcher*>::const_iterator J;
+ std::vector<APT::CacheFilter::Matcher*> filters;
+ std::vector<APT::CacheFilter::Matcher*>::const_iterator J;
#undef PackageMatcher
};
/*}}}*/
@@ -111,7 +120,7 @@ bool DoList(CommandLine &Cmd)
if (_config->FindB("APT::Cmd::List-Include-Summary", false) == true)
format += "\n ${Description}\n";
- PackageNameMatcher matcher(patterns);
+ PackageNameMatcher matcher(CacheFile, patterns);
LocalitySortedVersionSet bag;
OpTextProgress progress(*_config);
progress.OverallProgress(0,