#!/usr/bin/python # -*- coding: UTF-8 -*- # Copyright © 2009 James Westby , # 2010, 2011 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 webbrowser try: import SOAPpy except ImportError: Logger.error("Please install 'python-soappy' in order to use this utility.") sys.exit(1) from launchpadlib.launchpad import Launchpad from ubuntutools.config import UDTConfig from ubuntutools.logger import Logger 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") launchpad = Launchpad.login_with("ubuntu-dev-tools", options.lpinstance) 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: Logger.error("Can't determine bug number from %s", bug_num) sys.exit(1) 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] if not bugs: Logger.error("Cannot find any of the listed bugs") sys.exit(1) for bug in bugs: bug = bug.value ubupackage = package = bug.source 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) if target is None: Logger.error("Source package '%s' is not in Ubuntu. Please specify " "the destination source package with --package", ubupackage) sys.exit(1) 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() Logger.normal("Opened %s", u_bug.web_link) if not options.browserless: webbrowser.open(u_bug.web_link) if __name__ == '__main__': main()