2012-06-25 23:57:01 -07:00

149 lines
3.9 KiB
Python
Executable File

#!/usr/bin/python
import contextlib
import glob
import os
import shutil
import subprocess
import sys
import tempfile
import tempita
PKG_MP = {
'tempita': 'python-tempita',
'boto': 'python-boto',
'configobj': 'python-configobj',
'oauth': 'python-oauth',
'yaml': 'python-yaml',
'prettytable': 'python-prettytable',
'argparse': 'python-argparse',
}
@contextlib.contextmanager
def tmpdir():
t = tempfile.mkdtemp()
try:
yield t
finally:
pass
#shutil.rmtree(t)
def join(*paths):
p = os.path.join(*paths)
return os.path.abspath(p)
def tiny_p(cmd, capture=True):
# Darn python 2.6 doesn't have check_output (argggg)
info("Running %s" % (cmd))
stdout = subprocess.PIPE
stderr = subprocess.PIPE
if not capture:
stdout = None
stderr = None
sp = subprocess.Popen(cmd, stdout=stdout,
stderr=stderr, stdin=None)
(out, err) = sp.communicate()
if sp.returncode not in [0]:
raise RuntimeError("Failed running %s [rc=%s] (%s, %s)"
% (cmd, sp.returncode, out, err))
return (out, err)
def tmpl_file(name, params):
with open(join('debian', name), 'r') as fh:
contents = fh.read()
tpl = tempita.Template(contents)
return tpl.substitute(**params)
def write_debian(version, revno, root):
db_dir = join(root, 'debian')
os.makedirs(db_dir)
# Fill in the change log template
with open(join(db_dir, 'changelog'), 'w') as fh:
params = {
'version': version,
'revision': revno,
}
contents = tmpl_file('changelog', params)
fh.write(contents)
# Write out the control file template
cmd = [sys.executable, join(os.pardir, 'tools', 'read-dependencies')]
(stdout, _stderr) = tiny_p(cmd)
pkgs = stdout.splitlines()
requires = []
# Map to known packages
for e in pkgs:
e = e.lower().strip()
tgt_pkg = None
for n in PKG_MP.keys():
if e.find(n) != -1:
tgt_pkg = PKG_MP.get(n)
if not tgt_pkg:
raise RuntimeError(("Do not know how to translate %s to "
" a known package") % (e))
else:
requires.append(tgt_pkg)
contents = tmpl_file('control', {'requires': requires})
with open(join(db_dir, 'control'), 'w') as fh:
fh.write(contents)
# Just copy the following directly
for fn in ['dirs', 'copyright', 'compat', 'pycompat', 'rules']:
shutil.copy(join('debian', fn),
join(db_dir, fn))
def info(msg):
print("INFO: %s" % (msg))
def warn(msg):
print("WARNING: %s" % (msg))
def archive_code():
(stdout, _stderr) = tiny_p([sys.executable,
join(os.getcwd(), 'make-tarball')])
return stdout.split(None)
def main():
with tmpdir() as td:
(revno, version, bname, archive_fn) = archive_code()
real_archive_fn = os.path.join(td, os.path.basename(archive_fn))
shutil.move(archive_fn, real_archive_fn)
cmd = ['tar', '-xvzf', real_archive_fn, '-C', td]
stdout, stderr = tiny_p(cmd)
edir = join(td, bname)
shutil.move(edir, join(td, 'cloud-init'))
write_debian(version, revno, join(td, 'cloud-init'))
# Seems to want an original tar ball
o_tar = "cloud-init_%s~%s.orig.tar.gz" % (version, revno)
cmd = ['tar', '-czvf', join(td, o_tar), '-C', join(td, 'cloud-init')]
cmd.extend(os.listdir(join(td, 'cloud-init')))
tiny_p(cmd)
ocwd = os.getcwd()
os.chdir(join(td, 'cloud-init'))
cmd = ['debuild']
tiny_p(cmd, capture=False)
debname = "cloud-init_%s~bzr%s-1_all.deb" % (version, revno)
shutil.move(debname, join(owcwd, debname))
info("Wrote out debian package %s" % (join(owcwd, debname)))
return 0
if __name__ == '__main__':
sys.exit(main())