#!/usr/bin/python # -*- coding: utf-8 -*- # # Copyright (C) 2007 Canonical Ltd., Daniel Holbach # Copyright (C) 2008 Jonathan Patrick Davies # # ################################################################## # # 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; version 3. # # 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. # # See file /usr/share/common-licenses/GPL-3 for more details. # # ################################################################## # # # hugdaylist - produces MoinMoin wiki formatted tables based on a Launchpad bug # list. # # hugdaylist # - produces lists like https://wiki.ubuntu.com/UbuntuBugDay/20070912?action=raw # # hugdaylist -n # - will only list URLs. import os import re import string import sys from optparse import OptionParser try: import launchpadbugs.connector as Connector BugList = Connector.ConnectBugList() Bug = Connector.ConnectBug(method="Text") except ImportError: print >> sys.stderr, \ "python-launchpad-bugs (>= 0.2.25) needs to be installed to use hugdaylist." sys.exit(1) def check_args(): howmany = -1 url = "" # Our usage options. usage = "usage: %prog [-n ] launchpad-buglist-url" optParser = OptionParser(usage) argsParsed = 0 # Options - namely just the number of bugs to output. optParser.add_option("-n", "--number", type = "int", dest = "number", help = "Number of entries to output.") # Parse arguments. (options, args) = optParser.parse_args() # Check if we want a number other than the default. howmany = options.number # Check that we have an URL. if not args: print >> sys.stderr, "An URL pointing to a Launchpad bug list is " \ "required." optParser.print_help() sys.exit(1) else: url = args[argsParsed] return (howmany, url) def filter_unsolved(b): bug = Bug(int(b)) # Filter out special types of bugs: # - https://wiki.ubuntu.com/Bugs/HowToTriage#Special%20types%20of%20bugs return filter(lambda a: a.status != 'Fix Committed' and \ (a.assignee in ['motu','desktop-bugs'] or \ not a.assignee), bug.infotable) and \ 'ubuntu-main-sponsors' not in [str(s) for s in bug.subscribers] and \ 'ubuntu-universe-sponsors' not in [str(s) for s in bug.subscribers] and \ 'ubuntu-archive' not in [str(s) for s in bug.subscribers] def main(): (howmany, url) = check_args() try: bl = BugList(url) except: print >> sys.stderr, "The URL at '%s' does not appear to have a bug " \ "list." % url sys.exit(1) l = filter(filter_unsolved, bl) if not l: print "Bug list of %s is empty." % url sys.exit(0) if howmany == -1: howmany = len(l) print """ ## || This task is done || somebody || || ## || This task is assigned || somebody || || ## || This task isn't || ... || || ## || This task is blocked on something || somebody || || || Bug || Subject || Triager ||""" for i in list(l)[:howmany]: print '|| [%s %s] || %s || ||' % \ (i.url, i.bugnumber, i.summary) if __name__ == '__main__': try: main() except KeyboardInterrupt: print >> sys.stderr, "Aborted." sys.exit(1)