[Aptitude-svn-commit] r3708 - in branches/aptitude-0.3/aptitude: . doc/en src

Daniel Burrows dburrows at costa.debian.org
Fri Aug 5 22:48:38 UTC 2005


Author: dburrows
Date: Fri Aug  5 22:48:34 2005
New Revision: 3708

Modified:
   branches/aptitude-0.3/aptitude/ChangeLog
   branches/aptitude-0.3/aptitude/doc/en/aptitude.xml
   branches/aptitude-0.3/aptitude/src/load_grouppolicy.cc
   branches/aptitude-0.3/aptitude/src/pkg_grouppolicy.cc
   branches/aptitude-0.3/aptitude/src/pkg_grouppolicy.h
Log:
Add a grouping policy based on debtags.

Modified: branches/aptitude-0.3/aptitude/ChangeLog
==============================================================================
--- branches/aptitude-0.3/aptitude/ChangeLog	(original)
+++ branches/aptitude-0.3/aptitude/ChangeLog	Fri Aug  5 22:48:34 2005
@@ -1,5 +1,9 @@
 2005-08-05  Daniel Burrows  <dburrows at debian.org>
 
+	* doc/en/aptitude.xml, src/load_grouppolicy.cc, src/pkg_grouppolicy.cc, src/pkg_grouppolicy.h:
+
+	  Add support for grouping packages using debtags information.
+
 	* src/generic/tags.cc, src/generic/tags.h:
 
 	  Add code to load in the tag vocabulary database.

Modified: branches/aptitude-0.3/aptitude/doc/en/aptitude.xml
==============================================================================
--- branches/aptitude-0.3/aptitude/doc/en/aptitude.xml	(original)
+++ branches/aptitude-0.3/aptitude/doc/en/aptitude.xml	Fri Aug  5 22:48:34 2005
@@ -4471,6 +4471,28 @@
 	    </varlistentry>
 
 	    <varlistentry>
+	      <term><synopsis>tag<optional>(<replaceable>facet</replaceable>)</optional></synopsis></term>
+
+	      <listitem>
+		<para>
+		  Groups packages according to the Tag information
+		  stored in the Debian package files.  If
+		  <replaceable>facet</replaceable> is provided, then
+		  only tags corresponding to that facet will be
+		  displayed, and packages lacking this facet will be
+		  hidden; otherwise, all packages will be displayed at
+		  least once (with tagless packages listed separately
+		  from packages that have tags).
+		</para>
+
+		<para>
+		  For more information on debtags, see <ulink
+		  url='http://debtags.alioth.debian.org'/>.
+		</para>
+	      </listitem>
+	    </varlistentry>
+
+	    <varlistentry>
 	      <term><synopsis>task</synopsis></term>
 
 	      <listitem>

Modified: branches/aptitude-0.3/aptitude/src/load_grouppolicy.cc
==============================================================================
--- branches/aptitude-0.3/aptitude/src/load_grouppolicy.cc	(original)
+++ branches/aptitude-0.3/aptitude/src/load_grouppolicy.cc	Fri Aug  5 22:48:34 2005
@@ -542,6 +542,19 @@
   }
 };
 
+class tag_policy_parser : public string_policy_parser
+{
+  group_policy_parse_node *create_node(const vector<string> &args)
+  {
+    if(args.size() == 0)
+      return new policy_node0<pkg_grouppolicy_facet_tag_factory>;
+    else if(args.size() != 1)
+      throw GroupParseException(_("Expected no more than one argument to a tag grouping policy"));
+    else
+      return new policy_node1<pkg_grouppolicy_tag_factory, string>(args[0]);
+  }
+};
+
 class pattern_policy_parser : public group_policy_parser
 {
   group_policy_parse_node *parse(string::const_iterator &begin,
@@ -652,6 +665,7 @@
       parse_types["priority"]=new priority_policy_parser;
       parse_types["hier"]=new hier_policy_parser;
       parse_types["task"]=new task_policy_parser;
+      parse_types["tag"]=new tag_policy_parser;
 
       parse_types["pattern"]=new pattern_policy_parser;
 

Modified: branches/aptitude-0.3/aptitude/src/pkg_grouppolicy.cc
==============================================================================
--- branches/aptitude-0.3/aptitude/src/pkg_grouppolicy.cc	(original)
+++ branches/aptitude-0.3/aptitude/src/pkg_grouppolicy.cc	Fri Aug  5 22:48:34 2005
@@ -30,9 +30,12 @@
 #include "generic/apt.h"
 #include "generic/matchers.h"
 #include "generic/pkg_hier.h"
+#include "generic/tags.h"
 #include "generic/tasks.h"
+#include "generic/util.h"
 
 #include <map>
+#include <set>
 
 #include <ctype.h>
 
@@ -1180,3 +1183,261 @@
     delete i->matcher;
   delete chain;
 }
+
+
+
+
+
+class pkg_grouppolicy_tag : public pkg_grouppolicy
+{
+  pkg_grouppolicy_factory *chain;
+
+  string facet;
+
+  typedef hash_map<string, pair<pkg_grouppolicy *, pkg_subtree *> > childmap;
+
+  childmap children;
+public:
+  pkg_grouppolicy_tag(const string &_facet, pkg_grouppolicy_factory *_chain,
+		      pkg_signal *sig, desc_signal *desc_sig)
+    :pkg_grouppolicy(sig, desc_sig), chain(_chain), facet(_facet)
+  {
+  }
+
+  virtual void add_package(const pkgCache::PkgIterator &pkg,
+			   pkg_subtree *root)
+  {
+    const set<tag> *tags = get_tags(pkg);
+    for(set<tag>::const_iterator ti = tags->begin();
+	ti != tags->end(); ++ti)
+      {
+	tag::const_iterator j = ti->begin();
+	if(j == ti->end())
+	  continue;
+
+	string thisfacet = *j;
+
+	if(thisfacet != facet)
+	  continue;
+
+	++j;
+	if(j == ti->end())
+	  continue;
+
+	string tagname = *j;
+	childmap::const_iterator found =
+	  children.find(tagname);
+
+	pkg_subtree *subtree = NULL;
+	pkg_grouppolicy *subpolicy = NULL;
+
+	if(found == children.end())
+	  {
+	    string desc = tag_description(ti->str());
+	    string shortdesc(desc, 0, desc.find('\n'));
+
+	    subtree = new pkg_subtree(swsprintf(L"%s - %s",
+						tagname.c_str(),
+						shortdesc.c_str()),
+				      transcode(desc),
+				      get_desc_sig());
+	    root->add_child(subtree);
+	    subpolicy = chain->instantiate(get_sig(),
+					   get_desc_sig());
+
+	    children[tagname] = pair<pkg_grouppolicy *, pkg_subtree *>(subpolicy, subtree);
+	  }
+	else
+	  {
+	    subpolicy = found->second.first;
+	    subtree = found->second.second;
+	  }
+
+	subpolicy->add_package(pkg, subtree);
+      }
+  }
+
+  ~pkg_grouppolicy_tag()
+  {
+    // Delete the subpolicies.
+    for(childmap::const_iterator i = children.begin();
+	i != children.end(); ++i)
+      delete i->second.first;
+  }
+};
+
+pkg_grouppolicy *pkg_grouppolicy_tag_factory::instantiate(pkg_signal *pkg_sig,
+							  desc_signal *desc_sig)
+{
+  return new pkg_grouppolicy_tag(facet, chain, pkg_sig, desc_sig);
+}
+
+pkg_grouppolicy_tag_factory::~pkg_grouppolicy_tag_factory()
+{
+  delete chain;
+}
+
+
+
+
+
+class pkg_grouppolicy_facet_tag : public pkg_grouppolicy
+{
+  pkg_grouppolicy_factory *chain;
+
+  typedef hash_map<string, pair<pkg_grouppolicy *, pkg_subtree *> > tagmap;
+
+  typedef hash_map<string, pair<tagmap *, pkg_subtree *> > facetmap;
+
+  pkg_subtree *untagged_tree;
+  pkg_grouppolicy *untagged_policy;
+
+  facetmap children;
+public:
+  pkg_grouppolicy_facet_tag(pkg_grouppolicy_factory *_chain,
+			    pkg_signal *pkg_sig,
+			    desc_signal *desc_sig)
+    :pkg_grouppolicy(pkg_sig, desc_sig),
+     chain(_chain),
+     untagged_tree(NULL),
+     untagged_policy(NULL)
+  {
+  }
+
+
+  virtual void add_package(const pkgCache::PkgIterator &pkg,
+			   pkg_subtree *root)
+  {
+    const set<tag> *tags = get_tags(pkg);
+
+    // Put all untagged, non-virtual packages into a separate list.
+    if(tags->empty() && !pkg.VersionList().end())
+      {
+	if(untagged_tree == NULL)
+	  {
+	    assert(untagged_policy == NULL);
+
+	    untagged_tree = new pkg_subtree(transcode(_("TAGLESS PACKAGES")),
+					    transcode(_("\n These packages have not yet been classified in debtags.")),
+					    get_desc_sig());
+	    root->add_child(untagged_tree);
+
+	    untagged_policy = chain->instantiate(get_sig(), get_desc_sig());
+	  }
+
+	untagged_policy->add_package(pkg, untagged_tree);
+      }
+
+    for(set<tag>::const_iterator ti = tags->begin();
+	ti != tags->end(); ++ti)
+      {
+	tag::const_iterator j = ti->begin();
+
+	assert(j != ti->end());
+
+	string thisfacet = *j;
+
+	if(j != ti->end())
+	  ++j;
+
+	string thistag;
+
+	if(j == ti->end())
+	  thistag = _("MISSING TAG");
+	else
+	  thistag = *j;
+
+	facetmap::const_iterator facetfound =
+	  children.find(thisfacet);
+
+	tagmap *tagchildren = NULL;
+	pkg_subtree *tagtree = NULL;
+
+	if(facetfound == children.end())
+	  {
+	    string desc = facet_description(thisfacet);
+	    string shortdesc(desc, 0, desc.find('\n'));
+
+	    if(!shortdesc.empty())
+	      tagtree = new pkg_subtree(swsprintf(L"%s - %s",
+						  thisfacet.c_str(),
+						  shortdesc.c_str()),
+					transcode(desc),
+					get_desc_sig());
+	    else
+	      tagtree = new pkg_subtree(transcode(thisfacet),
+					transcode(desc),
+					get_desc_sig());
+	    root->add_child(tagtree);
+	    tagchildren = new tagmap;
+
+	    children[thisfacet] = pair<tagmap *, pkg_subtree *>(tagchildren, tagtree);
+	  }
+	else
+	  {
+	    tagchildren = facetfound->second.first;
+	    tagtree = facetfound->second.second;
+	  }
+
+	tagmap::const_iterator tagfound =
+	  tagchildren->find(thistag);
+
+	pkg_grouppolicy *subpolicy = NULL;
+	pkg_subtree *subtree = NULL;
+
+	if(tagfound == tagchildren->end())
+	  {
+	    string desc = tag_description(ti->str());
+	    string shortdesc(desc, 0, desc.find('\n'));
+
+	    if(!shortdesc.empty())
+	      subtree = new pkg_subtree(swsprintf(L"%s - %s",
+						  thistag.c_str(),
+						  shortdesc.c_str()),
+					transcode(desc),
+					get_desc_sig());
+	    else
+	      subtree = new pkg_subtree(transcode(thistag),
+					transcode(desc),
+					get_desc_sig());
+
+	    tagtree->add_child(subtree);
+	    subpolicy = chain->instantiate(get_sig(), get_desc_sig());
+
+	    (*tagchildren)[thistag] = pair<pkg_grouppolicy *, pkg_subtree *>(subpolicy, subtree);
+	  }
+	else
+	  {
+	    subpolicy = tagfound->second.first;
+	    subtree = tagfound->second.second;
+	  }
+
+	subpolicy->add_package(pkg, subtree);
+      }
+  }
+
+  ~pkg_grouppolicy_facet_tag()
+  {
+    for(facetmap::const_iterator i = children.begin();
+	i != children.end(); ++i)
+      {
+	for(tagmap::const_iterator j = i->second.first->begin();
+	    j != i->second.first->end(); ++j)
+	  delete j->second.first;
+
+	delete i->second.first;
+      }
+  }
+};
+
+pkg_grouppolicy *
+pkg_grouppolicy_facet_tag_factory::instantiate(pkg_signal *sig,
+					       desc_signal *desc_sig)
+{
+  return new pkg_grouppolicy_facet_tag(chain, sig, desc_sig);
+}
+
+pkg_grouppolicy_facet_tag_factory::~pkg_grouppolicy_facet_tag_factory()
+{
+  delete chain;
+}

Modified: branches/aptitude-0.3/aptitude/src/pkg_grouppolicy.h
==============================================================================
--- branches/aptitude-0.3/aptitude/src/pkg_grouppolicy.h	(original)
+++ branches/aptitude-0.3/aptitude/src/pkg_grouppolicy.h	Fri Aug  5 22:48:34 2005
@@ -293,4 +293,39 @@
   ~pkg_grouppolicy_matchers_factory();
 };
 
+/** Groups packages by their tags within a single facet. */
+class pkg_grouppolicy_tag_factory : public pkg_grouppolicy_factory
+{
+  pkg_grouppolicy_factory *chain;
+
+  std::string facet;
+public:
+  pkg_grouppolicy_tag_factory(const std::string &_facet,
+			      pkg_grouppolicy_factory *_chain)
+    :chain(_chain), facet(_facet)
+  {
+  }
+
+  pkg_grouppolicy *instantiate(pkg_signal *sig,
+			       desc_signal *desc_sig);
+
+  ~pkg_grouppolicy_tag_factory();
+};
+
+/** Groups packages by their facets and their tags. */
+class pkg_grouppolicy_facet_tag_factory : public pkg_grouppolicy_factory
+{
+  pkg_grouppolicy_factory *chain;
+public:
+  pkg_grouppolicy_facet_tag_factory(pkg_grouppolicy_factory *_chain)
+    :chain(_chain)
+  {
+  }
+
+  pkg_grouppolicy *instantiate(pkg_signal *sig,
+			       desc_signal *desc_sig);
+
+  ~pkg_grouppolicy_facet_tag_factory();
+};
+
 #endif



More information about the Aptitude-svn-commit mailing list