diff options
Diffstat (limited to 'packages/bddeb')
-rwxr-xr-x | packages/bddeb | 157 |
1 files changed, 83 insertions, 74 deletions
diff --git a/packages/bddeb b/packages/bddeb index 10ad08b3..2cfddb99 100755 --- a/packages/bddeb +++ b/packages/bddeb @@ -3,13 +3,21 @@ import os import shutil import sys -import glob + + +def find_root(): + # expected path is in <top_dir>/packages/ + top_dir = os.environ.get("CLOUD_INIT_TOP_D", None) + if top_dir is None: + top_dir = os.path.dirname( + os.path.dirname(os.path.abspath(sys.argv[0]))) + if os.path.isfile(os.path.join(top_dir, 'setup.py')): + return os.path.abspath(top_dir) + raise OSError(("Unable to determine where your cloud-init topdir is." + " set CLOUD_INIT_TOP_D?")) # Use the util functions from cloudinit -possible_topdir = os.path.normpath(os.path.join(os.path.abspath( - sys.argv[0]), os.pardir, os.pardir)) -if os.path.exists(os.path.join(possible_topdir, "cloudinit", "__init__.py")): - sys.path.insert(0, possible_topdir) +sys.path.insert(0, find_root()) from cloudinit import templater from cloudinit import util @@ -17,24 +25,27 @@ from cloudinit import util import argparse # Package names that will showup in requires to what we can actually -# use in our debian 'control' file +# use in our debian 'control' file, this is a translation of the 'requires' +# file pypi package name to a debian/ubuntu package name. PKG_MP = { - 'tempita': 'python-tempita', 'boto': 'python-boto', 'configobj': 'python-configobj', 'oauth': 'python-oauth', - 'yaml': 'python-yaml', + 'pyyaml': 'python-yaml', 'prettytable': 'python-prettytable', 'argparse': 'python-argparse', + 'cheetah': 'python-cheetah', } +DEBUILD_ARGS = ["-us", "-S", "-uc"] -def write_debian_folder(root, version, revno, init_sys): +def write_debian_folder(root, version, revno): deb_dir = util.abs_join(root, 'debian') os.makedirs(deb_dir) - + # Fill in the change log template - templater.render_to_file(util.abs_join('debian', 'changelog'), + templater.render_to_file(util.abs_join(find_root(), + 'packages', 'debian', 'changelog.in'), util.abs_join(deb_dir, 'changelog'), params={ 'version': version, @@ -42,56 +53,45 @@ def write_debian_folder(root, version, revno, init_sys): }) # Write out the control file template - cmd = [sys.executable, - util.abs_join(os.pardir, 'tools', 'read-dependencies')] + cmd = [util.abs_join(find_root(), 'tools', 'read-dependencies')] (stdout, _stderr) = util.subp(cmd) - - # Map to known packages pkgs = [p.lower().strip() for p in stdout.splitlines()] + + # Map to known packages requires = [] for p in pkgs: - tgt_pkg = None - for name in PKG_MP.keys(): - if p.find(name) != -1: - tgt_pkg = PKG_MP.get(name) - break + tgt_pkg = PKG_MP.get(p) if not tgt_pkg: - raise RuntimeError(("Do not know how to translate %s to " - " a known package") % (p)) + raise RuntimeError(("Do not know how to translate pypi dependency" + " %r to a known package") % (p)) else: requires.append(tgt_pkg) - templater.render_to_file(util.abs_join('debian', 'control'), + templater.render_to_file(util.abs_join(find_root(), + 'packages', 'debian', 'control.in'), util.abs_join(deb_dir, 'control'), params={'requires': requires}) - - templater.render_to_file(util.abs_join('debian', 'rules'), - util.abs_join(deb_dir, 'rules'), - params={'init_sys': init_sys}) - + # Just copy the following directly - for base_fn in ['dirs', 'copyright', 'compat', 'pycompat']: - shutil.copy(util.abs_join('debian', base_fn), + for base_fn in ['dirs', 'copyright', 'compat', 'pycompat', 'rules']: + shutil.copy(util.abs_join(find_root(), + 'packages', 'debian', base_fn), util.abs_join(deb_dir, base_fn)) def main(): parser = argparse.ArgumentParser() - parser.add_argument("-n", "--no-sign", dest="sign", - help=("attempt to sign " - "the package (default: %(default)s)"), - default=True, - action='store_false') parser.add_argument("-v", "--verbose", dest="verbose", help=("run verbosely" " (default: %(default)s)"), default=False, action='store_true') - parser.add_argument("-b", "--boot", dest="boot", - help="select boot type (default: %(default)s)", - metavar="TYPE", default='upstart', - choices=('upstart', 'upstart-local')) + + for ent in DEBUILD_ARGS: + parser.add_argument(ent, dest="debuild_args", action='append_const', + const=ent, help=("pass through '%s' to debuild" % ent)) + args = parser.parse_args() capture = True @@ -100,21 +100,19 @@ def main(): with util.tempdir() as tdir: - cmd = [sys.executable, - util.abs_join(os.pardir, 'tools', 'read-version')] + cmd = [util.abs_join(find_root(), 'tools', 'read-version')] (sysout, _stderr) = util.subp(cmd) version = sysout.strip() cmd = ['bzr', 'revno'] (sysout, _stderr) = util.subp(cmd) revno = sysout.strip() - + # This is really only a temporary archive # since we will extract it then add in the debian # folder, then re-archive it for debian happiness print("Creating a temporary tarball using the 'make-tarball' helper") - cmd = [sys.executable, - util.abs_join(os.getcwd(), 'make-tarball')] + cmd = [util.abs_join(find_root(), 'tools', 'make-tarball')] (sysout, _stderr) = util.subp(cmd) arch_fn = sysout.strip() tmp_arch_fn = util.abs_join(tdir, os.path.basename(arch_fn)) @@ -123,47 +121,58 @@ def main(): print("Extracting temporary tarball %r" % (tmp_arch_fn)) cmd = ['tar', '-xvzf', tmp_arch_fn, '-C', tdir] util.subp(cmd, capture=capture) - base_name = os.path.basename(arch_fn)[:-len(".tar.gz")] - shutil.move(util.abs_join(tdir, base_name), - util.abs_join(tdir, 'cloud-init')) + extracted_name = tmp_arch_fn[:-len('.tar.gz')] + os.remove(tmp_arch_fn) + + xdir = util.abs_join(tdir, 'cloud-init') + shutil.move(extracted_name, xdir) - print("Creating a debian/ folder in %r" % - (util.abs_join(tdir, 'cloud-init'))) - write_debian_folder(util.abs_join(tdir, 'cloud-init'), - version, revno, args.boot) + print("Creating a debian/ folder in %r" % (xdir)) + write_debian_folder(xdir, version, revno) # The naming here seems to follow some debian standard # so it will whine if it is changed... - tar_fn = "cloud-init_%s~%s.orig.tar.gz" % (version, revno) - print("Archiving that new folder into %r" % (tar_fn)) - cmd = ['tar', '-czvf', - util.abs_join(tdir, tar_fn), - '-C', util.abs_join(tdir, 'cloud-init')] - cmd.extend(os.listdir(util.abs_join(tdir, 'cloud-init'))) + tar_fn = "cloud-init_%s~bzr%s.orig.tar.gz" % (version, revno) + print("Archiving the adjusted source into %r" % + (util.abs_join(tdir, tar_fn))) + cmd = ['tar', '-czvf', + util.abs_join(tdir, tar_fn), + '-C', xdir] + cmd.extend(os.listdir(xdir)) util.subp(cmd, capture=capture) - shutil.copy(util.abs_join(tdir, tar_fn), tar_fn) - print("Wrote out archive %r" % (util.abs_join(tar_fn))) - - print("Running 'debuild' in %r" % (util.abs_join(tdir, 'cloud-init'))) - with util.chdir(util.abs_join(tdir, 'cloud-init')): - cmd = ['debuild'] - if not args.sign: - cmd.extend(['-us', '-uc']) + + # Copy it locally for reference + shutil.copy(util.abs_join(tdir, tar_fn), + util.abs_join(os.getcwd(), tar_fn)) + print("Copied that archive to %r for local usage (if desired)." % + (util.abs_join(os.getcwd(), tar_fn))) + + print("Running 'debuild' in %r" % (xdir)) + with util.chdir(xdir): + cmd = ['debuild', '--preserve-envvar', 'INIT_SYSTEM'] + if args.debuild_args: + cmd.extend(args.debuild_args) util.subp(cmd, capture=capture) - globs = [] - globs.extend(glob.glob("%s/*.deb" % - (os.path.join(tdir)))) link_fn = os.path.join(os.getcwd(), 'cloud-init_all.deb') - for fn in globs: - base_fn = os.path.basename(fn) - shutil.move(fn, base_fn) - print("Wrote out debian package %r" % (base_fn)) - if fn.endswith('_all.deb'): + link_dsc = os.path.join(os.getcwd(), 'cloud-init.dsc') + for base_fn in os.listdir(os.path.join(tdir)): + full_fn = os.path.join(tdir, base_fn) + if not os.path.isfile(full_fn): + continue + shutil.move(full_fn, base_fn) + print("Wrote %r" % (base_fn)) + if base_fn.endswith('_all.deb'): # Add in the local link util.del_file(link_fn) os.symlink(base_fn, link_fn) - print("Linked %r to %r" % (base_fn, link_fn)) + print("Linked %r to %r" % (base_fn, + os.path.basename(link_fn))) + if base_fn.endswith('.dsc'): + util.del_file(link_dsc) + os.symlink(base_fn, link_dsc) + print("Linked %r to %r" % (base_fn, + os.path.basename(link_dsc))) return 0 |