From 3926737aab5b33ab10e70448622a611a6b92026b Mon Sep 17 00:00:00 2001 From: Andrew Hunter Date: Fri, 15 Feb 2008 12:22:35 -0500 Subject: [PATCH 1/3] Seperated ppaput into python module and script. --- ppaput | 273 +++++++----------------------------------------------- ppaput.py | 206 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 238 insertions(+), 241 deletions(-) create mode 100755 ppaput.py diff --git a/ppaput b/ppaput index eb43837..7020e52 100755 --- a/ppaput +++ b/ppaput @@ -1,258 +1,48 @@ #!/usr/bin/python -# -*- coding: utf-8 -*- -# -# Copyright 2007, Canonical, Daniel Holbach -# -# GPL 3 -# -# -# 11:57:27 < dholbach> but what it does is: build a source package of -# the current source tree you're in, upload it to PPA -# and follow up on a bug report, subscribe the right -# sponsors, set the right status - if you pass "-n" -# it will file a bug report, add a (LP: #....) to -# the changelog also -# 11:57:37 < dholbach> I thought it'd help with our sponsoring process -# -import re import os import sys -import string - -try: - import launchpadbugs.connector as Connector -except: - print >> sys.stderr, \ - "You need python-launchpad-bugs (>= 0.2.14) installed to use ppaput." - sys.exit(1) - -#try: -# import apt -#except: -# print >> sys.stderr, "You need python-apt installed to use ppaput." -# sys.exit(1) - +import ppaput +from optparse import OptionParser USAGE = \ """Usage: ppaput [-n] [] [] --n to file a new bug - dput alias - options that are passed to debuild(1) -""" +See debuild(1) for more information on debuild options.""" +parser = OptionParser(usage=USAGE) +parser.add_option('-n', action='store_true', dest='new_bug', help='File a new bug on Launchpad', default=False) +parser.disable_interspersed_args() +(options, args) = parser.parse_args() -def dput_check(): - if not os.path.exists("/usr/bin/dput"): - print >> sys.stderr, "You need to install the dput package." - sys.exit(1) - - -def find_fixed_launchpad_bug(changesfile): - changes = open(changesfile).readlines() - for line in changes: - if line.startswith("Launchpad-Bugs-Fixed"): - return line.split(":")[1].split() - return [] - - -def call_dput(location, changes): - dput_check() - - incoming = "" - res = False - - (dummy, output, dummy) = os.popen3("dput --debug %s %s" % (location, changes)) - text = output.readlines() - for line in text: - if line.startswith("D: Incoming: "): - incoming = line.split("D: Incoming: ")[1].strip() - if incoming[-1] == "/": - incoming = incoming[:-1] - if line.startswith("Successfully uploaded packages."): - res = True - return (res, incoming) - - -def lookup_dput_host(host): - dput_check() - (dummy, output, dummy) = os.popen3("dput -H | grep ^%s" % host) - text = output.read() - if text: - return text.split()[2] - return "" - - -def call_debuild(options): -# FIXME: this requires magic, that figures out when to use --native --working, -# etc. -# if os.path.exists(".bzr") and os.path.exists("/usr/bin/bzr-buildpackage"): -# return os.system("bzr bd -S --builder='-k%s %s'" % \ -# (os.getenv("DEBEMAIL"), \ -# string.join(options, " "))) == 0 -# else: - return os.system("debuild -S -k%s %s" % \ - (os.getenv("DEBEMAIL"), \ - string.join(options, " "))) == 0 - -def get_name_version_section_and_release(): - changelogfile = "debian/changelog" - if not os.path.exists(changelogfile): - print >> sys.stderr, "%s not found." % changelogfile - sys.exit(1) - controlfile = "debian/control" - if not os.path.exists(controlfile): - print >> sys.stderr, "%s not found." % controlfile - sys.exit(1) - - head = open(changelogfile).readline() - (name, \ - version, \ - release) = re.findall(r'^(.*)\ \((.*)\)\ (.*?)\;\ .*', head)[0] - section = "main" - - for line in open(controlfile).readlines(): - if line.startswith("Section"): - if line.split("Section: ")[1].count("/")>0: - section = line.split("Section: ")[1].split("/")[0].strip() - return (name, version, section) - - return (name, version, section, release) - -def assemble_bug_comment_text(host, incoming, section, sourcepackage, version, - release): - if host == "ppa.launchpad.net": - dsc_file_location = "http://%s/%s/pool/%s/%s/%s/%s_%s.dsc" % \ - (host, incoming[1:], section, sourcepackage[0], sourcepackage, \ - sourcepackage, version) - else: -# FIXME: this needs to be much much cleverer at some stage - dsc_file_location = "http://%s/%s/pool/%s/%s/%s/%s_%s.dsc" % \ - (host, incoming, section, sourcepackage[0], sourcepackage, version) - return """A new version of %s was uploaded to fix this bug. - -To review the source the current version, please run - - dget -x %s - - -The package will get built by Launchpad in a while. If you want to test it, -please run the following commands: - - sudo -s - echo >> /etc/apt/sources.list - echo "deb http://%s/%s %s main universe multiverse restricted" >> /etc/apt/sources.list - apt-get update - apt-get install -""" % (sourcepackage, dsc_file_location, host, incoming[1:], release) - - -def deal_with_bugreport(bugnumbers, host, section, incoming, sourcepackage, - version, release): - if not os.path.exists(os.path.expanduser("~/.lpcookie")): - print >> sys.stderr, \ - "You need your Launchpad Cookie to be stored in ~/.lpcookie" - sys.exit(1) - - #print apt.Cache()[sourcepackage].section.split("/")[0].count("verse") - (dummy, output, dummy) = os.popen3( -"apt-cache showsrc %s | grep Directory | cut -d' ' -f2 | cut -d'/' -f2" % \ - sourcepackage) - component = output.read().strip() - - Bug = Connector.ConnectBug() - Bug.authentication = os.path.expanduser("~/.lpcookie") - - for bugnumber in bugnumbers: - bug = Bug(int(bugnumber)) - if component in ["main", "restricted"] and \ - 'ubuntu-main-sponsors' not in [str(s) for s in bug.subscribers]: - bug.subscribers.add('ubuntu-main-sponsors') - if component in ["universe", "multiverse"] and \ - 'ubuntu-universe-sponsors' not in [str(s) for s in bug.subscribers]: - bug.subscribers.add('ubuntu-universe-sponsors') - if not component: - bug.tags.append("needs-packaging") - - comment = Bug.NewComment(text=assemble_bug_comment_text(host, incoming, - section, - sourcepackage, - version, - release), - subject="Fix in %s (%s)" % \ - (sourcepackage, version)) - bug.comments.add(comment) - - if bug.status != "Fix Committed": - bug.status = "Fix Committed" - bug.commit() - - -def check_arguments(args): - new_bug = False +def check_arguments(): location = 'default' - debuild_args = list() - - if len(sys.argv) == 2 and sys.argv[1] in ["--help", "-H"]: - print USAGE - sys.exit(0) - - if len(sys.argv) == 1: - return (new_bug, location, debuild_args) - - if sys.argv[1] == "-n": - new_bug = True - if len(sys.argv)>2: - if sys.argv[2].startswith("-"): - debuild_args = sys.argv[2:] - else: - location = sys.argv[2] - if len(sys.argv)>3: - debuild_args = sys.argv[3:] - else: - if sys.argv[1].startswith("-"): - debuild_args.append(sys.argv[1:]) - else: - location = sys.argv[1] - if len(sys.argv)>2: - debuild_args = sys.argv[2:] - - return (new_bug, location, debuild_args) - - -def file_bug(sourcepackage, version): - Bug = Connector.ConnectBug() - Bug.authentication = os.path.expanduser("~/.lpcookie") + debuild_args = [] try: - bug = Bug.New(product={"name": sourcepackage, "target": "ubuntu"}, - summary="Please sponsor %s %s" % \ - (sourcepackage, version), - description=\ - "The new package will be uploaded to PPA shortly.") - except: - bug = Bug.New(product={"name": "ubuntu"}, - summary="Please sponsor %s %s" % \ - (sourcepackage, version), - description=\ - "The new package will be uploaded to PPA shortly.") + if args[0].startswith("-"): + debuild_args = args + else: + location = args[0] + debuild_args = args[1:] + except IndexError: + print "No location or arguments given, using defaults" - print "Successfully filed bug %s: http://launchpad.net/bugs/%s" % \ - (bug.bugnumber, bug.bugnumber) - - return bug.bugnumber - + return (location, debuild_args) def main(): - (new_bug, location, debuild_args) = check_arguments(sys.argv) - (sourcepackage, version, \ - section, release) = get_name_version_section_and_release() - if new_bug: - bugnumber = file_bug(sourcepackage, version) + (location, debuild_args) = check_arguments() + print location + print debuild_args + + (sourcepackage, version, \ + section, release) = ppaput.get_name_version_section_and_release() + + if options.new_bug: + bugnumber = ppaput.file_bug(sourcepackage, version) os.system("dch -a 'Fixes (LP: #%s)'" % bugnumber) - if not call_debuild(debuild_args): + if not ppaput.call_debuild(debuild_args): sys.exit(1) changesfile = "../%s_%s_source.changes" % (sourcepackage, version) @@ -261,17 +51,18 @@ def main(): os.path.expanduser(changesfile) sys.exit(1) - host = lookup_dput_host(location) - (dput_res, incoming) = call_dput(location, changesfile) + host = ppaput.lookup_dput_host(location) + (dput_res, incoming) = ppaput.call_dput(location, changesfile) if not dput_res: print >> sys.stderr, "%s was not uploaded." % changesfile sys.exit(1) - fixed_lp_bugs = find_fixed_launchpad_bug(changesfile) - if(fixed_lp_bugs): + fixed_lp_bugs = ppaput.find_fixed_launchpad_bug(changesfile) + if fixed_lp_bugs: deal_with_bugreport(fixed_lp_bugs, host, section, incoming, sourcepackage, version, release) if __name__ == '__main__': main() + diff --git a/ppaput.py b/ppaput.py new file mode 100755 index 0000000..66ebecf --- /dev/null +++ b/ppaput.py @@ -0,0 +1,206 @@ +#!/usr/bin/python +# -*- coding: utf-8 -*- +# +# Copyright 2007, Canonical, Daniel Holbach +# +# GPL 3 +# +# +# 11:57:27 < dholbach> but what it does is: build a source package of +# the current source tree you're in, upload it to PPA +# and follow up on a bug report, subscribe the right +# sponsors, set the right status - if you pass "-n" +# it will file a bug report, add a (LP: #....) to +# the changelog also +# 11:57:37 < dholbach> I thought it'd help with our sponsoring process +# + +import re +import os +import sys +import string + +try: + import launchpadbugs.connector as Connector +except: + print >> sys.stderr, \ + "You need python-launchpad-bugs (>= 0.2.14) installed to use ppaput." + sys.exit(1) + +#try: +# import apt +#except: +# print >> sys.stderr, "You need python-apt installed to use ppaput." +# sys.exit(1) + +def dput_check(): + if not os.path.exists("/usr/bin/dput"): + print >> sys.stderr, "You need to install the dput package." + sys.exit(1) + + +def find_fixed_launchpad_bug(changesfile): + changes = open(changesfile).readlines() + for line in changes: + if line.startswith("Launchpad-Bugs-Fixed"): + return line.split(":")[1].split() + return [] + + +def call_dput(location, changes): + dput_check() + + incoming = "" + res = False + + (dummy, output, dummy) = os.popen3("dput --debug %s %s" % (location, changes)) + text = output.readlines() + for line in text: + if line.startswith("D: Incoming: "): + incoming = line.split("D: Incoming: ")[1].strip() + if incoming[-1] == "/": + incoming = incoming[:-1] + if line.startswith("Successfully uploaded packages."): + res = True + return (res, incoming) + + +def lookup_dput_host(host): + dput_check() + (dummy, output, dummy) = os.popen3("dput -H | grep ^%s" % host) + text = output.read() + if text: + return text.split()[2] + return "" + + +def call_debuild(options): +# FIXME: this requires magic, that figures out when to use --native --working, +# etc. +# if os.path.exists(".bzr") and os.path.exists("/usr/bin/bzr-buildpackage"): +# return os.system("bzr bd -S --builder='-k%s %s'" % \ +# (os.getenv("DEBEMAIL"), \ +# string.join(options, " "))) == 0 +# else: + return os.system("debuild -S -k%s %s" % \ + (os.getenv("DEBEMAIL"), \ + string.join(options, " "))) == 0 + +def get_name_version_section_and_release(): + changelogfile = "debian/changelog" + if not os.path.exists(changelogfile): + print >> sys.stderr, "%s not found." % changelogfile + sys.exit(1) + controlfile = "debian/control" + if not os.path.exists(controlfile): + print >> sys.stderr, "%s not found." % controlfile + sys.exit(1) + + head = open(changelogfile).readline() + (name, \ + version, \ + release) = re.findall(r'^(.*)\ \((.*)\)\ (.*?)\;\ .*', head)[0] + section = "main" + +# +#Is this nessicary? All ppa install to main now. +# + +# for line in open(controlfile).readlines(): +# if line.startswith("Section"): +# if line.split("Section: ")[1].count("/")>0: +# section = line.split("Section: ")[1].split("/")[0].strip() +# return (name, version, section) + + return (name, version, section, release) + +def assemble_bug_comment_text(host, incoming, section, sourcepackage, version, + release): + if host == "ppa.launchpad.net": + dsc_file_location = "http://%s/%s/pool/%s/%s/%s/%s_%s.dsc" % \ + (host, incoming[1:], section, sourcepackage[0], sourcepackage, \ + sourcepackage, version) + else: +# FIXME: this needs to be much much cleverer at some stage + dsc_file_location = "http://%s/%s/pool/%s/%s/%s/%s_%s.dsc" % \ + (host, incoming, section, sourcepackage[0], sourcepackage, version) + return """A new version of %s was uploaded to fix this bug. + +To review the source the current version, please run + + dget -x %s + + +The package will get built by Launchpad in a while. If you want to test it, +please run the following commands: + + sudo -s + echo >> /etc/apt/sources.list + echo "deb http://%s/%s %s main universe multiverse restricted" >> /etc/apt/sources.list + apt-get update + apt-get install +""" % (sourcepackage, dsc_file_location, host, incoming[1:], release) + + +def deal_with_bugreport(bugnumbers, host, section, incoming, sourcepackage, + version, release): + if not os.path.exists(os.path.expanduser("~/.lpcookie")): + print >> sys.stderr, \ + "You need your Launchpad Cookie to be stored in ~/.lpcookie" + sys.exit(1) + + #print apt.Cache()[sourcepackage].section.split("/")[0].count("verse") + (dummy, output, dummy) = os.popen3( +"apt-cache showsrc %s | grep Directory | cut -d' ' -f2 | cut -d'/' -f2" % \ + sourcepackage) + component = output.read().strip() + + Bug = Connector.ConnectBug() + Bug.authentication = os.path.expanduser("~/.lpcookie") + + for bugnumber in bugnumbers: + bug = Bug(int(bugnumber)) + if component in ["main", "restricted"] and \ + 'ubuntu-main-sponsors' not in [str(s) for s in bug.subscribers]: + bug.subscribers.add('ubuntu-main-sponsors') + if component in ["universe", "multiverse"] and \ + 'ubuntu-universe-sponsors' not in [str(s) for s in bug.subscribers]: + bug.subscribers.add('ubuntu-universe-sponsors') + if not component: + bug.tags.append("needs-packaging") + + comment = Bug.NewComment(text=assemble_bug_comment_text(host, incoming, + section, + sourcepackage, + version, + release), + subject="Fix in %s (%s)" % \ + (sourcepackage, version)) + bug.comments.add(comment) + + if bug.status != "Fix Committed": + bug.status = "Fix Committed" + bug.commit() + + +def file_bug(sourcepackage, version): + Bug = Connector.ConnectBug() + Bug.authentication = os.path.expanduser("~/.lpcookie") + + try: + bug = Bug.New(product={"name": sourcepackage, "target": "ubuntu"}, + summary="Please sponsor %s %s" % \ + (sourcepackage, version), + description=\ + "The new package will be uploaded to PPA shortly.") + except: + bug = Bug.New(product={"name": "ubuntu"}, + summary="Please sponsor %s %s" % \ + (sourcepackage, version), + description=\ + "The new package will be uploaded to PPA shortly.") + + print "Successfully filed bug %s: http://launchpad.net/bugs/%s" % \ + (bug.bugnumber, bug.bugnumber) + + return bug.bugnumber From 83415fb564fe3291ad38b32354b691c1abc4a1ac Mon Sep 17 00:00:00 2001 From: Andrew Hunter Date: Fri, 15 Feb 2008 13:09:34 -0500 Subject: [PATCH 2/3] Updated debian packaging. --- debian/changelog | 10 +++++++++- debian/control | 11 ++++++++++- setup.py | 1 + 3 files changed, 20 insertions(+), 2 deletions(-) diff --git a/debian/changelog b/debian/changelog index e358834..9020568 100644 --- a/debian/changelog +++ b/debian/changelog @@ -12,7 +12,15 @@ ubuntu-dev-tools (0.26) UNRELEASED; urgency=low (LP: #190351) * Exit, if versions in Ubuntu and Debian are the same already. - -- Daniel Hahler Sat, 09 Feb 2008 02:23:44 +0100 + [ Andrew Hunter ] + * Use install files as we have multiple binaries now. + * ppaput: + * Separated ppaput script from backend python modules (shipped in + python-ppaput). (LP: #192184) + * Switched from homegrown option parseing to Optparse, much more + robust and less code duplication. + + -- Andrew Hunter Fri, 15 Feb 2008 13:08:12 -0500 ubuntu-dev-tools (0.25) hardy; urgency=low diff --git a/debian/control b/debian/control index 5e18b06..64d904a 100644 --- a/debian/control +++ b/debian/control @@ -13,7 +13,7 @@ Standards-Version: 3.7.3 Package: ubuntu-dev-tools Architecture: all Section: devel -Depends: ${python:Depends}, ${misc:Depends}, binutils, devscripts, sudo, python-launchpad-bugs (>= 0.2.25), reportbug (>= 3.39ubuntu1), python-debian, dctrl-tools, lsb-release +Depends: ${python:Depends}, ${misc:Depends}, binutils, devscripts, sudo, python-launchpad-bugs (>= 0.2.25), reportbug (>= 3.39ubuntu1), python-debian, dctrl-tools, lsb-release, python-ppaput Recommends: bzr, pbuilder Conflicts: devscripts (<< 2.10.7ubuntu5) Replaces: devscripts (<< 2.10.7ubuntu5) @@ -22,3 +22,12 @@ Description: useful tools for Ubuntu developers This is a collection of useful tools that Ubuntu developers use to make their packaging work a lot easier. Such tools can include bug filing, packaging preparation, package analysis, etc. + +Package: python-ppaput +Architecture: all +Section: python +Depends: ${python:Depends} +XB-Python-Version: ${python:Versions} +Description: python module for uploading to PPAs. + python-ppaput is a python module that abstracts the process of creating and + uploading Debian source packages to Personal Package Archives. diff --git a/setup.py b/setup.py index ecd01a3..b42befe 100755 --- a/setup.py +++ b/setup.py @@ -33,4 +33,5 @@ setup(name='ubuntu-dev-tools', 'get-build-deps', 'dgetlp' ], + py_modules=['ppaput'], ) From a728639b4eb3c4f236cf071df4bb0aa78cc570f6 Mon Sep 17 00:00:00 2001 From: Andrew Hunter Date: Fri, 15 Feb 2008 13:16:14 -0500 Subject: [PATCH 3/3] Forgot to add .install files... --- debian/python-ppaput.install | 1 + debian/ubuntu-dev-tools.install | 17 +++++++++++++++++ 2 files changed, 18 insertions(+) create mode 100644 debian/python-ppaput.install create mode 100644 debian/ubuntu-dev-tools.install diff --git a/debian/python-ppaput.install b/debian/python-ppaput.install new file mode 100644 index 0000000..bd6b984 --- /dev/null +++ b/debian/python-ppaput.install @@ -0,0 +1 @@ +debian/tmp/usr/lib/python2.5/site-packages/ppaput.py diff --git a/debian/ubuntu-dev-tools.install b/debian/ubuntu-dev-tools.install new file mode 100644 index 0000000..9e3c460 --- /dev/null +++ b/debian/ubuntu-dev-tools.install @@ -0,0 +1,17 @@ +debian/tmp/usr/bin/404main +debian/tmp/usr/bin/check-symbols +debian/tmp/usr/bin/dch-repeat +debian/tmp/usr/bin/dgetlp +debian/tmp/usr/bin/get-branches +debian/tmp/usr/bin/get-build-deps +debian/tmp/usr/bin/hugdaylist +debian/tmp/usr/bin/massfile +debian/tmp/usr/bin/mk-sbuild-lv +debian/tmp/usr/bin/pbuilder-dist +debian/tmp/usr/bin/ppaput +debian/tmp/usr/bin/pull-debian-debdiff +debian/tmp/usr/bin/requestsync +debian/tmp/usr/bin/submittodebian +debian/tmp/usr/bin/suspicious-source +debian/tmp/usr/bin/update-maintainer +debian/tmp/usr/bin/what-patch