From 35b902c05711c8637999ad3fb72d5e04aae36dad Mon Sep 17 00:00:00 2001 From: Joshua Harlow Date: Fri, 15 Jul 2016 11:48:25 -0700 Subject: Avoid depending on argparse in 2.7 or greater Its not needed since its a built-in for these versions so we can just skip it for any newer rpm building in the first place. LP: #1603533 --- packages/brpm | 3 +++ 1 file changed, 3 insertions(+) (limited to 'packages') diff --git a/packages/brpm b/packages/brpm index b41b675f..45e47610 100755 --- a/packages/brpm +++ b/packages/brpm @@ -137,6 +137,9 @@ def generate_spec_contents(args, tmpl_fn, top_dir, arc_fn): # Map to known packages requires = [] for p in pkgs: + if p == 'argparse' and sys.version_info[0:2] >= (2, 7): + # Not needed on anything but 2.6 or older. + continue tgt_pkg = PKG_MP[args.distro].get(p) if not tgt_pkg: raise RuntimeError(("Do not know how to translate pypi dependency" -- cgit v1.2.3 From 72d6adcb2e4cb5911f7809b89835965d4bf04476 Mon Sep 17 00:00:00 2001 From: Lars Kellogg-Stedman Date: Fri, 22 Jul 2016 15:09:24 -0400 Subject: Update build tools to work with git - Update HACKING.rst to include git instructions - update MANIFEST.in and .gitignore to ignore git-related things - replaced tarball generation scripts with git-based script - have the spec files correctly identify themselves as cheetah templates - make brpm work with git --- .gitignore | 6 + HACKING.rst | 68 ++++++--- MANIFEST.in | 2 + packages/bddeb | 13 +- packages/brpm | 294 ++++++++++++++++--------------------- packages/debian/changelog.in | 2 +- packages/redhat/cloud-init.spec.in | 20 +-- packages/suse/cloud-init.spec.in | 14 +- tools/make-dist-tarball | 21 --- tools/make-tarball | 54 +++---- tools/read-dependencies | 22 ++- 11 files changed, 233 insertions(+), 283 deletions(-) create mode 100644 .gitignore delete mode 100755 tools/make-dist-tarball (limited to 'packages') diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..77eb9c74 --- /dev/null +++ b/.gitignore @@ -0,0 +1,6 @@ +build +cloud_init.egg-info +dist +*.pyc +__pycache__ +.tox diff --git a/HACKING.rst b/HACKING.rst index 6bfe4b4d..63a5bde0 100644 --- a/HACKING.rst +++ b/HACKING.rst @@ -2,47 +2,71 @@ Hacking on cloud-init ===================== -To get changes into cloud-init, the process to follow is: +This document describes how to contribute changes to cloud-init. + +Do these things once +-------------------- * If you have not already, be sure to sign the CCA: - `Canonical Contributor Agreement`_ -* Get your changes into a local bzr branch. - Initialize a repo, and checkout trunk (init repo is to share bzr info across multiple checkouts, its different than git): +* Clone the `LaunchPad`_ repository: + + git clone YOUR_USERNAME@git.launchpad.net:cloud-init + cd cloud-init + + If you would prefer a bzr style `git clone lp:cloud-init`, see + the `Instructions on LaunchPad`_ for more information. - - ``bzr init-repo cloud-init`` - - ``bzr branch lp:cloud-init trunk.dist`` - - ``bzr branch trunk.dist my-topic-branch`` +* Create a new remote pointing to your personal LaunchPad + repository:: + + git remote add YOUR_USERNAME YOUR_USERNAME@git.launchpad.net:~YOUR_USERNAME/cloud-init + +.. _Canonical Contributor Agreement: http://www.canonical.com/contributors -* Commit your changes (note, you can make multiple commits, fixes, more commits.): +Do these things for each feature or bug +--------------------------------------- - - ``bzr commit`` +* Create a new topic branch for your work:: -* Check pep8 and test, and address any issues: + git checkout -b my-topic-branch - - ``make test pep8`` +.. _Instructions on launchpad: https://help.launchpad.net/Code/Git -* Push to launchpad to a personal branch: +* Make and commit your changes (note, you can make multiple commits, + fixes, more commits.):: - - ``bzr push lp:~/cloud-init/`` + git commit -* Propose that for a merge into lp:cloud-init via web browser. +* Check pep8 and test, and address any issues:: - - Open the branch in `Launchpad`_ + make test pep8 - - It will typically be at ``https://code.launchpad.net///`` - - ie. https://code.launchpad.net/~smoser/cloud-init/mybranch +* Push your changes to your personal LaunchPad repository:: -* Click 'Propose for merging' -* Select 'lp:cloud-init' as the target branch + git push -u YOUR_USERNAME my-topic-branch -Then, someone on cloud-init-dev (currently `Scott Moser`_ and `Joshua Harlow`_) will -review your changes and follow up in the merge request. +* Use your browser to create a merge request: -Feel free to ping and/or join #cloud-init on freenode (irc) if you have any questions. + - Open the branch on `LaunchPad`_ + + - It will typically be at + ``https://code.launchpad.net/~YOUR_USERNAME/cloud-init/+git/cloud-init/+ref/BRANCHNAME`` + for example + https://code.launchpad.net/~larsks/cloud-init/+git/cloud-init/+ref/feature/move-to-git + + - Click 'Propose for merging` + - Select ``cloud-init`` as the target repository + - Select ``master`` as the target reference path + +Then, someone on cloud-init-dev (currently `Scott Moser`_ and `Joshua +Harlow`_) will review your changes and follow up in the merge request. + +Feel free to ping and/or join ``#cloud-init`` on freenode (irc) if you +have any questions. .. _Launchpad: https://launchpad.net -.. _Canonical Contributor Agreement: http://www.canonical.com/contributors .. _Scott Moser: https://launchpad.net/~smoser .. _Joshua Harlow: https://launchpad.net/~harlowja diff --git a/MANIFEST.in b/MANIFEST.in index 90f6c7d5..94264640 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -4,5 +4,7 @@ graft tools prune build prune dist prune .tox +prune .git prune .bzr +exclude .gitignore exclude .bzrignore diff --git a/packages/bddeb b/packages/bddeb index 3c77ce1d..46c07c88 100755 --- a/packages/bddeb +++ b/packages/bddeb @@ -180,13 +180,10 @@ def main(): with util.tempdir() as tdir: - cmd = [util.abs_join(find_root(), 'tools', 'read-version')] + # output like 0.7.6-1022-g36e92d3 + cmd = ['git', 'describe', '--long'] (sysout, _stderr) = util.subp(cmd) - version = sysout.strip() - - cmd = ['bzr', 'revno'] - (sysout, _stderr) = util.subp(cmd) - revno = sysout.strip() + version, extra = sysout.strip().split("-", 1) # This is really only a temporary archive # since we will extract it then add in the debian @@ -212,12 +209,12 @@ def main(): append_requires=['cloud-utils | cloud-guest-utils'] else: append_requires=[] - write_debian_folder(xdir, version, revno, pkgmap, + write_debian_folder(xdir, version, extra, pkgmap, pyver=pyver, append_requires=append_requires) # The naming here seems to follow some debian standard # so it will whine if it is changed... - tar_fn = "cloud-init_%s~bzr%s.orig.tar.gz" % (version, revno) + tar_fn = "cloud-init_%s+%s~bddeb.orig.tar.gz" % (version, extra) print("Archiving the adjusted source into %r" % (util.abs_join(tdir, tar_fn))) cmd = ['tar', '-czvf', diff --git a/packages/brpm b/packages/brpm index 45e47610..5d16eb71 100755 --- a/packages/brpm +++ b/packages/brpm @@ -1,27 +1,24 @@ -#!/usr/bin/python +#!/usr/bin/env python import argparse -import contextlib import glob import os import shutil -import subprocess import sys import tempfile -import re - -from datetime import datetime +import time def find_root(): # expected path is in /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]))) + 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?")) + " set CLOUD_INIT_TOP_D?")) # Use the util functions from cloudinit @@ -30,34 +27,15 @@ sys.path.insert(0, find_root()) from cloudinit import templater from cloudinit import util -# Mapping of expected packages to there full name... -# this is a translation of the 'requires' -# file pypi package name to a redhat/fedora package name. -PKG_MP = { +# Map python requirements to package names. If a match isn't found +# here, we assume 'python-'. +PACKAGE_MAP = { 'redhat': { - 'argparse': 'python-argparse', - 'cheetah': 'python-cheetah', - 'jinja2': 'python-jinja2', - 'configobj': 'python-configobj', - 'jsonpatch': 'python-jsonpatch', - 'oauthlib': 'python-oauthlib', - 'prettytable': 'python-prettytable', 'pyserial': 'pyserial', 'pyyaml': 'PyYAML', - 'requests': 'python-requests', - 'six': 'python-six', }, 'suse': { - 'argparse': 'python-argparse', - 'cheetah': 'python-cheetah', - 'configobj': 'python-configobj', - 'jsonpatch': 'python-jsonpatch', - 'oauthlib': 'python-oauthlib', - 'prettytable': 'python-prettytable', - 'pyserial': 'python-pyserial', 'pyyaml': 'python-yaml', - 'requests': 'python-requests', - 'six': 'python-six', } } @@ -65,113 +43,79 @@ PKG_MP = { RPM_BUILD_SUBDIRS = ['BUILD', 'RPMS', 'SOURCES', 'SPECS', 'SRPMS'] -def get_log_header(version): - # Try to find the version in the tags output - cmd = ['bzr', 'tags'] - (stdout, _stderr) = util.subp(cmd) - a_rev = None - for t in stdout.splitlines(): - ver, rev = t.split(None) - if ver == version: - a_rev = rev - break - if not a_rev: - return None - - # Extract who made that tag as the header - cmd = ['bzr', 'log', '-r%s' % (a_rev), '--timezone=utc'] +def read_dependencies(): + '''Returns the Python depedencies from requirements.txt. This explicitly + removes 'argparse' from the list of requirements for python >= 2.7, + because with 2.7 argparse became part of the standard library.''' + cmd = [util.abs_join(find_root(), 'tools', 'read-dependencies')] (stdout, _stderr) = util.subp(cmd) - kvs = { - 'comment': version, - } + return [p.lower().strip() for p in stdout.splitlines() + if p != 'argparse' or (p == 'argparse' + and sys.version_info[0:2] < (2, 7))] - for line in stdout.splitlines(): - if line.startswith('committer:'): - kvs['who'] = line[len('committer:'):].strip() - if line.startswith('timestamp:'): - ts = line[len('timestamp:'):] - ts = ts.strip() - # http://bugs.python.org/issue6641 - ts = ts.replace("+0000", '').strip() - ds = datetime.strptime(ts, '%a %Y-%m-%d %H:%M:%S') - kvs['ds'] = ds - return format_change_line(**kvs) +def translate_dependencies(deps, distro): + '''Maps python requirements into package names. We assume + python- for packages not listed explicitly in + PACKAGE_MAP.''' + return [PACKAGE_MAP[distro][req] + if req in PACKAGE_MAP[distro] else 'python-%s' % req + for req in deps] -def format_change_line(ds, who, comment=None): - # Rpmbuild seems to be pretty strict about the date format - d = ds.strftime("%a %b %d %Y") - d += " - %s" % (who) - if comment: - d += " - %s" % (comment) - return "* %s" % (d) - - -def generate_spec_contents(args, tmpl_fn, top_dir, arc_fn): - +def read_version(): + '''Read version information. We parse the version itself from + the changelog, and then ask git for the commit id and distance + from the last tag.''' # Figure out the version and revno cmd = [util.abs_join(find_root(), 'tools', 'read-version')] (stdout, _stderr) = util.subp(cmd) version = stdout.strip() - - cmd = ['bzr', 'revno'] + + cmd = ['git', 'describe', '--tags'] (stdout, _stderr) = util.subp(cmd) - revno = stdout.strip() + git_version = stdout.strip() + + try: + _version, distance, revno = git_version.split('-') + except ValueError: + distance = None + revno = None + + return (version, distance, revno) + + +def generate_spec_contents(args, tmpl_fn, top_dir, arc_fn): + + # This will get us something like ('0.7.6', None, None) for a + # tagged commit, and something like ('0.7.6', '1026', 'gd1d5796') + # for an untagged commited. + version, distance, revno = read_version() # Tmpl params subs = {} subs['version'] = version subs['revno'] = revno - subs['release'] = "bzr%s" % (revno) + subs['distance'] = distance + + if distance is not None: + now = time.strftime('%Y%m%d', time.localtime()) + release = '.%sgit%s' % (now, revno) + else: + release = '' + if args.sub_release is not None: - subs['subrelease'] = "." + str(args.sub_release) + subs['subrelease'] = release + "." + str(args.sub_release) else: - subs['subrelease'] = '' - subs['archive_name'] = arc_fn + subs['subrelease'] = release - cmd = [util.abs_join(find_root(), 'tools', 'read-dependencies')] - (stdout, _stderr) = util.subp(cmd) - pkgs = [p.lower().strip() for p in stdout.splitlines()] + subs['archive_name'] = arc_fn + subs['source_name'] = os.path.basename(arc_fn).replace('.tar.gz', '') # Map to known packages - requires = [] - for p in pkgs: - if p == 'argparse' and sys.version_info[0:2] >= (2, 7): - # Not needed on anything but 2.6 or older. - continue - tgt_pkg = PKG_MP[args.distro].get(p) - if not tgt_pkg: - raise RuntimeError(("Do not know how to translate pypi dependency" - " %r to a known package") % (p)) - else: - requires.append(tgt_pkg) - subs['requires'] = requires - - # Format a nice changelog (as best as we can) - changelog = util.load_file(util.abs_join(find_root(), 'ChangeLog')) - changelog_lines = [] - missing_versions = 0 - for line in changelog.splitlines(): - if not line.strip(): - continue - if re.match(r"^\s*[\d][.][\d][.][\d]:\s*", line): - line = line.strip(":") - header = get_log_header(line) - if not header: - missing_versions += 1 - if missing_versions == 1: - # Must be using a new 'dev'/'trunk' release - changelog_lines.append(format_change_line(datetime.now(), - '??')) - else: - sys.stderr.write(("Changelog version line %s does not " - "have a corresponding tag!\n") % (line)) - else: - changelog_lines.append(header) - else: - changelog_lines.append(line) - subs['changelog'] = "\n".join(changelog_lines) + python_deps = read_dependencies() + package_deps = translate_dependencies(python_deps, args.distro) + subs['requires'] = package_deps if args.boot == 'sysvinit': subs['sysvinit'] = True @@ -183,21 +127,23 @@ def generate_spec_contents(args, tmpl_fn, top_dir, arc_fn): else: subs['systemd'] = False - subs['defines'] = ["_topdir %s" % (top_dir)] subs['init_sys'] = args.boot subs['patches'] = [os.path.basename(p) for p in args.patches] return templater.render_from_file(tmpl_fn, params=subs) def main(): - + parser = argparse.ArgumentParser() parser.add_argument("-d", "--distro", dest="distro", help="select distro (default: %(default)s)", metavar="DISTRO", default='redhat', choices=('redhat', 'suse')) + parser.add_argument('--srpm', + help='Produce a source rpm', + action='store_true') parser.add_argument("-b", "--boot", dest="boot", - help="select boot type (default: %(default)s)", + help="select boot type (default: %(default)s)", metavar="TYPE", default='sysvinit', choices=('sysvinit', 'systemd')) parser.add_argument("-v", "--verbose", dest="verbose", @@ -221,57 +167,63 @@ def main(): if args.verbose: capture = False - # Clean out the root dir and make sure the dirs we want are in place - root_dir = os.path.expanduser("~/rpmbuild") - if os.path.isdir(root_dir): - shutil.rmtree(root_dir) - - arc_dir = util.abs_join(root_dir, 'SOURCES') - build_dirs = [root_dir, arc_dir] - for dname in RPM_BUILD_SUBDIRS: - build_dirs.append(util.abs_join(root_dir, dname)) - build_dirs.sort() - util.ensure_dirs(build_dirs) - - # Archive the code - cmd = [util.abs_join(find_root(), 'tools', 'make-tarball')] - (stdout, _stderr) = util.subp(cmd) - archive_fn = stdout.strip() - real_archive_fn = os.path.join(arc_dir, os.path.basename(archive_fn)) - shutil.move(archive_fn, real_archive_fn) - print("Archived the code in %r" % (real_archive_fn)) - - # Form the spec file to be used - tmpl_fn = util.abs_join(find_root(), 'packages', - args.distro, 'cloud-init.spec.in') - contents = generate_spec_contents(args, tmpl_fn, root_dir, - os.path.basename(archive_fn)) - spec_fn = util.abs_join(root_dir, 'cloud-init.spec') - util.write_file(spec_fn, contents) - print("Created spec file at %r" % (spec_fn)) - print(contents) - for p in args.patches: - util.copy(p, util.abs_join(arc_dir, os.path.basename(p))) - - # Now build it! - print("Running 'rpmbuild' in %r" % (root_dir)) - cmd = ['rpmbuild', '-ba', spec_fn] - util.subp(cmd, capture=capture) - - # Copy the items built to our local dir - globs = [] - globs.extend(glob.glob("%s/*.rpm" % - (util.abs_join(root_dir, 'RPMS', 'noarch')))) - globs.extend(glob.glob("%s/*.rpm" % - (util.abs_join(root_dir, 'RPMS', 'x86_64')))) - globs.extend(glob.glob("%s/*.rpm" % - (util.abs_join(root_dir, 'RPMS')))) - globs.extend(glob.glob("%s/*.rpm" % - (util.abs_join(root_dir, 'SRPMS')))) - for rpm_fn in globs: - tgt_fn = util.abs_join(os.getcwd(), os.path.basename(rpm_fn)) - shutil.move(rpm_fn, tgt_fn) - print("Wrote out %s package %r" % (args.distro, tgt_fn)) + workdir = None + try: + workdir = tempfile.mkdtemp(prefix='rpmbuild') + os.environ['HOME'] = workdir + topdir = os.path.join(workdir, 'rpmbuild') + build_dirs = [os.path.join(topdir, dir) + for dir in RPM_BUILD_SUBDIRS] + util.ensure_dirs(build_dirs) + + # Archive the code + cmd = [util.abs_join(find_root(), 'tools', 'make-tarball')] + (stdout, _stderr) = util.subp(cmd) + archive_fn = stdout.strip() + print "Archived source as %s" % archive_fn + real_archive_fn = os.path.join(topdir, 'SOURCES', + os.path.basename(archive_fn)) + shutil.move(archive_fn, real_archive_fn) + print("Archived the code in %r" % (real_archive_fn)) + + # Form the spec file to be used + tmpl_fn = util.abs_join(find_root(), 'packages', + args.distro, 'cloud-init.spec.in') + contents = generate_spec_contents(args, tmpl_fn, topdir, + os.path.basename(archive_fn)) + spec_fn = util.abs_join(topdir, 'SPECS', 'cloud-init.spec') + util.write_file(spec_fn, contents) + print("Created spec file at %r" % (spec_fn)) + for p in args.patches: + util.copy(p, util.abs_join(topdir, 'SOURCES', os.path.basename(p))) + + # Now build it! + print("Running 'rpmbuild' in %r" % (topdir)) + + if args.srpm: + cmd = ['rpmbuild', '-bs', '--nodeps', spec_fn] + else: + cmd = ['rpmbuild', '-ba', spec_fn] + + util.subp(cmd, capture=capture) + + # Copy the items built to our local dir + globs = [] + globs.extend(glob.glob("%s/*.rpm" % + (util.abs_join(topdir, 'RPMS', 'noarch')))) + globs.extend(glob.glob("%s/*.rpm" % + (util.abs_join(topdir, 'RPMS', 'x86_64')))) + globs.extend(glob.glob("%s/*.rpm" % + (util.abs_join(topdir, 'RPMS')))) + globs.extend(glob.glob("%s/*.rpm" % + (util.abs_join(topdir, 'SRPMS')))) + for rpm_fn in globs: + tgt_fn = util.abs_join(os.getcwd(), os.path.basename(rpm_fn)) + shutil.move(rpm_fn, tgt_fn) + print("Wrote out %s package %r" % (args.distro, tgt_fn)) + finally: + if workdir is not None: + shutil.rmtree(workdir) return 0 diff --git a/packages/debian/changelog.in b/packages/debian/changelog.in index c9affe47..544d23cf 100644 --- a/packages/debian/changelog.in +++ b/packages/debian/changelog.in @@ -1,5 +1,5 @@ ## template:basic -cloud-init (${version}~bzr${revision}-1) UNRELEASED; urgency=low +cloud-init (${version}+${revision}~bddeb-1) UNRELEASED; urgency=low * build diff --git a/packages/redhat/cloud-init.spec.in b/packages/redhat/cloud-init.spec.in index 254d209b..c30d33ca 100644 --- a/packages/redhat/cloud-init.spec.in +++ b/packages/redhat/cloud-init.spec.in @@ -1,17 +1,13 @@ -## This is a cheetah template +## template: cheetah %{!?python_sitelib: %global python_sitelib %(%{__python} -c "from distutils.sysconfig import get_python_lib; print get_python_lib()")} # See: http://www.zarb.org/~jasonc/macros.php # Or: http://fedoraproject.org/wiki/Packaging:ScriptletSnippets # Or: http://www.rpm.org/max-rpm/ch-rpm-inside.html -#for $d in $defines -%define ${d} -#end for - Name: cloud-init Version: ${version} -Release: ${release}${subrelease}%{?dist} +Release: 1${subrelease}%{?dist} Summary: Cloud instance init scripts Group: System Environment/Base @@ -22,9 +18,9 @@ Source0: ${archive_name} BuildArch: noarch BuildRoot: %{_tmppath} -BuildRequires: python-devel -BuildRequires: python-setuptools -BuildRequires: python-cheetah +BuildRequires: python-devel +BuildRequires: python-setuptools +BuildRequires: python-cheetah # System util packages needed Requires: shadow-utils @@ -68,7 +64,7 @@ need special scripts to run during initialization to retrieve and install ssh keys and to let the user run various scripts. %prep -%setup -q -n %{name}-%{version}~${release} +%setup -q -n ${source_name} # Custom patches activation #set $size = 0 @@ -198,7 +194,3 @@ fi # Python code is here... %{python_sitelib}/* - -%changelog - -${changelog} diff --git a/packages/suse/cloud-init.spec.in b/packages/suse/cloud-init.spec.in index 53e6ad13..f994a0cf 100644 --- a/packages/suse/cloud-init.spec.in +++ b/packages/suse/cloud-init.spec.in @@ -1,16 +1,12 @@ -## This is a cheetah template +## template: cheetah # See: http://www.zarb.org/~jasonc/macros.php # Or: http://fedoraproject.org/wiki/Packaging:ScriptletSnippets # Or: http://www.rpm.org/max-rpm/ch-rpm-inside.html -#for $d in $defines -%define ${d} -#end for - Name: cloud-init Version: ${version} -Release: ${release}${subrelease}%{?dist} +Release: 1${subrelease}%{?dist} Summary: Cloud instance init scripts Group: System/Management @@ -63,7 +59,7 @@ need special scripts to run during initialization to retrieve and install ssh keys and to let the user run various scripts. %prep -%setup -q -n %{name}-%{version}~${release} +%setup -q -n ${source_name} # Custom patches activation #set $size = 0 @@ -157,7 +153,3 @@ mkdir -p %{buildroot}/var/lib/cloud %{python_sitelib}/* /var/lib/cloud - -%changelog - -${changelog} diff --git a/tools/make-dist-tarball b/tools/make-dist-tarball deleted file mode 100755 index 5b078515..00000000 --- a/tools/make-dist-tarball +++ /dev/null @@ -1,21 +0,0 @@ -#!/bin/sh - -Usage() { - cat <&2 ; exit 1; } - -out="${topdir}/cloud-init-${tag}.tar.gz" - -bzr export --format=tgz --root="cloud-init-$tag" \ - "--revision=tag:${tag}" "$out" "$topdir" && - echo "Wrote ${out}" diff --git a/tools/make-tarball b/tools/make-tarball index b7039150..4828a622 100755 --- a/tools/make-tarball +++ b/tools/make-tarball @@ -1,39 +1,33 @@ #!/bin/sh set -e -find_root() { - local topd - if [ -z "${CLOUD_INIT_TOP_D}" ]; then - topd=$(cd "$(dirname "${0}")" && cd .. && pwd) - else - topd=$(cd "${CLOUD_INIT_TOP_D}" && pwd) - fi - [ $? -eq 0 -a -f "${topd}/setup.py" ] || return - ROOT_DIR="$topd" -} +rev=${1:-HEAD} +revname=$(git describe $rev) -if ! find_root; then - echo "Unable to locate 'setup.py' file that should" \ - "exist in the cloud-init root directory." 1>&2 - exit 1; -fi - -REVNO=$(bzr revno "$ROOT_DIR") +# revname could be 0.7.5 or 0.7.5-NNN-gHASH +# turn that into 0.7.5 or 0.7.5+NNN.gHASH +case "$revname" in + *-*) revname=$(echo "$revname" | sed -e 's/-/+/' -e 's/-/./') +esac -if [ ! -z "$1" ]; then - ARCHIVE_FN="$1" -else - VERSION=$("$ROOT_DIR/tools/read-version") - ARCHIVE_FN="$PWD/cloud-init-$VERSION~bzr$REVNO.tar.gz" -fi +archive_base="cloud-init-$revname" -export_uncommitted="" -if [ "${UNCOMMITTED:-0}" != "0" ]; then - export_uncommitted="--uncommitted" +# when building an archiving from HEAD, ensure that there aren't any +# uncomitted changes in the working directory (because these would not +# end up in the archive). +if [ "$rev" = HEAD ] && ! git diff-index --quiet HEAD --; then + if [ -z "$SKIP_UNCOMITTED_CHANGES_CHECK" ]; then + echo "ERROR: There are uncommitted changes in your working directory." >&2 + exit 1 + else + echo "WARNING: There are uncommitted changes in your working directory." >&2 + echo " This changes will not be included in the archive." >&2 + fi fi -bzr export ${export_uncommitted} \ - --format=tgz --root="cloud-init-$VERSION~bzr$REVNO" \ - "--revision=${REVNO}" "${ARCHIVE_FN}" "$ROOT_DIR" +git archive \ + --format=tar.gz \ + --prefix="$archive_base/" "$rev" \ + "--output=$archive_base.tar.gz" -echo "$ARCHIVE_FN" +echo "${archive_base}.tar.gz" diff --git a/tools/read-dependencies b/tools/read-dependencies index 6a6f3e12..9fc503eb 100755 --- a/tools/read-dependencies +++ b/tools/read-dependencies @@ -1,8 +1,13 @@ #!/usr/bin/env python +# You might be tempted to rewrite this as a shell script, but you +# would be surprised to discover that things like 'egrep' or 'sed' may +# differ between Linux and *BSD. + import os import re import sys +import subprocess if 'CLOUD_INIT_TOP_D' in os.environ: topd = os.path.realpath(os.environ.get('CLOUD_INIT_TOP_D')) @@ -16,14 +21,21 @@ for fname in ("setup.py", "requirements.txt"): sys.exit(1) if len(sys.argv) > 1: - reqfile = sys.argv[1] + reqfile = sys.argv[1] else: - reqfile = "requirements.txt" - + reqfile = "requirements.txt" + with open(os.path.join(topd, reqfile), "r") as fp: for line in fp: - if not line.strip() or line.startswith("#"): + line = line.strip() + if not line or line.startswith("#"): continue - sys.stdout.write(re.split("[>=.<]*", line)[0].strip() + "\n") + + # remove pip-style markers + dep = line.split(';')[0] + + # remove version requirements + dep = re.split("[>=.<]*", dep)[0].strip() + print(dep) sys.exit(0) -- cgit v1.2.3 From 10f82bd474c5bc91b330beccd883da06b0014a99 Mon Sep 17 00:00:00 2001 From: Scott Moser Date: Fri, 5 Aug 2016 11:56:48 -0400 Subject: adjust tools and version information. upstream snapshots are versioned in the format 'X.Y.Z+.g' where X.Y.Z are major, minor, and micro. Distance is number of commits since last annotated tag, and commit is the git commit. bddeb and brpm will now create and use the "upstream version" like above. Things changed here: - tools/make-tarball update cloudinit/version.py to contain the full version support --output support '--long' to always create the long format version string. - bddeb: - use quilt debian source format - use read-version and long version in changelog. - brpm: - change to use read-version and upstream long version in the spec. - flake8 changes - tools/read-version - read version from git or from cloudinit/version. - provide --json output with more nicely formed data. --- cloudinit/version.py | 15 +++-- packages/bddeb | 110 ++++++++++++++++--------------------- packages/brpm | 85 +++++++++++----------------- packages/debian/changelog.in | 2 +- packages/debian/source/format | 1 + packages/redhat/cloud-init.spec.in | 2 +- tools/make-tarball | 59 ++++++++++++++++---- tools/read-version | 81 ++++++++++++++++++++++----- 8 files changed, 205 insertions(+), 150 deletions(-) create mode 100644 packages/debian/source/format (limited to 'packages') diff --git a/cloudinit/version.py b/cloudinit/version.py index 3d1d1d23..01785eb8 100644 --- a/cloudinit/version.py +++ b/cloudinit/version.py @@ -16,12 +16,17 @@ # You should have received a copy of the GNU General Public License # along with this program. If not, see . -from distutils import version as vr +__VERSION__ = "0.7.6" +__EXPORT_VERSION__ = "@@EXPORT_VERSION@@" -def version(): - return vr.StrictVersion("0.7.7") +def version_string(): + if not __EXPORT_VERSION__.startswith("@@"): + return __EXPORT_VERSION__ + return __VERSION__ -def version_string(): - return str(version()) +def full_version_string(): + if __EXPORT_VERSION__.startswith("@@"): + raise ValueError("No full version available") + return __EXPORT_VERSION__ diff --git a/packages/bddeb b/packages/bddeb index 46c07c88..94496c74 100755 --- a/packages/bddeb +++ b/packages/bddeb @@ -1,6 +1,7 @@ #!/usr/bin/env python3 -import glob +import argparse +import json import os import shutil import sys @@ -15,15 +16,13 @@ def find_root(): 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 -sys.path.insert(0, find_root()) + " set CLOUD_INIT_TOP_D?")) -from cloudinit import templater -from cloudinit import util - -import argparse +if "avoid-pep8-E402-import-not-top-of-file": + # Use the util functions from cloudinit + sys.path.insert(0, find_root()) + from cloudinit import templater + from cloudinit import util # Package names that will showup in requires to what we can actually # use in our debian 'control' file, this is a translation of the 'requires' @@ -58,27 +57,37 @@ NONSTD_NAMED_PACKAGES = { DEBUILD_ARGS = ["-S", "-d"] -def write_debian_folder(root, version, revno, pkgmap, - pyver="3", append_requires=[]): +def run_helper(helper, args=None, strip=True): + if args is None: + args = [] + cmd = [util.abs_join(find_root(), 'tools', helper)] + args + (stdout, _stderr) = util.subp(cmd) + if strip: + stdout = stdout.strip() + return stdout + + +def write_debian_folder(root, version_data, pkgmap, pyver="3", + append_requires=[]): deb_dir = util.abs_join(root, 'debian') - os.makedirs(deb_dir) + + # Just copy debian/ dir and then update files + pdeb_d = util.abs_join(find_root(), 'packages', 'debian') + util.subp(['cp', '-a', pdeb_d, deb_dir]) # Fill in the change log template templater.render_to_file(util.abs_join(find_root(), 'packages', 'debian', 'changelog.in'), util.abs_join(deb_dir, 'changelog'), - params={ - 'version': version, - 'revision': revno, - }) + params=version_data) # Write out the control file template - cmd = [util.abs_join(find_root(), 'tools', 'read-dependencies')] - (stdout, _stderr) = util.subp(cmd) - pypi_pkgs = [p.lower().strip() for p in stdout.splitlines()] + reqs = run_helper('read-dependencies').splitlines() + test_reqs = run_helper( + 'read-dependencies', ['test-requirements.txt']).splitlines() - (stdout, _stderr) = util.subp(cmd + ['test-requirements.txt']) - pypi_test_pkgs = [p.lower().strip() for p in stdout.splitlines()] + pypi_pkgs = [p.lower().strip() for p in reqs] + pypi_test_pkgs = [p.lower().strip() for p in test_reqs] # Map to known packages requires = append_requires @@ -109,11 +118,9 @@ def write_debian_folder(root, version, revno, pkgmap, util.abs_join(deb_dir, 'rules'), params={'python': python, 'pyver': pyver}) - # Just copy any other files directly (including .in) - pdeb_d = util.abs_join(find_root(), 'packages', 'debian') - for f in [os.path.join(pdeb_d, f) for f in os.listdir(pdeb_d)]: - if os.path.isfile(f): - shutil.copy(f, util.abs_join(deb_dir, os.path.basename(f))) + +def read_version(): + return json.loads(run_helper('read-version', ['--json'])) def main(): @@ -140,11 +147,10 @@ def main(): default=os.environ.get("INIT_SYSTEM", "upstart,systemd")) - for ent in DEBUILD_ARGS: parser.add_argument(ent, dest="debuild_args", action='append_const', - const=ent, help=("pass through '%s' to debuild" % ent), - default=[]) + const=ent, default=[], + help=("pass through '%s' to debuild" % ent)) parser.add_argument("--sign", default=False, action='store_true', help="sign result. do not pass -us -uc to debuild") @@ -181,54 +187,30 @@ def main(): with util.tempdir() as tdir: # output like 0.7.6-1022-g36e92d3 - cmd = ['git', 'describe', '--long'] - (sysout, _stderr) = util.subp(cmd) - version, extra = sysout.strip().split("-", 1) + ver_data = read_version() # 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 = [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)) - shutil.move(arch_fn, tmp_arch_fn) - - print("Extracting temporary tarball %r" % (tmp_arch_fn)) - cmd = ['tar', '-xvzf', tmp_arch_fn, '-C', tdir] + tarball = "cloud-init_%s.orig.tar.gz" % ver_data['version_long'] + tarball_fp = util.abs_join(tdir, tarball) + run_helper('make-tarball', ['--long', '--output=' + tarball_fp]) + + print("Extracting temporary tarball %r" % (tarball)) + cmd = ['tar', '-xvzf', tarball_fp, '-C', tdir] util.subp(cmd, capture=capture) - 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) + xdir = util.abs_join(tdir, "cloud-init-%s" % ver_data['version_long']) print("Creating a debian/ folder in %r" % (xdir)) if args.cloud_utils: - append_requires=['cloud-utils | cloud-guest-utils'] + append_requires = ['cloud-utils | cloud-guest-utils'] else: - append_requires=[] - write_debian_folder(xdir, version, extra, pkgmap, + append_requires = [] + write_debian_folder(xdir, ver_data, pkgmap, pyver=pyver, append_requires=append_requires) - # The naming here seems to follow some debian standard - # so it will whine if it is changed... - tar_fn = "cloud-init_%s+%s~bddeb.orig.tar.gz" % (version, extra) - 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) - - # 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 %s' in %r" % (' '.join(args.debuild_args), xdir)) with util.chdir(xdir): diff --git a/packages/brpm b/packages/brpm index 5d16eb71..14d75f2b 100755 --- a/packages/brpm +++ b/packages/brpm @@ -2,11 +2,11 @@ import argparse import glob +import json import os import shutil import sys import tempfile -import time def find_root(): @@ -21,11 +21,11 @@ def find_root(): " set CLOUD_INIT_TOP_D?")) -# Use the util functions from cloudinit -sys.path.insert(0, find_root()) - -from cloudinit import templater -from cloudinit import util +if "avoid-pep8-E402-import-not-top-of-file": + # Use the util functions from cloudinit + sys.path.insert(0, find_root()) + from cloudinit import templater + from cloudinit import util # Map python requirements to package names. If a match isn't found # here, we assume 'python-'. @@ -43,15 +43,24 @@ PACKAGE_MAP = { RPM_BUILD_SUBDIRS = ['BUILD', 'RPMS', 'SOURCES', 'SPECS', 'SRPMS'] +def run_helper(helper, args=None, strip=True): + if args is None: + args = [] + cmd = [util.abs_join(find_root(), 'tools', helper)] + args + (stdout, _stderr) = util.subp(cmd) + if strip: + stdout = stdout.strip() + return stdout + + def read_dependencies(): '''Returns the Python depedencies from requirements.txt. This explicitly removes 'argparse' from the list of requirements for python >= 2.7, because with 2.7 argparse became part of the standard library.''' - cmd = [util.abs_join(find_root(), 'tools', 'read-dependencies')] - (stdout, _stderr) = util.subp(cmd) + stdout = run_helper('read-dependencies') return [p.lower().strip() for p in stdout.splitlines() - if p != 'argparse' or (p == 'argparse' - and sys.version_info[0:2] < (2, 7))] + if p != 'argparse' or (p == 'argparse' and + sys.version_info[0:2] < (2, 7))] def translate_dependencies(deps, distro): @@ -64,53 +73,22 @@ def translate_dependencies(deps, distro): def read_version(): - '''Read version information. We parse the version itself from - the changelog, and then ask git for the commit id and distance - from the last tag.''' - # Figure out the version and revno - cmd = [util.abs_join(find_root(), 'tools', 'read-version')] - (stdout, _stderr) = util.subp(cmd) - version = stdout.strip() + return json.loads(run_helper('read-version', ['--json'])) - cmd = ['git', 'describe', '--tags'] - (stdout, _stderr) = util.subp(cmd) - git_version = stdout.strip() - try: - _version, distance, revno = git_version.split('-') - except ValueError: - distance = None - revno = None - - return (version, distance, revno) - - -def generate_spec_contents(args, tmpl_fn, top_dir, arc_fn): - - # This will get us something like ('0.7.6', None, None) for a - # tagged commit, and something like ('0.7.6', '1026', 'gd1d5796') - # for an untagged commited. - version, distance, revno = read_version() +def generate_spec_contents(args, version_data, tmpl_fn, top_dir, arc_fn): # Tmpl params subs = {} - subs['version'] = version - subs['revno'] = revno - subs['distance'] = distance - - if distance is not None: - now = time.strftime('%Y%m%d', time.localtime()) - release = '.%sgit%s' % (now, revno) - else: - release = '' if args.sub_release is not None: - subs['subrelease'] = release + "." + str(args.sub_release) + subs['subrelease'] = str(args.sub_release) else: - subs['subrelease'] = release + subs['subrelease'] = "" subs['archive_name'] = arc_fn subs['source_name'] = os.path.basename(arc_fn).replace('.tar.gz', '') + subs.update(version_data) # Map to known packages python_deps = read_dependencies() @@ -176,20 +154,19 @@ def main(): for dir in RPM_BUILD_SUBDIRS] util.ensure_dirs(build_dirs) + version_data = read_version() + # Archive the code - cmd = [util.abs_join(find_root(), 'tools', 'make-tarball')] - (stdout, _stderr) = util.subp(cmd) - archive_fn = stdout.strip() - print "Archived source as %s" % archive_fn - real_archive_fn = os.path.join(topdir, 'SOURCES', - os.path.basename(archive_fn)) - shutil.move(archive_fn, real_archive_fn) + archive_fn = "cloud-init-%s.tar.gz" % version_data['version_long'] + real_archive_fn = os.path.join(topdir, 'SOURCES', archive_fn) + archive_fn = run_helper( + 'make-tarball', ['--long', '--output=' + real_archive_fn]) print("Archived the code in %r" % (real_archive_fn)) # Form the spec file to be used tmpl_fn = util.abs_join(find_root(), 'packages', args.distro, 'cloud-init.spec.in') - contents = generate_spec_contents(args, tmpl_fn, topdir, + contents = generate_spec_contents(args, version_data, tmpl_fn, topdir, os.path.basename(archive_fn)) spec_fn = util.abs_join(topdir, 'SPECS', 'cloud-init.spec') util.write_file(spec_fn, contents) diff --git a/packages/debian/changelog.in b/packages/debian/changelog.in index 544d23cf..f8e98258 100644 --- a/packages/debian/changelog.in +++ b/packages/debian/changelog.in @@ -1,5 +1,5 @@ ## template:basic -cloud-init (${version}+${revision}~bddeb-1) UNRELEASED; urgency=low +cloud-init (${version_long}-1~bddeb) UNRELEASED; urgency=low * build diff --git a/packages/debian/source/format b/packages/debian/source/format new file mode 100644 index 00000000..163aaf8d --- /dev/null +++ b/packages/debian/source/format @@ -0,0 +1 @@ +3.0 (quilt) diff --git a/packages/redhat/cloud-init.spec.in b/packages/redhat/cloud-init.spec.in index c30d33ca..2f02f017 100644 --- a/packages/redhat/cloud-init.spec.in +++ b/packages/redhat/cloud-init.spec.in @@ -6,7 +6,7 @@ # Or: http://www.rpm.org/max-rpm/ch-rpm-inside.html Name: cloud-init -Version: ${version} +Version: ${version_long} Release: 1${subrelease}%{?dist} Summary: Cloud instance init scripts diff --git a/tools/make-tarball b/tools/make-tarball index 4828a622..bd7399c1 100755 --- a/tools/make-tarball +++ b/tools/make-tarball @@ -1,16 +1,53 @@ #!/bin/sh set -e +TEMP_D="" +cleanup() { + [ -z "$TEMP_D" ] || rm -Rf "${TEMP_D}" +} +trap cleanup EXIT + +Usage() { + cat <&2; exit 1; } + +long_opt="" +while [ $# -ne 0 ]; do + cur=$1; next=$2 + case "$cur" in + -o|--output) output=$next; shift;; + --long) long_opt="--long";; + --) shift; break;; + esac + shift; +done + rev=${1:-HEAD} -revname=$(git describe $rev) +git_describe=$(git describe ${long_opt} $rev) -# revname could be 0.7.5 or 0.7.5-NNN-gHASH +# git_describe could be 0.7.5 or 0.7.5-NNN-gHASH # turn that into 0.7.5 or 0.7.5+NNN.gHASH -case "$revname" in - *-*) revname=$(echo "$revname" | sed -e 's/-/+/' -e 's/-/./') +case "$git_describe" in + *-*) version=$(echo "$git_describe" | sed -e 's/-/+/' -e 's/-/./');; + *) version=${git_describe};; esac -archive_base="cloud-init-$revname" +archive_base="cloud-init-$version" +if [ -z "$output" ]; then + output="$archive_base.tar.gz" +fi # when building an archiving from HEAD, ensure that there aren't any # uncomitted changes in the working directory (because these would not @@ -25,9 +62,11 @@ if [ "$rev" = HEAD ] && ! git diff-index --quiet HEAD --; then fi fi -git archive \ - --format=tar.gz \ - --prefix="$archive_base/" "$rev" \ - "--output=$archive_base.tar.gz" +git archive --format=tar --prefix="$archive_base/" "$rev" | + ( cd "$TEMP_D" && tar xpf - ) + +sed -i "s,@@EXPORT_VERSION@@,$version," "$archive_base/cloudinit/version.py" + +( cd "$TEMP_D" && tar cpzf - "$archive_base/" ) > "$output" -echo "${archive_base}.tar.gz" +echo "$output" diff --git a/tools/read-version b/tools/read-version index d02651e9..e585ab2e 100755 --- a/tools/read-version +++ b/tools/read-version @@ -1,26 +1,77 @@ #!/usr/bin/env python import os -import re +import json import sys -if 'CLOUD_INIT_TOP_D' in os.environ: - topd = os.path.realpath(os.environ.get('CLOUD_INIT_TOP_D')) -else: - topd = os.path.dirname(os.path.dirname(os.path.realpath(__file__))) +if "avoid-pep8-E402-import-not-top-of-file": + _tdir = os.path.abspath(os.path.join(os.path.dirname(__file__), "..")) + sys.path.insert(0, _tdir) + from cloudinit import version as ci_version + from cloudinit import util + + +use_long = '--long' in sys.argv or os.environ.get('CI_RV_LONG') +use_tags = '--tags' in sys.argv or os.environ.get('CI_RV_TAGS') +output_json = '--json' in sys.argv + +src_version = ci_version.version_string() +version_long = None + +if os.path.isdir(os.path.join(_tdir, ".git")): + def fix_git_version(ver): + ver = ver.strip() + if "-" in ver: + # change X.Y.Z-1023-gHASH to X.Y.Z+1023.ghash + return "{0}+{1}.{2}".format(*ver.split("-")) + return ver + + flags = [] + if use_tags: + flags = ['--tags'] + cmd = ['git', 'describe'] + flags -for fname in ("setup.py", "ChangeLog"): - if not os.path.isfile(os.path.join(topd, fname)): - sys.stderr.write("Unable to locate '%s' file that should " - "exist in cloud-init root directory." % fname) + version = fix_git_version(util.subp(cmd)[0]) + + if not version.startswith(src_version): + sys.stderr.write("git describe version (%s) differs from " + "cloudinit.version (%s)\n" % (version, src_version)) sys.exit(1) -vermatch = re.compile(r"^[0-9]+[.][0-9]+[.][0-9]+:$") + version_long = fix_git_version(util.subp(cmd + ["--long"])[0]) +else: + version = src_version + try: + version_long = ci_version.full_version_string() + except ValueError: + pass + +# version is X.Y.Z[+xxx.gHASH] +# version_long is None or X.Y.Z+xxx.gHASH +release = version.partition("+")[0] +extra = None +commit = None +distance = None -with open(os.path.join(topd, "ChangeLog"), "r") as fp: - for line in fp: - if vermatch.match(line): - sys.stdout.write(line.strip()[:-1] + "\n") - break +if version_long: + info = version_long.partition("+")[2] + extra = "+" + info + distance, commit = info.split(".") + # remove the 'g' from gHASH + commit = commit[1:] + +data = { + 'release': release, + 'version': version, + 'version_long': version_long, + 'extra': extra, + 'commit': commit, + 'distance': distance, +} + +if output_json: + sys.stdout.write(json.dumps(data, indent=1) + "\n") +else: + sys.stdout.write(release + "\n") sys.exit(0) -- cgit v1.2.3 From 42bed116b411eb25ebd8368b2b4ed6c56ffd85e7 Mon Sep 17 00:00:00 2001 From: Scott Moser Date: Fri, 5 Aug 2016 15:51:34 -0400 Subject: drop modification of version during make-tarball, tools changes. Modification of the tarball became problematic, as it meant that any tool extracting source would find the orig source tarball different. I found this unusable when trying to use 'gbp buildpackage'. Other changes here are to better support using python3 or python2 for the build. Makefile will try to call the right python version and can be told which python to use. read-version: by adding 'tiny_p' and avoiding the import of cloudinit.util, we need less dependencies to run this. --- Makefile | 19 +++++++++++-------- cloudinit/version.py | 9 --------- packages/debian/rules.in | 2 +- setup.py | 4 ++-- tools/make-tarball | 8 +------- tools/read-version | 26 +++++++++++++++++++------- 6 files changed, 34 insertions(+), 34 deletions(-) (limited to 'packages') diff --git a/Makefile b/Makefile index 32c50aee..5d35dcc0 100644 --- a/Makefile +++ b/Makefile @@ -1,21 +1,20 @@ CWD=$(shell pwd) -PYVER ?= 3 +PYVER ?= $(shell for p in python3 python2; do \ + out=$(which $$p 2>&1) && echo $$p && exit; done; \ + exit 1) noseopts ?= -v YAML_FILES=$(shell find cloudinit bin tests tools -name "*.yaml" -type f ) YAML_FILES+=$(shell find doc/examples -name "cloud-config*.txt" -type f ) -CHANGELOG_VERSION=$(shell $(CWD)/tools/read-version) -CODE_VERSION=$(shell python -c "from cloudinit import version; print version.version_string()") - PIP_INSTALL := pip install -ifeq ($(PYVER),3) +ifeq ($(PYVER),python3) pyflakes = pyflakes3 unittests = unittest3 yaml = yaml else -ifeq ($(PYVER),2) +ifeq ($(PYVER),python2) pyflakes = pyflakes unittests = unittest else @@ -28,6 +27,10 @@ ifeq ($(distro),) distro = redhat endif +READ_VERSION=$(shell $(PYVER) $(CWD)/tools/read-version) +CODE_VERSION=$(shell $(PYVER) -c "from cloudinit import version; print(version.version_string())") + + all: check check: check_version pep8 $(pyflakes) test $(yaml) @@ -58,8 +61,8 @@ pip-test-requirements: test: $(unittests) check_version: - @if [ "$(CHANGELOG_VERSION)" != "$(CODE_VERSION)" ]; then \ - echo "Error: ChangeLog version $(CHANGELOG_VERSION)" \ + @if [ "$(READ_VERSION)" != "$(CODE_VERSION)" ]; then \ + echo "Error: read-version version $(READ_VERSION)" \ "not equal to code version $(CODE_VERSION)"; exit 2; \ else true; fi diff --git a/cloudinit/version.py b/cloudinit/version.py index 01785eb8..aa8ccd7e 100644 --- a/cloudinit/version.py +++ b/cloudinit/version.py @@ -17,16 +17,7 @@ # along with this program. If not, see . __VERSION__ = "0.7.6" -__EXPORT_VERSION__ = "@@EXPORT_VERSION@@" def version_string(): - if not __EXPORT_VERSION__.startswith("@@"): - return __EXPORT_VERSION__ return __VERSION__ - - -def full_version_string(): - if __EXPORT_VERSION__.startswith("@@"): - raise ValueError("No full version available") - return __EXPORT_VERSION__ diff --git a/packages/debian/rules.in b/packages/debian/rules.in index cf2dd405..9b004357 100755 --- a/packages/debian/rules.in +++ b/packages/debian/rules.in @@ -14,7 +14,7 @@ override_dh_install: override_dh_auto_test: ifeq (,$(findstring nocheck,$(DEB_BUILD_OPTIONS))) - http_proxy= make PYVER=${pyver} check + http_proxy= make PYVER=python${pyver} check else @echo check disabled by DEB_BUILD_OPTIONS=$(DEB_BUILD_OPTIONS) endif diff --git a/setup.py b/setup.py index 0af576a9..4abbb67e 100755 --- a/setup.py +++ b/setup.py @@ -116,13 +116,13 @@ def in_virtualenv(): def get_version(): - cmd = ['tools/read-version'] + cmd = [sys.executable, 'tools/read-version'] (ver, _e) = tiny_p(cmd) return str(ver).strip() def read_requires(): - cmd = ['tools/read-dependencies'] + cmd = [sys.executable, 'tools/read-dependencies'] (deps, _e) = tiny_p(cmd) return str(deps).splitlines() diff --git a/tools/make-tarball b/tools/make-tarball index bd7399c1..57358447 100755 --- a/tools/make-tarball +++ b/tools/make-tarball @@ -62,11 +62,5 @@ if [ "$rev" = HEAD ] && ! git diff-index --quiet HEAD --; then fi fi -git archive --format=tar --prefix="$archive_base/" "$rev" | - ( cd "$TEMP_D" && tar xpf - ) - -sed -i "s,@@EXPORT_VERSION@@,$version," "$archive_base/cloudinit/version.py" - -( cd "$TEMP_D" && tar cpzf - "$archive_base/" ) > "$output" - +git archive --format=tar.gz --prefix="$archive_base/" "$rev" > "$output" echo "$output" diff --git a/tools/read-version b/tools/read-version index e585ab2e..78e34157 100755 --- a/tools/read-version +++ b/tools/read-version @@ -2,13 +2,28 @@ import os import json +import subprocess import sys if "avoid-pep8-E402-import-not-top-of-file": _tdir = os.path.abspath(os.path.join(os.path.dirname(__file__), "..")) sys.path.insert(0, _tdir) from cloudinit import version as ci_version - from cloudinit import util + + +def tiny_p(cmd, capture=True): + # python 2.6 doesn't have check_output + stdout = subprocess.PIPE + stderr = subprocess.PIPE + sp = subprocess.Popen(cmd, stdout=stdout, + stderr=stderr, stdin=None, + universal_newlines=True) + (out, err) = sp.communicate() + ret = sp.returncode + if ret not in [0]: + raise RuntimeError("Failed running %s [rc=%s] (%s, %s)" % + (cmd, ret, out, err)) + return out use_long = '--long' in sys.argv or os.environ.get('CI_RV_LONG') @@ -31,20 +46,17 @@ if os.path.isdir(os.path.join(_tdir, ".git")): flags = ['--tags'] cmd = ['git', 'describe'] + flags - version = fix_git_version(util.subp(cmd)[0]) + version = fix_git_version(tiny_p(cmd)) if not version.startswith(src_version): sys.stderr.write("git describe version (%s) differs from " "cloudinit.version (%s)\n" % (version, src_version)) sys.exit(1) - version_long = fix_git_version(util.subp(cmd + ["--long"])[0]) + version_long = fix_git_version(tiny_p(cmd + ["--long"])) else: version = src_version - try: - version_long = ci_version.full_version_string() - except ValueError: - pass + version_long = None # version is X.Y.Z[+xxx.gHASH] # version_long is None or X.Y.Z+xxx.gHASH -- cgit v1.2.3 From 48ec60ae19c749223cb58dcbdbf0ecb7343f2a31 Mon Sep 17 00:00:00 2001 From: Scott Moser Date: Mon, 8 Aug 2016 13:24:59 -0400 Subject: For upstream snapshot versions do not modify git-describe output. For upstream version directly use the output of git-describe (X.Y.Z-number.gHASH) rather than rather than changing it to (X.Y.Z+number.gHASH). The rpm version does not allow '-' in Version, so we create and use rpm_upstream_version in the rpm spec file. That is of format: X.Y.Z+number.gHASH --- packages/brpm | 9 +++++++++ packages/redhat/cloud-init.spec.in | 2 +- tools/make-tarball | 9 +-------- tools/read-version | 17 +++++------------ 4 files changed, 16 insertions(+), 21 deletions(-) (limited to 'packages') diff --git a/packages/brpm b/packages/brpm index 14d75f2b..89696ab8 100755 --- a/packages/brpm +++ b/packages/brpm @@ -90,6 +90,15 @@ def generate_spec_contents(args, version_data, tmpl_fn, top_dir, arc_fn): subs['source_name'] = os.path.basename(arc_fn).replace('.tar.gz', '') subs.update(version_data) + # rpm does not like '-' in the Version, so change + # X.Y.Z-N-gHASH to X.Y.Z+N.gHASH + if "-" in version_data.get('version'): + ver, commits, ghash = version_data['version'].split("-") + rpm_upstream_version = "%s+%s.%s" % (ver, commits, ghash) + else: + rpm_upstream_version = version_data['version'] + subs['rpm_upstream_version'] = rpm_upstream_version + # Map to known packages python_deps = read_dependencies() package_deps = translate_dependencies(python_deps, args.distro) diff --git a/packages/redhat/cloud-init.spec.in b/packages/redhat/cloud-init.spec.in index 2f02f017..d0ae048f 100644 --- a/packages/redhat/cloud-init.spec.in +++ b/packages/redhat/cloud-init.spec.in @@ -6,7 +6,7 @@ # Or: http://www.rpm.org/max-rpm/ch-rpm-inside.html Name: cloud-init -Version: ${version_long} +Version: ${rpm_upstream_version} Release: 1${subrelease}%{?dist} Summary: Cloud instance init scripts diff --git a/tools/make-tarball b/tools/make-tarball index 57358447..d8705896 100755 --- a/tools/make-tarball +++ b/tools/make-tarball @@ -35,14 +35,7 @@ while [ $# -ne 0 ]; do done rev=${1:-HEAD} -git_describe=$(git describe ${long_opt} $rev) - -# git_describe could be 0.7.5 or 0.7.5-NNN-gHASH -# turn that into 0.7.5 or 0.7.5+NNN.gHASH -case "$git_describe" in - *-*) version=$(echo "$git_describe" | sed -e 's/-/+/' -e 's/-/./');; - *) version=${git_describe};; -esac +version=$(git describe ${long_opt} $rev) archive_base="cloud-init-$version" if [ -z "$output" ]; then diff --git a/tools/read-version b/tools/read-version index 78e34157..85c62343 100755 --- a/tools/read-version +++ b/tools/read-version @@ -34,26 +34,19 @@ src_version = ci_version.version_string() version_long = None if os.path.isdir(os.path.join(_tdir, ".git")): - def fix_git_version(ver): - ver = ver.strip() - if "-" in ver: - # change X.Y.Z-1023-gHASH to X.Y.Z+1023.ghash - return "{0}+{1}.{2}".format(*ver.split("-")) - return ver - flags = [] if use_tags: flags = ['--tags'] cmd = ['git', 'describe'] + flags - version = fix_git_version(tiny_p(cmd)) + version = tiny_p(cmd).strip() if not version.startswith(src_version): sys.stderr.write("git describe version (%s) differs from " "cloudinit.version (%s)\n" % (version, src_version)) sys.exit(1) - version_long = fix_git_version(tiny_p(cmd + ["--long"])) + version_long = tiny_p(cmd + ["--long"]).strip() else: version = src_version version_long = None @@ -66,9 +59,9 @@ commit = None distance = None if version_long: - info = version_long.partition("+")[2] - extra = "+" + info - distance, commit = info.split(".") + info = version_long.partition("-")[2] + extra = "-" + info + distance, commit = info.split("-") # remove the 'g' from gHASH commit = commit[1:] -- cgit v1.2.3 From 2ddaa93b870bb0953a5a23b0eab155b21dd05a0f Mon Sep 17 00:00:00 2001 From: Scott Moser Date: Wed, 31 Aug 2016 17:10:29 -0400 Subject: bddeb: add --release flag to specify the release in changelog. ./packages/bddeb --release=xenial that will get you a changelog with Distribution of xenial rather than UNRELEASED. --- packages/bddeb | 13 ++++++++++--- packages/debian/changelog.in | 2 +- 2 files changed, 11 insertions(+), 4 deletions(-) (limited to 'packages') diff --git a/packages/bddeb b/packages/bddeb index 94496c74..abb7b607 100755 --- a/packages/bddeb +++ b/packages/bddeb @@ -67,7 +67,7 @@ def run_helper(helper, args=None, strip=True): return stdout -def write_debian_folder(root, version_data, pkgmap, pyver="3", +def write_debian_folder(root, templ_data, pkgmap, pyver="3", append_requires=[]): deb_dir = util.abs_join(root, 'debian') @@ -79,7 +79,7 @@ def write_debian_folder(root, version_data, pkgmap, pyver="3", templater.render_to_file(util.abs_join(find_root(), 'packages', 'debian', 'changelog.in'), util.abs_join(deb_dir, 'changelog'), - params=version_data) + params=templ_data) # Write out the control file template reqs = run_helper('read-dependencies').splitlines() @@ -147,6 +147,10 @@ def main(): default=os.environ.get("INIT_SYSTEM", "upstart,systemd")) + parser.add_argument("--release", dest="release", + help=("build with changelog referencing RELEASE"), + default="UNRELEASED") + for ent in DEBUILD_ARGS: parser.add_argument(ent, dest="debuild_args", action='append_const', const=ent, default=[], @@ -184,6 +188,7 @@ def main(): pkgmap[p] = "python3-" + p pyver = "3" + templ_data = {'debian_release': args.release} with util.tempdir() as tdir: # output like 0.7.6-1022-g36e92d3 @@ -208,7 +213,9 @@ def main(): append_requires = ['cloud-utils | cloud-guest-utils'] else: append_requires = [] - write_debian_folder(xdir, ver_data, pkgmap, + + templ_data.update(ver_data) + write_debian_folder(xdir, templ_data, pkgmap, pyver=pyver, append_requires=append_requires) print("Running 'debuild %s' in %r" % (' '.join(args.debuild_args), diff --git a/packages/debian/changelog.in b/packages/debian/changelog.in index f8e98258..bdf8d56f 100644 --- a/packages/debian/changelog.in +++ b/packages/debian/changelog.in @@ -1,5 +1,5 @@ ## template:basic -cloud-init (${version_long}-1~bddeb) UNRELEASED; urgency=low +cloud-init (${version_long}-1~bddeb) ${debian_release}; urgency=low * build -- cgit v1.2.3