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

Reply via email to