-
Notifications
You must be signed in to change notification settings - Fork 53
/
Copy pathsetversion.py
executable file
·114 lines (84 loc) · 3.26 KB
/
setversion.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
#!/usr/bin/env python
"""Set version.
This script sets the DBUtils version number information
consistently in all files of the distribution.
"""
# Version format is (Major, Minor, Sub, Alpha/Beta/etc)
# The Sub is optional, and if 0 is not returned.
# Examples: (0, 8, 1, 'b1'), (0, 8, 2) or (0, 9, 0, 'rc1')
# releaseDate format should be 'MM/DD/YY'.
# Update this to change the current version and release date:
# version = ('X', 'Y', 0)
version = (1, 2, 0)
# releaseDate = '@@/@@/@@'
releaseDate = '02/05/17'
# Verbose output (output unchanged files also):
verbose = False
from glob import glob
import os, sys, re
path = os.path.dirname(os.path.abspath(sys.argv[0]))
sys.path.append(path)
os.chdir(path)
print "Setversion", path
def versionString(version):
"""Create version string.
For a sequence containing version information such as (2, 0, 0, 'pre'),
this returns a printable string such as '2.0pre'.
The micro version number is only excluded from the string if it is zero.
"""
ver = map(str, version)
numbers, rest = ver[:2 if ver[2] == '0' else 3], ver[3:]
return '.'.join(numbers) + '-'.join(rest)
versionString = versionString(version)
if versionString == 'X.Y':
print "Please set the version."
sys.exit(1)
if releaseDate == '@@/@@/@@':
print "Please set the release date."
sys.exit(1)
class Replacer:
"""Class to handle substitutions in a file."""
def __init__(self, *args):
self._subs = list(args)
def add(self, search, replace):
self._subs.append((re.compile(search,re.M), replace))
def replaceInStr(self, data):
for search, replace in self._subs:
data = re.sub(search, replace, data)
return data
def replaceInFile(self, filename):
data = open(filename).read()
newdata = self.replaceInStr(data)
if data == newdata:
if verbose:
print 'Unchanged ' + filename
else:
print 'Updating ' + filename
open(filename, 'w').write(newdata)
def replaceGlob(self, pattern):
for file in glob(pattern):
if os.path.exists(file):
self.replaceInFile(file)
pyReplace = Replacer()
pyReplace.add(r"(__version__\s*=\s*)'.*'", r"\g<1>%s" % repr(versionString))
propReplace = Replacer()
propReplace.add(r"(version\s*=\s*).*", r"\g<1>%s" % repr(version))
propReplace.add(r"(releaseDate\s*=\s*).*", r"\g<1>%s" % repr(releaseDate))
htmlReplace = Replacer()
htmlReplace.add(r"<!--\s*version\s*-->[^<]*<!--\s*/version\s*-->",
r"<!-- version --> %s <!-- /version -->" % versionString)
htmlReplace.add(r"<!--\s*relDate\s*-->[^<]*<!--\s*/relDate\s*-->",
r"<!-- relDate --> %s <!-- /relDate -->" % releaseDate)
rstReplace = Replacer()
rstReplace.add(r"^:(.+)?: (X|\d+)\.(Y|\d+)(\.\d+)?$", r":\1: %s" % versionString)
rstReplace.add(r"^:(.+)?: (@|\d){2}/(@|\d){2}/(@|\d){2}$", r":\1: %s" % releaseDate)
# Replace in Python files:
pyReplace.replaceGlob('*.py')
pyReplace.replaceGlob('DBUtils/*.py')
pyReplace.replaceGlob('DBUtils/*/*.py')
# Replace in Properties files:
propReplace.replaceGlob('DBUtils/Properties.py')
# Replace in existing HTML:
htmlReplace.replaceGlob('DBUtils/Docs/*.html')
# Replace in reStructuredText files:
rstReplace.replaceGlob('DBUtils/Docs/*.rst')