summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to 'BuildTools/SCons/Version.py')
-rw-r--r--BuildTools/SCons/Version.py72
1 files changed, 51 insertions, 21 deletions
diff --git a/BuildTools/SCons/Version.py b/BuildTools/SCons/Version.py
index 001374a..23cd850 100644
--- a/BuildTools/SCons/Version.py
+++ b/BuildTools/SCons/Version.py
@@ -1,24 +1,32 @@
+from __future__ import print_function
import subprocess, os, datetime, re, os.path, sys, unittest
-def getGitBuildVersion(root, project) :
- tag = git("describe --tags --exact --match \"" + project + "-*\"", root)
- if tag :
- return tag.rstrip()[len(project)+1:]
- tag = git("describe --tags --match \"" + project + "-*\"", root)
- if tag :
- m = re.match(project + "-(.*)-(.*)-(.*)", tag)
- if m :
- return m.group(1) + "-dev" + m.group(2)
+def gitDescribeToVersion(tag, tagPrefix):
+ m = re.match(r'^' + tagPrefix + r'-(.+?)(?:-(.+?)-(.+?))?$', tag)
+ if not m:
+ return None
+ result = m.group(1)
+ if m.group(2):
+ result += "-dev" + m.group(2)
+ return result
+
+def getGitBuildVersion(root, tagPrefix) :
+ tag = git("describe --tags --match \"" + tagPrefix + "-*\"", root)
+ if tag:
+ return gitDescribeToVersion(tag, tagPrefix)
return None
-def git(cmd, root) :
+def git(cmd, root):
full_cmd = "git " + cmd
+ # Would've used with .. as p, but that's not supported by Python 2.7
p = subprocess.Popen(full_cmd, cwd=root, shell=True, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE, close_fds=(os.name != "nt"))
gitVersion = p.stdout.read()
- # error = p.stderr.read()
- # if error:
- # print("Git error: " + error)
- p.stdin.close()
- if p.wait() == 0 :
- return gitVersion
+ try:
+ p.stdin.close()
+ p.stdout.close()
+ p.stderr.close()
+ except:
+ pass
+ if p.wait() == 0:
+ return bytes(gitVersion).decode('utf-8')
return None
@@ -97,3 +105,3 @@ def convertToWindowsVersion(version):
# Test Windows version mapping scheme
-class convertToWindowsVersionTest(unittest.TestCase):
+class TestCases(unittest.TestCase):
def testWindowsVersionsAreDescending(self):
@@ -113,2 +121,3 @@ class convertToWindowsVersionTest(unittest.TestCase):
("4.0rc3", (4, 0, 30000)),
+ ('4.0rc2-dev39', (4, 0, 20039)),
('4.0rc2-dev34', (4, 0, 20034)),
@@ -119,3 +128,2 @@ class convertToWindowsVersionTest(unittest.TestCase):
('4.0rc2-dev27', (4, 0, 20027)),
- ('4.0rc2-dev39', (4, 0, 20039)),
('4.0rc2', (4, 0, 20000)),
@@ -165,3 +173,13 @@ class convertToWindowsVersionTest(unittest.TestCase):
]
- windowsVersionMapping = list(map(lambda (x,y): (x, convertToWindowsVersion(x)), versionStringsWithOldVersions))
+ prevParsed = None
+ prevOldVersion = None
+ for string, oldVersion in versionStringsWithOldVersions:
+ parsed = convertToWindowsVersion(string)
+ if prevOldVersion and oldVersion:
+ self.assertTrue(oldVersion <= prevOldVersion, "Old version %r must come before %r" % (oldVersion, prevOldVersion))
+ if prevParsed:
+ self.assertTrue(parsed < prevParsed, "%s => %r must be smaller than %s => %r" % (string, parsed, prevString, prevParsed))
+ prevString = string
+ prevParsed = parsed
+ prevOldVersion = oldVersion
@@ -192,2 +210,11 @@ class convertToWindowsVersionTest(unittest.TestCase):
+ def testGitDescribeToVersion(self):
+ self.assertEqual("5.0alpha2-dev100", gitDescribeToVersion("swift-5.0alpha2-100-g33d5f6571", "swift"))
+ self.assertEqual("5.0alpha2", gitDescribeToVersion("swift-5.0alpha2", "swift"))
+ self.assertEqual("5.0-dev1", gitDescribeToVersion("swift-5.0-1-g012312312", "swift"))
+ self.assertIsNone(gitDescribeToVersion("swiften-5.0-1-g012312312", "swift"))
+ self.assertIsNone(gitDescribeToVersion("quickly-5.0-1-g012312312", "swift"))
+ self.assertIsNone(gitDescribeToVersion("swift-", "swift"))
+ self.assertIsNone(gitDescribeToVersion("swift", "swift"))
+
if __name__ == '__main__':
@@ -196,6 +223,9 @@ if __name__ == '__main__':
elif len(sys.argv) == 2:
- print convertToWindowsVersion(sys.argv[1])
+ if sys.argv[1] == "--git-build-version":
+ print(getGitBuildVersion(os.path.dirname(os.path.dirname(__file__)), "swift"))
+ else:
+ print(convertToWindowsVersion(sys.argv[1]))
sys.exit(0)
else:
- print "Error: Simply run the script without arguments or pass a single argument."
+ print("Error: Simply run the script without arguments or pass a single argument.")
sys.exit(-1)