diff options
Diffstat (limited to 'BuildTools/SCons/Version.py')
-rw-r--r-- | BuildTools/SCons/Version.py | 72 |
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) |