Add post-tag versioning.

Change-Id: Ic6cff31681b77e865ea0f1715e882cf7f191f7cd
This commit is contained in:
Monty Taylor 2012-06-25 11:21:33 -05:00
parent a7147ce934
commit 3e9c523741
4 changed files with 111 additions and 23 deletions

1
.gitignore vendored
View File

@ -10,3 +10,4 @@ AUTHORS
build build
dist dist
python_keystoneclient.egg-info python_keystoneclient.egg-info
keystoneclient/versioninfo

View File

@ -1,6 +1,8 @@
include README.rst include README.rst
include AUTHORS HACKING LICENSE include AUTHORS HACKING LICENSE
include run_tests.sh tox.ini include run_tests.sh tox.ini
include python-keystoneclient
include keystoneclient/versioninfo
recursive-include doc * recursive-include doc *
recursive-include tests * recursive-include tests *
recursive-include tools * recursive-include tools *

View File

@ -19,6 +19,7 @@
Utilities with minimum-depends for use in setup.py Utilities with minimum-depends for use in setup.py
""" """
import datetime
import os import os
import re import re
import subprocess import subprocess
@ -34,8 +35,7 @@ def parse_mailmap(mailmap='.mailmap'):
for l in fp: for l in fp:
l = l.strip() l = l.strip()
if not l.startswith('#') and ' ' in l: if not l.startswith('#') and ' ' in l:
canonical_email, alias = [x for x in l.split(' ') canonical_email, alias = l.split(' ')
if x.startswith('<')]
mapping[alias] = canonical_email mapping[alias] = canonical_email
return mapping return mapping
@ -118,28 +118,54 @@ def write_requirements():
def _run_shell_command(cmd): def _run_shell_command(cmd):
output = subprocess.Popen(["/bin/sh", "-c", cmd], output = subprocess.Popen(["/bin/sh", "-c", cmd],
stdout=subprocess.PIPE) stdout=subprocess.PIPE)
return output.communicate()[0].strip() out = output.communicate()
if len(out) == 0:
return None
if len(out[0].strip()) == 0:
return None
return out[0].strip()
def write_vcsversion(location): def _get_git_next_version_suffix(branch_name):
"""Produce a vcsversion dict that mimics the old one produced by bzr. datestamp = datetime.datetime.now().strftime('%Y%m%d')
""" if branch_name == 'milestone-proposed':
if os.path.isdir('.git'): revno_prefix = "r"
branch_nick_cmd = 'git branch | grep -Ei "\* (.*)" | cut -f2 -d" "' else:
branch_nick = _run_shell_command(branch_nick_cmd) revno_prefix = ""
revid_cmd = "git rev-parse HEAD" _run_shell_command("git fetch origin +refs/meta/*:refs/remotes/meta/*")
revid = _run_shell_command(revid_cmd).split()[0] milestone_cmd = "git show meta/openstack/release:%s" % branch_name
revno_cmd = "git log --oneline | wc -l" milestonever = _run_shell_command(milestone_cmd)
revno = _run_shell_command(revno_cmd) if not milestonever:
with open(location, 'w') as version_file: milestonever = ""
version_file.write(""" post_version = _get_git_post_version()
# This file is automatically generated by setup.py, So don't edit it. :) revno = post_version.split(".")[-1]
version_info = { return "%s~%s.%s%s" % (milestonever, datestamp, revno_prefix, revno)
'branch_nick': '%s',
'revision_id': '%s',
'revno': %s def _get_git_current_tag():
} return _run_shell_command("git tag --contains HEAD")
""" % (branch_nick, revid, revno))
def _get_git_tag_info():
return _run_shell_command("git describe --tags")
def _get_git_post_version():
current_tag = _get_git_current_tag()
if current_tag is not None:
return current_tag
else:
tag_info = _get_git_tag_info()
if tag_info is None:
base_version = "0.0"
cmd = "git --no-pager log --oneline"
out = _run_shell_command(cmd)
revno = len(out.split("\n"))
else:
tag_infos = tag_info.split("-")
base_version = "-".join(tag_infos[:-2])
revno = tag_infos[-2]
return "%s.%s" % (base_version, revno)
def write_git_changelog(): def write_git_changelog():
@ -179,6 +205,25 @@ _rst_template = """%(heading)s
""" """
def read_versioninfo(project):
"""Read the versioninfo file. If it doesn't exist, we're in a github
zipball, and there's really know way to know what version we really
are, but that should be ok, because the utility of that should be
just about nil if this code path is in use in the first place."""
versioninfo_path = os.path.join(project, 'versioninfo')
if os.path.exists(versioninfo_path):
with open(versioninfo_path, 'r') as vinfo:
version = vinfo.read().strip()
else:
version = "0.0.0"
return version
def write_versioninfo(project, version):
"""Write a simple file containing the version of the package."""
open(os.path.join(project, 'versioninfo'), 'w').write("%s\n" % version)
def get_cmdclass(): def get_cmdclass():
"""Return dict of commands to run from setup.py.""" """Return dict of commands to run from setup.py."""
@ -255,3 +300,43 @@ def get_cmdclass():
pass pass
return cmdclass return cmdclass
def get_git_branchname():
for branch in _run_shell_command("git branch --color=never").split("\n"):
if branch.startswith('*'):
_branch_name = branch.split()[1].strip()
if _branch_name == "(no":
_branch_name = "no-branch"
return _branch_name
def get_pre_version(projectname, base_version):
"""Return a version which is based"""
if os.path.isdir('.git'):
current_tag = _get_git_current_tag()
if current_tag is not None:
version = current_tag
else:
branch_name = os.getenv('BRANCHNAME',
os.getenv('GERRIT_REFNAME',
get_git_branchname()))
version_suffix = _get_git_next_version_suffix(branch_name)
version = "%s~%s" % (base_version, version_suffix)
write_versioninfo(projectname, version)
return version.split('~')[0]
else:
version = read_versioninfo(projectname)
return version.split('~')[0]
def get_post_version(projectname):
"""Return a version which is equal to the tag that's on the current
revision if there is one, or tag plus number of additional revisions
if the current revision has no tag."""
if os.path.isdir('.git'):
version = _get_git_post_version()
write_versioninfo(projectname, version)
return version
return read_versioninfo(projectname)

View File

@ -14,7 +14,7 @@ tests_require = setup.parse_requirements(['tools/test-requires'])
setuptools.setup( setuptools.setup(
name="python-keystoneclient", name="python-keystoneclient",
version="2012.2", version=setup.get_post_version('keystoneclient'),
description="Client library for OpenStack Keystone API", description="Client library for OpenStack Keystone API",
long_description=read('README.rst'), long_description=read('README.rst'),
url='https://github.com/openstack/python-keystoneclient', url='https://github.com/openstack/python-keystoneclient',