summarylogtreecommitdiffstats
path: root/buildhelper.py
blob: cd5a48ae6f6686695d67a06e54bf45ab8f8a574a (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
77
78
79
80
81
82
83
84
85
86
87
88
# Helper script for PKGBUILD
#
# Previously required jq/ripgrep, now just needs the python stdlib

import argparse
import json
import re

VERSION_PATTERN = re.compile(
    r"^(?P<primary>[\w\.]+)(?:-(?P<build>dev[\w\.]+)\+(?P<rev>\w+))?$"
)


def print_version(*, version_data, format="raw", **_kwargs):
    assert format in ["raw", "sanitize"], format
    raw_version = version_data["version"]
    assert isinstance(raw_version, str)
    version_info = VERSION_PATTERN.fullmatch(raw_version)
    if version_info is None:
        raise RuntimeError(f"Unexpected version {raw_version!r}")
    if format == "sanitize" and version_info.group("build") is not None:
        # Sanitize `-` to `_`, `+` to `.g`
        #
        # So `0.12.0-dev.3429+13a9d94a8` becomes `0.12.0_dev.3429.g13a9d94a8`
        #
        # See PKGBUILD.pkgver for full details
        # The sanitization is not necessary if we are not using a dev build
        print(
            "{}_{}.g{}".format(
                version_info["primary"],
                version_info["build"],
                version_info["rev"],
            )
        )
    else:
        print(raw_version)


def print_date(*, version_data, **_kwargs):
    print(version_data["date"])


def print_url(*, platform_data, **_kwargs):
    print(platform_data["tarball"])


def print_hash(*, platform_data, **_kwargs):
    print(platform_data["shasum"])


SUBCOMMANDS = {
    func.__name__: func for func in [print_version, print_date, print_url, print_hash]
}


def main():
    parser = argparse.ArgumentParser(prog="buildhelper")
    parser.add_argument(
        "--index-file", "--index", type=argparse.FileType(), required=True
    )
    parser.add_argument("--target-arch", "--arch", required=True)
    subparser = parser.add_subparsers(required=True, dest="subcommand_name")
    parser_print_version = subparser.add_parser("print-version")
    parser_print_version.add_argument(
        "--sanitize",
        dest="format",
        action="store_const",
        const="sanitize",
        help="Sanitize the version to make usable with pacman",
    )
    parser_print_version.set_defaults(format="raw")
    subparser.add_parser("print-url")
    subparser.add_parser("print-hash")
    subparser.add_parser("print-date")

    args = parser.parse_args()

    # parse index file
    index_data = json.load(args.index_file)
    args.version_data = index_data["master"]
    args.platform_data = args.version_data[f"{args.target_arch}-linux"]

    # execute subcommand
    SUBCOMMANDS[args.subcommand_name.replace("-", "_")](**vars(args))


if __name__ == "__main__":
    main()