2010-07-11 18:43:19 +02:00
|
|
|
#!/usr/bin/python
|
2010-07-29 00:00:33 +02:00
|
|
|
# -*- coding: UTF-8 -*-
|
2010-07-11 18:43:19 +02:00
|
|
|
|
2010-12-21 23:41:55 +02:00
|
|
|
# Copyright © 2009 James Westby <james.westby@ubuntu.com>,
|
|
|
|
# 2010 Stefano Rivera <stefanor@ubuntu.com>
|
2010-07-11 20:30:08 +02:00
|
|
|
#
|
|
|
|
# ##################################################################
|
|
|
|
#
|
|
|
|
# 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.
|
2010-12-03 00:06:43 +01:00
|
|
|
#
|
2010-07-11 20:30:08 +02:00
|
|
|
# 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.
|
|
|
|
#
|
|
|
|
# ##################################################################
|
|
|
|
|
2010-12-21 23:41:55 +02:00
|
|
|
from optparse import OptionParser, SUPPRESS_HELP
|
2010-07-11 18:43:19 +02:00
|
|
|
import re
|
|
|
|
import sys
|
2010-12-21 23:41:55 +02:00
|
|
|
|
2011-02-12 23:13:44 +01:00
|
|
|
try:
|
|
|
|
import SOAPpy
|
|
|
|
except ImportError:
|
|
|
|
print >> sys.stderr, ("Please install 'python-soappy' in order to use "
|
|
|
|
"this utility.")
|
|
|
|
sys.exit(1)
|
2010-12-21 23:41:55 +02:00
|
|
|
|
2011-03-01 00:30:54 +02:00
|
|
|
from launchpadlib.launchpad import Launchpad
|
|
|
|
|
2010-12-21 23:41:55 +02:00
|
|
|
from ubuntutools.config import UDTConfig
|
2011-05-24 20:22:37 +02:00
|
|
|
from ubuntutools import subprocess
|
2010-07-11 18:43:19 +02:00
|
|
|
|
2010-12-27 21:54:31 +01:00
|
|
|
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")
|
2011-01-04 22:24:06 +02:00
|
|
|
parser.add_option("-p", "--package", metavar="PACKAGE",
|
|
|
|
help="Launchpad package to file bug against "
|
|
|
|
"(default: Same as Debian)",
|
|
|
|
dest="package", default=None)
|
2010-12-27 21:54:31 +01:00
|
|
|
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:
|
2011-03-01 00:30:54 +02:00
|
|
|
launchpad = Launchpad.login_with("ubuntu-dev-tools", options.lpinstance)
|
2010-12-27 21:54:31 +01:00
|
|
|
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
|
2011-01-04 22:24:06 +02:00
|
|
|
ubupackage = package
|
|
|
|
if options.package:
|
|
|
|
ubupackage = options.package
|
2010-12-27 21:54:31 +01:00
|
|
|
bug_num = bug.bug_num
|
|
|
|
subject = bug.subject
|
|
|
|
log = debbugs.get_bug_log(bug_num)
|
|
|
|
summary = log[0][0]
|
2011-01-04 22:24:06 +02:00
|
|
|
target = ubuntu.getSourcePackage(name=ubupackage)
|
2010-12-27 21:54:31 +01:00
|
|
|
u_bug = launchpad.bugs.createBug(target=target, title=subject,
|
2011-01-04 22:26:24 +02:00
|
|
|
description='Imported from Debian bug '
|
|
|
|
'http://bugs.debian.org/%d:\n\n%s'
|
|
|
|
% (bug_num, summary))
|
2011-01-04 22:24:06 +02:00
|
|
|
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)
|
2010-12-27 21:54:31 +01:00
|
|
|
d_watch = u_bug.addWatch(remote_bug=bug_num, bug_tracker=lp_debbugs)
|
|
|
|
d_task.bug_watch = d_watch
|
|
|
|
d_task.lp_save()
|
2011-02-11 15:33:09 +01:00
|
|
|
print "Opened %s" % u_bug.web_link
|
2010-12-27 21:54:31 +01:00
|
|
|
if not options.browserless:
|
2011-02-11 15:33:09 +01:00
|
|
|
subprocess.call(["xdg-open", u_bug.web_link])
|
2010-12-27 21:54:31 +01:00
|
|
|
|
|
|
|
if __name__ == '__main__':
|
|
|
|
main()
|
2010-07-11 18:43:19 +02:00
|
|
|
|
|
|
|
#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")
|
|
|
|
#
|