views.actions: Fix action dialog when revprompt is true and argprompt is false
[git-cola.git] / cola / version.py
blob9de5a24a15bb04eb39a45fd63e0da71c788d4ca2
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 gitcmd
10 from cola import errors
11 from cola import utils
12 from cola import resources
14 # minimum version requirements
15 _versions = {
16 'git': '1.5.2',
17 'python': '2.4',
18 'pyqt': '4.3',
19 'pyqt_qrunnable': '4.4',
20 # git-difftool moved out of contrib in git 1.6.3
21 'difftool-builtin': '1.6.3',
22 # git-mergetool learned --no-prompt in 1.6.2
23 'mergetool-no-prompt': '1.6.2',
24 'patience': '1.6.2',
25 'diff-submodule': '1.6.6',
28 def get(key):
29 """Returns an entry from the known versions table"""
30 return _versions.get(key)
32 # cached to avoid recalculation
33 _version = None
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 def _builtin_version_file(ext='py'):
72 """Returns the path to cola's builtin_version.py."""
73 dirname = os.path.dirname(__file__)
74 return os.path.join(dirname, 'builtin_version.%s' % ext)
77 def write_builtin_version():
78 """Writes cola/builtin_version.py."""
79 try:
80 v = git_describe_version()
81 except VersionUnavailable:
82 return
83 f = file(_builtin_version_file(), 'w')
84 f.write('# This file was generated automatically. Do not edit by hand.\n'
85 'version = %r\n' % v)
87 def delete_builtin_version():
88 """Deletes cola/builtin_version.py."""
89 for ext in ('py', 'pyc', 'pyo'):
90 fn = _builtin_version_file(ext=ext)
91 if os.path.exists(fn):
92 os.remove(fn)
95 def version():
96 """Returns the builtin version or calculates the current version."""
97 global _version
98 if _version:
99 return _version
100 for v in [builtin_version, git_describe_version]:
101 try:
102 _version = v()
103 break
104 except VersionUnavailable:
105 pass
106 if not _version:
107 _version = 'unknown-version'
108 return _version
111 # Avoid recomputing the same checks
112 _check_version_cache = {}
114 def check_version(min_ver, ver):
115 """Check whether ver is greater or equal to min_ver
117 test = (min_ver, ver)
118 if test in _check_version_cache:
119 return _check_version_cache[test]
120 min_ver_list = version_to_list(min_ver)
121 ver_list = version_to_list(ver)
122 answer = min_ver_list <= ver_list
123 _check_version_cache[test] = answer
124 return answer
127 def check(key, ver):
128 """Checks if a version is greater than the known version for <what>"""
129 return check_version(get(key), ver)
132 def version_to_list(version):
133 """Convert a version string to a list of numbers or strings
135 ver_list = []
136 for p in version.split('.'):
137 try:
138 n = int(p)
139 except ValueError:
140 n = p
141 ver_list.append(n)
142 return ver_list
145 _git_version = None
146 def git_version():
147 """Returns the current GIT version"""
148 global _git_version
149 if _git_version is None:
150 _git_version = gitcmd.instance().version().split()[-1]
151 return _git_version