File: version.py

package info (click to toggle)
git-cola 4.13.0-1
  • links: PTS
  • area: main
  • in suites: sid
  • size: 6,480 kB
  • sloc: python: 36,938; sh: 304; makefile: 223; xml: 100; tcl: 62
file content (157 lines) | stat: -rw-r--r-- 4,357 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
"""Provide git-cola's version number"""
import sys

try:
    if sys.version_info < (3, 8):
        import importlib_metadata as metadata
    else:
        from importlib import metadata
except (ImportError, OSError):
    metadata = None

from .git import STDOUT
from .decorators import memoize
from ._version import VERSION

try:
    from ._scm_version import __version__ as SCM_VERSION
except ImportError:
    SCM_VERSION = None


# minimum version requirements
_versions = {
    # git diff learned --patience in 1.6.2
    # git mergetool learned --no-prompt in 1.6.2
    # git difftool moved out of contrib in git 1.6.3
    'git': '1.6.3',
    'python': '2.6',
    # new: git cat-file --filters --path=<path> SHA1
    # old: git cat-file --filters blob SHA1:<path>
    'cat-file-filters-path': '2.11.0',
    # git diff --submodule was introduced in 1.6.6
    'diff-submodule': '1.6.6',
    # git check-ignore was introduced in 1.8.2, but did not follow the same
    # rules as git add and git status until 1.8.5
    'check-ignore': '1.8.5',
    # git push --force-with-lease
    'force-with-lease': '1.8.5',
    # git submodule update --recursive was introduced in 1.6.5
    'submodule-update-recursive': '1.6.5',
    # git include.path pseudo-variable was introduced in 1.7.10.
    'config-includes': '1.7.10',
    # git config --show-scope was introduced in 2.26.0
    'config-show-scope': '2.26.0',
    # git config --show-origin was introduced in 2.8.0
    'config-show-origin': '2.8.0',
    # git for-each-ref --sort=version:refname
    'version-sort': '2.7.0',
    # Qt support for QT_AUTO_SCREEN_SCALE_FACTOR and QT_SCALE_FACTOR
    'qt-hidpi-scale': '5.6.0',
    # git rebase --rebase-merges was added in 2.18.0
    'rebase-merges': '2.18.0',
    # git rebase --update-refs was added in 2.38.0
    'rebase-update-refs': '2.38.0',
    # git rev-parse --show-superproject-working-tree was added in 2.13.0
    'show-superproject-working-tree': '2.13.0',
}


def get(key):
    """Returns an entry from the known versions table"""
    return _versions.get(key)


def version():
    """Returns the current version"""
    if SCM_VERSION:
        return SCM_VERSION

    pkg_version = VERSION
    if metadata is None:
        return pkg_version

    try:
        metadata_version = metadata.version('git-cola')
    except (ImportError, OSError):
        return pkg_version

    # Building from a tarball can end up reporting "0.0.0" or "0.1.dev*".
    # Use the fallback version in these scenarios.
    if not metadata_version.startswith('0.'):
        return metadata_version
    return pkg_version


def builtin_version():
    """Returns the version recorded in cola/_version.py"""
    return VERSION


@memoize
def check_version(min_ver, ver):
    """Check whether ver is greater or equal to min_ver"""
    min_ver_list = version_to_list(min_ver)
    ver_list = version_to_list(ver)
    return min_ver_list <= ver_list


@memoize
def check(key, ver):
    """Checks if a version is greater than the known version for <what>"""
    return check_version(get(key), ver)


def check_git(context, key):
    """Checks if Git has a specific feature"""
    return check(key, git_version(context))


def version_to_list(value):
    """Convert a version string to a list of numbers or strings"""
    ver_list = []
    for part in value.split('.'):
        try:
            number = int(part)
        except ValueError:
            number = part
        ver_list.append(number)
    return ver_list


@memoize
def git_version_str(context):
    """Returns the current GIT version"""
    git = context.git
    return git.version(_readonly=True)[STDOUT].strip()


@memoize
def git_version(context):
    """Returns the current GIT version"""
    parts = git_version_str(context).split()
    if parts and len(parts) >= 3:
        result = parts[2]
    else:
        # minimum supported version
        result = get('git')
    return result


def cola_version(builtin=False):
    """A version string for consumption by humans"""
    if builtin:
        suffix = builtin_version()
    else:
        suffix = version()
    return 'cola version %s' % suffix


def print_version(builtin=False, brief=False):
    if builtin and brief:
        msg = builtin_version()
    elif brief:
        msg = version()
    else:
        msg = cola_version(builtin=builtin)
    print(msg)