Package: aptitude Version: 0.4.11.8-1.1 Severity: wishlist Tags: patch This patch allows grouping packages by Source package name. It allows using Aptitude::UI::Default-Grouping with the source name (try aptitude -o Aptitude::UI::Default-Grouping="status,source") and provides an option in the Views menu for Source Browsing.
-- System Information: Debian Release: lenny/sid APT prefers unstable APT policy: (500, 'unstable'), (1, 'experimental') Architecture: i386 (i686) Kernel: Linux 2.6.27-rc1-00001-gf053e9a (PREEMPT) Locale: LANG=en_US.UTF-8, LC_CTYPE=en_US.UTF-8 (charmap=UTF-8) Shell: /bin/sh linked to /bin/bash Versions of packages aptitude depends on: ii apt [libapt-pkg-libc6.7-6 0.7.14.1 Advanced front-end for dpkg ii libc6 2.7-13 GNU C Library: Shared libraries ii libcwidget3 0.5.12-1 high-level terminal interface libr ii libgcc1 1:4.3.1-9 GCC support library ii libncursesw5 5.6+20080823-1 shared libraries for terminal hand ii libsigc++-2.0-0c2a 2.0.18-2 type-safe Signal Framework for C++ ii libstdc++6 4.3.1-9 The GNU Standard C++ Library v3 Versions of packages aptitude recommends: ii aptitude-doc-en [aptitude-doc 0.4.11.9-1 English manual for aptitude, a ter ii libparse-debianchangelog-perl 1.1.1-2 parse Debian changelogs and output -- no debconf information
--- aptitude-0.4.11.8.orig/src/load_grouppolicy.cc +++ aptitude-0.4.11.8/src/load_grouppolicy.cc @@ -492,6 +492,18 @@ } }; +class source_policy_parser : public string_policy_parser +{ +public: + group_policy_parse_node *create_node(const vector<string> &args) + { + if(args.size()!=0) + throw GroupParseException(_("Too many arguments to by-source grouping policy")); + + return new policy_node0<pkg_grouppolicy_source_factory>; + } +}; + class ver_policy_parser : public string_policy_parser { group_policy_parse_node *create_node(const vector<string> &args) @@ -696,6 +708,7 @@ parse_types["action"]=new mode_policy_parser; parse_types["filter"]=new filter_policy_parser; parse_types["firstchar"]=new firstchar_policy_parser; + parse_types["source"]=new source_policy_parser; parse_types["versions"]=new ver_policy_parser; parse_types["deps"]=new dep_policy_parser; --- aptitude-0.4.11.8.orig/src/ui.cc +++ aptitude-0.4.11.8/src/ui.cc @@ -909,6 +909,27 @@ p->destroy(); } +static void do_new_source_view_with_new_bar() +{ + progress_ref p = gen_progress_bar(); + + pkg_grouppolicy_factory *grp = NULL; + string grpstr = "source"; + grp = parse_grouppolicy(grpstr); + + pkg_tree_ref tree = pkg_tree::create(grpstr.c_str(), grp); + + add_main_widget(make_default_view(tree, + &tree->selected_signal, + &tree->selected_desc_signal), + _("Packages"), + _("View available packages and choose actions to perform"), + _("Packages")); + + tree->build_tree(*p.unsafe_get_ref()); + p->destroy(); +} + void do_new_hier_view(OpProgress &progress) { pkg_grouppolicy_factory *grp=NULL; @@ -2348,6 +2369,11 @@ N_("Browse packages using Debtags data"), sigc::ptr_fun(do_new_tag_view_with_new_bar)), + cw::menu_info(cw::menu_info::MENU_ITEM, N_("New ^Source Browser"), + NULL, + N_("Browse packages by Source package"), + sigc::ptr_fun(do_new_source_view_with_new_bar)), + cw::menu_info(cw::menu_info::MENU_ITEM, N_("New Categorical ^Browser"), NULL, N_("Browse packages by category"), --- aptitude-0.4.11.8.orig/src/pkg_grouppolicy.h +++ aptitude-0.4.11.8/src/pkg_grouppolicy.h @@ -370,4 +370,18 @@ ~pkg_grouppolicy_facet_tag_factory(); }; +// Groups by source package +class pkg_grouppolicy_source_factory:public pkg_grouppolicy_factory +{ + pkg_grouppolicy_factory *chain; +public: + pkg_grouppolicy_source_factory(pkg_grouppolicy_factory *_chain):chain(_chain) {} + + pkg_grouppolicy *instantiate(pkg_signal *_sig, + desc_signal *_desc_sig); + + virtual ~pkg_grouppolicy_source_factory() + {delete chain;} +}; + #endif --- aptitude-0.4.11.8.orig/src/pkg_grouppolicy.cc +++ aptitude-0.4.11.8/src/pkg_grouppolicy.cc @@ -1645,3 +1645,68 @@ { delete chain; } + + +/*****************************************************************************/ + +// Groups packages by source package +class pkg_grouppolicy_source:public pkg_grouppolicy +{ + typedef map<string, + pair<pkg_grouppolicy *, pkg_subtree *> > childmap; + + childmap children; + pkg_grouppolicy_factory *chain; + + pkg_grouppolicy *spillover; +public: + pkg_grouppolicy_source(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_source() + { + 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 source; + if (!pkg.Source()) + source=pkg.Name(); + else + source=pkg.Source(); + + childmap::iterator found=children.find(source); + + if(found!=children.end()) + found->second.first->add_package(pkg, found->second.second); + else + { + pkg_subtree *newtree=new pkg_subtree(cw::util::transcode(source.c_str()), + L"", + get_desc_sig()); + pkg_grouppolicy *newchild=chain->instantiate(get_sig(), + get_desc_sig()); + children[source].first=newchild; + children[source].second=newtree; + root->add_child(newtree); + newtree->set_num_packages_parent(root); + + newchild->add_package(pkg, newtree); + } + } +}; + +pkg_grouppolicy *pkg_grouppolicy_source_factory::instantiate(pkg_signal *sig, + desc_signal *desc_sig) +{ + return new pkg_grouppolicy_source(chain, sig, desc_sig); +} + +