aboutsummaryrefslogtreecommitdiffstats
path: root/youtube/get_app_version/get_app_version.py
blob: a73b857b4f13507c8451cebc4e26ed0e87f364ef (plain)
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
from __future__ import unicode_literals
import os
import shutil
import subprocess

from ..version import __version__


def app_version():
    def minimal_env_cmd(cmd):
        # make minimal environment
        env = {k: os.environ[k] for k in ['SYSTEMROOT', 'PATH'] if k in os.environ}
        env.update({'LANGUAGE': 'C', 'LANG': 'C', 'LC_ALL': 'C'})
        out = subprocess.Popen(cmd, stdout=subprocess.PIPE, env=env).communicate()[0]
        return out

    subst_list = {
        'version': __version__,
        'branch': None,
        'commit': None,
    }

    # Use shutil.which instead of `command -v`/os.system so we don't spawn a
    # shell (CWE-78 hardening) and so it works cross-platform.
    if shutil.which('git') is None:
        return subst_list

    try:
        # Check we are inside a git work tree. Using DEVNULL avoids the
        # file-handle leak from `open(os.devnull, 'w')`.
        rc = subprocess.call(
            ['git', 'branch'],
            stderr=subprocess.DEVNULL,
            stdout=subprocess.DEVNULL,
        )
    except OSError:
        return subst_list
    if rc != 0:
        return subst_list

    describe = minimal_env_cmd(['git', 'describe', '--tags', '--always'])
    git_revision = describe.strip().decode('ascii')

    branch = minimal_env_cmd(['git', 'branch'])
    git_branch = branch.strip().decode('ascii').replace('* ', '')

    subst_list.update({
        'branch': git_branch,
        'commit': git_revision,
    })

    return subst_list


if __name__ == '__main__':
    app_version()