mirror of
https://git.launchpad.net/ubuntu-dev-tools
synced 2025-05-07 23:11:29 +00:00
* Add python-launchpad-bugs support to requestsync and update the manpage.
This commit is contained in:
parent
2ae02070a3
commit
cd7ea02ceb
11
debian/changelog
vendored
11
debian/changelog
vendored
@ -1,8 +1,13 @@
|
||||
ubuntu-dev-tools (0.25) UNRELEASED; urgency=low
|
||||
|
||||
[ Michael Bienia ]
|
||||
* Add work-around for a bug in Debian's madison.php not returning only the
|
||||
'source' line (LP: #183346).
|
||||
* requestsync:
|
||||
+ Add work-around for a bug in Debian's madison.php not returning only the
|
||||
'source' line (LP: #183346).
|
||||
+ Add support to file sync requests with python-launchpad-bugs (--lp)
|
||||
(LP: #147994).
|
||||
* doc/requestsync.1:
|
||||
+ Document new requestsync options.
|
||||
|
||||
[ Siegfried-Angel Gevatter Pujals (RainCT) ]
|
||||
* what-patch:
|
||||
@ -24,7 +29,7 @@ ubuntu-dev-tools (0.25) UNRELEASED; urgency=low
|
||||
* Remove duplicated ubuntu-dev-tools recommends (it's already a
|
||||
dependency).
|
||||
|
||||
-- Siegfried-Angel Gevatter Pujals (RainCT) <rainct@ubuntu.com> Thu, 17 Jan 2008 19:17:43 +0100
|
||||
-- Michael Bienia <geser@ubuntu.com> Sat, 19 Jan 2008 15:27:14 +0100
|
||||
|
||||
ubuntu-dev-tools (0.24) hardy; urgency=low
|
||||
|
||||
|
@ -1,20 +1,30 @@
|
||||
.TH REQUESTSYNC "1" "22 November 2007" "ubuntu-dev-tools"
|
||||
.TH REQUESTSYNC "1" "19 January 2008" "ubuntu-dev-tools"
|
||||
.SH NAME
|
||||
requestsync \- helper to file sync requests for Ubuntu
|
||||
.SH SYNOPSIS
|
||||
.B requestsync\fR [\fB\-ns\fR] [\fB-k \fIkeyid\fR] <\fBsource package\fR> <\fBtarget release\fR> [\fIbase version\fR]
|
||||
.B requestsync\fR [\fB\-ns\fR] [\fB\-k \fIkeyid\fR] <\fBsource package\fR> <\fBtarget release\fR> [\fIbase version\fR]
|
||||
|
||||
.B requestsync \-\-lp\fR [\fB\-ns\fR] <\fBsource package\fR> <\fBtarget release\fR> [\fIbase version\fR]
|
||||
|
||||
.B requestsync \-h
|
||||
.SH DESCRIPTION
|
||||
.PP
|
||||
\fBrequestsync\fR looks at the versions of <source package> in Debian and
|
||||
Ubuntu and prompts for an explanation of why the Ubuntu changes (if there
|
||||
are any) should be dropped.
|
||||
The changelog entry is then downloaded from packages.debian.org, followed by
|
||||
a prompt for your GPG passphrase so that it can sign the mail and send it
|
||||
off, to file a sync request in the form of a bug report in Launchpad.
|
||||
The changelog entry is then downloaded from packages.debian.org. If the sync
|
||||
request is being filed per email (default), a prompt for your GPG passphrase
|
||||
follows so that it can sign the mail and send it off to Launchpad.
|
||||
Alternatively a sync request can be filed directly using the launchpadbugs
|
||||
python module (option \fB\-\-lp\fR). \fBrequestsync\fR falls back to mail
|
||||
the sync request if submitting using the launchpadbugs module fails.
|
||||
.SH OPTIONS
|
||||
.PP
|
||||
Listed below are the command line options for requestsync:
|
||||
.TP
|
||||
.B \-h
|
||||
Display a help message and exit.
|
||||
.TP
|
||||
.B \-n
|
||||
Specifies that the package is a new package, and requestsync should not
|
||||
attempt to look it up in Ubuntu since it will not exist.
|
||||
@ -25,9 +35,14 @@ You need this option if you are not a member of ubuntu-dev for universe or
|
||||
multiverse, or ubuntu-core-dev for main or restricted.
|
||||
.TP
|
||||
.B \-k \fI<keyid>\fR
|
||||
Specifies your GPC key.
|
||||
Specifies your GPG key.
|
||||
Can also be set with the line `\fIexport GPGKEY=<keyid>\fR' in
|
||||
.IR $HOME/.bashrc .
|
||||
This is only used if the sync request is mailed to Launchpad.
|
||||
.TP
|
||||
.B \-\-lp
|
||||
Use the launchpadbugs python module (packaged as python-launchpad-bugs) to
|
||||
file the sync request in Launchpad.
|
||||
.TP
|
||||
.B <source package>
|
||||
This is the source package that you would like to be synced from Debian.
|
||||
@ -45,7 +60,8 @@ Specify this option in this case.
|
||||
.PP
|
||||
This manual page was pieced together by Steve Kowalik.
|
||||
|
||||
It was then updated by Ryan Kavanagh to reflect additional features.
|
||||
It was then updated by Ryan Kavanagh and Michael Bienia to reflect
|
||||
additional features.
|
||||
.SH SEE ALSO
|
||||
.PP
|
||||
.BR rmadison (1)
|
||||
|
335
requestsync
335
requestsync
@ -5,16 +5,16 @@
|
||||
# Authors:
|
||||
# Martin Pitt <martin.pitt@ubuntu.com>
|
||||
# Steve Kowalik <stevenk@ubuntu.com>
|
||||
# Michael Bienia <geser@ubuntu.com> (python-launchpad-bugs support)
|
||||
#
|
||||
# License: GPLv2, see /usr/share/common-licenses/GPL
|
||||
|
||||
import os, os.path, sys, urllib, subprocess, smtplib, getopt
|
||||
|
||||
changelog = 1
|
||||
import os, sys, urllib, subprocess, getopt
|
||||
|
||||
def cur_version_component(sourcepkg, release):
|
||||
'''Determine current package version in ubuntu.'''
|
||||
madison = subprocess.Popen(['rmadison', '-u', 'ubuntu', '-a', 'source', \
|
||||
'-s', release, sourcepkg], \
|
||||
stdout=subprocess.PIPE)
|
||||
'-s', release, sourcepkg], stdout=subprocess.PIPE)
|
||||
out = madison.communicate()[0]
|
||||
assert (madison.returncode == 0)
|
||||
|
||||
@ -29,7 +29,7 @@ def cur_version_component(sourcepkg, release):
|
||||
sys.exit(1)
|
||||
|
||||
def cur_deb_version(sourcepkg):
|
||||
''' Return the current debian version of a package in unstable '''
|
||||
'''Return the current debian version of a package in unstable.'''
|
||||
madison = subprocess.Popen(['rmadison', '-u', 'debian', '-a', 'source', \
|
||||
'-s', 'unstable', sourcepkg], \
|
||||
stdout=subprocess.PIPE)
|
||||
@ -50,8 +50,6 @@ def cur_deb_version(sourcepkg):
|
||||
|
||||
return out.split('|')[1].rstrip('[]''').strip()
|
||||
|
||||
sys.exit(1)
|
||||
|
||||
def debian_changelog(sourcepkg, component, version):
|
||||
'''Return the Debian changelog from the latest up to the given version
|
||||
(exclusive).'''
|
||||
@ -86,80 +84,214 @@ def debian_component(sourcepkg):
|
||||
return component
|
||||
|
||||
def usage():
|
||||
print """Usage: requestsync [-n|-s|-k <keyid>] <source package> <target release> [basever]
|
||||
print '''Usage: requestsync [-h|-n|-s|-k <keyid>|--lp] <source package> <target release> [basever]
|
||||
|
||||
In some cases, the base version (fork point from Debian) cannot be determined
|
||||
automatically, and you'll get a complete Debian changelog. Specify the correct
|
||||
base version of the package in Ubuntu."""
|
||||
base version of the package in Ubuntu.
|
||||
|
||||
Options:
|
||||
-h print this help
|
||||
-n new source package (doesn't exist yet in Ubuntu)
|
||||
-s request sponsoring (through ubuntu-{main,universe}-sponsors)
|
||||
-k <keyid> sign email with <keyid> (only used when submitting per email)
|
||||
--lp use python-launchpad-bugs instead of email for bug submitting
|
||||
'''
|
||||
sys.exit(1)
|
||||
|
||||
def mail_bug(source_package, subscribe, status, bugtitle, bugtext, keyid = None):
|
||||
'''Submit the sync request per email.
|
||||
Return True if email successfully send, otherwise False.'''
|
||||
|
||||
import smtplib
|
||||
|
||||
to = 'new@bugs.launchpad.net'
|
||||
|
||||
myemailaddr = os.getenv('DEBEMAIL')
|
||||
if not myemailaddr:
|
||||
print >> sys.stderr, 'The environment variable DEBEMAIL needs to be set to make use of this script.'
|
||||
return False
|
||||
|
||||
mailbody = ''
|
||||
if source_package:
|
||||
mailbody += ' affects ubuntu/%s\n' % source_package
|
||||
else:
|
||||
mailbody += ' affects ubuntu\n'
|
||||
mailbody = mailbody + ' status %s\n importance wishlist\n subscribe %s\n\n%s' % (status, subscribe, bugtext)
|
||||
|
||||
# sign it
|
||||
sign_command = 'gpg'
|
||||
for cmd in ('gpg2', 'gnome-gpg'):
|
||||
if os.access('/usr/bin/%s' % cmd, os.X_OK):
|
||||
sign_command = cmd
|
||||
|
||||
gpg_command = [sign_command, '--clearsign']
|
||||
if keyid:
|
||||
gpg_command.extend(('-u', keyid))
|
||||
|
||||
gpg = subprocess.Popen(gpg_command, stdin = subprocess.PIPE, stdout = subprocess.PIPE)
|
||||
signed_report = gpg.communicate(mailbody)[0]
|
||||
assert gpg.returncode == 0
|
||||
|
||||
# generate email
|
||||
mail = 'From: %s\nTo: %s\nSubject: %s\n\n%s' % (myemailaddr, to, bugtitle, signed_report)
|
||||
|
||||
print mail
|
||||
|
||||
print 'Press enter to file this bug, Control-C to abort.'
|
||||
try:
|
||||
sys.stdin.readline()
|
||||
except KeyboardInterrupt:
|
||||
print 'Abort requested. No sync request filed.'
|
||||
sys.exit(1)
|
||||
|
||||
# get server address
|
||||
mailserver = os.getenv('DEBSMTP')
|
||||
if mailserver:
|
||||
print 'Using custom SMTP server:', mailserver
|
||||
else:
|
||||
mailserver = 'fiordland.ubuntu.com'
|
||||
|
||||
# get server port
|
||||
mailserver_port = os.getenv('DEBSMTP_PORT')
|
||||
if mailserver_port:
|
||||
print 'Using custom SMTP port:', mailserver_port
|
||||
else:
|
||||
mailserver_port = 25
|
||||
|
||||
# connect to the server
|
||||
s = smtplib.SMTP(mailserver, mailserver_port)
|
||||
|
||||
# authenticate to the server
|
||||
mailserver_user = os.getenv('DEBSMTP_USER')
|
||||
mailserver_pass = os.getenv('DEBSMTP_PASS')
|
||||
if mailserver_user and mailserver_pass:
|
||||
try:
|
||||
s.login(mailserver_user, mailserver_pass)
|
||||
except smtplib.SMTPAuthenticationError:
|
||||
print 'Error authenticating to the server: invalid username and password.'
|
||||
s.quit()
|
||||
return False
|
||||
except:
|
||||
print 'Unknown SMTP error.'
|
||||
s.quit()
|
||||
return False
|
||||
|
||||
s.sendmail(myemailaddr, to, mail)
|
||||
s.quit()
|
||||
print 'Sync request mailed.'
|
||||
|
||||
return True
|
||||
|
||||
def post_bug(source_package, subscibe, status, bugtitle, bugtext):
|
||||
'''Use python-launchpad-bugs to submit the sync request.
|
||||
Return True if email successfully send, otherwise False.'''
|
||||
|
||||
import glob, os.path
|
||||
|
||||
try:
|
||||
import launchpadbugs.connector
|
||||
except ImportError:
|
||||
print >> sys.stderr, 'Importing launchpadbugs failed. Is python-launchpad-bugs installed?'
|
||||
print >> sys.stderr, 'Falling back to submitting per email.'
|
||||
return False
|
||||
|
||||
# Search cookiefile (for authentication to lp)
|
||||
try:
|
||||
cookiefile = glob.glob(os.path.expanduser('~/.mozilla/*/*/cookies.txt'))[0]
|
||||
except IndexError:
|
||||
print >> sys.stderr, 'Could not find Firefox cookie file'
|
||||
return False
|
||||
|
||||
if source_package:
|
||||
product = {'name': source_package, 'target': 'ubuntu'}
|
||||
else:
|
||||
# new source package
|
||||
product = {'name': 'ubuntu'}
|
||||
|
||||
print 'Summary:\n%s\n\nDescription:\n%s' % (bugtitle, bugtext)
|
||||
|
||||
print 'Press enter to file this bug, Control-C to abort.'
|
||||
try:
|
||||
sys.stdin.readline()
|
||||
except KeyboardInterrupt:
|
||||
print 'Abort requested. No sync request filed.'
|
||||
sys.exit(1)
|
||||
|
||||
# Create bug
|
||||
Bug = launchpadbugs.connector.ConnectBug()
|
||||
Bug.authentication = cookiefile
|
||||
|
||||
bug = Bug.New(product = product, summary = bugtitle, description = bugtext)
|
||||
bug.importance = 'Wishlist'
|
||||
bug.status = status
|
||||
bug.subscriptions.add(subscribe)
|
||||
bug.commit()
|
||||
|
||||
print 'Sync request filed as bug #%i: https://launchpad.net/bugs/%i' % (bug.bugnumber, bug.bugnumber)
|
||||
|
||||
return True
|
||||
|
||||
#
|
||||
# entry point
|
||||
#
|
||||
|
||||
newsource = False
|
||||
sponsorship = False
|
||||
keyid = None
|
||||
try:
|
||||
opts, args = getopt.getopt(sys.argv[1:], 'nsk:')
|
||||
except getopt.GetoptError:
|
||||
usage()
|
||||
for o, a in opts:
|
||||
if o == "-n":
|
||||
newsource = True
|
||||
if o == "-s":
|
||||
sponsorship = True
|
||||
if o == "-k":
|
||||
keyid = a
|
||||
if __name__ == '__main__':
|
||||
newsource = False
|
||||
sponsorship = False
|
||||
keyid = None
|
||||
use_lp_bugs = False
|
||||
|
||||
if len(args) not in (2, 3):
|
||||
usage()
|
||||
try:
|
||||
opts, args = getopt.gnu_getopt(sys.argv[1:], 'hnsk:', ('lp'))
|
||||
except getopt.GetoptError:
|
||||
usage()
|
||||
for o, a in opts:
|
||||
if o == '-h': usage()
|
||||
if o == '-n': newsource = True
|
||||
if o == '-s': sponsorship = True
|
||||
if o == '-k': keyid = a
|
||||
if o == '--lp': use_lp_bugs = True
|
||||
|
||||
(srcpkg, release) = args[:2]
|
||||
force_base_ver = None
|
||||
if len(args) == 3:
|
||||
force_base_ver = args[2]
|
||||
(cur_ver, component) = ('0', 'universe') # Let's assume universe
|
||||
if not newsource:
|
||||
(cur_ver, component) = cur_version_component(srcpkg, release)
|
||||
if len(args) not in (2, 3):
|
||||
usage()
|
||||
|
||||
debiancomponent = debian_component(srcpkg)
|
||||
(srcpkg, release) = args[:2]
|
||||
force_base_ver = None
|
||||
if len(args) == 3:
|
||||
force_base_ver = args[2]
|
||||
(cur_ver, component) = ('0', 'universe') # Let's assume universe
|
||||
if not newsource:
|
||||
(cur_ver, component) = cur_version_component(srcpkg, release)
|
||||
|
||||
# generate bug report
|
||||
status = "confirmed"
|
||||
subscribe = "ubuntu-archive"
|
||||
deb_version = cur_deb_version(srcpkg)
|
||||
if sponsorship:
|
||||
status = "new"
|
||||
if component in ['main', 'restricted']:
|
||||
subscribe = "ubuntu-main-sponsors"
|
||||
else:
|
||||
subscribe = "ubuntu-universe-sponsors"
|
||||
debiancomponent = debian_component(srcpkg)
|
||||
deb_version = cur_deb_version(srcpkg)
|
||||
|
||||
affects = '/%s' % srcpkg
|
||||
if newsource:
|
||||
affects = ''
|
||||
# generate bug report
|
||||
subscribe = 'ubuntu-archive'
|
||||
status = 'confirmed'
|
||||
if sponsorship:
|
||||
status = 'new'
|
||||
if component in ['main', 'restricted']:
|
||||
subscribe = 'ubuntu-main-sponsors'
|
||||
else:
|
||||
subscribe = 'ubuntu-universe-sponsors'
|
||||
|
||||
report = ''' affects ubuntu%s
|
||||
status %s
|
||||
importance wishlist
|
||||
subscribe %s
|
||||
report = '''Please sync %s %s (%s) from Debian unstable (%s).
|
||||
''' % (srcpkg, deb_version, component, debiancomponent)
|
||||
title = report[:-2]
|
||||
|
||||
base_ver = cur_ver
|
||||
uidx = base_ver.find('ubuntu')
|
||||
if uidx > 0:
|
||||
base_ver = base_ver[:uidx]
|
||||
|
||||
Please sync %s %s (%s) from Debian unstable (%s).
|
||||
''' % (affects, status, subscribe, srcpkg, deb_version, component, debiancomponent)
|
||||
print 'Explanation of the Ubuntu delta and why it can be dropped:'
|
||||
explanation = '\nExplanation of the Ubuntu delta and why it can be dropped:\n'
|
||||
while (explanation[-2:] != '\n\n'):
|
||||
explanation += sys.stdin.readline()
|
||||
report += explanation
|
||||
|
||||
base_ver = cur_ver
|
||||
uidx = base_ver.find('ubuntu')
|
||||
if uidx > 0:
|
||||
base_ver = base_ver[:uidx]
|
||||
|
||||
print 'Explanation of the Ubuntu delta and why it can be dropped:'
|
||||
explanation = '\nExplanation of the Ubuntu delta and why it can be dropped:\n'
|
||||
while (explanation[-2:] != '\n\n'):
|
||||
explanation += sys.stdin.readline()
|
||||
report += explanation
|
||||
|
||||
if changelog:
|
||||
uidx = base_ver.find('build')
|
||||
if uidx > 0:
|
||||
base_ver = base_ver[:uidx]
|
||||
@ -170,69 +302,16 @@ if changelog:
|
||||
report += 'Changelog since current %s version %s:\n\n' % (release, cur_ver)
|
||||
report += debian_changelog(srcpkg, debiancomponent, base_ver) + '\n'
|
||||
|
||||
# sign it
|
||||
sign_command = 'gpg'
|
||||
for cmd in ('gpg2', 'gnome-gpg'):
|
||||
if os.access('/usr/bin/%s' % cmd, os.X_OK):
|
||||
sign_command = cmd
|
||||
# mail or post the sync request
|
||||
srcpkg = not newsource and srcpkg or None
|
||||
if use_lp_bugs:
|
||||
# Map status to the values expected by lp-bugs
|
||||
mapping = {'new': 'New', 'confirmed': 'Confirmed'}
|
||||
if post_bug(srcpkg, subscribe, mapping[status], title, report):
|
||||
sys.exit(0)
|
||||
|
||||
gpg_command = [sign_command, '--clearsign']
|
||||
if keyid:
|
||||
gpg_command.extend(('-u', keyid))
|
||||
if mail_bug(srcpkg, subscribe, status, title, report, keyid):
|
||||
sys.exit(0)
|
||||
|
||||
gpg = subprocess.Popen(gpg_command, stdin=subprocess.PIPE, stdout=subprocess.PIPE)
|
||||
signed_report = gpg.communicate(report)[0]
|
||||
assert gpg.returncode == 0
|
||||
|
||||
# generate email
|
||||
myemailaddr = os.getenv('DEBEMAIL')
|
||||
if not myemailaddr:
|
||||
print "The environment variable DEBEMAIL needs to be set to make use of this script."
|
||||
print 'Something went wrong. No sync request filed.'
|
||||
sys.exit(1)
|
||||
to = 'new@bugs.launchpad.net'
|
||||
|
||||
mail = '''From: %s
|
||||
To: %s
|
||||
Subject: Please sync %s %s (%s) from Debian unstable (%s)
|
||||
|
||||
%s''' % (myemailaddr, to, srcpkg, deb_version, component, debiancomponent, signed_report)
|
||||
|
||||
print mail
|
||||
|
||||
print 'Press enter to file this bug, Control-C to abort'
|
||||
|
||||
sys.stdin.readline()
|
||||
|
||||
# get server address
|
||||
mailserver = os.getenv('DEBSMTP')
|
||||
if mailserver:
|
||||
print 'Using custom SMTP server:', mailserver
|
||||
else :
|
||||
mailserver = 'fiordland.ubuntu.com'
|
||||
|
||||
# get server port
|
||||
mailserver_port = os.getenv('DEBSMTP_PORT')
|
||||
if mailserver_port:
|
||||
print 'Using custom SMTP port:', mailserver_port
|
||||
else:
|
||||
mailserver_port = 25
|
||||
|
||||
# connect to the server
|
||||
s = smtplib.SMTP(mailserver, mailserver_port)
|
||||
|
||||
# authenticate to the server
|
||||
mailserver_user = os.getenv('DEBSMTP_USER')
|
||||
mailserver_pass = os.getenv('DEBSMTP_PASS')
|
||||
if mailserver_user and mailserver_pass:
|
||||
try:
|
||||
s.login(mailserver_user, mailserver_pass)
|
||||
except smtplib.SMTPAuthenticationError:
|
||||
print 'Error authenticating to the server: invalid username and password.'
|
||||
s.quit(); sys.exit(1)
|
||||
except:
|
||||
print 'Unknown SMTP error.'
|
||||
s.quit(); sys.exit(1)
|
||||
|
||||
|
||||
s.sendmail(myemailaddr, to, mail)
|
||||
s.quit()
|
||||
|
Loading…
x
Reference in New Issue
Block a user