diff --git a/backportpackage b/backportpackage index d8c659e..4b78200 100755 --- a/backportpackage +++ b/backportpackage @@ -64,6 +64,11 @@ def parse(args): default=None, help='Specify the package builder (default: pbuilder)', metavar='BUILDER') + p.add_option('-U', '--update', + dest='update', + default=False, + action='store_true', + help='Update the build environment before attempting to build') p.add_option('-u', '--upload', dest='upload', help='Specify an upload destination', @@ -182,6 +187,11 @@ def do_build(workdir, package, release, bp_version, builder): if not builder: return + if opts.update: + if 0 != builder.update(release): + error('Failed to update %s chroot for %s.' % \ + (release, builder.get_name())) + return builder.build(os.path.join(workdir, '%s_%s.dsc' % (package, bp_version)), release, diff --git a/debian/changelog b/debian/changelog index 2998938..2023abf 100644 --- a/debian/changelog +++ b/debian/changelog @@ -14,6 +14,8 @@ ubuntu-dev-tools (0.108) UNRELEASED; urgency=low [ Evan Broder ] * backportpackage: new script for testing backport requests in a PPA. + * sponsor-patch: Add --update option to make sure build environment is + up to date (LP: #689605) [ Bilal Akhtar ] * pbuilder-dist: Override the default build result location if diff --git a/doc/backportpackage.1 b/doc/backportpackage.1 index 227070c..bd08f73 100644 --- a/doc/backportpackage.1 +++ b/doc/backportpackage.1 @@ -33,6 +33,9 @@ Use the specified builder to build the package. Supported are \fBpbuilder\fR(8), \fBpbuilder-dist\fR(1), and \fBsbuild\fR(1). This overrides \fBUBUNTUTOOLS_BUILDER\fR. The default is \fBpbuilder\fR(8). .TP +.B \-U, \-\-update +Update the build environment before attempting to build. +.TP .B \-u \fIUPLOAD\fR, \-\-upload=\fIUPLOAD\fR Upload to \fIUPLOAD\fR with \fBdput\fR(1) (after confirmation). .TP diff --git a/doc/sponsor-patch.1 b/doc/sponsor-patch.1 index eab654f..ee592fd 100644 --- a/doc/sponsor-patch.1 +++ b/doc/sponsor-patch.1 @@ -77,6 +77,9 @@ Shortcut for sponsored uploads. Equivalent to \fB\-b \-u ubuntu\fR. .B \-u \fIDEST\fR, \fB\-\-upload\fR=\fIDEST Upload to \fIDEST\fR with \fBdput\fR(1) (after confirmation). .TP +.BR \-U ", " \-\-update +Update the build environment before attempting to build. +.TP .BR \-v ", " \-\-verbose Print more information. .TP diff --git a/sponsor-patch b/sponsor-patch index 0d8cde6..7c2612a 100755 --- a/sponsor-patch +++ b/sponsor-patch @@ -409,8 +409,8 @@ def apply_patch(task, patch): edit = True return edit -def main(script_name, bug_number, build, edit, keyid, upload, workdir, builder, - verbose=False): +def main(script_name, bug_number, update, build, edit, keyid, upload, workdir, + builder, verbose=False): workdir = os.path.expanduser(workdir) if not os.path.isdir(workdir): try: @@ -598,12 +598,24 @@ def main(script_name, bug_number, build, edit, keyid, upload, workdir, builder, continue if build: + dist = re.sub("-.*$", "", changelog.distributions) + + if update: + ret = builder.update(dist) + if ret != 0: + Logger.error("Failed to update %s chroot for %s." % \ + (dist, builder.get_name())) + ask_for_manual_fixing() + continue + # We want to update the build environment only once, but not + # after every manual fix. + update = False + buildresult = os.path.join(workdir, task.package + "-buildresult") if not os.path.isdir(buildresult): os.makedirs(buildresult) # build package - dist = re.sub("-.*$", "", changelog.distributions) result = builder.build(new_dsc_file, dist, buildresult) if result != 0: Logger.error("Failed to build %s from source with %s." % \ @@ -706,6 +718,9 @@ if __name__ == "__main__": dest="sponsoring", action="store_true", default=False) parser.add_option("-u", "--upload", dest="upload", default=None, help="Specify an upload destination (default none).") + parser.add_option("-U", "--update", dest="update", default=False, + action="store_true", + help="Update the build environment before building.") parser.add_option("-v", "--verbose", help="print more information", dest="verbose", action="store_true", default=False) parser.add_option("-w", "--workdir", dest="workdir", @@ -737,5 +752,6 @@ if __name__ == "__main__": options.build = True options.upload = "ubuntu" - main(script_name, bug_number, options.build, options.edit, options.keyid, - options.upload, options.workdir, builder, options.verbose) + main(script_name, bug_number, options.update, options.build, options.edit, + options.keyid, options.upload, options.workdir, builder, + options.verbose) diff --git a/ubuntutools/builder.py b/ubuntutools/builder.py index cafab61..cb9dd89 100644 --- a/ubuntutools/builder.py +++ b/ubuntutools/builder.py @@ -50,6 +50,12 @@ class Pbuilder(Builder): Logger.command(cmd) return subprocess.call(cmd) + def update(self, dist): + cmd = ["sudo", "-E", "DIST=" + dist, "pbuilder", "--update", + "--distribution", dist, "--architecture", self.architecture] + Logger.command(cmd) + return subprocess.call(cmd) + class Pbuilderdist(Builder): def __init__(self): @@ -78,6 +84,36 @@ class Sbuild(Builder): os.chdir(workdir) return result + def update(self, dist): + cmd = ["schroot", "--list"] + Logger.command(cmd) + p = subprocess.Popen(cmd, stdout=subprocess.PIPE) + chroots, _ = p.communicate() + chroots = chroots.strip().split() + if p.returncode != 0: + return p.returncode + + params = {"dist": dist, + "arch": self.architecture} + for chroot in ("%(dist)s-%(arch)s-sbuild-source", + "%(dist)s-sbuild-source", + "%(dist)s-%(arch)s-source", + "%(dist)s-source"): + chroot = chroot % params + if chroot in chroots: + break + else: + return 1 + + commands = [["sbuild-update"], + ["sbuild-distupgrade"], + ["sbuild-clean", "-a", "-c"]] + for cmd in commands: + Logger.command(cmd + [chroot]) + ret = subprocess.call(cmd + [chroot]) + if ret != 0: + return ret + def getBuilder(builder=None): if not builder: