Blame packages/brpm

Packit Service 11b429
#!/usr/bin/env python
Packit Service a04d08
Packit Service a04d08
import argparse
Packit Service a04d08
import glob
Packit Service a04d08
import json
Packit Service a04d08
import os
Packit Service a04d08
import shutil
Packit Service a04d08
import sys
Packit Service a04d08
import tempfile
Packit Service a04d08
Packit Service a04d08
Packit Service a04d08
def find_root():
Packit Service a04d08
    # expected path is in <top_dir>/packages/
Packit Service a04d08
    top_dir = os.environ.get("CLOUD_INIT_TOP_D", None)
Packit Service a04d08
    if top_dir is None:
Packit Service a04d08
        top_dir = os.path.dirname(
Packit Service a04d08
            os.path.dirname(os.path.abspath(sys.argv[0])))
Packit Service a04d08
    if os.path.isfile(os.path.join(top_dir, 'setup.py')):
Packit Service a04d08
        return os.path.abspath(top_dir)
Packit Service a04d08
    raise OSError(("Unable to determine where your cloud-init topdir is."
Packit Service a04d08
                   " set CLOUD_INIT_TOP_D?"))
Packit Service a04d08
Packit Service a04d08
Packit Service a04d08
if "avoid-pep8-E402-import-not-top-of-file":
Packit Service a04d08
    # Use the util functions from cloudinit
Packit Service a04d08
    sys.path.insert(0, find_root())
Packit Service a04d08
    from cloudinit import templater
Packit Service a04d08
    from cloudinit import util
Packit Service a04d08
Packit Service a04d08
Packit Service a04d08
# Subdirectories of the ~/rpmbuild dir
Packit Service a04d08
RPM_BUILD_SUBDIRS = ['BUILD', 'RPMS', 'SOURCES', 'SPECS', 'SRPMS']
Packit Service a04d08
Packit Service a04d08
Packit Service a04d08
def run_helper(helper, args=None, strip=True):
Packit Service a04d08
    if args is None:
Packit Service a04d08
        args = []
Packit Service a04d08
    cmd = [util.abs_join(find_root(), 'tools', helper)] + args
Packit Service 11b429
    (stdout, _stderr) = util.subp(cmd)
Packit Service a04d08
    if strip:
Packit Service a04d08
        stdout = stdout.strip()
Packit Service a04d08
    return stdout
Packit Service a04d08
Packit Service a04d08
Packit Service 11b429
def read_dependencies(distro, requirements_file='requirements.txt'):
Packit Service a04d08
    """Returns the Python package depedencies from requirements.txt files.
Packit Service a04d08
Packit Service 11b429
    @returns a tuple of (requirements, test_requirements)
Packit Service a04d08
    """
Packit Service 11b429
    pkg_deps = run_helper(
Packit Service 11b429
        'read-dependencies', args=['--distro', distro]).splitlines()
Packit Service a04d08
    test_deps = run_helper(
Packit Service a04d08
        'read-dependencies', args=[
Packit Service a04d08
            '--requirements-file', 'test-requirements.txt',
Packit Service a04d08
            '--system-pkg-names']).splitlines()
Packit Service 11b429
    return (pkg_deps, test_deps)
Packit Service a04d08
Packit Service a04d08
Packit Service a04d08
def read_version():
Packit Service a04d08
    return json.loads(run_helper('read-version', ['--json']))
Packit Service a04d08
Packit Service a04d08
Packit Service a04d08
def generate_spec_contents(args, version_data, tmpl_fn, top_dir, arc_fn):
Packit Service a04d08
Packit Service a04d08
    # Tmpl params
Packit Service a04d08
    subs = {}
Packit Service a04d08
Packit Service a04d08
    if args.sub_release is not None:
Packit Service a04d08
        subs['subrelease'] = str(args.sub_release)
Packit Service a04d08
    else:
Packit Service a04d08
        subs['subrelease'] = ""
Packit Service a04d08
Packit Service a04d08
    subs['archive_name'] = arc_fn
Packit Service a04d08
    subs['source_name'] = os.path.basename(arc_fn).replace('.tar.gz', '')
Packit Service a04d08
    subs.update(version_data)
Packit Service a04d08
Packit Service a04d08
    # rpm does not like '-' in the Version, so change
Packit Service a04d08
    #   X.Y.Z-N-gHASH to X.Y.Z+N.gHASH
Packit Service a04d08
    if "-" in version_data.get('version'):
Packit Service a04d08
        ver, commits, ghash = version_data['version'].split("-")
Packit Service a04d08
        rpm_upstream_version = "%s+%s.%s" % (ver, commits, ghash)
Packit Service a04d08
    else:
Packit Service a04d08
        rpm_upstream_version = version_data['version']
Packit Service a04d08
    subs['rpm_upstream_version'] = rpm_upstream_version
Packit Service a04d08
Packit Service 11b429
    deps, test_deps = read_dependencies(distro=args.distro)
Packit Service 11b429
    subs['buildrequires'] = deps + test_deps
Packit Service 11b429
    subs['requires'] = deps
Packit Service a04d08
Packit Service a04d08
    if args.boot == 'sysvinit':
Packit Service a04d08
        subs['sysvinit'] = True
Packit Service a04d08
    else:
Packit Service a04d08
        subs['sysvinit'] = False
Packit Service a04d08
Packit Service a04d08
    if args.boot == 'systemd':
Packit Service a04d08
        subs['systemd'] = True
Packit Service a04d08
    else:
Packit Service a04d08
        subs['systemd'] = False
Packit Service a04d08
Packit Service a04d08
    subs['init_sys'] = args.boot
Packit Service a04d08
    subs['patches'] = [os.path.basename(p) for p in args.patches]
Packit Service a04d08
    return templater.render_from_file(tmpl_fn, params=subs)
Packit Service a04d08
Packit Service a04d08
Packit Service a04d08
def main():
Packit Service a04d08
Packit Service a04d08
    parser = argparse.ArgumentParser()
Packit Service a04d08
    parser.add_argument("-d", "--distro", dest="distro",
Packit Service a04d08
                        help="select distro (default: %(default)s)",
Packit Service a04d08
                        metavar="DISTRO", default='redhat',
Packit Service a04d08
                        choices=('redhat', 'suse'))
Packit Service a04d08
    parser.add_argument('--srpm',
Packit Service a04d08
                        help='Produce a source rpm',
Packit Service a04d08
                        action='store_true')
Packit Service a04d08
    parser.add_argument("-b", "--boot", dest="boot",
Packit Service a04d08
                        help="select boot type (default: %(default)s)",
Packit Service a04d08
                        metavar="TYPE", default='sysvinit',
Packit Service a04d08
                        choices=('sysvinit', 'systemd'))
Packit Service a04d08
    parser.add_argument("-v", "--verbose", dest="verbose",
Packit Service a04d08
                        help=("run verbosely"
Packit Service a04d08
                              " (default: %(default)s)"),
Packit Service a04d08
                        default=False,
Packit Service a04d08
                        action='store_true')
Packit Service a04d08
    parser.add_argument('-s', "--sub-release", dest="sub_release",
Packit Service a04d08
                        metavar="RELEASE",
Packit Service a04d08
                        help=("a 'internal' release number to concat"
Packit Service a04d08
                              " with the bzr version number to form"
Packit Service a04d08
                              " the final version number"),
Packit Service a04d08
                        type=int,
Packit Service a04d08
                        default=None)
Packit Service a04d08
    parser.add_argument("-p", "--patch", dest="patches",
Packit Service a04d08
                        help=("include the following patch when building"),
Packit Service a04d08
                        default=[],
Packit Service a04d08
                        action='append')
Packit Service a04d08
    args = parser.parse_args()
Packit Service a04d08
    capture = True
Packit Service a04d08
    if args.verbose:
Packit Service a04d08
        capture = False
Packit Service a04d08
Packit Service a04d08
    workdir = None
Packit Service a04d08
    try:
Packit Service a04d08
        workdir = tempfile.mkdtemp(prefix='rpmbuild')
Packit Service a04d08
        os.environ['HOME'] = workdir
Packit Service a04d08
        topdir = os.path.join(workdir, 'rpmbuild')
Packit Service a04d08
        build_dirs = [os.path.join(topdir, dir)
Packit Service a04d08
                      for dir in RPM_BUILD_SUBDIRS]
Packit Service a04d08
        util.ensure_dirs(build_dirs)
Packit Service a04d08
Packit Service a04d08
        version_data = read_version()
Packit Service a04d08
Packit Service a04d08
        # Archive the code
Packit Service a04d08
        archive_fn = "cloud-init-%s.tar.gz" % version_data['version_long']
Packit Service a04d08
        real_archive_fn = os.path.join(topdir, 'SOURCES', archive_fn)
Packit Service a04d08
        archive_fn = run_helper(
Packit Service a04d08
            'make-tarball', ['--long', '--output=' + real_archive_fn])
Packit Service a04d08
        print("Archived the code in %r" % (real_archive_fn))
Packit Service a04d08
Packit Service a04d08
        # Form the spec file to be used
Packit Service a04d08
        tmpl_fn = util.abs_join(find_root(), 'packages',
Packit Service a04d08
                                args.distro, 'cloud-init.spec.in')
Packit Service a04d08
        contents = generate_spec_contents(args, version_data, tmpl_fn, topdir,
Packit Service a04d08
                                          os.path.basename(archive_fn))
Packit Service a04d08
        spec_fn = util.abs_join(topdir, 'SPECS', 'cloud-init.spec')
Packit Service a04d08
        util.write_file(spec_fn, contents)
Packit Service a04d08
        print("Created spec file at %r" % (spec_fn))
Packit Service a04d08
        for p in args.patches:
Packit Service a04d08
            util.copy(p, util.abs_join(topdir, 'SOURCES', os.path.basename(p)))
Packit Service a04d08
Packit Service a04d08
        # Now build it!
Packit Service a04d08
        print("Running 'rpmbuild' in %r" % (topdir))
Packit Service a04d08
Packit Service a04d08
        if args.srpm:
Packit Service a04d08
            cmd = ['rpmbuild', '-bs', '--nodeps', spec_fn]
Packit Service a04d08
        else:
Packit Service a04d08
            cmd = ['rpmbuild', '-ba', spec_fn]
Packit Service a04d08
Packit Service 11b429
        util.subp(cmd, capture=capture)
Packit Service a04d08
Packit Service a04d08
        # Copy the items built to our local dir
Packit Service a04d08
        globs = []
Packit Service a04d08
        globs.extend(glob.glob("%s/*.rpm" %
Packit Service a04d08
                               (util.abs_join(topdir, 'RPMS', 'noarch'))))
Packit Service a04d08
        globs.extend(glob.glob("%s/*.rpm" %
Packit Service a04d08
                               (util.abs_join(topdir, 'RPMS', 'x86_64'))))
Packit Service a04d08
        globs.extend(glob.glob("%s/*.rpm" %
Packit Service a04d08
                               (util.abs_join(topdir, 'RPMS'))))
Packit Service a04d08
        globs.extend(glob.glob("%s/*.rpm" %
Packit Service a04d08
                               (util.abs_join(topdir, 'SRPMS'))))
Packit Service a04d08
        for rpm_fn in globs:
Packit Service a04d08
            tgt_fn = util.abs_join(os.getcwd(), os.path.basename(rpm_fn))
Packit Service a04d08
            shutil.move(rpm_fn, tgt_fn)
Packit Service a04d08
            print("Wrote out %s package %r" % (args.distro, tgt_fn))
Packit Service a04d08
    finally:
Packit Service a04d08
        if workdir is not None:
Packit Service a04d08
            shutil.rmtree(workdir)
Packit Service a04d08
Packit Service a04d08
    return 0
Packit Service a04d08
Packit Service a04d08
Packit Service a04d08
if __name__ == '__main__':
Packit Service a04d08
    sys.exit(main())