1 # Copyright (c) 2008 David Aguilar
2 """Provides the current cola version number"""
9 from cola
import errors
10 from cola
import utils
11 from cola
import resources
13 # minimum version requirements
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',
25 """Returns an entry from the known versions table"""
26 return _versions
.get(key
)
28 # cached to avoid recalculation
31 class VersionUnavailable(Exception):
35 def git_describe_version():
36 """Inspect the cola git repository and return the current version."""
38 v
= git
.Git
.execute(['git', 'describe', '--tags', '--abbrev=4'],
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
)
45 dirty
= git
.Git
.execute(['git', 'diff-index', '--name-only', 'HEAD'])
46 except errors
.GitCommandError
, e
:
47 raise VersionUnavailable(str(e
))
50 return re
.sub('-', '.', utils
.strip_prefix('v', v
))
53 def builtin_version():
54 """Return the builtin version or throw a VersionUnavailable exception"""
56 import builtin_version
as bv
58 raise VersionUnavailable()
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."""
72 v
= git_describe_version()
73 except VersionUnavailable
:
75 f
= file(_builtin_version_file(), 'w')
76 f
.write('# This file was generated automatically. Do not edit by hand.\n'
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
):
88 """Returns the builtin version or calculates the current version."""
92 for v
in [builtin_version
, git_describe_version
]:
95 except VersionUnavailable
:
98 _version
= 'unknown-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
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
119 for p
in version
.split('.'):
129 """Returns the current GIT version"""
130 return utils
.run_cmd(['git', '--version']).split()[2]