forked from scipy/scipy
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathversion_utils.py
119 lines (100 loc) · 4.03 KB
/
version_utils.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
import os
import subprocess
import argparse
MAJOR = 1
MINOR = 14
MICRO = 0
ISRELEASED = False
IS_RELEASE_BRANCH = False
VERSION = '%d.%d.%d' % (MAJOR, MINOR, MICRO)
def get_version_info(source_root):
# Adding the git rev number needs to be done inside
# write_version_py(), otherwise the import of scipy.version messes
# up the build under Python 3.
FULLVERSION = VERSION
if os.path.exists(os.path.join(source_root, '.git')):
GIT_REVISION, COMMIT_COUNT = git_version(source_root)
elif os.path.exists('scipy/version.py'):
# must be a source distribution, use existing version file
# load it as a separate module to not load scipy/__init__.py
import runpy
ns = runpy.run_path('scipy/version.py')
GIT_REVISION = ns['git_revision']
COMMIT_COUNT = ns['git_revision']
else:
GIT_REVISION = "Unknown"
COMMIT_COUNT = "Unknown"
if not ISRELEASED:
FULLVERSION += '.dev0+' + COMMIT_COUNT + '.' + GIT_REVISION
return FULLVERSION, GIT_REVISION, COMMIT_COUNT
def write_version_py(source_root, filename='scipy/version.py'):
cnt = """\
# THIS FILE IS GENERATED DURING THE SCIPY BUILD
# See tools/version_utils.py for details
short_version = '%(version)s'
version = '%(version)s'
full_version = '%(full_version)s'
git_revision = '%(git_revision)s'
commit_count = '%(commit_count)s'
release = %(isrelease)s
if not release:
version = full_version
"""
FULLVERSION, GIT_REVISION, COMMIT_COUNT = get_version_info(source_root)
a = open(filename, 'w')
try:
a.write(cnt % {'version': VERSION,
'full_version': FULLVERSION,
'git_revision': GIT_REVISION,
'commit_count': COMMIT_COUNT,
'isrelease': str(ISRELEASED)})
finally:
a.close()
# Return the git revision as a string
def git_version(cwd):
def _minimal_ext_cmd(cmd):
# construct minimal environment
env = {}
for k in ['SYSTEMROOT', 'PATH']:
v = os.environ.get(k)
if v is not None:
env[k] = v
# LANGUAGE is used on win32
env['LANGUAGE'] = 'C'
env['LANG'] = 'C'
env['LC_ALL'] = 'C'
out = subprocess.Popen(cmd, stdout=subprocess.PIPE,
env=env, cwd=cwd).communicate()[0]
return out
try:
git_dir = os.path.abspath(os.path.dirname(os.path.dirname(__file__)))
git_dir = os.path.join(git_dir, ".git")
out = _minimal_ext_cmd(['git',
'--git-dir',
git_dir,
'rev-parse',
'HEAD'])
GIT_REVISION = out.strip().decode('ascii')[:7]
# We need a version number that's regularly incrementing for newer commits,
# so the sort order in a wheelhouse of nightly builds is correct (see
# https://github.com/MacPython/scipy-wheels/issues/114). It should also be
# a reproducible version number, so don't rely on date/time but base it on
# commit history. This gives the commit count since the previous branch
# point from the current branch (assuming a full `git clone`, it may be
# less if `--depth` was used - commonly the default in CI):
prev_version_tag = f'^v{MAJOR}.{MINOR - 2}.0'
out = _minimal_ext_cmd(['git', '--git-dir', git_dir,
'rev-list', 'HEAD', prev_version_tag,
'--count'])
COMMIT_COUNT = out.strip().decode('ascii')
COMMIT_COUNT = '0' if not COMMIT_COUNT else COMMIT_COUNT
except OSError:
GIT_REVISION = "Unknown"
COMMIT_COUNT = "Unknown"
return GIT_REVISION, COMMIT_COUNT
if __name__ == "__main__":
parser = argparse.ArgumentParser()
parser.add_argument("--source-root", type=str, default='.',
help="Relative path to the root of the source directory")
args = parser.parse_args()
write_version_py(args.source_root)