diff options
author | Daniel Hartwig <mandyke@gmail.com> | 2012-03-21 15:08:12 +0800 |
---|---|---|
committer | Daniel Hartwig <mandyke@gmail.com> | 2012-03-21 15:08:12 +0800 |
commit | cec9f33bc38d82c65cfd11673d0a22fb4a55513b (patch) | |
tree | f9d3857751cde3d34317e24119468c17ac257591 | |
parent | 16f710a0ad5a3e9fdc0d6b4b3d448fee38c6158e (diff) | |
download | aptitude-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.cc | 21 | ||||
-rw-r--r-- | src/generic/apt/matching/parse.cc | 8 |
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)); } } |