-
-
Save pwithnall/7bc5f320b3bdf418265a to your computer and use it in GitHub Desktop.
Extract Python module version from git tags and repository status
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# This program is placed into the public domain. | |
""" | |
Gets the current version number. | |
If in a git repository, it is the current git tag. | |
Otherwise it is the one contained in the PKG-INFO file. | |
To use this script, simply import it in your setup.py file | |
and use the results of get_version() as your package version: | |
from version import * | |
setup( | |
... | |
version=get_version(), | |
... | |
) | |
""" | |
__all__ = ('get_version') | |
from os.path import dirname, isdir, join | |
import os | |
import re | |
import subprocess | |
version_re = re.compile('^Version: (.+)$', re.M) | |
def get_version(): | |
d = dirname(__file__) | |
if isdir(join(d, '.git')): | |
# Get the version using "git describe". | |
cmd = 'git describe --tags --match [0-9]*'.split() | |
try: | |
version = subprocess.check_output(cmd).decode().strip() | |
except subprocess.CalledProcessError: | |
print('Unable to get version number from git tags') | |
exit(1) | |
# PEP 386 compatibility | |
if '-' in version: | |
version = '.post'.join(version.split('-')[:2]) | |
# Don't declare a version "dirty" merely because a time stamp has | |
# changed. If it is dirty, append a ".dev1" suffix to indicate a | |
# development revision after the release. | |
with open(os.devnull, 'w') as fd_devnull: | |
subprocess.call(['git', 'status'], | |
stdout=fd_devnull, stderr=fd_devnull) | |
cmd = 'git diff-index --name-only HEAD'.split() | |
try: | |
dirty = subprocess.check_output(cmd).decode().strip() | |
except subprocess.CalledProcessError: | |
print('Unable to get git index status') | |
exit(1) | |
if dirty != '': | |
version += '.dev1' | |
else: | |
# Extract the version from the PKG-INFO file. | |
with open(join(d, 'PKG-INFO')) as f: | |
version = version_re.search(f.read()).group(1) | |
return version | |
if __name__ == '__main__': | |
print(get_version()) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Changes: