1 # Copyright (c) 2008 David Aguilar
2 """Provides the current cola version number"""
9 from cola
import gitcmd
10 from cola
import errors
11 from cola
import utils
12 from cola
import resources
14 # minimum version requirements
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',
25 'diff-submodule': '1.6.6',
29 """Returns an entry from the known versions table"""
30 return _versions
.get(key
)
32 # cached to avoid recalculation
35 class VersionUnavailable(Exception):
39 def git_describe_version():
40 """Inspect the cola git repository and return the current version."""
42 v
= git
.Git
.execute(['git', 'describe',
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
)
53 dirty
= git
.Git
.execute(['git', 'diff-index', '--name-only', 'HEAD'])
54 except errors
.GitCommandError
, e
:
55 raise VersionUnavailable(str(e
))
58 return re
.sub('-', '.', utils
.strip_prefix('v', v
))
61 def builtin_version():
62 """Return the builtin version or throw a VersionUnavailable exception"""
64 from cola
import builtin_version
as bv
65 except ImportError, e
:
66 raise VersionUnavailable()
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."""
80 v
= git_describe_version()
81 except VersionUnavailable
:
83 f
= file(_builtin_version_file(), 'w')
84 f
.write('# This file was generated automatically. Do not edit by hand.\n'
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
):
96 """Returns the builtin version or calculates the current version."""
100 for v
in [builtin_version
, git_describe_version
]:
104 except VersionUnavailable
:
107 _version
= 'unknown-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
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
136 for p
in version
.split('.'):
147 """Returns the current GIT version"""
149 if _git_version
is None:
150 _git_version
= gitcmd
.instance().version().split()[-1]