Use *SourcePackage in backportpackage

This commit is contained in:
Stefano Rivera 2010-12-30 18:05:55 +02:00
parent 1fb2545712
commit 3013ee034a
2 changed files with 40 additions and 61 deletions

View File

@ -25,14 +25,13 @@ import subprocess
import sys import sys
import tempfile import tempfile
from debian.deb822 import Dsc
from launchpadlib.launchpad import Launchpad from launchpadlib.launchpad import Launchpad
import lsb_release import lsb_release
from ubuntutools.archive import UbuntuSourcePackage
from ubuntutools.config import UDTConfig, ubu_email from ubuntutools.config import UDTConfig, ubu_email
from ubuntutools.builder import get_builder from ubuntutools.builder import get_builder
from ubuntutools.logger import Logger from ubuntutools.logger import Logger
from ubuntutools.mirrors import pull_source_pkg
from ubuntutools.question import YesNoQuestion from ubuntutools.question import YesNoQuestion
def error(msg): def error(msg):
@ -166,42 +165,26 @@ def find_release_package(launchpad, package, version, source_release):
return srcpkg return srcpkg
def find_version_package(launchpad, package, version): def find_package(launchpad, mirror, workdir, package, version, source_release):
ubuntu = launchpad.distributions['ubuntu'] "Returns the SourcePackage"
archive = ubuntu.main_archive
try:
# Might get more than one (i.e. same version in multiple
# releases), but they should all be identical
return archive.getPublishedSources(source_name=package,
version=version)[0]
except IndexError:
error('Version %s of package %s was never published in Ubuntu.' %
(version, package))
def fetch_package(launchpad, mirror, workdir, package, version, source_release):
"Returns the path to the .dsc file that was fetched"
if package.endswith('.dsc'): if package.endswith('.dsc'):
cmd = ('dget', '--download-only', '--allow-unauthenticated', package) return UbuntuSourcePackage(version=version, dscfile=package,
Logger.command(cmd) workdir=workdir, lp=launchpad,
ret = subprocess.call(cmd, cwd=workdir) mirrors=[mirror])
if ret == 0:
return os.path.join(workdir, os.path.basename(package))
sys.exit(1)
if not source_release and not version: if not source_release and not version:
source_release = launchpad.distributions['ubuntu'].current_series.name source_release = launchpad.distributions['ubuntu'].current_series.name
component = None
# If source_release is specified, then version is just for verification # If source_release is specified, then version is just for verification
if source_release: if source_release:
srcpkg = find_release_package(launchpad, package, version, srcpkg = find_release_package(launchpad, package, version,
source_release) source_release)
else: version = srcpkg.source_package_version
srcpkg = find_version_package(launchpad, package, version) component = srcpkg.component_name
version = srcpkg.source_package_version return UbuntuSourcePackage(package, version, component, workdir=workdir,
return pull_source_pkg('UBUNTU', mirror, srcpkg.component_name, package, lp=launchpad, mirrors=[mirror])
version, workdir=workdir, unpack=False)
def get_backport_version(version, suffix, upload, release): def get_backport_version(version, suffix, upload, release):
backport_version = version + ('~%s1' % release) backport_version = version + ('~%s1' % release)
@ -217,7 +200,7 @@ def get_backport_dist(upload, release):
else: else:
return release return release
def do_build(workdir, package, release, bp_version, builder, update): def do_build(workdir, dsc, release, builder, update):
builder = get_builder(builder) builder = get_builder(builder)
if not builder: if not builder:
return return
@ -226,12 +209,11 @@ def do_build(workdir, package, release, bp_version, builder, update):
if 0 != builder.update(release): if 0 != builder.update(release):
sys.exit(1) sys.exit(1)
return builder.build(os.path.join(workdir, return builder.build(os.path.join(workdir, dsc),
'%s_%s.dsc' % (package, bp_version)),
release, release,
os.path.join(workdir, "buildresult")) os.path.join(workdir, "buildresult"))
def do_upload(workdir, package, bp_version, upload, prompt): def do_upload(workdir, package, bp_version, changes, upload, prompt):
print 'Please check %s %s in file://%s carefully!' % \ print 'Please check %s %s in file://%s carefully!' % \
(package, bp_version, workdir) (package, bp_version, workdir)
if prompt or upload == 'ubuntu': if prompt or upload == 'ubuntu':
@ -240,20 +222,21 @@ def do_upload(workdir, package, bp_version, upload, prompt):
if answer == "no": if answer == "no":
return return
changes_file = '%s_%s_source.changes' % (package, bp_version) check_call(['dput', upload, changes], cwd=workdir)
check_call(['dput', upload, changes_file], cwd=workdir)
def do_backport(workdir, pkg, suffix, release, build, builder, update, upload,
prompt):
dirname = '%s-%s' % (pkg.source, release)
pkg.unpack(dirname)
srcdir = os.path.join(workdir, dirname)
def do_backport(workdir, package, dscfile, version, suffix, release, build, bp_version = get_backport_version(pkg.version.full_version, suffix,
builder, update, upload, prompt): upload, release)
check_call(['dpkg-source', '-x', dscfile, package], cwd=workdir)
srcdir = os.path.join(workdir, package)
bp_version = get_backport_version(version, suffix, upload, release)
bp_dist = get_backport_dist(upload, release) bp_dist = get_backport_dist(upload, release)
check_call(['dch', check_call(['dch',
'--force-bad-version', '--allow-lower-version',
'--force-distribution',
'--preserve', '--preserve',
'--newversion', bp_version, '--newversion', bp_version,
'--distribution', bp_dist, '--distribution', bp_dist,
@ -261,15 +244,14 @@ def do_backport(workdir, package, dscfile, version, suffix, release, build,
cwd=srcdir) cwd=srcdir)
check_call(['debuild', '--no-lintian', '-S', '-sa'], cwd=srcdir) check_call(['debuild', '--no-lintian', '-S', '-sa'], cwd=srcdir)
if ':' in bp_version: fn_base = pkg.source + '_' + bp_version.split(':', 1)[-1]
bp_version = bp_version[bp_version.find(':')+1:]
if build: if build:
if 0 != do_build(workdir, package, release, bp_version, builder, if 0 != do_build(workdir, fn_base + '.dsc', release, builder, update):
update):
sys.exit(1) sys.exit(1)
if upload: if upload:
do_upload(workdir, package, bp_version, upload, prompt) do_upload(workdir, pkg.source, bp_version, fn_base + '.changes',
upload, prompt)
shutil.rmtree(srcdir) shutil.rmtree(srcdir)
@ -298,22 +280,17 @@ def main(args):
os.makedirs(workdir) os.makedirs(workdir)
try: try:
dscfile = fetch_package(launchpad, pkg = find_package(launchpad,
opts.ubuntu_mirror, opts.ubuntu_mirror,
workdir, workdir,
package_or_dsc, package_or_dsc,
opts.version, opts.version,
opts.source_release) opts.source_release)
pkg.pull()
dsc = Dsc(open(os.path.join(workdir, dscfile)))
package = dsc['Source']
version = dsc['Version']
for release in opts.dest_releases: for release in opts.dest_releases:
do_backport(workdir, do_backport(workdir,
package, pkg,
dscfile,
version,
opts.suffix, opts.suffix,
release, release,
opts.build, opts.build,

View File

@ -267,9 +267,11 @@ class SourcePackage(object):
return False return False
return True return True
def unpack(self): def unpack(self, destdir=None):
"Unpack in workdir" "Unpack in workdir"
cmd = ('dpkg-source', '-x', self.dsc_name) cmd = ['dpkg-source', '-x', self.dsc_name]
if destdir:
cmd.append(destdir)
Logger.command(cmd) Logger.command(cmd)
subprocess.check_call(cmd, cwd=self.workdir) subprocess.check_call(cmd, cwd=self.workdir)