Update to latest oslo-version.
Remove the need for versioninfo file and just use python's PKG-INFO. Change-Id: I4765141e9bf3fa075dfbbc6a07e495c29e12177b
This commit is contained in:
		@@ -1,5 +1,4 @@
 | 
				
			|||||||
include AUTHORS
 | 
					include AUTHORS
 | 
				
			||||||
include ChangeLog
 | 
					include ChangeLog
 | 
				
			||||||
include glanceclient/versioninfo
 | 
					 | 
				
			||||||
exclude .gitignore
 | 
					exclude .gitignore
 | 
				
			||||||
exclude .gitreview
 | 
					exclude .gitreview
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -23,23 +23,6 @@ except ImportError:
 | 
				
			|||||||
    import warnings
 | 
					    import warnings
 | 
				
			||||||
    warnings.warn("Could not import glanceclient.client", ImportWarning)
 | 
					    warnings.warn("Could not import glanceclient.client", ImportWarning)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import os
 | 
					from glanceclient.openstack.common import version as common_version
 | 
				
			||||||
import inspect
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					__version__ = common_version.VersionInfo('python-glanceclient')
 | 
				
			||||||
def _get_client_version():
 | 
					 | 
				
			||||||
    """Read version from versioninfo file."""
 | 
					 | 
				
			||||||
    mod_abspath = inspect.getabsfile(inspect.currentframe())
 | 
					 | 
				
			||||||
    client_path = os.path.dirname(mod_abspath)
 | 
					 | 
				
			||||||
    version_path = os.path.join(client_path, 'versioninfo')
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    if os.path.exists(version_path):
 | 
					 | 
				
			||||||
        version = open(version_path).read().strip()
 | 
					 | 
				
			||||||
    else:
 | 
					 | 
				
			||||||
        version = "Unknown, couldn't find versioninfo file at %s"\
 | 
					 | 
				
			||||||
                  % version_path
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    return version
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
__version__ = _get_client_version()
 | 
					 | 
				
			||||||
 
 | 
				
			|||||||
@@ -29,7 +29,7 @@ def import_class(import_str):
 | 
				
			|||||||
    try:
 | 
					    try:
 | 
				
			||||||
        __import__(mod_str)
 | 
					        __import__(mod_str)
 | 
				
			||||||
        return getattr(sys.modules[mod_str], class_str)
 | 
					        return getattr(sys.modules[mod_str], class_str)
 | 
				
			||||||
    except (ValueError, AttributeError), exc:
 | 
					    except (ValueError, AttributeError):
 | 
				
			||||||
        raise ImportError('Class %s cannot be found (%s)' %
 | 
					        raise ImportError('Class %s cannot be found (%s)' %
 | 
				
			||||||
                          (class_str,
 | 
					                          (class_str,
 | 
				
			||||||
                           traceback.format_exception(*sys.exc_info())))
 | 
					                           traceback.format_exception(*sys.exc_info())))
 | 
				
			||||||
@@ -57,3 +57,11 @@ def import_module(import_str):
 | 
				
			|||||||
    """Import a module."""
 | 
					    """Import a module."""
 | 
				
			||||||
    __import__(import_str)
 | 
					    __import__(import_str)
 | 
				
			||||||
    return sys.modules[import_str]
 | 
					    return sys.modules[import_str]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					def try_import(import_str, default=None):
 | 
				
			||||||
 | 
					    """Try to import a module and if it fails return default."""
 | 
				
			||||||
 | 
					    try:
 | 
				
			||||||
 | 
					        return import_module(import_str)
 | 
				
			||||||
 | 
					    except ImportError:
 | 
				
			||||||
 | 
					        return default
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,6 +1,7 @@
 | 
				
			|||||||
# vim: tabstop=4 shiftwidth=4 softtabstop=4
 | 
					# vim: tabstop=4 shiftwidth=4 softtabstop=4
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# Copyright 2011 OpenStack LLC.
 | 
					# Copyright 2011 OpenStack LLC.
 | 
				
			||||||
 | 
					# Copyright 2012-2013 Hewlett-Packard Development Company, L.P.
 | 
				
			||||||
# All Rights Reserved.
 | 
					# All Rights Reserved.
 | 
				
			||||||
#
 | 
					#
 | 
				
			||||||
#    Licensed under the Apache License, Version 2.0 (the "License"); you may
 | 
					#    Licensed under the Apache License, Version 2.0 (the "License"); you may
 | 
				
			||||||
@@ -19,7 +20,7 @@
 | 
				
			|||||||
Utilities with minimum-depends for use in setup.py
 | 
					Utilities with minimum-depends for use in setup.py
 | 
				
			||||||
"""
 | 
					"""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import datetime
 | 
					import email
 | 
				
			||||||
import os
 | 
					import os
 | 
				
			||||||
import re
 | 
					import re
 | 
				
			||||||
import subprocess
 | 
					import subprocess
 | 
				
			||||||
@@ -33,11 +34,12 @@ def parse_mailmap(mailmap='.mailmap'):
 | 
				
			|||||||
    if os.path.exists(mailmap):
 | 
					    if os.path.exists(mailmap):
 | 
				
			||||||
        with open(mailmap, 'r') as fp:
 | 
					        with open(mailmap, 'r') as fp:
 | 
				
			||||||
            for l in fp:
 | 
					            for l in fp:
 | 
				
			||||||
                l = l.strip()
 | 
					                try:
 | 
				
			||||||
                if not l.startswith('#') and ' ' in l:
 | 
					                    canonical_email, alias = re.match(
 | 
				
			||||||
                    canonical_email, alias = [x for x in l.split(' ')
 | 
					                        r'[^#]*?(<.+>).*(<.+>).*', l).groups()
 | 
				
			||||||
                                              if x.startswith('<')]
 | 
					                except AttributeError:
 | 
				
			||||||
                    mapping[alias] = canonical_email
 | 
					                    continue
 | 
				
			||||||
 | 
					                mapping[alias] = canonical_email
 | 
				
			||||||
    return mapping
 | 
					    return mapping
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -45,8 +47,8 @@ def canonicalize_emails(changelog, mapping):
 | 
				
			|||||||
    """Takes in a string and an email alias mapping and replaces all
 | 
					    """Takes in a string and an email alias mapping and replaces all
 | 
				
			||||||
       instances of the aliases in the string with their real email.
 | 
					       instances of the aliases in the string with their real email.
 | 
				
			||||||
    """
 | 
					    """
 | 
				
			||||||
    for alias, email in mapping.iteritems():
 | 
					    for alias, email_address in mapping.iteritems():
 | 
				
			||||||
        changelog = changelog.replace(alias, email)
 | 
					        changelog = changelog.replace(alias, email_address)
 | 
				
			||||||
    return changelog
 | 
					    return changelog
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -106,23 +108,17 @@ def parse_dependency_links(requirements_files=['requirements.txt',
 | 
				
			|||||||
    return dependency_links
 | 
					    return dependency_links
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
def write_requirements():
 | 
					def _run_shell_command(cmd, throw_on_error=False):
 | 
				
			||||||
    venv = os.environ.get('VIRTUAL_ENV', None)
 | 
					 | 
				
			||||||
    if venv is not None:
 | 
					 | 
				
			||||||
        with open("requirements.txt", "w") as req_file:
 | 
					 | 
				
			||||||
            output = subprocess.Popen(["pip", "-E", venv, "freeze", "-l"],
 | 
					 | 
				
			||||||
                                      stdout=subprocess.PIPE)
 | 
					 | 
				
			||||||
            requirements = output.communicate()[0].strip()
 | 
					 | 
				
			||||||
            req_file.write(requirements)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
def _run_shell_command(cmd):
 | 
					 | 
				
			||||||
    if os.name == 'nt':
 | 
					    if os.name == 'nt':
 | 
				
			||||||
        output = subprocess.Popen(["cmd.exe", "/C", cmd],
 | 
					        output = subprocess.Popen(["cmd.exe", "/C", cmd],
 | 
				
			||||||
                                  stdout=subprocess.PIPE)
 | 
					                                  stdout=subprocess.PIPE,
 | 
				
			||||||
 | 
					                                  stderr=subprocess.PIPE)
 | 
				
			||||||
    else:
 | 
					    else:
 | 
				
			||||||
        output = subprocess.Popen(["/bin/sh", "-c", cmd],
 | 
					        output = subprocess.Popen(["/bin/sh", "-c", cmd],
 | 
				
			||||||
                                  stdout=subprocess.PIPE)
 | 
					                                  stdout=subprocess.PIPE,
 | 
				
			||||||
 | 
					                                  stderr=subprocess.PIPE)
 | 
				
			||||||
 | 
					    if output.returncode and throw_on_error:
 | 
				
			||||||
 | 
					        raise Exception("%s returned %d" % cmd, output.returncode)
 | 
				
			||||||
    out = output.communicate()
 | 
					    out = output.communicate()
 | 
				
			||||||
    if len(out) == 0:
 | 
					    if len(out) == 0:
 | 
				
			||||||
        return None
 | 
					        return None
 | 
				
			||||||
@@ -131,57 +127,6 @@ def _run_shell_command(cmd):
 | 
				
			|||||||
    return out[0].strip()
 | 
					    return out[0].strip()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
def _get_git_next_version_suffix(branch_name):
 | 
					 | 
				
			||||||
    datestamp = datetime.datetime.now().strftime('%Y%m%d')
 | 
					 | 
				
			||||||
    if branch_name == 'milestone-proposed':
 | 
					 | 
				
			||||||
        revno_prefix = "r"
 | 
					 | 
				
			||||||
    else:
 | 
					 | 
				
			||||||
        revno_prefix = ""
 | 
					 | 
				
			||||||
    _run_shell_command("git fetch origin +refs/meta/*:refs/remotes/meta/*")
 | 
					 | 
				
			||||||
    milestone_cmd = "git show meta/openstack/release:%s" % branch_name
 | 
					 | 
				
			||||||
    milestonever = _run_shell_command(milestone_cmd)
 | 
					 | 
				
			||||||
    if milestonever:
 | 
					 | 
				
			||||||
        first_half = "%s~%s" % (milestonever, datestamp)
 | 
					 | 
				
			||||||
    else:
 | 
					 | 
				
			||||||
        first_half = datestamp
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    post_version = _get_git_post_version()
 | 
					 | 
				
			||||||
    # post version should look like:
 | 
					 | 
				
			||||||
    # 0.1.1.4.gcc9e28a
 | 
					 | 
				
			||||||
    # where the bit after the last . is the short sha, and the bit between
 | 
					 | 
				
			||||||
    # the last and second to last is the revno count
 | 
					 | 
				
			||||||
    (revno, sha) = post_version.split(".")[-2:]
 | 
					 | 
				
			||||||
    second_half = "%s%s.%s" % (revno_prefix, revno, sha)
 | 
					 | 
				
			||||||
    return ".".join((first_half, second_half))
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
def _get_git_current_tag():
 | 
					 | 
				
			||||||
    return _run_shell_command("git tag --contains HEAD")
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
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"))
 | 
					 | 
				
			||||||
            sha = _run_shell_command("git describe --always")
 | 
					 | 
				
			||||||
        else:
 | 
					 | 
				
			||||||
            tag_infos = tag_info.split("-")
 | 
					 | 
				
			||||||
            base_version = "-".join(tag_infos[:-2])
 | 
					 | 
				
			||||||
            (revno, sha) = tag_infos[-2:]
 | 
					 | 
				
			||||||
        return "%s.%s.%s" % (base_version, revno, sha)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
def write_git_changelog():
 | 
					def write_git_changelog():
 | 
				
			||||||
    """Write a changelog based on the git changelog."""
 | 
					    """Write a changelog based on the git changelog."""
 | 
				
			||||||
    new_changelog = 'ChangeLog'
 | 
					    new_changelog = 'ChangeLog'
 | 
				
			||||||
@@ -227,26 +172,6 @@ _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 no 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."""
 | 
					 | 
				
			||||||
    with open(os.path.join(project, 'versioninfo'), 'w') as fil:
 | 
					 | 
				
			||||||
        fil.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."""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -276,6 +201,9 @@ def get_cmdclass():
 | 
				
			|||||||
        from sphinx.setup_command import BuildDoc
 | 
					        from sphinx.setup_command import BuildDoc
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        class LocalBuildDoc(BuildDoc):
 | 
					        class LocalBuildDoc(BuildDoc):
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            builders = ['html', 'man']
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            def generate_autoindex(self):
 | 
					            def generate_autoindex(self):
 | 
				
			||||||
                print "**Autodocumenting from %s" % os.path.abspath(os.curdir)
 | 
					                print "**Autodocumenting from %s" % os.path.abspath(os.curdir)
 | 
				
			||||||
                modules = {}
 | 
					                modules = {}
 | 
				
			||||||
@@ -311,56 +239,97 @@ def get_cmdclass():
 | 
				
			|||||||
                if not os.getenv('SPHINX_DEBUG'):
 | 
					                if not os.getenv('SPHINX_DEBUG'):
 | 
				
			||||||
                    self.generate_autoindex()
 | 
					                    self.generate_autoindex()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                for builder in ['html', 'man']:
 | 
					                for builder in self.builders:
 | 
				
			||||||
                    self.builder = builder
 | 
					                    self.builder = builder
 | 
				
			||||||
                    self.finalize_options()
 | 
					                    self.finalize_options()
 | 
				
			||||||
                    self.project = self.distribution.get_name()
 | 
					                    self.project = self.distribution.get_name()
 | 
				
			||||||
                    self.version = self.distribution.get_version()
 | 
					                    self.version = self.distribution.get_version()
 | 
				
			||||||
                    self.release = self.distribution.get_version()
 | 
					                    self.release = self.distribution.get_version()
 | 
				
			||||||
                    BuildDoc.run(self)
 | 
					                    BuildDoc.run(self)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        class LocalBuildLatex(LocalBuildDoc):
 | 
				
			||||||
 | 
					            builders = ['latex']
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        cmdclass['build_sphinx'] = LocalBuildDoc
 | 
					        cmdclass['build_sphinx'] = LocalBuildDoc
 | 
				
			||||||
 | 
					        cmdclass['build_sphinx_latex'] = LocalBuildLatex
 | 
				
			||||||
    except ImportError:
 | 
					    except ImportError:
 | 
				
			||||||
        pass
 | 
					        pass
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    return cmdclass
 | 
					    return cmdclass
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
def get_git_branchname():
 | 
					def _get_revno():
 | 
				
			||||||
    for branch in _run_shell_command("git branch --color=never").split("\n"):
 | 
					    """Return the number of commits since the most recent tag.
 | 
				
			||||||
        if branch.startswith('*'):
 | 
					
 | 
				
			||||||
            _branch_name = branch.split()[1].strip()
 | 
					    We use git-describe to find this out, but if there are no
 | 
				
			||||||
    if _branch_name == "(no":
 | 
					    tags then we fall back to counting commits since the beginning
 | 
				
			||||||
        _branch_name = "no-branch"
 | 
					    of time.
 | 
				
			||||||
    return _branch_name
 | 
					    """
 | 
				
			||||||
 | 
					    describe = _run_shell_command("git describe --always")
 | 
				
			||||||
 | 
					    if "-" in describe:
 | 
				
			||||||
 | 
					        return describe.rsplit("-", 2)[-2]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    # no tags found
 | 
				
			||||||
 | 
					    revlist = _run_shell_command("git rev-list --abbrev-commit HEAD")
 | 
				
			||||||
 | 
					    return len(revlist.splitlines())
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
def get_pre_version(projectname, base_version):
 | 
					def get_version_from_git(pre_version):
 | 
				
			||||||
    """Return a version which is leading up to a version that will
 | 
					 | 
				
			||||||
       be released in the future."""
 | 
					 | 
				
			||||||
    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
 | 
					 | 
				
			||||||
    else:
 | 
					 | 
				
			||||||
        version = read_versioninfo(projectname)
 | 
					 | 
				
			||||||
    return version
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
def get_post_version(projectname):
 | 
					 | 
				
			||||||
    """Return a version which is equal to the tag that's on the current
 | 
					    """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
 | 
					    revision if there is one, or tag plus number of additional revisions
 | 
				
			||||||
    if the current revision has no tag."""
 | 
					    if the current revision has no tag."""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if os.path.isdir('.git'):
 | 
					    if os.path.isdir('.git'):
 | 
				
			||||||
        version = _get_git_post_version()
 | 
					        if pre_version:
 | 
				
			||||||
        write_versioninfo(projectname, version)
 | 
					            try:
 | 
				
			||||||
 | 
					                return _run_shell_command(
 | 
				
			||||||
 | 
					                    "git describe --exact-match",
 | 
				
			||||||
 | 
					                    throw_on_error=True).replace('-', '.')
 | 
				
			||||||
 | 
					            except Exception:
 | 
				
			||||||
 | 
					                sha = _run_shell_command("git log -n1 --pretty=format:%h")
 | 
				
			||||||
 | 
					                return "%s.a%s.g%s" % (pre_version, _get_revno(), sha)
 | 
				
			||||||
 | 
					        else:
 | 
				
			||||||
 | 
					            return _run_shell_command(
 | 
				
			||||||
 | 
					                "git describe --always").replace('-', '.')
 | 
				
			||||||
 | 
					    return None
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					def get_version_from_pkg_info(package_name):
 | 
				
			||||||
 | 
					    """Get the version from PKG-INFO file if we can."""
 | 
				
			||||||
 | 
					    try:
 | 
				
			||||||
 | 
					        pkg_info_file = open('PKG-INFO', 'r')
 | 
				
			||||||
 | 
					    except (IOError, OSError):
 | 
				
			||||||
 | 
					        return None
 | 
				
			||||||
 | 
					    try:
 | 
				
			||||||
 | 
					        pkg_info = email.message_from_file(pkg_info_file)
 | 
				
			||||||
 | 
					    except email.MessageError:
 | 
				
			||||||
 | 
					        return None
 | 
				
			||||||
 | 
					    # Check to make sure we're in our own dir
 | 
				
			||||||
 | 
					    if pkg_info.get('Name', None) != package_name:
 | 
				
			||||||
 | 
					        return None
 | 
				
			||||||
 | 
					    return pkg_info.get('Version', None)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					def get_version(package_name, pre_version=None):
 | 
				
			||||||
 | 
					    """Get the version of the project. First, try getting it from PKG-INFO, if
 | 
				
			||||||
 | 
					    it exists. If it does, that means we're in a distribution tarball or that
 | 
				
			||||||
 | 
					    install has happened. Otherwise, if there is no PKG-INFO file, pull the
 | 
				
			||||||
 | 
					    version from git.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    We do not support setup.py version sanity in git archive tarballs, nor do
 | 
				
			||||||
 | 
					    we support packagers directly sucking our git repo into theirs. We expect
 | 
				
			||||||
 | 
					    that a source tarball be made from our git repo - or that if someone wants
 | 
				
			||||||
 | 
					    to make a source tarball from a fork of our repo with additional tags in it
 | 
				
			||||||
 | 
					    that they understand and desire the results of doing that.
 | 
				
			||||||
 | 
					    """
 | 
				
			||||||
 | 
					    version = os.environ.get("OSLO_PACKAGE_VERSION", None)
 | 
				
			||||||
 | 
					    if version:
 | 
				
			||||||
        return version
 | 
					        return version
 | 
				
			||||||
    return read_versioninfo(projectname)
 | 
					    version = get_version_from_pkg_info(package_name)
 | 
				
			||||||
 | 
					    if version:
 | 
				
			||||||
 | 
					        return version
 | 
				
			||||||
 | 
					    version = get_version_from_git(pre_version)
 | 
				
			||||||
 | 
					    if version:
 | 
				
			||||||
 | 
					        return version
 | 
				
			||||||
 | 
					    raise Exception("Versioning for this project requires either an sdist"
 | 
				
			||||||
 | 
					                    " tarball, or access to an upstream git repository.")
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,6 +1,6 @@
 | 
				
			|||||||
# vim: tabstop=4 shiftwidth=4 softtabstop=4
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
#    Copyright 2012 OpenStack LLC
 | 
					#    Copyright 2012 OpenStack LLC
 | 
				
			||||||
 | 
					#    Copyright 2012-2013 Hewlett-Packard Development Company, L.P.
 | 
				
			||||||
#
 | 
					#
 | 
				
			||||||
#    Licensed under the Apache License, Version 2.0 (the "License"); you may
 | 
					#    Licensed under the Apache License, Version 2.0 (the "License"); you may
 | 
				
			||||||
#    not use this file except in compliance with the License. You may obtain
 | 
					#    not use this file except in compliance with the License. You may obtain
 | 
				
			||||||
@@ -15,134 +15,80 @@
 | 
				
			|||||||
#    under the License.
 | 
					#    under the License.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
"""
 | 
					"""
 | 
				
			||||||
Utilities for consuming the auto-generated versioninfo files.
 | 
					Utilities for consuming the version from pkg_resources.
 | 
				
			||||||
"""
 | 
					"""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import datetime
 | 
					 | 
				
			||||||
import pkg_resources
 | 
					import pkg_resources
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import setup
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
class _deferred_version_string(object):
 | 
					 | 
				
			||||||
    """Internal helper class which provides delayed version calculation."""
 | 
					 | 
				
			||||||
    def __init__(self, version_info, prefix):
 | 
					 | 
				
			||||||
        self.version_info = version_info
 | 
					 | 
				
			||||||
        self.prefix = prefix
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    def __str__(self):
 | 
					 | 
				
			||||||
        return "%s%s" % (self.prefix, self.version_info.version_string())
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    def __repr__(self):
 | 
					 | 
				
			||||||
        return "%s%s" % (self.prefix, self.version_info.version_string())
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
class VersionInfo(object):
 | 
					class VersionInfo(object):
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def __init__(self, package, python_package=None, pre_version=None):
 | 
					    def __init__(self, package):
 | 
				
			||||||
        """Object that understands versioning for a package
 | 
					        """Object that understands versioning for a package
 | 
				
			||||||
        :param package: name of the top level python namespace. For glance,
 | 
					        :param package: name of the python package, such as glance, or
 | 
				
			||||||
                        this would be "glance" for python-glanceclient, it
 | 
					                        python-glanceclient
 | 
				
			||||||
                        would be "glanceclient"
 | 
					 | 
				
			||||||
        :param python_package: optional name of the project name. For
 | 
					 | 
				
			||||||
                               glance this can be left unset. For
 | 
					 | 
				
			||||||
                               python-glanceclient, this would be
 | 
					 | 
				
			||||||
                               "python-glanceclient"
 | 
					 | 
				
			||||||
        :param pre_version: optional version that the project is working to
 | 
					 | 
				
			||||||
        """
 | 
					        """
 | 
				
			||||||
        self.package = package
 | 
					        self.package = package
 | 
				
			||||||
        if python_package is None:
 | 
					        self.release = None
 | 
				
			||||||
            self.python_package = package
 | 
					 | 
				
			||||||
        else:
 | 
					 | 
				
			||||||
            self.python_package = python_package
 | 
					 | 
				
			||||||
        self.pre_version = pre_version
 | 
					 | 
				
			||||||
        self.version = None
 | 
					        self.version = None
 | 
				
			||||||
 | 
					        self._cached_version = None
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def _generate_version(self):
 | 
					    def __str__(self):
 | 
				
			||||||
        """Defer to the openstack.common.setup routines for making a
 | 
					        """Make the VersionInfo object behave like a string."""
 | 
				
			||||||
        version from git."""
 | 
					        return self.version_string
 | 
				
			||||||
        if self.pre_version is None:
 | 
					 | 
				
			||||||
            return setup.get_post_version(self.python_package)
 | 
					 | 
				
			||||||
        else:
 | 
					 | 
				
			||||||
            return setup.get_pre_version(self.python_package, self.pre_version)
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def _newer_version(self, pending_version):
 | 
					    def __repr__(self):
 | 
				
			||||||
        """Check to see if we're working with a stale version or not.
 | 
					        """Include the name."""
 | 
				
			||||||
        We expect a version string that either looks like:
 | 
					        return "VersionInfo(%s:%s)" % (self.package, self.version_string())
 | 
				
			||||||
          2012.2~f3~20120708.10.4426392
 | 
					
 | 
				
			||||||
        which is an unreleased version of a pre-version, or:
 | 
					    def _get_version_from_pkg_resources(self):
 | 
				
			||||||
          0.1.1.4.gcc9e28a
 | 
					        """Get the version of the package from the pkg_resources record
 | 
				
			||||||
        which is an unreleased version of a post-version, or:
 | 
					        associated with the package."""
 | 
				
			||||||
          0.1.1
 | 
					 | 
				
			||||||
        Which is a release and which should match tag.
 | 
					 | 
				
			||||||
        For now, if we have a date-embedded version, check to see if it's
 | 
					 | 
				
			||||||
        old, and if so re-generate. Otherwise, just deal with it.
 | 
					 | 
				
			||||||
        """
 | 
					 | 
				
			||||||
        try:
 | 
					        try:
 | 
				
			||||||
            version_date = int(self.version.split("~")[-1].split('.')[0])
 | 
					            requirement = pkg_resources.Requirement.parse(self.package)
 | 
				
			||||||
            if version_date < int(datetime.date.today().strftime('%Y%m%d')):
 | 
					            provider = pkg_resources.get_provider(requirement)
 | 
				
			||||||
                return self._generate_version()
 | 
					            return provider.version
 | 
				
			||||||
            else:
 | 
					        except pkg_resources.DistributionNotFound:
 | 
				
			||||||
                return pending_version
 | 
					            # The most likely cause for this is running tests in a tree with
 | 
				
			||||||
        except Exception:
 | 
					            # produced from a tarball where the package itself has not been
 | 
				
			||||||
            return pending_version
 | 
					            # installed into anything. Check for a PKG-INFO file.
 | 
				
			||||||
 | 
					            from glanceclient.openstack.common import setup
 | 
				
			||||||
 | 
					            return setup.get_version_from_pkg_info(self.package)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def version_string_with_vcs(self, always=False):
 | 
					    def release_string(self):
 | 
				
			||||||
        """Return the full version of the package including suffixes indicating
 | 
					        """Return the full version of the package including suffixes indicating
 | 
				
			||||||
        VCS status.
 | 
					        VCS status.
 | 
				
			||||||
 | 
					 | 
				
			||||||
        For instance, if we are working towards the 2012.2 release,
 | 
					 | 
				
			||||||
        canonical_version_string should return 2012.2 if this is a final
 | 
					 | 
				
			||||||
        release, or else something like 2012.2~f1~20120705.20 if it's not.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        :param always: if true, skip all version caching
 | 
					 | 
				
			||||||
        """
 | 
					        """
 | 
				
			||||||
        if always:
 | 
					        if self.release is None:
 | 
				
			||||||
            self.version = self._generate_version()
 | 
					            self.release = self._get_version_from_pkg_resources()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        return self.release
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def version_string(self):
 | 
				
			||||||
 | 
					        """Return the short version minus any alpha/beta tags."""
 | 
				
			||||||
        if self.version is None:
 | 
					        if self.version is None:
 | 
				
			||||||
 | 
					            parts = []
 | 
				
			||||||
            requirement = pkg_resources.Requirement.parse(self.python_package)
 | 
					            for part in self.release_string().split('.'):
 | 
				
			||||||
            versioninfo = "%s/versioninfo" % self.package
 | 
					                if part[0].isdigit():
 | 
				
			||||||
            try:
 | 
					                    parts.append(part)
 | 
				
			||||||
                raw_version = pkg_resources.resource_string(requirement,
 | 
					                else:
 | 
				
			||||||
                                                            versioninfo)
 | 
					                    break
 | 
				
			||||||
                self.version = self._newer_version(raw_version.strip())
 | 
					            self.version = ".".join(parts)
 | 
				
			||||||
            except (IOError, pkg_resources.DistributionNotFound):
 | 
					 | 
				
			||||||
                self.version = self._generate_version()
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
        return self.version
 | 
					        return self.version
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def canonical_version_string(self, always=False):
 | 
					    # Compatibility functions
 | 
				
			||||||
        """Return the simple version of the package excluding any suffixes.
 | 
					    canonical_version_string = version_string
 | 
				
			||||||
 | 
					    version_string_with_vcs = release_string
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        For instance, if we are working towards the 2012.2 release,
 | 
					    def cached_version_string(self, prefix=""):
 | 
				
			||||||
        canonical_version_string should return 2012.2 in all cases.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        :param always: if true, skip all version caching
 | 
					 | 
				
			||||||
        """
 | 
					 | 
				
			||||||
        return self.version_string_with_vcs(always).split('~')[0]
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    def version_string(self, always=False):
 | 
					 | 
				
			||||||
        """Return the base version of the package.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        For instance, if we are working towards the 2012.2 release,
 | 
					 | 
				
			||||||
        version_string should return 2012.2 if this is a final release, or
 | 
					 | 
				
			||||||
        2012.2-dev if it is not.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        :param always: if true, skip all version caching
 | 
					 | 
				
			||||||
        """
 | 
					 | 
				
			||||||
        version_parts = self.version_string_with_vcs(always).split('~')
 | 
					 | 
				
			||||||
        if len(version_parts) == 1:
 | 
					 | 
				
			||||||
            return version_parts[0]
 | 
					 | 
				
			||||||
        else:
 | 
					 | 
				
			||||||
            return '%s-dev' % (version_parts[0],)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    def deferred_version_string(self, prefix=""):
 | 
					 | 
				
			||||||
        """Generate an object which will expand in a string context to
 | 
					        """Generate an object which will expand in a string context to
 | 
				
			||||||
        the results of version_string(). We do this so that don't
 | 
					        the results of version_string(). We do this so that don't
 | 
				
			||||||
        call into pkg_resources every time we start up a program when
 | 
					        call into pkg_resources every time we start up a program when
 | 
				
			||||||
        passing version information into the CONF constructor, but
 | 
					        passing version information into the CONF constructor, but
 | 
				
			||||||
        rather only do the calculation when and if a version is requested
 | 
					        rather only do the calculation when and if a version is requested
 | 
				
			||||||
        """
 | 
					        """
 | 
				
			||||||
        return _deferred_version_string(self, prefix)
 | 
					        if not self._cached_version:
 | 
				
			||||||
 | 
					            self._cached_version = "%s%s" % (prefix,
 | 
				
			||||||
 | 
					                                             self.version_string())
 | 
				
			||||||
 | 
					        return self._cached_version
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										6
									
								
								setup.py
									
									
									
									
									
								
							
							
						
						
									
										6
									
								
								setup.py
									
									
									
									
									
								
							@@ -9,6 +9,7 @@ from glanceclient.openstack.common import setup
 | 
				
			|||||||
requires = setup.parse_requirements()
 | 
					requires = setup.parse_requirements()
 | 
				
			||||||
dependency_links = setup.parse_dependency_links()
 | 
					dependency_links = setup.parse_dependency_links()
 | 
				
			||||||
tests_require = setup.parse_requirements(['tools/test-requires'])
 | 
					tests_require = setup.parse_requirements(['tools/test-requires'])
 | 
				
			||||||
 | 
					project = 'python-glanceclient'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
if sys.version_info < (2, 6):
 | 
					if sys.version_info < (2, 6):
 | 
				
			||||||
    requires.append('simplejson')
 | 
					    requires.append('simplejson')
 | 
				
			||||||
@@ -18,8 +19,8 @@ def read(fname):
 | 
				
			|||||||
    return open(os.path.join(os.path.dirname(__file__), fname)).read()
 | 
					    return open(os.path.join(os.path.dirname(__file__), fname)).read()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
setuptools.setup(
 | 
					setuptools.setup(
 | 
				
			||||||
    name="python-glanceclient",
 | 
					    name=project,
 | 
				
			||||||
    version=setup.get_post_version('glanceclient'),
 | 
					    version=setup.get_version(project),
 | 
				
			||||||
    description="Client library for OpenStack Image API",
 | 
					    description="Client library for OpenStack Image API",
 | 
				
			||||||
    long_description=read('README.rst'),
 | 
					    long_description=read('README.rst'),
 | 
				
			||||||
    url='https://github.com/openstack/python-glanceclient',
 | 
					    url='https://github.com/openstack/python-glanceclient',
 | 
				
			||||||
@@ -44,5 +45,4 @@ setuptools.setup(
 | 
				
			|||||||
    tests_require=tests_require,
 | 
					    tests_require=tests_require,
 | 
				
			||||||
    setup_requires=['setuptools-git>=0.4'],
 | 
					    setup_requires=['setuptools-git>=0.4'],
 | 
				
			||||||
    entry_points={'console_scripts': ['glance = glanceclient.shell:main']},
 | 
					    entry_points={'console_scripts': ['glance = glanceclient.shell:main']},
 | 
				
			||||||
    data_files=[('glanceclient', ['glanceclient/versioninfo'])]
 | 
					 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user