gitcmds: "globals to locals" micro-optimization
[git-cola.git] / cola / version.py
blob0db7f55811fbdd0b259478bd69e6a037e1585fd1
1 # Copyright (c) 2008 David Aguilar
2 """Provides the current cola version number"""
4 import re
5 import os
6 import sys
8 from cola import git
9 from cola import errors
10 from cola import utils
11 from cola import resources
12 from cola.decorators import memoize
15 # minimum version requirements
16 _versions = {
17 'git': '1.5.2',
18 'python': '2.4',
19 'pyqt': '4.1',
20 'pyqt_qrunnable': '4.4',
21 # git-difftool moved out of contrib in git 1.6.3
22 'difftool-builtin': '1.6.3',
23 # git-mergetool learned --no-prompt in 1.6.2
24 'mergetool-no-prompt': '1.6.2',
25 'patience': '1.6.2',
26 'diff-submodule': '1.6.6',
30 def get(key):
31 """Returns an entry from the known versions table"""
32 return _versions.get(key)
35 class VersionUnavailable(Exception):
36 pass
39 def git_describe_version():
40 """Inspect the cola git repository and return the current version."""
41 try:
42 v = git.Git.execute(['git', 'describe',
43 '--tags',
44 '--match=v*',
45 '--abbrev=7',
46 'HEAD'],
47 with_stderr=True)
48 except errors.GitCommandError, e:
49 raise VersionUnavailable(str(e))
50 if not re.match(r'^v[0-9]', v):
51 raise VersionUnavailable('%s: bad version' % v)
52 try:
53 dirty = git.Git.execute(['git', 'diff-index', '--name-only', 'HEAD'])
54 except errors.GitCommandError, e:
55 raise VersionUnavailable(str(e))
56 if dirty:
57 v += '-dirty'
58 return re.sub('-', '.', utils.strip_prefix('v', v))
61 def builtin_version():
62 """Return the builtin version or throw a VersionUnavailable exception"""
63 try:
64 from cola import builtin_version as bv
65 except ImportError, e:
66 raise VersionUnavailable()
67 else:
68 return bv.version
71 @memoize
72 def _builtin_version_file(ext='py'):
73 """Returns the path to cola's builtin_version.py."""
74 dirname = os.path.dirname(__file__)
75 return os.path.join(dirname, 'builtin_version.%s' % ext)
78 def write_builtin_version():
79 """Writes cola/builtin_version.py."""
80 try:
81 v = git_describe_version()
82 except VersionUnavailable:
83 return
84 f = file(_builtin_version_file(), 'w')
85 f.write('# This file was generated automatically. Do not edit by hand.\n'
86 'version = %r\n' % v)
88 def delete_builtin_version():
89 """Deletes cola/builtin_version.py."""
90 for ext in ('py', 'pyc', 'pyo'):
91 fn = _builtin_version_file(ext=ext)
92 if os.path.exists(fn):
93 os.remove(fn)
96 @memoize
97 def version():
98 """Returns the builtin version or calculates the current version."""
99 for v in [builtin_version, git_describe_version]:
100 try:
101 return v()
102 except VersionUnavailable:
103 pass
104 return 'unknown-version'
107 @memoize
108 def check_version(min_ver, ver):
109 """Check whether ver is greater or equal to min_ver
111 test = (min_ver, ver)
112 min_ver_list = version_to_list(min_ver)
113 ver_list = version_to_list(ver)
114 return min_ver_list <= ver_list
117 @memoize
118 def check(key, ver):
119 """Checks if a version is greater than the known version for <what>"""
120 return check_version(get(key), ver)
123 def version_to_list(version):
124 """Convert a version string to a list of numbers or strings
126 ver_list = []
127 for p in version.split('.'):
128 try:
129 n = int(p)
130 except ValueError:
131 n = p
132 ver_list.append(n)
133 return ver_list
136 @memoize
137 def git_version():
138 """Returns the current GIT version"""
139 return git.instance().version().split()[-1]