Files
dice-counter/version.py
T
gitea-actions e3d56f4c22 Binárka má vědět, která je
Venku jsou čtyři soubory na release, tři systémy a k tomu zdrojáky. Když
někdo napíše, že mu něco nefunguje, není jak zjistit, co vlastně pustil.

Verzi zapisuje build.sh do verze.txt, kostky.spec ji přibalí a version.py ji
z rozbalené binárky přečte. Ze zdrojáků má přednost git describe, který ví
i o commitech nad tagem a o rozdělané práci. V CI se na tagu vnucuje
proměnnou, protože runner klonuje jeden commit bez značek.

Hlásí se přes --version, v úvodní hlášce serveru a v patičce každé stránky.
Zkouška v obou workflow ověří, že se do binárky opravdu dostala.
2026-08-22 18:26:32 +02:00

50 lines
1.4 KiB
Python

"""Která verze počitadla to vlastně je.
Venku jsou čtyři binárky pro tři systémy a k tomu zdrojáky. Když někdo
napíše, že mu něco nefunguje, je první otázka vždycky stejná — a bez
`--version` na ni nemá jak odpovědět.
"""
import subprocess
import sys
from functools import lru_cache
from pathlib import Path
NAME = "verze.txt"
UNKNOWN = "neznámá"
def bundled() -> str:
"""Verze vypálená do binárky při stavbě.
`build.sh` ji zapíše do souboru, `kostky.spec` ji přibalí. V binárce
leží vedle šablon v dočasném adresáři, na který ukazuje `sys._MEIPASS`.
"""
root = Path(getattr(sys, "_MEIPASS", Path(__file__).parent))
try:
return (root / NAME).read_text(encoding="utf-8").strip()
except OSError:
return ""
def described() -> str:
"""Verze podle gitu. Ze zdrojáků je to přesnější než cokoli zapsaného."""
try:
done = subprocess.run(
["git", "describe", "--tags", "--always", "--dirty"],
cwd=Path(__file__).parent, capture_output=True, text=True,
timeout=5, check=True)
except (OSError, subprocess.SubprocessError):
return ""
return done.stdout.strip()
@lru_cache(maxsize=1)
def current() -> str:
"""Verze pro výpis. Ptát se gitu má smysl jen mimo binárku."""
if getattr(sys, "frozen", False):
return bundled() or UNKNOWN
return described() or bundled() or UNKNOWN