Spaces:
Running
Running
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))
|