chiark / gitweb /
Better StGit version tracking
authorKarl Hasselström <kha@treskal.com>
Tue, 13 May 2008 21:50:31 +0000 (23:50 +0200)
committerKarl Hasselström <kha@treskal.com>
Tue, 13 May 2008 21:50:31 +0000 (23:50 +0200)
Instead of claiming to be the latest released version (really, a
hardcoded string that we hope is the latest released version), run git
describe to figure out what version we are, just like git does. Fall
back to a hardcoded value that is generated at install time, or
supplied in a release tarball.

Currently, we have to give git describe the --tags flag, since StGit
release tags are lightweight tags. This means we're going to pick up
any lightweight tags the user makes, which isn't ideal. The solution
is to start making annotated release tags, and then remove that flag.

Signed-off-by: Karl Hasselström <kha@treskal.com>
setup.py
stgit/.gitignore
stgit/version.py

index 04ca82106c41fdc8fe17cf6120cc4aaf46ecbc5d..40022a74d10cd59c7f14040e6ab86a5d6ae9f185 100755 (executable)
--- a/setup.py
+++ b/setup.py
@@ -48,6 +48,8 @@ if sys.argv[1] in ['install', 'build']:
     __check_python_version()
     __check_git_version()
 
+version.write_builtin_version()
+
 # ensure readable template files
 old_mask = os.umask(0022)
 
index 0d20b6487c61e7d1bde93acf4a14b7a89083a16d..4f9c8f17b9022fc15832580962ee01d566faa30a 100644 (file)
@@ -1 +1,2 @@
 *.pyc
+/builtin_version.py
index 06ac7238c4e72214e660f874e7098895965a4190..8ee50090b7addcb40a691aed4de61e277b3eebcc 100644 (file)
@@ -1,4 +1,54 @@
-version = '0.14.2'
+from stgit.exception import StgException
+from stgit import run, utils
+import os.path, re, sys
+
+class VersionUnavailable(StgException):
+    pass
+
+def git_describe_version():
+    path = sys.path[0]
+    try:
+        v = run.Run('git', 'describe', '--tags', '--abbrev=4'
+                    ).cwd(path).output_one_line()
+    except run.RunException, e:
+        raise VersionUnavailable(str(e))
+    if not re.match(r'^v[0-9]', v):
+        raise VersionUnavailable('%s: bad version' % v)
+    try:
+        dirty = run.Run('git', 'diff-index', '--name-only', 'HEAD'
+                        ).cwd(path).raw_output()
+    except run.RunException, e:
+        raise VersionUnavailable(str(e))
+    if dirty:
+        v += '-dirty'
+    return re.sub('-', '.', utils.strip_prefix('v', v))
+
+def builtin_version():
+    try:
+        import builtin_version as bv
+    except ImportError:
+        raise VersionUnavailable()
+    else:
+        return bv.version
+
+def write_builtin_version():
+    try:
+        v = git_describe_version()
+    except VersionUnavailable:
+        return
+    f = file(os.path.join(sys.path[0], 'stgit', 'builtin_version.py'), 'w')
+    f.write('# This file was generated automatically. Do not edit by hand.\n'
+            'version = %r\n' % v)
+
+def get_version():
+    for v in [git_describe_version, builtin_version]:
+        try:
+            return v()
+        except VersionUnavailable:
+            pass
+    return 'unknown-version'
+
+version = get_version()
 
 # minimum version requirements
 git_min_ver = '1.5.2'