--- /dev/null
+#!/usr/bin/python
+
+# categorize-bts -- categorize
+#
+# Copyright 2009 Mike O'Connor <stew@vireo.org>
+#
+# This program is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 2, or (at your option) any
+# later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
+# USA.
+
+import sys
+import re
+import logging
+log = logging.getLogger()
+
+from btsutils.debbugs import debbugs
+
+class BugClassifier(object):
+ """
+ classify bugs using usertags based on the bug subject lines
+
+ >>> BugClassifier.rm_re.match( "RM: asdf" ) != None
+ True
+ >>> BugClassifier.rm_re.match( "[dak] Packages.diff/Index broken" ) != None
+ False
+ >>> BugClassifier.dak_re.match( "[dak] Packages.diff/Index broken" ) != None
+ True
+ """
+ rm_re = re.compile( "^RM" )
+ dak_re = re.compile( "^\[dak\]" )
+ classifiers = { rm_re: 'remove',
+ dak_re: "dak" }
+
+ def __init__( self ):
+
+ self.bts = debbugs()
+ self.bts.setUsers(['ftp.debian.org@packages.debian.org'])
+
+
+ def unclassified_bugs(self):
+ """
+ Returns a list of bugs which have not yet been classified by one
+ of our usertags.
+ """
+ return [ bug for bug in self.bts.query("pkg:ftp.debian.org") \
+ if bug.status=='pending' and not bug.usertags ]
+
+
+ def classify_bug(self, bug):
+ """
+ if any of our classifiers match, return a newline terminated
+ command to set an appropriate usertag, otherwise return an
+ empty string
+ """
+ retval = ""
+
+ for classifier in self.classifiers.keys():
+ if classifier.match(bug.summary):
+ retval = "usertag %s %s\n" % (bug.bug,
+ self.classifiers[classifier])
+ break
+
+ log.debug( retval )
+ return retval
+
+
+def main():
+ """
+ for now, we just dump a list of commands that could be sent for
+ control@b.d.o
+ """
+
+ level=logging.INFO
+ level=logging.DEBUG
+
+ logging.basicConfig( level=level,
+ format='%(asctime)s %(levelname)s %(message)s',
+ stream = sys.stderr )
+
+ controls = "user ftp.debian.org@packages.debian.org\n"
+
+ bc = BugClassifier()
+ for bug in bc.unclassified_bugs():
+ controls += bc.classify_bug(bug)
+
+ print controls
+
+
+if __name__ == "__main__":
+# import doctest
+# doctest.testmod()
+ main()