diff options
Diffstat (limited to 'distribution/lib/FixUtil.py')
-rwxr-xr-x | distribution/lib/FixUtil.py | 213 |
1 files changed, 213 insertions, 0 deletions
diff --git a/distribution/lib/FixUtil.py b/distribution/lib/FixUtil.py new file mode 100755 index 00000000000..6071fcc9799 --- /dev/null +++ b/distribution/lib/FixUtil.py @@ -0,0 +1,213 @@ +#!/usr/bin/env python +# ********************************************************************** +# +# Copyright (c) 2003-2009 ZeroC, Inc. All rights reserved. +# +# This copy of Ice is licensed to you under the terms described in the +# ICE_LICENSE file included in this distribution. +# +# ********************************************************************** + +import os, sys, shutil, fnmatch, re, glob, getopt +from stat import * + +def getTrackedFiles(): + files = [] + pipe = os.popen('git ls-files') + for line in pipe.readlines(): + p = os.path.join('.', line.strip()) + files.append(p) + return files + +def fnmatchlist(x, l): + for p in l: + if fnmatch.fnmatch(x, p): + return True + return False +# +# Version patterns +# +vpatCheck = "[0-9]+\.[0-9]+(\.[0-9]+|b[0-9]*)$" +vpatParse = "([0-9]+)\.([0-9]+)(\.[0-9]+|b[0-9]*)" +vpatMatch = "([0-9]+\.[0-9]+(\.[0-9]+|b[0-9]*))" + +def commaVersion(version): + major = majorVersion(version) + minor = minorVersion(version) + patch = patchVersion(version) + return ("%s,%s,%s" % (major, minor, patch)) + +def intVersion(version): + r = re.search(vpatParse, version) + major = int(r.group(1)) + minor = int(r.group(2)) + gr3 = r.group(3) + patch = -1 + if gr3.startswith("."): + patch = int(gr3[1:]) + else: + if len(gr3) > 1: + patch = 50 + int(gr3[1:]) + else: + patch = 51 + return ("%2d%02d%02d" % (major, minor, patch)).strip() + +def betaVersion(version): + r = re.search(vpatParse, version) + if r.group(3).startswith("b"): + return "b" + else: + return "" + +def soVersion(version): + r = re.search(vpatParse, version) + major = int(r.group(1)) + minor = int(r.group(2)) + v = ("%d%d" % (major, minor)).strip() + if r.group(3).startswith("b"): + return v + "b" + else: + return v + +def majorVersion(version): + r = re.search(vpatParse, version) + major = int(r.group(1)) + return ("%d" % (major)).strip() + +def minorVersion(version): + r = re.search(vpatParse, version) + minor = int(r.group(2)) + return ("%d" % (minor)).strip() + +def shortVersion(version): + r = re.search(vpatParse, version) + major = int(r.group(1)) + minor = int(r.group(2)) + return ("%d.%d" % (major, minor)).strip() + +def patchVersion(version): + r = re.search(vpatParse, version) + + gr3 = r.group(3) + patch = -1 + if gr3.startswith("."): + patch = int(gr3[1:]) + else: + if len(gr3) > 1: + patch = 50 + int(gr3[1:]) + else: + patch = 51 + + return ("%d" % (patch)).strip() + +# +# Find files matching a pattern. +# +def find(patt): + if type(patt) != type([]): + patt = [patt] + result = [ ] + for fullpath in getTrackedFiles(): + x = os.path.basename(fullpath) + if os.path.isdir(fullpath): + continue; + for p in patt: + if fnmatch.fnmatch(x, p): + result.append(fullpath) + break + return result + +# +# Replace a string matched by the first group of regular expression. +# +# For example: the regular expression "ICE_STRING_VERSION \"([0-9]*\.[0-9]*\.[0-9]*)\"" +# will match the string version in "ICE_STRING_VERSION "2.1.0"" and will replace it with +# the given version. +# +def fileMatchAndReplace(filename, matchAndReplaceExps, warn=True): + + if os.path.isdir(filename): + return + + mode = os.stat(filename).st_mode + oldConfigFile = open(filename, "r") + newConfigFile = open(filename + ".new", "w") + + # + # Compile the regular expressions + # + regexps = [ ] + for (regexp, replace) in matchAndReplaceExps: + regexps.append((re.compile(regexp), replace)) + + # + # Search for the line with the given regular expressions and + # replace the matching string + # + updated = False + for line in oldConfigFile.readlines(): + for (regexp, replace) in regexps: + match = regexp.search(line) + if match != None: + oldLine = line + line = oldLine.replace(match.group(1), replace) +# print oldLine + line + updated = True + break + newConfigFile.write(line) + + newConfigFile.close() + oldConfigFile.close() + + if updated: + print "updated " + filename + os.rename(filename + ".new", filename) + os.chmod(filename, S_IMODE(mode)) + else: + if warn: + print "warning: " + filename + " didn't contain any version" + os.unlink(filename + ".new") + +# +# Replace all occurences of a regular expression in a file +# +def fileMatchAllAndReplace(filename, matchAndReplaceExps): + + oldFile = open(filename, "r") + newFile = open(filename + ".new", "w") + + # + # Compile the regular expressions + # + regexps = [ ] + for (regexp, replace) in matchAndReplaceExps: + regexps.append((re.compile(regexp), replace)) + + # + # Search for all lines with the given regular expressions and + # replace the matching string + # + updated = False + for line in oldFile.readlines(): + for (regexp, replace) in regexps: + match = regexp.search(line) + if match != None: + oldLine = line + line = oldLine.replace(match.group(1), replace) + updated = True + newFile.write(line) + + newFile.close() + oldFile.close() + + if updated: + print "updated " + filename + os.rename(filename + ".new", filename) + else: + print "warning: " + filename + " didn't contain any version" + os.unlink(filename + ".new") + +def checkVersion(version): + if not re.match(vpatCheck, version): + print "invalid version number: " + version + " (it should have the form 3.2.1 or 3.2b or 3.2b2)" + sys.exit(0) |