X-Git-Url: http://xvm.mit.edu/gitweb/invirt/packages/invirt-dev.git/blobdiff_plain/94bf6022689c29a7e27df0710f0b1d63d578038d..d6660755c5b38b89e3b9ec852f17502f6c59e806:/python/invirt/builder.py diff --git a/python/invirt/builder.py b/python/invirt/builder.py index c800cf8..1a736bd 100644 --- a/python/invirt/builder.py +++ b/python/invirt/builder.py @@ -6,9 +6,9 @@ and the remctl submission scripts that insert items into its queue. import os +import subprocess from debian_bundle import changelog -from debian_bundle import deb822 import invirt.common as c from invirt.config import structs as config @@ -19,10 +19,27 @@ _REPO_DIR = '/srv/git' _LOG_DIR = '/var/log/invirt/builds' _HOOKS_DIR = '/usr/share/invirt-dev/build-hooks' +_DEFAULT_DISTRIBUTION = 'hardy' + class InvalidBuild(ValueError): pass +_DISTRO_TO_SUFFIX = { + 'etch': '~debian4.0', + 'lenny': '~debian5.0', + 'squeeze': '~debian6.0', + + 'hardy': '~ubuntu8.04', + 'lucid': '~ubuntu10.04', + 'maverick': '~ubuntu10.10', + 'natty': '~ubuntu11.04', + 'oneiric': '~ubuntu11.10', + 'precise': '~ubuntu12.04', + } + +def distroToSuffix(distro): + return _DISTRO_TO_SUFFIX.get(distro, '~'+distro) def getRepo(package): """Return the path to the git repo for a given package.""" @@ -59,6 +76,9 @@ def pocketToApt(pocket): """Map a pocket in the configuration to an apt repo pocket.""" return getattr(getattr(config.build.pockets, pocket), 'apt', pocket) +def pocketToDistro(pocket): + """Map a pocket in the configuration to the distro we build for.""" + return getattr(getattr(config.build.pockets, pocket), 'distro', _DEFAULT_DISTRIBUTION) def getGitFile(package, ref, path): """Return the contents of a path from a git ref in a package.""" @@ -116,6 +136,7 @@ def validateBuild(pocket, package, commit): ensureValidPackage(package) package_repo = getRepo(package) new_version = getVersion(package, commit) + new_distro = pocketToDistro(pocket) ret = True @@ -124,11 +145,20 @@ def validateBuild(pocket, package, commit): continue b = pocketToGit(p) - current_commit = c.captureOutput(['git', 'rev-parse', b], - cwd=package_repo).strip() + try: + current_commit = c.captureOutput(['git', 'rev-parse', b], + cwd=package_repo).strip() + except subprocess.CalledProcessError: + # Guess we haven't created this pocket yet + continue + current_version = getVersion(package, b) + current_distro = pocketToDistro(pocket) + + # NB: Neither current_version nor new_version will have the + # distro-specific prefix. - if current_version == new_version: + if current_version == new_version and current_distro == new_distro: if current_commit == commit: ret = p else: @@ -146,8 +176,8 @@ def validateBuild(pocket, package, commit): # Almost by definition, A is a fast-forward of B if B..A is # empty - if not c.captureOutput(['git', 'rev-list', '%s..%s' % (commit, branch)], - cwd=package_repo): + if c.captureOutput(['git', 'rev-list', '%s..%s' % (commit, branch)], + cwd=package_repo): raise InvalidBuild('New commit %s of %s is not a fast-forward of' 'commit currently in pocket %s' % (commit, package, pocket))