#!/usr/bin/python # -*- coding: UTF-8 -*- # Copyright © 2009 James Westby , # 2010 Stefano Rivera # # ################################################################## # # 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 # of the License, 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., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. # # ################################################################## from optparse import OptionParser, SUPPRESS_HELP import re import sys import subprocess import SOAPpy from ubuntutools.config import UDTConfig from ubuntutools.lp.libsupport import get_launchpad def main(): bug_re = re.compile(r"bug=(\d+)") url = 'http://bugs.debian.org/cgi-bin/soap.cgi' namespace = 'Debbugs/SOAP' debbugs = SOAPpy.SOAPProxy(url, namespace) # debug #debbugs.config.dumpSOAPOut = 1 #debbugs.config.dumpSOAPIn = 1 parser = OptionParser(usage="%prog [option] bug ...") parser.add_option("-b", "--browserless", help="Don't open the bug in the browser at the end", dest="browserless", action="store_true") parser.add_option("-l", "--lpinstance", metavar="INSTANCE", help="Launchpad instance to connect to " "(default: production)", dest="lpinstance", default=None) parser.add_option("-n", "--dry-run", help=SUPPRESS_HELP, dest="lpinstance", action="store_const", const="staging") parser.add_option("-p", "--package", metavar="PACKAGE", help="Launchpad package to file bug against " "(default: Same as Debian)", dest="package", default=None) parser.add_option("--no-conf", dest="no_conf", default=False, help="Don't read config files or environment variables.", action="store_true") (options, args) = parser.parse_args() config = UDTConfig(options.no_conf) if options.lpinstance is None: options.lpinstance = config.get_value("LPINSTANCE") try: launchpad = get_launchpad("ubuntu-dev-tools", options.lpinstance) except IOError, msg: print msg print "No credentials, can't continue" sys.exit(1) debian = launchpad.distributions['debian'] ubuntu = launchpad.distributions['ubuntu'] lp_debbugs = launchpad.bug_trackers.getByName(name='debbugs') bug_nums = [] for bug_num in args: if bug_num.startswith("http"): # bug URL match = bug_re.search(bug_num) if match is None: raise ValueError("Can't determine bug number from %s" % bug_num) bug_num = match.groups()[0] bug_num = bug_num.lstrip("#") bug_num = int(bug_num) bug_nums.append(bug_num) bugs = debbugs.get_status(*bug_nums) if len(bug_nums) > 1: bugs = bugs[0] #import pdb; pdb.set_trace() for bug in bugs: bug = bug.value package = bug.package ubupackage = package if options.package: ubupackage = options.package bug_num = bug.bug_num subject = bug.subject log = debbugs.get_bug_log(bug_num) summary = log[0][0] target = ubuntu.getSourcePackage(name=ubupackage) u_bug = launchpad.bugs.createBug(target=target, title=subject, description='Imported from Debian bug ' 'http://bugs.debian.org/%d:\n\n%s' % (bug_num, summary)) d_sp = debian.getSourcePackage(name=package) if d_sp is None and options.package: d_sp = debian.getSourcePackage(name=options.package) d_task = u_bug.addTask(target=d_sp) d_watch = u_bug.addWatch(remote_bug=bug_num, bug_tracker=lp_debbugs) d_task.bug_watch = d_watch d_task.lp_save() print "Opened %s" % u_bug.web_link if not options.browserless: subprocess.call(["xdg-open", u_bug.web_link]) if __name__ == '__main__': main() #def get_status(*args): # result = server.get_status(*args) # return result # #def get_bugs(*args): # result = server.get_bugs(*args) # return result # #def get_usertag(email, *tags): # result = server.get_usertag(email, *tags) # return result # #def get_bug_log(bugnumber): # result = server.get_bug_log(bugnumber) # return result # #def newest_bugs(amount): # result = server.newest_bugs(amount) # return result # #if __name__ == "__main__": # # Demonstration # # # some debug output # # # All bugs from one package (returns a list of bugnumbers) # print get_bugs("package", "gtk-qt-engine") # # # All bugs of a maintainer # print get_bugs("maint", "debian-qa@lists.debian.org") # # # returns the status of those bugs # print get_status(409909, 419920, 421581, 417044, 397993) # # # get_status and get_bugs combined: # print get_status(get_bugs("package", "gtk-qt-engine")) # # # returns the full log for the given bug number # print get_bug_log(202526) # # # retrives the newest 20 bugs # print newest_bugs(20) # # # All bugs of a maintainer # print get_bugs("maint", "debian-qa@lists.debian.org") # # # returns the status of those bugs # print get_status(409909, 419920, 421581, 417044, 397993) # # # get_status and get_bugs combined: # print get_status(get_bugs("package", "gtk-qt-engine")) # # # returns the full log for the given bug number # print get_bug_log(202526) # # # retrives the newest 20 bugs # print newest_bugs(20) # # # returns bugs tagged by the given email # print get_usertag("debian-qa@lists.debian.org") # # # returns bugs tagged by the given email, with the given tag # print get_usertag("debian-qa@lists.debian.org", "qa-ftbfs-20070708") #