diff options
Diffstat (limited to 'bin/sfsum')
-rw-r--r-- | bin/sfsum | 148 |
1 files changed, 0 insertions, 148 deletions
diff --git a/bin/sfsum b/bin/sfsum deleted file mode 100644 index 142793a..0000000 --- a/bin/sfsum +++ /dev/null @@ -1,148 +0,0 @@ -#!/usr/bin/env python -# -# sfsum.py: A script for parsing XML data exported from -# SourceForge projects. -# -# Right now, this is hard-coded to generate a summary of open bugs. -# -# XML data for SourceForge project is available for download by project -# administrators. Because it's intended for backup purposes, you have -# to slurp the whole set of data, including info about all of the closed -# items, the feature requests, etc., so it can get big. -# -# You can do this by hand (if you're an administrator) with a URL like -# this (where 30337 is the group_id for SCons): -# -# http://sourceforge.net/export/xml_export.php?group_id=30337 -# -# They also have a Perl script, called xml_export, available as part -# of a set of utilities called "adocman" which automate dealing with -# SourceForge document management from the command line. "adocman" -# is available at: -# -# https://sourceforge.net/projects/sitedocs/ -# -from __future__ import print_function - -import xml.sax -import xml.sax.saxutils -import sys - -SFName = { - 'Unassigned' : 'nobody', - 'Chad Austin' : 'aegis', - 'Charle Crain' : 'diewarzau', - 'Steven Knight' : 'stevenknight', - 'Steve Leblanc' : 'stevenleblanc', - 'Jeff Petkau' : 'jpet', - 'Anthony Roach' : 'anthonyroach', - 'Steven Shaw' : 'steven_shaw', - 'Terrel Shumway' : 'terrelshumway', - 'Greg Spencer' : 'greg_spencer', - 'Christoph Wiedemann' : 'wiedeman', -} - -class Artifact(object): - """Just a place to hold attributes that we find in the XML.""" - pass - -Artifacts = {} - -def nws(text): - """Normalize white space. This will become important if/when - we enhance this to search for arbitrary fields.""" - return ' '.join(text.split()) - -class ClassifyArtifacts(xml.sax.saxutils.DefaultHandler): - """ - Simple SAX subclass to classify the artifacts in SourceForge - XML output. - - This reads up the fields in an XML description and turns the field - descriptions into attributes of an Artificat object, on the fly. - Artifacts are of the following types: - - Bugs - Feature Requests - Patches - Support Requests - - We could, if we choose to, add additional types in the future - by creating additional trackers. - - This class loses some info right now because we don't pay attention - to the <messages> tag in the output, which contains a list of items - that have <field> tags in them. Right now, these just overwrite - each other in the Arifact object we create. - - We also don't pay attention to any attributes of a <field> tag other - than the "name" attribute. We'll need to extend this class if we - ever want to pay attention to those attributes. - """ - def __init__(self): - self.artifact = None - - def startElement(self, name, attrs): - self.text = "" - if name == 'artifact': - self.artifact = Artifact() - elif not self.artifact is None and name == 'field': - self.fname = attrs.get('name', None) - - def characters(self, ch): - if not self.artifact is None: - self.text = self.text + ch - - def endElement(self, name): - global Artifacts - if name == 'artifact': - type = self.artifact.artifact_type - try: - list = Artifacts[type] - except KeyError: - Artifacts[type] = list = [] - list.append(self.artifact) - self.artifact = None - elif not self.artifact is None and name == 'field': - setattr(self.artifact, self.fname, self.text) - -if __name__ == '__main__': - # Create a parser. - parser = xml.sax.make_parser() - # Tell the parser we are not interested in XML namespaces. - parser.setFeature(xml.sax.handler.feature_namespaces, 0) - - # Instantiate our handler and tell the parser to use it. - parser.setContentHandler(ClassifyArtifacts()) - - # Parse the input. - parser.parse(sys.argv[1]) - - # Hard-coded search for 'Open' bugs. This should be easily - # generalized once we figure out other things for this script to do. - bugs = [x for x in Artifacts['Bugs'] if x.status == 'Open'] - - print(list(Artifacts.keys())) - - print("%d open bugs" % len(bugs)) - - # Sort them into a separate list for each assignee. - Assigned = {} - for bug in bugs: - a = bug.assigned_to - try: - list = Assigned[a] - except KeyError: - Assigned[a] = list = [] - list.append(bug) - - for a in SFName.keys(): - try: - b = Assigned[SFName[a]] - except KeyError: - pass - else: - print(" %s" % a) - b.sort(key=lambda x, y: (x.artifact_id, y.artifact_id)) - for bug in b: - print(" %-6s %s" % (bug.artifact_id, bug.summary)) |