diff options
-rw-r--r-- | NEWS | 1 | ||||
-rw-r--r-- | doc/en/aptitude.xml | 10 | ||||
-rw-r--r-- | src/load_grouppolicy.cc | 12 | ||||
-rw-r--r-- | src/pkg_grouppolicy.cc | 68 | ||||
-rw-r--r-- | src/pkg_grouppolicy.h | 14 |
5 files changed, 105 insertions, 0 deletions
@@ -57,6 +57,7 @@ resolve any problems. - Default search (with no explicit term) now accepts "name:arch" patterns which match "?exact-name(name)?architecture(arch)". + - Add architecture grouping policy. (Closes: #659079, #661744) (LP: #454941, #845136, #884945, #904486) diff --git a/doc/en/aptitude.xml b/doc/en/aptitude.xml index f2b5759a..0ea9cc87 100644 --- a/doc/en/aptitude.xml +++ b/doc/en/aptitude.xml @@ -7492,6 +7492,16 @@ e: Examine !: Apply .: Next ,: Previous</screen> </listitem> </varlistentry> + <varlistentry> + <term><synopsis>architecture</synopsis></term> + + <listitem> + <para> + Groups packages according to their architecture. + </para> + </listitem> + </varlistentry> + <varlistentry> <term><synopsis>deps</synopsis></term> diff --git a/src/load_grouppolicy.cc b/src/load_grouppolicy.cc index 3189e827..c8aad707 100644 --- a/src/load_grouppolicy.cc +++ b/src/load_grouppolicy.cc @@ -758,6 +758,17 @@ class pattern_policy_parser : public group_policy_parser } }; +class arch_policy_parser : public string_policy_parser +{ + group_policy_parse_node *create_node(const vector<string> &args) + { + if(args.size()!=0) + throw GroupParseException(_("Grouping policy '%s' takes no arguments"), "architecture"); + + return new policy_node0<pkg_grouppolicy_arch_factory>; + } +}; + static void init_parse_types() { static bool initted_parse_types=false; @@ -770,6 +781,7 @@ static void init_parse_types() parse_types["filter"]=new filter_policy_parser; parse_types["firstchar"]=new firstchar_policy_parser; parse_types["source"]=new source_policy_parser; + parse_types["architecture"]=new arch_policy_parser; parse_types["versions"]=new ver_policy_parser; parse_types["deps"]=new dep_policy_parser; diff --git a/src/pkg_grouppolicy.cc b/src/pkg_grouppolicy.cc index 76b8b2f0..66588138 100644 --- a/src/pkg_grouppolicy.cc +++ b/src/pkg_grouppolicy.cc @@ -1765,3 +1765,71 @@ pkg_grouppolicy *pkg_grouppolicy_source_factory::instantiate(pkg_signal *sig, { return new pkg_grouppolicy_source(chain, sig, desc_sig); } + +/*****************************************************************************/ + +// Groups packages by architecture +class pkg_grouppolicy_arch:public pkg_grouppolicy +{ + typedef map<string, + pair<pkg_grouppolicy *, pkg_subtree *> > childmap; + + childmap children; + pkg_grouppolicy_factory *chain; + + pkg_grouppolicy *spillover; + +public: + pkg_grouppolicy_arch(pkg_grouppolicy_factory *_chain, + pkg_signal *_sig, desc_signal *_desc_sig) + :pkg_grouppolicy(_sig, _desc_sig), + chain(_chain), + spillover(_chain->instantiate(get_sig(), get_desc_sig())) + { + } + + ~pkg_grouppolicy_arch() + { + for(childmap::iterator i=children.begin(); i!=children.end(); i++) + delete i->second.first; + } + + void add_package(const pkgCache::PkgIterator &pkg, pkg_subtree *root) + { + string arch; + + if(!pkg.VersionList().end()) + { + arch=pkg.VersionList().Arch(); + } + else + { + arch=_("virtual"); + } + + childmap::iterator found=children.find(arch); + + if(found!=children.end()) + found->second.first->add_package(pkg, found->second.second); + else + { + pkg_subtree *newtree=new pkg_subtree(cw::util::transcode(arch), + L"", + get_desc_sig()); + pkg_grouppolicy *newchild=chain->instantiate(get_sig(), + get_desc_sig()); + children[arch].first=newchild; + children[arch].second=newtree; + root->add_child(newtree); + newtree->set_num_packages_parent(root); + + newchild->add_package(pkg, newtree); + } + } +}; + +pkg_grouppolicy *pkg_grouppolicy_arch_factory::instantiate(pkg_signal *sig, + desc_signal *desc_sig) +{ + return new pkg_grouppolicy_arch(chain, sig, desc_sig); +} diff --git a/src/pkg_grouppolicy.h b/src/pkg_grouppolicy.h index f9169e21..33d3d860 100644 --- a/src/pkg_grouppolicy.h +++ b/src/pkg_grouppolicy.h @@ -391,4 +391,18 @@ public: {delete chain;} }; +// Groups by architecture +class pkg_grouppolicy_arch_factory:public pkg_grouppolicy_factory +{ + pkg_grouppolicy_factory *chain; +public: + pkg_grouppolicy_arch_factory(pkg_grouppolicy_factory *_chain):chain(_chain) {} + + pkg_grouppolicy *instantiate(pkg_signal *_sig, + desc_signal *_desc_sig); + + virtual ~pkg_grouppolicy_arch_factory() + {delete chain;} +}; + #endif |