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,26 +1,34 @@ +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  def getBuildVersion(root, project) : @@ -95,7 +103,7 @@ def convertToWindowsVersion(version):      return (major, minor, patch)  # Test Windows version mapping scheme -class convertToWindowsVersionTest(unittest.TestCase): +class TestCases(unittest.TestCase):      def testWindowsVersionsAreDescending(self):          versionStringsWithOldVersions = [              ("5.0rc11", None), @@ -111,13 +119,13 @@ class convertToWindowsVersionTest(unittest.TestCase):              ("4.0rc5", (4, 0, 50000)),              ("4.0rc4", (4, 0, 40000)),              ("4.0rc3", (4, 0, 30000)), +            ('4.0rc2-dev39', (4, 0, 20039)),              ('4.0rc2-dev34', (4, 0, 20034)),              ('4.0rc2-dev33', (4, 0, 20033)),              ('4.0rc2-dev31', (4, 0, 20031)),              ('4.0rc2-dev30', (4, 0, 20030)),              ('4.0rc2-dev29', (4, 0, 20029)),              ('4.0rc2-dev27', (4, 0, 20027)), -            ('4.0rc2-dev39', (4, 0, 20039)),              ('4.0rc2', (4, 0, 20000)),              ('4.0rc1', (4, 0, 10000)),              ('4.0beta2-dev203', (4, 0, 2203)), @@ -163,7 +171,17 @@ class convertToWindowsVersionTest(unittest.TestCase):              ('3.0alpha-dev524', (3, 0, 524)),              ('3.0alpha-dev515', (3, 0, 515)),          ] -        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      def testThatBetaIsHigherThanAlpha(self):          self.assertTrue(convertToWindowsVersion("3.0beta0") > convertToWindowsVersion("3.0alpha0")) @@ -190,12 +208,24 @@ class convertToWindowsVersionTest(unittest.TestCase):          self.assertTrue(convertToWindowsVersion("3.0") > convertToWindowsVersion("3.0rc1"))          self.assertTrue(convertToWindowsVersion("3.0") > convertToWindowsVersion("3.0rc11")) +    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__':      if len(sys.argv) == 1:          unittest.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)  | 
 Swift