summaryrefslogtreecommitdiff
path: root/build/getversion.py
diff options
context:
space:
mode:
authorLorry <lorry@roadtrain.codethink.co.uk>2012-08-22 14:29:52 +0100
committerLorry <lorry@roadtrain.codethink.co.uk>2012-08-22 14:29:52 +0100
commitf1bdf13786f0752c0846cf36f0d91e4fc6747929 (patch)
tree4223b2035bf2240d681a53822808b3c7f687b905 /build/getversion.py
downloadsubversion-tarball-f1bdf13786f0752c0846cf36f0d91e4fc6747929.tar.gz
Tarball conversion
Diffstat (limited to 'build/getversion.py')
-rwxr-xr-xbuild/getversion.py109
1 files changed, 109 insertions, 0 deletions
diff --git a/build/getversion.py b/build/getversion.py
new file mode 100755
index 0000000..7ed1e53
--- /dev/null
+++ b/build/getversion.py
@@ -0,0 +1,109 @@
+#!/usr/bin/env python
+#
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied. See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+#
+#
+# getversion.py - Parse version numbers from C header files.
+#
+
+import os
+import re
+import sys
+
+__all__ = ['Parser', 'Result']
+
+class Result:
+ pass
+
+class Parser:
+ def __init__(self):
+ self.patterns = {}
+
+ def search(self, define_name, value_name):
+ 'Add the name of a define to the list of search pattenrs.'
+ self.patterns[define_name] = value_name
+
+ def parse(self, file):
+ 'Parse the file, extracting defines into a Result object.'
+ stream = open(file, 'rt')
+ result = Result()
+ regex = re.compile(r'^\s*#\s*define\s+(\w+)\s+(\d+)')
+ for line in stream.readlines():
+ match = regex.match(line)
+ if match:
+ try:
+ name = self.patterns[match.group(1)]
+ except:
+ continue
+ setattr(result, name, int(match.group(2)))
+ stream.close()
+ return result
+
+def svn_extractor(parser, include_file):
+ '''Pull values from svn.version.h'''
+ p.search('SVN_VER_MAJOR', 'major')
+ p.search('SVN_VER_MINOR', 'minor')
+ p.search('SVN_VER_PATCH', 'patch')
+
+ try:
+ r = p.parse(include_file)
+ except IOError, e:
+ usage_and_exit(str(e))
+ sys.stdout.write("%d.%d.%d" % (r.major, r.minor, r.patch))
+
+
+def sqlite_extractor(parser, include_file):
+ '''Pull values from sqlite3.h'''
+ p.search('SQLITE_VERSION_NUMBER', 'version')
+
+ try:
+ r = p.parse(include_file)
+ except IOError, e:
+ usage_and_exit(str(e))
+ major = r.version / 1000000
+ minor = (r.version - (major * 1000000)) / 1000
+ micro = (r.version - (major * 1000000) - (minor * 1000))
+ sys.stdout.write("%d.%d.%d" % (major, minor, micro))
+
+
+extractors = {
+ 'SVN' : svn_extractor,
+ 'SQLITE' : sqlite_extractor,
+ }
+
+def usage_and_exit(msg):
+ if msg:
+ sys.stderr.write("%s\n\n" % msg)
+ sys.stderr.write("usage: %s [SVN|SQLITE] [header_file]\n" % \
+ os.path.basename(sys.argv[0]))
+ sys.stderr.flush()
+ sys.exit(1)
+
+
+if __name__ == '__main__':
+ if len(sys.argv) == 3:
+ extractor = extractors[sys.argv[1]]
+ include_file = sys.argv[2]
+ else:
+ usage_and_exit("Incorrect number of arguments")
+
+ # Extract and print the version number
+ p = Parser()
+ extractor(p, include_file)