summaryrefslogtreecommitdiff
path: root/graphics/asymptote/generate_asy_ver_info.py
blob: 2f5550145394269ce985e8b46dd91ac60a456b5d (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
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
#!/usr/bin/env python3

__doc__ = """
Determines asymptote version for release, or with git info for development
"""
__author__ = "Supakorn 'Jamie' Rassameemasmuang <jamievlin@outlook.com>"

import pathlib
import re
import subprocess
from argparse import ArgumentParser
from subprocess import CalledProcessError

from determine_pkg_info import determine_asy_pkg_info


def parse_args():
    parser = ArgumentParser()
    parser.add_argument(
        "--base-version",
        type=str,
        help="Base version string. If blank, this information is "
        + "fetched from configure.ac",
    )
    version_mode = parser.add_mutually_exclusive_group()
    version_mode.add_argument("--version-for-release", action="store_true")
    version_mode.add_argument(
        "--version-with-git-info",
        action="store_true",
        help="Includes number of commits since last tag, if directory is a git repo. "
        + "If commit information cannot be determined, reverts to baseline version",
    )

    return parser.parse_args()


def determine_version_for_release(version_base: str):
    git_string = "git"
    if version_base.endswith("git"):
        return version_base[: -len(git_string)]
    return version_base


def determine_version_with_git_info(version_base: str):
    try:
        long_description = subprocess.run(
            ["git", "describe", "--long"],
            cwd=pathlib.Path(__file__).parent,
            check=True,
            stderr=subprocess.DEVNULL,
            stdout=subprocess.PIPE,
            text=True,
        )
    except CalledProcessError:
        return version_base

    first_version_base = re.sub(r"git-([0-9]*)-g.*", r"-\1", long_description.stdout)
    return re.sub(r"-0-g.*", r"", first_version_base)


def main():
    args = parse_args()
    version_base = args.base_version or determine_asy_pkg_info()["version-base"]

    if args.version_for_release:
        version = determine_version_for_release(version_base)
    elif args.version_with_git_info:
        version = determine_version_with_git_info(version_base)
    else:
        version = version_base

    print(version, end="")


if __name__ == "__main__":
    main()