mirror of
https://git.launchpad.net/ubuntu-dev-tools
synced 2025-03-12 15:41:09 +00:00
Python logging by default sends all output to stderr, but that's not what normal programs usually do and is not expected for these scripts. Change the ubuntutools.getLogger() method to return a logger with handlers correctly set up to send INFO level (or lower) logs to stdout and WARNING level (or higher; technically INFO+1 level or higher) logs to stderr. This results in normally logged output going to stdout and warnings/errors going to stderr, as expected.
146 lines
5.2 KiB
Python
Executable File
146 lines
5.2 KiB
Python
Executable File
#!/usr/bin/python3
|
|
|
|
# Copyright © 2009 James Westby <james.westby@ubuntu.com>,
|
|
# 2010, 2011 Stefano Rivera <stefanor@ubuntu.com>
|
|
#
|
|
# ##################################################################
|
|
#
|
|
# 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.
|
|
#
|
|
# ##################################################################
|
|
|
|
import argparse
|
|
import debianbts
|
|
import logging
|
|
import re
|
|
import sys
|
|
import webbrowser
|
|
|
|
from launchpadlib.launchpad import Launchpad
|
|
|
|
from ubuntutools.config import UDTConfig
|
|
|
|
from ubuntutools import getLogger
|
|
Logger = getLogger()
|
|
|
|
|
|
def main():
|
|
bug_re = re.compile(r"bug=(\d+)")
|
|
|
|
parser = argparse.ArgumentParser()
|
|
parser.add_argument("-b", "--browserless", action="store_true",
|
|
help="Don't open the bug in the browser at the end")
|
|
parser.add_argument("-l", "--lpinstance", metavar="INSTANCE",
|
|
help="LP instance to connect to (default: production)")
|
|
parser.add_argument("-v", "--verbose", action="store_true",
|
|
help="Print info about the bug being imported")
|
|
parser.add_argument("-n", "--dry-run", action="store_true",
|
|
help="Don't actually open a bug (also sets verbose)")
|
|
parser.add_argument("-p", "--package",
|
|
help="Launchpad package to file bug against "
|
|
"(default: Same as Debian)")
|
|
parser.add_argument("--no-conf", action="store_true",
|
|
help="Don't read config files or environment variables.")
|
|
parser.add_argument("bugs", nargs="+", help="Bug number(s) or URL(s)")
|
|
options = parser.parse_args()
|
|
|
|
config = UDTConfig(options.no_conf)
|
|
if options.lpinstance is None:
|
|
options.lpinstance = config.get_value("LPINSTANCE")
|
|
|
|
if options.dry_run:
|
|
launchpad = Launchpad.login_anonymously("ubuntu-dev-tools")
|
|
options.verbose = True
|
|
else:
|
|
launchpad = Launchpad.login_with("ubuntu-dev-tools", options.lpinstance)
|
|
|
|
if options.verbose:
|
|
Logger.setLevel(logging.DEBUG)
|
|
|
|
debian = launchpad.distributions['debian']
|
|
ubuntu = launchpad.distributions['ubuntu']
|
|
lp_debbugs = launchpad.bug_trackers.getByName(name='debbugs')
|
|
|
|
bug_nums = []
|
|
|
|
for bug_num in options.bugs:
|
|
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 = debianbts.get_status(*bug_nums)
|
|
|
|
if not bugs:
|
|
Logger.error("Cannot find any of the listed bugs")
|
|
sys.exit(1)
|
|
|
|
err = False
|
|
for bug in bugs:
|
|
ubupackage = package = bug.source
|
|
if options.package:
|
|
ubupackage = options.package
|
|
bug_num = bug.bug_num
|
|
subject = bug.subject
|
|
log = debianbts.get_bug_log(bug_num)
|
|
summary = log[0]['message'].get_payload()
|
|
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)
|
|
err = True
|
|
continue
|
|
|
|
description = ('Imported from Debian bug http://bugs.debian.org/%d:\n\n%s' %
|
|
(bug_num, summary))
|
|
# LP limits descriptions to 50K chars
|
|
description = (description[:49994] + ' [...]') if len(description) > 50000 else description
|
|
|
|
Logger.debug('Target: %s' % target)
|
|
Logger.debug('Subject: %s' % subject)
|
|
Logger.debug('Description: ')
|
|
Logger.debug(description)
|
|
|
|
if options.dry_run:
|
|
Logger.info('Dry-Run: not creating Ubuntu bug.')
|
|
continue
|
|
|
|
u_bug = launchpad.bugs.createBug(target=target, title=subject,
|
|
description=description)
|
|
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.info("Opened %s", u_bug.web_link)
|
|
if not options.browserless:
|
|
webbrowser.open(u_bug.web_link)
|
|
|
|
if err:
|
|
sys.exit(1)
|
|
|
|
|
|
if __name__ == '__main__':
|
|
main()
|