#!/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 sys from optparse import OptionParser from launchpadlib.launchpad import Launchpad from ubuntutools.lp.libsupport import translate_web_api def check_args(): howmany = -1 url = "" # Our usage options. usage = "usage: %prog [-n ] launchpad-buglist-url" opt_parser = OptionParser(usage) # Options - namely just the number of bugs to output. opt_parser.add_option("-n", "--number", type="int", dest="number", help="Number of entries to output.") # Parse arguments. (options, args) = opt_parser.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." opt_parser.print_help() sys.exit(1) else: url = args[0] return (howmany, url) def filter_unsolved(task): # TODO: don't use this filter here, only check status and assignee of # the given task # Filter out special types of bugs: # - https://wiki.ubuntu.com/Bugs/HowToTriage#Special%20types%20of%20bugs # this is expensive, parse name out of self_link instead? subscriptions = set(s.person.name for s in task.bug.subscriptions) if (task.status != "Fix Committed" and (not task.assignee or task.assignee.name in ['motu', 'desktop-bugs']) and 'ubuntu-sponsors' not in subscriptions and 'ubuntu-archive' not in subscriptions): return True return False def main(): (howmany, url) = check_args() if len(url.split("?", 1)) == 2: # search options not supported, because there is no mapping web ui # options <-> API options print >> sys.stderr, "Options in url are not supported, url: %s" % url sys.exit(1) launchpad = None try: launchpad = Launchpad.login_with("ubuntu-dev-tools", 'production') except IOError, error: print error sys.exit(1) api_url = translate_web_api(url, launchpad) try: product = launchpad.load(api_url) except Exception, error: response = getattr(error, "response", {}) if response.get("status", None) == "404": print >> sys.stderr, ("The URL at '%s' does not appear to be a " "valid url to a product") % url sys.exit(1) else: raise bug_list = [b for b in product.searchTasks() if filter_unsolved(b)] if not bug_list: print "Bug list of %s is empty." % url sys.exit(0) if howmany == -1: howmany = len(bug_list) 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(bug_list)[:howmany]: bug = i.bug print '|| [%s %s] || %s || ||' % \ (bug.web_link, bug.id, bug.title) if __name__ == '__main__': try: main() except KeyboardInterrupt: print >> sys.stderr, "Aborted." sys.exit(1)