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,10 +34,11 @@ 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: | ||||||
|  |                     continue | ||||||
|                 mapping[alias] = canonical_email |                 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
	 Monty Taylor
					Monty Taylor