diff options
author | Daniel Hartwig <mandyke@gmail.com> | 2012-03-19 21:52:39 +0800 |
---|---|---|
committer | Daniel Hartwig <mandyke@gmail.com> | 2012-03-19 21:52:39 +0800 |
commit | ec234514bbf88e4800218fd39e3500024b424476 (patch) | |
tree | ab44cb2fbfc0e6e06c829f5c1de0ba0445f3b6ce /src/generic | |
parent | 8acc867a365f7199a61e4e9305bfc60fd093d7fd (diff) | |
download | aptitude-ec234514bbf88e4800218fd39e3500024b424476.tar.gz |
Support 'native' and 'foreign' as arguments to ?architecture
* src/generic/apt/apt.{cc,h}:
- new functions is_native_arch, is_foreign_arch.
* src/generic/apt/matching/*:
* doc/en/aptitude.xml:
- support 'native' and 'foreign' as arguments to ?architecture.
Diffstat (limited to 'src/generic')
-rw-r--r-- | src/generic/apt/apt.cc | 9 | ||||
-rw-r--r-- | src/generic/apt/apt.h | 10 | ||||
-rw-r--r-- | src/generic/apt/matching/compare_patterns.cc | 6 | ||||
-rw-r--r-- | src/generic/apt/matching/match.cc | 26 | ||||
-rw-r--r-- | src/generic/apt/matching/parse.cc | 20 | ||||
-rw-r--r-- | src/generic/apt/matching/pattern.cc | 2 | ||||
-rw-r--r-- | src/generic/apt/matching/pattern.h | 38 | ||||
-rw-r--r-- | src/generic/apt/matching/serialize.cc | 8 |
8 files changed, 117 insertions, 2 deletions
diff --git a/src/generic/apt/apt.cc b/src/generic/apt/apt.cc index 0c8ca139..fb4a0435 100644 --- a/src/generic/apt/apt.cc +++ b/src/generic/apt/apt.cc @@ -86,6 +86,8 @@ sigc::signal0<void> cache_closed, cache_reloaded, cache_reload_failed; sigc::signal0<void> hier_reloaded; sigc::signal0<void> consume_errors; +static string apt_native_arch; + static void reset_interesting_dep_memoization() { delete[] cached_deps_interesting; @@ -1370,5 +1372,12 @@ namespace aptitude return top_sections; } + + bool is_native_arch(const pkgCache::VerIterator &ver) + { + if(apt_native_arch.empty()) + apt_native_arch = aptcfg->Find("APT::Architecture"); + return apt_native_arch == ver.Arch(); + } } } diff --git a/src/generic/apt/apt.h b/src/generic/apt/apt.h index 89147c41..75c91a32 100644 --- a/src/generic/apt/apt.h +++ b/src/generic/apt/apt.h @@ -451,6 +451,16 @@ namespace aptitude * or a builtin list of defaults. */ const std::vector<std::string> get_top_sections(const bool cached=true); + + /** \return \b true if the given package is for the native + * architecture. + */ + bool is_native_arch(const pkgCache::VerIterator &ver); + + inline bool is_foreign_arch(const pkgCache::VerIterator &ver) + { + return !is_native_arch(ver) && (strcmp(ver.Arch(), "all") != 0); + } } } diff --git a/src/generic/apt/matching/compare_patterns.cc b/src/generic/apt/matching/compare_patterns.cc index 3aae4246..c68bbc04 100644 --- a/src/generic/apt/matching/compare_patterns.cc +++ b/src/generic/apt/matching/compare_patterns.cc @@ -183,6 +183,9 @@ namespace aptitude p2->get_for_pattern()); } + case pattern::foreign_architecture: + return 0; + case pattern::garbage: return 0; @@ -217,6 +220,9 @@ namespace aptitude p2->get_narrow_pattern()); } + case pattern::native_architecture: + return 0; + case pattern::new_tp: return 0; diff --git a/src/generic/apt/matching/match.cc b/src/generic/apt/matching/match.cc index 1fa6e70d..435ca51e 100644 --- a/src/generic/apt/matching/match.cc +++ b/src/generic/apt/matching/match.cc @@ -1164,6 +1164,14 @@ namespace aptitude return NULL; break; + case pattern::foreign_architecture: + if(target.get_has_version() && + aptitude::apt::is_foreign_arch(target.get_version_iterator(cache))) + return match::make_atomic(p); + else + return NULL; + break; + case pattern::garbage: if(!target.get_has_version()) return NULL; @@ -1251,6 +1259,14 @@ namespace aptitude debug); break; + case pattern::native_architecture: + if(target.get_has_version() && + aptitude::apt::is_native_arch(target.get_version_iterator(cache))) + return match::make_atomic(p); + else + return NULL; + break; + case pattern::new_tp: if(!target.get_has_version()) return NULL; @@ -2089,12 +2105,14 @@ namespace aptitude case pattern::equal: case pattern::exact_name: case pattern::false_tp: + case pattern::foreign_architecture: case pattern::garbage: case pattern::install_version: case pattern::installed: case pattern::maintainer: case pattern::multiarch: case pattern::name: + case pattern::native_architecture: case pattern::new_tp: case pattern::obsolete: case pattern::origin: @@ -2300,12 +2318,14 @@ namespace aptitude case pattern::essential: case pattern::equal: case pattern::false_tp: + case pattern::foreign_architecture: case pattern::garbage: case pattern::install_version: case pattern::installed: case pattern::maintainer: case pattern::multiarch: case pattern::name: + case pattern::native_architecture: case pattern::new_tp: case pattern::obsolete: case pattern::origin: @@ -2424,12 +2444,14 @@ namespace aptitude case pattern::essential: case pattern::equal: case pattern::false_tp: + case pattern::foreign_architecture: case pattern::garbage: case pattern::install_version: case pattern::installed: case pattern::maintainer: case pattern::multiarch: case pattern::name: + case pattern::native_architecture: case pattern::new_tp: case pattern::obsolete: case pattern::origin: @@ -2622,12 +2644,14 @@ namespace aptitude case pattern::equal: case pattern::exact_name: case pattern::false_tp: + case pattern::foreign_architecture: case pattern::garbage: case pattern::install_version: case pattern::installed: case pattern::maintainer: case pattern::multiarch: case pattern::name: + case pattern::native_architecture: case pattern::new_tp: case pattern::obsolete: case pattern::origin: @@ -2911,12 +2935,14 @@ namespace aptitude case pattern::essential: case pattern::equal: case pattern::false_tp: + case pattern::foreign_architecture: case pattern::garbage: case pattern::install_version: case pattern::installed: case pattern::maintainer: case pattern::multiarch: case pattern::name: + case pattern::native_architecture: case pattern::new_tp: case pattern::obsolete: case pattern::origin: diff --git a/src/generic/apt/matching/parse.cc b/src/generic/apt/matching/parse.cc index e0b7a178..98218bcb 100644 --- a/src/generic/apt/matching/parse.cc +++ b/src/generic/apt/matching/parse.cc @@ -774,6 +774,22 @@ ref_ptr<pattern> parse_version(const string &version) return pattern::make_version(version); } +/** \brief Return an ?architecture term giving consideration + * to the special values native and foreign. + * + * Specifying an arch of "native" will return packages from both the + * native arch and also arch "all". This is the same behaviour + * as libapt-pkg when using, e.g., FindPkg. + */ +ref_ptr<pattern> parse_architecture(const string &arch) +{ + if(arch == "native") + return pattern::make_native_architecture(); + else if(arch == "foreign") + return pattern::make_foreign_architecture(); + else + return pattern::make_architecture(arch); +} // NB: "partial" is passed in because ?for terms can have trailing strings. ref_ptr<pattern> parse_term_args(const string &term_name, @@ -924,7 +940,7 @@ ref_ptr<pattern> parse_term_args(const string &term_name, else return pattern::make_any_version(parse_term_args(start, end, terminators, false, name_context)); case term_type_architecture: - return pattern::make_architecture(parse_string_match_args(start, end)); + return parse_architecture(parse_string_match_args(start, end)); case term_type_archive: return pattern::make_archive(parse_string_match_args(start, end)); case term_type_automatic: @@ -1343,7 +1359,7 @@ ref_ptr<pattern> parse_atom(string::const_iterator &start, case 'p': return pattern::make_priority(parse_priority(substr)); case 'r': - return pattern::make_architecture(substr); + return parse_architecture(substr); case 's': return pattern::make_section(substr); case 't': diff --git a/src/generic/apt/matching/pattern.cc b/src/generic/apt/matching/pattern.cc index bb874f4c..5743a2a7 100644 --- a/src/generic/apt/matching/pattern.cc +++ b/src/generic/apt/matching/pattern.cc @@ -116,12 +116,14 @@ switch(p->get_type()) case pattern::essential: case pattern::equal: case pattern::false_tp: + case pattern::foreign_architecture: case pattern::garbage: case pattern::install_version: case pattern::installed: case pattern::maintainer: case pattern::multiarch: case pattern::name: + case pattern::native_architecture: case pattern::new_tp: case pattern::obsolete: case pattern::origin: diff --git a/src/generic/apt/matching/pattern.h b/src/generic/apt/matching/pattern.h index 65f8fd35..f5cd142c 100644 --- a/src/generic/apt/matching/pattern.h +++ b/src/generic/apt/matching/pattern.h @@ -340,6 +340,11 @@ namespace aptitude * Fields: variable_name, pattern. */ for_tp, + /** \brief ?architecture(foreign) + * + * Matches packages of foreign architectures. + */ + foreign_architecture, /** \brief ?garbage * * Matches packages that are not required by any manually @@ -384,6 +389,11 @@ namespace aptitude * Fields: filter, pattern */ narrow, + /** \brief ?architecture(native) + * + * Matches packages of the native architecture. + */ + native_architecture, /** \brief ?new * * Matches packages that are "new". @@ -1280,6 +1290,20 @@ namespace aptitude // @} + /** \name foreign_architecture term constructor */ + + // @{ + + /** \brief Create an ?architecture(foreign) term. */ + + static cwidget::util::ref_ptr<pattern> + make_foreign_architecture() + { + return new pattern(foreign_architecture); + } + + // @} + /** \name garbage term constructor. */ // @{ @@ -1427,6 +1451,20 @@ namespace aptitude // @} + /** \name native_architecture term constructor */ + + // @{ + + /** \brief Create an ?architecture(native) term. */ + + static cwidget::util::ref_ptr<pattern> + make_native_architecture() + { + return new pattern(native_architecture); + } + + // @} + /** \name new_tp term constructor */ // @{ diff --git a/src/generic/apt/matching/serialize.cc b/src/generic/apt/matching/serialize.cc index 7e4be96b..8bd7c1b0 100644 --- a/src/generic/apt/matching/serialize.cc +++ b/src/generic/apt/matching/serialize.cc @@ -356,6 +356,10 @@ namespace aptitude variable_name_stack.pop_back(); break; + case pattern::foreign_architecture: + out << "?architecture(foreign)"; + break; + case pattern::garbage: out << "?garbage"; break; @@ -414,6 +418,10 @@ namespace aptitude out.put(')'); break; + case pattern::native_architecture: + out << "?architecture(native)"; + break; + case pattern::new_tp: out << "?new"; break; |