X-Git-Url: https://git.decadent.org.uk/gitweb/?p=dak.git;a=blobdiff_plain;f=dak%2Fbts_categorize.py;h=c8739af65618fa16ff2c569306f61a45e94dc975;hp=3a3a8899f186e879cbe4158504a378dfb68f916a;hb=0d69fff35ef45fda573467873ae2f01ca1954650;hpb=564395db9f6a393a894fa1b2f7ff5aefcfadd2b7 diff --git a/dak/bts_categorize.py b/dak/bts_categorize.py index 3a3a8899..c8739af6 100755 --- a/dak/bts_categorize.py +++ b/dak/bts_categorize.py @@ -1,9 +1,14 @@ #!/usr/bin/python -# bts -- manage bugs filed against ftp.debian.org -# -# Copyright 2009 Mike O'Connor -# +""" +bts -- manage bugs filed against ftp.debian.org + +@contact: Debian FTP Master +@copyright: 2009 Mike O'Connor +@copyright: 2010 Alexander Reichle-Schmehl +@license: GNU General Public License version 2 or later +""" + # 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 @@ -22,19 +27,19 @@ ################################################################################ ################################################################################ +import sys +import re +import logging +log = logging.getLogger() + +import apt_pkg +from daklib import utils +import debianbts as bts + 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. + dak bts-categorize [options] OPTIONS -s @@ -60,15 +65,6 @@ arguments = [('s','simulate','BtsCategorize::Options::Simulate'), ('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 @@ -83,23 +79,26 @@ class BugClassifier(object): rm_re = re.compile( "^RM" ) dak_re = re.compile( "^\[dak\]" ) arch_re = re.compile( "^\[Architectures\]" ) + override_re = re.compile( "^override" ) 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']) - + arch_re: 'archs', + override_re: 'override'} 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 ] + + tagged_bugs = bts.get_usertag('ftp.debian.org@packages.debian.org') + tagged_bugs_ftp = [] + for tags in tagged_bugs.keys(): + tagged_bugs_ftp += tagged_bugs[tags] + + return [ bug for bug in bts.get_status( bts.get_bugs("package", "ftp.debian.org" ) ) \ + if bug.pending=='pending' and not bug.bug_num in tagged_bugs_ftp ] def classify_bug(self, bug): @@ -111,41 +110,44 @@ class BugClassifier(object): retval = "" for classifier in self.classifiers.keys(): - if classifier.match(bug.summary): - retval = "usertag %s %s\n" % (bug.bug, + if classifier.match(bug.subject): + retval = "usertag %s %s\n" % (bug.bug_num, self.classifiers[classifier]) break if retval: log.info(retval) else: - log.debug("Unmatched: [%s] %s" % (bug.bug, bug.summary)) + log.debug("Unmatched: [%s] %s" % (bug.bug_num, bug.subject)) return retval def email_text(self): - controls = 'user ftp.debian.org@packages.debian.org\n' + controls = "" bc = BugClassifier() - for bug in bc.unclassified_bugs(): - controls += bc.classify_bug(bug) + try: + for bug in bc.unclassified_bugs(): + controls += bc.classify_bug(bug) - return controls + return controls + except: + log.error("couldn't retrieve bugs from soap interface: %s" % sys.exc_info()[0]) + return None +def send_email(commands, simulate=False): + global Cnf + + Subst = {'__COMMANDS__' : commands, + "__DAK_ADDRESS__": Cnf["Dinstall::MyAdminAddress"]} -import smtplib -import email.Message + bts_mail_message = utils.TemplateSubst( + Subst,Cnf["Dir::Templates"]+"/bts-categorize") -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() + if simulate: + print bts_mail_message + else: + utils.send_mail( bts_mail_message ) def main(): """ @@ -160,8 +162,8 @@ def main(): if not Cnf.has_key(opt): Cnf[opt] = "" - packages = apt_pkg.ParseCommandLine(Cnf, arguments, sys.argv) - Options = Cnf.SubTree('BtsCategorize::Options') + packages = apt_pkg.parse_commandline(Cnf, arguments, sys.argv) + Options = Cnf.subtree('BtsCategorize::Options') if Options["Help"]: usage() @@ -182,11 +184,11 @@ def main(): body = BugClassifier().email_text() - if Options["Simulate"]: - print body + if body: + send_email(body, Options["Simulate"]) else: - send_email(body) + log.info( "nothing to do" ) if __name__ == '__main__':