models.main: Do not return cached values in everything()
[git-cola.git] / cola / version.py
blob75887167ddf81ec8996305d7b0d07e2395dbee57
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
13 # minimum version requirements
14 _versions = {
15 'git': '1.5.2',
16 'python': '2.4',
17 'pyqt': '4.3',
18 # git-difftool moved out of contrib in git 1.6.3
19 'difftool-builtin': '1.6.3',
20 # git-mergetool learned --no-prompt in 1.6.2
21 'mergetool-no-prompt': '1.6.2',
24 def get(key):
25 """Returns an entry from the known versions table"""
26 return _versions.get(key)
28 # cached to avoid recalculation
29 _version = None
31 class VersionUnavailable(Exception):
32 pass
35 def git_describe_version():
36 """Inspect the cola git repository and return the current version."""
37 try:
38 v = git.Git.execute(['git', 'describe', '--tags', '--abbrev=4'],
39 with_stderr=True)
40 except errors.GitCommandError, e:
41 raise VersionUnavailable(str(e))
42 if not re.match(r'^v[0-9]', v):
43 raise VersionUnavailable('%s: bad version' % v)
44 try:
45 dirty = git.Git.execute(['git', 'diff-index', '--name-only', 'HEAD'])
46 except errors.GitCommandError, e:
47 raise VersionUnavailable(str(e))
48 if dirty:
49 v += '-dirty'
50 return re.sub('-', '.', utils.strip_prefix('v', v))
53 def builtin_version():
54 """Return the builtin version or throw a VersionUnavailable exception"""
55 try:
56 import builtin_version as bv
57 except ImportError:
58 raise VersionUnavailable()
59 else:
60 return bv.version
63 def _builtin_version_file(ext = 'py'):
64 """Returns the path to cola's builtin_version.py."""
65 dirname = os.path.dirname(os.path.abspath(__file__))
66 return os.path.join(dirname, 'builtin_version.%s' % ext)
69 def write_builtin_version():
70 """Writes cola/builtin_version.py."""
71 try:
72 v = git_describe_version()
73 except VersionUnavailable:
74 return
75 f = file(_builtin_version_file(), 'w')
76 f.write('# This file was generated automatically. Do not edit by hand.\n'
77 'version = %r\n' % v)
79 def delete_builtin_version():
80 """Deletes cola/builtin_version.py."""
81 for ext in ('py', 'pyc', 'pyo'):
82 fn = _builtin_version_file(ext)
83 if os.path.exists(fn):
84 os.remove(fn)
87 def version():
88 """Returns the builtin version or calculates the current version."""
89 global _version
90 if _version:
91 return _version
92 for v in [builtin_version, git_describe_version]:
93 try:
94 _version = v()
95 except VersionUnavailable:
96 pass
97 if not _version:
98 _version = 'unknown-version'
99 return _version
102 def check_version(min_ver, ver):
103 """Check whether ver is greater or equal to min_ver
105 min_ver_list = version_to_list(min_ver)
106 ver_list = version_to_list(ver)
107 return min_ver_list <= ver_list
110 def check(key, ver):
111 """Checks if a version is greater than the known version for <what>"""
112 return check_version(get(key), ver)
115 def version_to_list(version):
116 """Convert a version string to a list of numbers or strings
118 ver_list = []
119 for p in version.split('.'):
120 try:
121 n = int(p)
122 except ValueError:
123 n = p
124 ver_list.append(n)
125 return ver_list
128 def git_version():
129 """Returns the current GIT version"""
130 return utils.run_cmd(['git', '--version']).split()[2]