summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel Hartwig <mandyke@gmail.com>2012-03-19 21:52:39 +0800
committerDaniel Hartwig <mandyke@gmail.com>2012-03-19 21:52:39 +0800
commitec234514bbf88e4800218fd39e3500024b424476 (patch)
treeab44cb2fbfc0e6e06c829f5c1de0ba0445f3b6ce
parent8acc867a365f7199a61e4e9305bfc60fd093d7fd (diff)
downloadaptitude-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.
-rw-r--r--doc/en/aptitude.xml7
-rw-r--r--src/generic/apt/apt.cc9
-rw-r--r--src/generic/apt/apt.h10
-rw-r--r--src/generic/apt/matching/compare_patterns.cc6
-rw-r--r--src/generic/apt/matching/match.cc26
-rw-r--r--src/generic/apt/matching/parse.cc20
-rw-r--r--src/generic/apt/matching/pattern.cc2
-rw-r--r--src/generic/apt/matching/pattern.h38
-rw-r--r--src/generic/apt/matching/serialize.cc8
9 files changed, 122 insertions, 4 deletions
diff --git a/doc/en/aptitude.xml b/doc/en/aptitude.xml
index ea9cdf6d..a8e84459 100644
--- a/doc/en/aptitude.xml
+++ b/doc/en/aptitude.xml
@@ -5567,7 +5567,8 @@ e: Examine !: Apply .: Next ,: Previous</screen>
<entry>
Select packages for the given architecture (such as
<quote><literal>amd64</literal></quote>, or
- <quote><literal>all</literal></quote>).
+ <quote><literal>all</literal></quote>). Special values:
+ <literal>native</literal> and <literal>foreign</literal>.
</entry>
</row>
@@ -6207,7 +6208,9 @@ e: Examine !: Apply .: Next ,: Previous</screen>
<quote><literal>?architecture(amd64)</literal></quote>
matches <literal>amd64</literal> packages, while
<quote><literal>?architecture(all)</literal></quote>
- matches arch-independent packages.
+ matches arch-independent packages. Also accepts the
+ special values <literal>native</literal> and
+ <literal>foreign</literal>.
</para>
</listitem>
</varlistentry>
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;