]> git.decadent.org.uk Git - dak.git/commitdiff
move bts_categorize into dak, send email
authorMike O'Connor <stew@vireo.org>
Sat, 24 Jan 2009 17:19:07 +0000 (12:19 -0500)
committerMike O'Connor <stew@vireo.org>
Sat, 24 Jan 2009 17:19:07 +0000 (12:19 -0500)
bts_categorize can now be called as "dak bts-categorize"
added command line options (try 'dak bts-categorize -h')
it now optionally sends email to control@bugs.debian.org

Signed-off-by: Mike O'Connor <stew@vireo.org>
dak/bts_categorize.py [new file with mode: 0755]
dak/dak.py
scripts/debian/bts-categorize [deleted file]

diff --git a/dak/bts_categorize.py b/dak/bts_categorize.py
new file mode 100755 (executable)
index 0000000..3a3a889
--- /dev/null
@@ -0,0 +1,195 @@
+#!/usr/bin/python
+
+#  bts -- manage bugs filed against ftp.debian.org
+#
+#  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.
+
+################################################################################
+################################################################################
+
+def usage():
+    print """
+SYNOPSIS
+    dak bts-categorize [options] command
+
+COMMANDS
+    list-categories
+        List the currently defind categorizations for bugs
+
+    categorize
+        Find the bugs filed against ftp.debian.org which have no usertag
+        and see if we can categorize the bug by adding a usertag by matching
+        the subject against a list of regexps.
+
+OPTIONS
+    -s
+    --simulate
+        Don't send email, instead output the lines that would be sent to
+        control@b.d.o.
+
+    -v
+    --verbose
+        Print more informational log messages
+
+    -q
+    --quiet
+        Suppress informational messages
+
+    -h
+    --help
+        Print this documentation.
+"""
+
+arguments = [('s','simulate','BtsCategorize::Options::Simulate'),
+             ('v', 'verbose', 'BtsCategorize::Options::Verbose'),
+             ('q', 'quiet', 'BtsCategorize::Options::Quiet'),
+             ('h', 'help', 'BtsCategorize::Options::Help')]
+
+import sys
+import re
+import logging
+log = logging.getLogger()
+
+import apt_pkg
+from daklib import utils
+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\]" )
+    arch_re = re.compile( "^\[Architectures\]" )
+
+    classifiers = { rm_re: 'remove',
+                    dak_re: 'dak',
+                    arch_re: 'archs'}
+
+    def __init__( self ):
+        self.bts = debbugs()
+        self.bts.setUsers(['ftp.debian.org@packages.debian.org'])
+
+
+    def unclassified_bugs(self):
+        """
+        Returns a list of open 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
+
+        if retval:
+            log.info(retval)
+        else:
+            log.debug("Unmatched: [%s] %s" % (bug.bug, bug.summary))
+
+        return retval
+
+    def email_text(self):
+        controls = 'user ftp.debian.org@packages.debian.org\n'
+
+        bc = BugClassifier()
+        for bug in bc.unclassified_bugs():
+            controls += bc.classify_bug(bug)
+
+        return controls
+
+
+import smtplib
+import email.Message
+
+def send_email(body):
+    to = 'control@bugs.debian.org'
+    sender = 'ak@ries.debian.org'
+    message = email.Message.Message()
+    message["To"] = to
+    message["From"] = sender
+    message.set_payload(body)
+    mailServer = smtplib.SMTP('localhost')
+    mailServer.sendmail(sender, to, message.as_string())
+    mailServer.quit()
+
+def main():
+    """
+    for now, we just dump a list of commands that could be sent for
+    control@b.d.o
+    """
+    global Cnf
+    Cnf = utils.get_conf()
+
+    for arg in arguments:
+        opt = "BtsCategorize::Options::%s" % arg[1]
+        if not Cnf.has_key(opt):
+            Cnf[opt] = ""
+
+    packages = apt_pkg.ParseCommandLine(Cnf, arguments, sys.argv)
+    Options = Cnf.SubTree('BtsCategorize::Options')
+
+    if Options["Help"]:
+        usage()
+        sys.exit( 0 )
+
+    if Options["Quiet"]:
+        level=logging.ERROR
+
+    elif Options["Verbose"]:
+        level=logging.DEBUG
+
+    else:
+        level=logging.INFO
+
+    logging.basicConfig( level=level,
+                         format='%(asctime)s %(levelname)s %(message)s',
+                         stream = sys.stderr )
+
+    body = BugClassifier().email_text()
+
+    if Options["Simulate"]:
+        print body
+
+    else:
+        send_email(body)
+
+
+if __name__ == '__main__':
+#    import doctest
+#    doctest.testmod()
+    main()
index e8a7df03a3c52d2998d24dd2e73b7110230e1385..266bae1766ded64aa819214b35b8cf6a2d6de1c8 100755 (executable)
@@ -164,6 +164,8 @@ def init():
          "Split queue/done into a date-based hierarchy"),
         ("stats",
          "Generate statistics"),
+        ("bts-categorize",
+         "Categorize uncategorized bugs filed against ftp.debian.org"),
         ]
     return functionality
 
diff --git a/scripts/debian/bts-categorize b/scripts/debian/bts-categorize
deleted file mode 100755 (executable)
index d4b4477..0000000
+++ /dev/null
@@ -1,102 +0,0 @@
-#!/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
-
-    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()