summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel Hartwig <mandyke@gmail.com>2012-03-21 15:08:12 +0800
committerDaniel Hartwig <mandyke@gmail.com>2012-03-21 15:08:12 +0800
commitcec9f33bc38d82c65cfd11673d0a22fb4a55513b (patch)
treef9d3857751cde3d34317e24119468c17ac257591
parent16f710a0ad5a3e9fdc0d6b4b3d448fee38c6158e (diff)
downloadaptitude-cec9f33bc38d82c65cfd11673d0a22fb4a55513b.tar.gz
Extend the default search pattern to support 'name:arch'
A search pattern with no explicit term, "s", is equivalent to "?name(s)". This changes modifies these semantics when the pattern is arch-qualified, "name:arch" which is now equivalent to "?exact-name(name) ?architecture(arch)". These are the semantics used by apt-get and others which are internally derived from pkgCache::FindPkg("name:arch"). On the command-line, it is possible to specify both an architecture and an archive/version, as well as an override specifier: # aptitude install an:armel/sid tf:armel- * src/generic/apt/matching/parse.cc: - extended semantics as per above. * src/cmdline/cmdline_versions.cc: - modify argument processing to use the extended semantics.
-rw-r--r--src/cmdline/cmdline_versions.cc21
-rw-r--r--src/generic/apt/matching/parse.cc8
2 files changed, 14 insertions, 15 deletions
diff --git a/src/cmdline/cmdline_versions.cc b/src/cmdline/cmdline_versions.cc
index 828e4239..8f57ff41 100644
--- a/src/cmdline/cmdline_versions.cc
+++ b/src/cmdline/cmdline_versions.cc
@@ -600,23 +600,16 @@ int cmdline_versions(int argc, char *argv[], const char *status_fname,
for(int i = 1; i < argc; ++i)
{
const char * const arg = argv[i];
- const bool treat_as_exact_name =
- !aptitude::matching::is_pattern(arg);
- if(treat_as_exact_name)
- matchers.push_back(m::pattern::make_exact_name(arg));
- else
- {
- cw::util::ref_ptr<m::pattern> m = m::parse(arg);
- if(!m.valid())
- {
- _error->DumpErrors();
+ cw::util::ref_ptr<m::pattern> m = m::parse(arg);
+ if(!m.valid())
+ {
+ _error->DumpErrors();
- return -1;
- }
+ return -1;
+ }
- matchers.push_back(m);
- }
+ matchers.push_back(m);
}
return do_search_versions(matchers,
diff --git a/src/generic/apt/matching/parse.cc b/src/generic/apt/matching/parse.cc
index 98218bcb..f114cd81 100644
--- a/src/generic/apt/matching/parse.cc
+++ b/src/generic/apt/matching/parse.cc
@@ -1376,7 +1376,13 @@ ref_ptr<pattern> parse_atom(string::const_iterator &start,
{
std::string s = parse_substr(start, end, terminators, true);
- return pattern::make_name(s);
+ const size_t found = s.rfind(':');
+ if(found == std::string::npos)
+ return pattern::make_name(s);
+ const std::string arch = s.substr(found + 1);
+ const std::string name = s.substr(0, found);
+ return pattern::make_and(pattern::make_exact_name(name),
+ parse_architecture(arch));
}
}