File size: 2,005 Bytes
e70c280
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
"""Parse container release tags and normalize them to Python project versions."""

from __future__ import annotations

import re
import sys
from dataclasses import dataclass


_STABLE_TAG = re.compile(r"^v(?P<base>\d+\.\d+\.\d+)$")
_RC_TAG = re.compile(r"^v(?P<base>\d+\.\d+\.\d+)-rc\.(?P<number>\d+)$")
_DEV_TAG = re.compile(
    r"^v(?P<base>\d+\.\d+\.\d+)-dev(?:\.(?P<number>\d+))?$"
)


@dataclass(frozen=True)
class ReleaseVersion:
    tag_version: str
    project_version: str


def parse_release_tag(tag: str) -> ReleaseVersion:
    """Return the container tag version and its PEP 440 project equivalent."""
    if match := _STABLE_TAG.fullmatch(tag):
        base = match.group("base")
        return ReleaseVersion(tag_version=base, project_version=base)

    if match := _RC_TAG.fullmatch(tag):
        base = match.group("base")
        number = match.group("number")
        return ReleaseVersion(
            tag_version=f"{base}-rc.{number}",
            project_version=f"{base}rc{number}",
        )

    if match := _DEV_TAG.fullmatch(tag):
        base = match.group("base")
        number = match.group("number") or "0"
        tag_version = f"{base}-dev"
        if match.group("number") is not None:
            tag_version = f"{tag_version}.{number}"
        return ReleaseVersion(
            tag_version=tag_version,
            project_version=f"{base}.dev{number}",
        )

    raise ValueError(
        f"Unsupported release tag: {tag}. Expected vX.Y.Z, vX.Y.Z-rc.N, "
        "vX.Y.Z-dev, or vX.Y.Z-dev.N"
    )


def main(argv: list[str]) -> int:
    if len(argv) != 2:
        print(f"Usage: {argv[0]} <release-tag>", file=sys.stderr)
        return 2
    try:
        release = parse_release_tag(argv[1])
    except ValueError as error:
        print(error, file=sys.stderr)
        return 2
    print(f"version={release.tag_version}")
    print(f"project_version={release.project_version}")
    return 0


if __name__ == "__main__":
    raise SystemExit(main(sys.argv))