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);
+}
+
+