[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