mirror of
https://git.launchpad.net/ubuntu-dev-tools
synced 2025-03-12 15:41:09 +00:00
* Add requestsync and its manual page from devscripts.
* Add Conflicts/Replaces against devscripts 2.10.7ubuntu3.
This commit is contained in:
parent
980a5b2081
commit
3587439e8b
7
debian/changelog
vendored
7
debian/changelog
vendored
@ -1,3 +1,10 @@
|
||||
ubuntu-dev-tools (0.5) gutsy; urgency=low
|
||||
|
||||
* Add requestsync and its manual page from devscripts.
|
||||
* Add Conflicts/Replaces against devscripts 2.10.7ubuntu3.
|
||||
|
||||
-- Steve Kowalik <stevenk@ubuntu.com> Wed, 12 Sep 2007 01:14:04 +1000
|
||||
|
||||
ubuntu-dev-tools (0.4) gutsy; urgency=low
|
||||
|
||||
* revuput: added a tool to upload packages to PPA and file sponsoring bugs
|
||||
|
2
debian/control
vendored
2
debian/control
vendored
@ -14,6 +14,8 @@ Architecture: all
|
||||
Section: devel
|
||||
Depends: ${python:Depends}, ${misc:Depends}, binutils, devscripts, sudo, python-launchpad-bugs (>= 0.2.9)
|
||||
Recommends: bzr, pbuilder
|
||||
Conflicts: devscripts (<< 2.10.7ubuntu3)
|
||||
Replaces: devscripts (<< 2.10.7ubuntu3)
|
||||
XB-Python-Version: ${python:Versions}
|
||||
Description: useful tools for Ubuntu developers
|
||||
This is a collection of useful tools that Ubuntu developers use to
|
||||
|
34
doc/requestsync.1
Normal file
34
doc/requestsync.1
Normal file
@ -0,0 +1,34 @@
|
||||
.TH REQUESTSYNC "1" "6 August 2007" "devscripts"
|
||||
.SH NAME
|
||||
requestsync \- helper to file sync requests for Ubuntu
|
||||
.SH SYNOPSIS
|
||||
.B requestsync
|
||||
.RI [\fI -n | -s \fR] " " <\fIsource\fR " " \fIpackage\fR> " " <\fItarget\fR " " \fIrelease\fR> " "[\fIbase\fR " " \fIversion\fR]
|
||||
.SH DESCRIPTION
|
||||
.PP
|
||||
\fBrequestsync\fR looks at the versions of <source package> in Debian and Ubuntu, prompts for an explanation of why the Ubuntu changes (if there are any) should be dropped, downloads the changelog entry from packages.debian.org, and then prompts for your GPG passphrase so it can sign the mail and send it off, which files a sync request in the form of a bug report in Launchpad.
|
||||
.SH OPTIONS
|
||||
.PP
|
||||
Listed below are the command line options for requestsync:
|
||||
.TP
|
||||
\fB\-n\fR
|
||||
Specifies that the package is a new package, and requestsync should not attempt to look it up in Ubuntu since it will not exist.
|
||||
.TP
|
||||
\fB\-s\fR
|
||||
Specifies that you require sponsorship. 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
|
||||
\fB<source package>\fR
|
||||
This is the source package that you would like to be synced from Debian.
|
||||
.TP
|
||||
\fB<target release>\fR
|
||||
This is the release that you would like the source package to be synced into. This should always be the latest development release of Ubuntu, ie: gutsy.
|
||||
.TP
|
||||
\fB[base version]\fR
|
||||
In some cases, the base version (where the Ubuntu package started differing from the Debian package) can not be automatically determined. Specify this option in this case.
|
||||
.SH AUTHOR
|
||||
.PP
|
||||
This manual page was pieced together by Steve Kowalik.
|
||||
.SH SEE ALSO
|
||||
.PP
|
||||
\fBrmadison\fP\fB(1)\fP
|
||||
.UE
|
180
requestsync
Executable file
180
requestsync
Executable file
@ -0,0 +1,180 @@
|
||||
#!/usr/bin/python
|
||||
|
||||
# (C) 2007 Canonical Ltd, Steve Kowalik
|
||||
# Authors:
|
||||
# Martin Pitt <martin.pitt@ubuntu.com>
|
||||
# Steve Kowalik <stevenk@ubuntu.com>
|
||||
# GPLv2, see /usr/share/common-licenses/GPL
|
||||
|
||||
import os, os.path, sys, urllib, subprocess, smtplib, getopt
|
||||
|
||||
changelog = 1
|
||||
|
||||
def cur_version_component(sourcepkg, release):
|
||||
madison = subprocess.Popen(['rmadison', '-u', 'ubuntu', '-a', 'source', \
|
||||
'-s', release, sourcepkg], \
|
||||
stdout=subprocess.PIPE)
|
||||
out = madison.communicate()[0]
|
||||
assert (madison.returncode == 0)
|
||||
|
||||
for l in out.splitlines():
|
||||
(pkg, version, rel, builds) = l.split('|')
|
||||
component = 'main'
|
||||
if rel.find('/') != -1:
|
||||
component = rel.split('/')[1]
|
||||
return (version.strip(), component.strip())
|
||||
|
||||
print "%s doesn't appear to exist in %s, specify -n for a package not in Ubuntu." % (sourcepkg, release)
|
||||
sys.exit(1)
|
||||
|
||||
def debian_changelog(sourcepkg, component, version):
|
||||
'''Return the Debian changelog from the latest up to the given version
|
||||
(exclusive).'''
|
||||
|
||||
ch = ''
|
||||
subdir = sourcepkg[0]
|
||||
if sourcepkg.startswith('lib'):
|
||||
subdir = 'lib%s' % sourcepkg[3]
|
||||
for l in urllib.urlopen('http://packages.debian.org/changelogs/pool/%s/%s/%s/current/changelog.txt' % (component, subdir, sourcepkg)):
|
||||
if l.startswith(sourcepkg) and l.find(version + ')') > 0:
|
||||
break
|
||||
ch += l
|
||||
|
||||
return ch
|
||||
|
||||
def debian_component(sourcepkg):
|
||||
'''Return the Debian component for the source package.'''
|
||||
madison = subprocess.Popen(['rmadison', '-a', 'source', '-s', 'unstable', \
|
||||
sourcepkg], stdout=subprocess.PIPE)
|
||||
out = madison.communicate()[0]
|
||||
assert (madison.returncode == 0)
|
||||
|
||||
try:
|
||||
assert out
|
||||
except AssertionError:
|
||||
print "%s doesn't appear to exist in Debian." % sourcepkg
|
||||
sys.exit(1)
|
||||
raw_comp = out.split(' | ')[2].split('/')
|
||||
component = 'main'
|
||||
if len(raw_comp) == 2:
|
||||
component = raw_comp[1]
|
||||
return component
|
||||
|
||||
def usage():
|
||||
print """Usage: requestsync [-n|-s|-k <keyid>] <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 in that case."""
|
||||
sys.exit(1)
|
||||
|
||||
#
|
||||
# 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 len(args) not in (2, 3):
|
||||
usage()
|
||||
|
||||
(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)
|
||||
|
||||
debiancomponent = debian_component(srcpkg)
|
||||
|
||||
# generate bug report
|
||||
status = "confirmed"
|
||||
subscribe = "ubuntu-archive"
|
||||
if sponsorship:
|
||||
status = "new"
|
||||
if component in ['main', 'restricted']:
|
||||
subscribe = "ubuntu-main-sponsors"
|
||||
else:
|
||||
subscribe = "ubuntu-universe-sponsors"
|
||||
|
||||
affects = '/%s' % srcpkg
|
||||
if newsource:
|
||||
affects = ''
|
||||
|
||||
report = ''' affects ubuntu%s
|
||||
status %s
|
||||
subscribe %s
|
||||
|
||||
Please sync %s (%s) from Debian unstable (%s).
|
||||
''' % (affects, status, subscribe, srcpkg, component, debiancomponent)
|
||||
|
||||
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]
|
||||
|
||||
if force_base_ver:
|
||||
base_ver = force_base_ver
|
||||
|
||||
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
|
||||
|
||||
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(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."
|
||||
sys.exit(1)
|
||||
to = 'new@bugs.launchpad.net'
|
||||
|
||||
mail = '''From: %s
|
||||
To: %s
|
||||
Subject: Please sync %s (%s) from Debian unstable (%s)
|
||||
|
||||
%s''' % (myemailaddr, to, srcpkg, component, debiancomponent, signed_report)
|
||||
|
||||
print mail
|
||||
|
||||
print 'Press enter to file this bug, Control-C to abort'
|
||||
sys.stdin.readline()
|
||||
|
||||
s = smtplib.SMTP('fiordland.ubuntu.com')
|
||||
s.sendmail(myemailaddr, to, mail)
|
||||
s.quit()
|
Loading…
x
Reference in New Issue
Block a user