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.
50 lines
1.4 KiB
Python
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
|