From a6c94e239bb9c0a0e991ca4ff9c2a9ccf8c3d64a Mon Sep 17 00:00:00 2001 From: gitea-actions Date: Sun, 23 Aug 2026 23:09:15 +0200 Subject: [PATCH] =?UTF-8?q?Za=C5=99=C3=ADznout=20star=C3=A1=20jm=C3=A9na?= =?UTF-8?q?=20kostky?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Druhý krok po #16, rovnou celý. Dvojkolejnost dávala smysl pro projekt s neznámými uživateli; tady běží jedna instance a ta je přemigrovaná. Pryč je: - deploy/pve-kostky.sh (přesměrování na nový skript) - stěhování ze starého jména v instalátoru včetně bloku STARY_* - záložní jméno přílohy kostky-* v instalátoru - věšení příloh pod dvěma jmény v obou workflow - záloha na ~/.local/share/kostky/dice.db ve storage.py - odstavce o přechodu v README Jediné, co ve zdrojácích zůstalo, je docstring "Pravidla hry v kostky" v core.py — to je česky pojmenovaná hra, ne identifikátor. POZOR na pořadí: instalátor teď hledá jen dice-counter-*, a poslední vydání (v1.2.1) má na releasu pouze kostky-*. Do otagování v1.2.2 tedy `update` ani čerstvá instalace nemají co stáhnout. Merge a tag patří k sobě. Ověřeno v debianím kontejneru: čistá instalace, druhé spuštění za sebou, a vydání bez nových jmen spadne se srozumitelnou hláškou místo toho, aby sáhlo po starém. Binárka postavená lokálně zakládá databázi v …/dice-counter/ a starou vedle sebe ignoruje. 118 testů. Closes #19 --- .gitea/workflows/binarka.yml | 11 ++---- .github/workflows/binarky.yml | 16 ++------- README.md | 15 -------- deploy/pve-dice-counter.sh | 64 +++-------------------------------- deploy/pve-kostky.sh | 23 ------------- storage.py | 19 ++--------- tests/test_storage.py | 22 ------------ 7 files changed, 14 insertions(+), 156 deletions(-) delete mode 100755 deploy/pve-kostky.sh diff --git a/.gitea/workflows/binarka.yml b/.gitea/workflows/binarka.yml index d5e8a61..193b346 100644 --- a/.gitea/workflows/binarka.yml +++ b/.gitea/workflows/binarka.yml @@ -93,9 +93,6 @@ jobs: env: TOKEN: ${{ secrets.GITHUB_TOKEN }} ASSET: dice-counter-linux-x86_64 - # Instalátory z dřívějška si chodí pro staré jméno. Až budou - # přemigrované, přestane se pod ním věšet. - STARY_ASSET: kostky-linux-x86_64 run: | api="${GITHUB_SERVER_URL}/api/v1/repos/${GITHUB_REPOSITORY}" auth="Authorization: token ${TOKEN}" @@ -113,12 +110,10 @@ jobs: # Součet se počítá nad jménem, pod kterým se soubor stahuje, aby # šel ověřit rovnou: sha256sum -c dice-counter-linux-x86_64.sha256 - for jmeno in "$ASSET" "$STARY_ASSET"; do - cp dist/dice-counter "$jmeno" - sha256sum "$jmeno" | tee "$jmeno.sha256" - done + cp dist/dice-counter "$ASSET" + sha256sum "$ASSET" | tee "$ASSET.sha256" - for file in "$ASSET" "$ASSET.sha256" "$STARY_ASSET" "$STARY_ASSET.sha256"; do + for file in "$ASSET" "$ASSET.sha256"; do # Aby se dal build zopakovat, stará příloha stejného jména jde pryč. curl -s -H "$auth" "$api/releases/$id/assets" \ | python3 -c 'import json,sys; [print(a["id"]) for a in json.load(sys.stdin) if a["name"] == sys.argv[1]]' "$file" \ diff --git a/.github/workflows/binarky.yml b/.github/workflows/binarky.yml index e845a90..d698d1d 100644 --- a/.github/workflows/binarky.yml +++ b/.github/workflows/binarky.yml @@ -29,25 +29,18 @@ jobs: strategy: fail-fast: false matrix: - # `stary` je jméno, pod kterým se příloha věšela do vydání 1.2.x. - # Instalátory z té doby si chodí pro něj, tak se pověsí obojí. - # Až budou přemigrované, sloupec zmizí. include: - os: windows-latest asset: dice-counter-windows-x86_64.exe - stary: kostky-windows-x86_64.exe built: dist/dice-counter.exe - os: macos-15-intel # Intel; macos-13 GitHub zrušil asset: dice-counter-macos-x86_64 - stary: kostky-macos-x86_64 built: dist/dice-counter - os: macos-latest # Apple Silicon asset: dice-counter-macos-arm64 - stary: kostky-macos-arm64 built: dist/dice-counter - os: ubuntu-24.04-arm # pro Raspberry Pi a spol. asset: dice-counter-linux-arm64 - stary: kostky-linux-arm64 built: dist/dice-counter runs-on: ${{ matrix.os }} @@ -104,7 +97,6 @@ jobs: env: TOKEN: ${{ secrets.GITEA_TOKEN }} ASSET: ${{ matrix.asset }} - STARY_ASSET: ${{ matrix.stary }} run: | api="$GITEA/api/v1/repos/$GITEA_REPO" auth="Authorization: token $TOKEN" @@ -133,12 +125,10 @@ jobs: # Součet se počítá nad jménem, pod kterým se soubor stahuje, aby # šel ověřit rovnou: shasum -a 256 -c dice-counter-macos-arm64.sha256 - for jmeno in "$ASSET" "$STARY_ASSET"; do - cp "${{ matrix.built }}" "$jmeno" - soucet "$jmeno" | tee "$jmeno.sha256" - done + cp "${{ matrix.built }}" "$ASSET" + soucet "$ASSET" | tee "$ASSET.sha256" - for file in "$ASSET" "$ASSET.sha256" "$STARY_ASSET" "$STARY_ASSET.sha256"; do + for file in "$ASSET" "$ASSET.sha256"; do # Aby se dal build zopakovat, stará příloha stejného jména jde pryč. curl -s -H "$auth" "$api/releases/$id/assets" \ | json 'import json,sys; [print(a["id"]) for a in json.load(sys.stdin) if a["name"] == sys.argv[1]]' "$file" \ diff --git a/README.md b/README.md index 66782e4..6b5b658 100644 --- a/README.md +++ b/README.md @@ -93,10 +93,6 @@ server vypíše při startu. | binárkou na Windows | `%LOCALAPPDATA%\dice-counter\dice.db` | | ze zdrojáků | `dice.db` v pracovním adresáři | -Do vydání 1.2.x se adresář jmenoval `kostky`. Kdo databázi po staru má, o ni -nepřijde — dokud nová neexistuje, používá se dál ta stará. Přesunout se dá -kdykoli ručně, přejmenováním adresáře. - Binárka se při každém spuštění rozbaluje do dočasného adresáře a pouští se odkudkoli, takže relativní cesta by databázi rozsypala po disku — proto napevno domovský adresář. Ze zdrojáků zůstává relativní, ať se dá mít víc @@ -174,13 +170,6 @@ Obojí vymění binárku za poslední vydání a službu restartuje; databáze z Příkaz `update` si přitom obnoví i sám sebe — instalátor bere z větve `main`, takže jede na nejnovější verzi skriptu, ne na té, se kterou se instalovalo. -Kontejnery založené do vydání 1.2.x se při první aktualizaci přejmenují ze -starého `kostky`: služba, uživatel i cesty dostanou nová jména a databáze se -přestěhuje z `/var/lib/kostky` do `/var/lib/dice-counter`. Dělá se to samo -a stačí na to obyčejný `update`; historie her zůstává. Původní adresa skriptu -(`deploy/pve-kostky.sh`) proto ještě chvíli funguje — jen přesměrovává na -novou. - Do konzole kontejneru se dostaneš přímo z webu Proxmoxu, **žádné jméno ani heslo se nezadává** — kontejner root heslo nemá a konzole se přihlašuje sama. Nová práva to nikomu nedává: kdo se dostane do webu Proxmoxu, má root na uzlu @@ -380,10 +369,6 @@ ověřit: sha256sum -c dice-counter-linux-x86_64.sha256 # na macOS: shasum -a 256 -c ``` -Do vydání 1.2.x se přílohy jmenovaly `kostky-*`. Ještě chvíli se budou věšet -pod oběma jmény, ať fungují instalace, které si o ně říkají po staru. Až budou -přemigrované, zůstane jen `dice-counter-*`. - Nad pull requesty se Linux staví taky, jen se nikam nevěší. Totéž platí pro kontejnerový image — doma se nad každým PR postaví a zkusí nastartovat (`.gitea/workflows/image.yml`), publikuje se ale až z tagu na GitHubu. diff --git a/deploy/pve-dice-counter.sh b/deploy/pve-dice-counter.sh index d5f280b..0a29fa5 100755 --- a/deploy/pve-dice-counter.sh +++ b/deploy/pve-dice-counter.sh @@ -84,20 +84,13 @@ HOME_DIR=/opt/dice-counter DATA_DIR=/var/lib/dice-counter SERVICE=dice-counter -# Do vydání 1.2.x se všechno jmenovalo kostky. Instalace z té doby se při -# aktualizaci přestěhují; až budou přemigrované, tenhle blok zmizí. -STARY_USER=kostky -STARY_HOME=/opt/kostky -STARY_DATA=/var/lib/kostky -STARA_SLUZBA=kostky - msg() { echo -e "\e[1;34m →\e[0m $*"; } ok() { echo -e "\e[1;32m ✓\e[0m $*"; } die() { echo -e "\e[1;31m ✗\e[0m $*" >&2; exit 1; } case "$(dpkg --print-architecture)" in - amd64) PLATFORMA=linux-x86_64 ;; - arm64) PLATFORMA=linux-arm64 ;; + amd64) ASSET=dice-counter-linux-x86_64 ;; + arm64) ASSET=dice-counter-linux-arm64 ;; *) die "Pro architekturu $(dpkg --print-architecture) binárka není." ;; esac @@ -114,22 +107,15 @@ if [ -z "$VERSION" ]; then | grep -o '"tag_name":[[:space:]]*"[^"]*"' | head -1 | cut -d'"' -f4) [ -n "$VERSION" ] || die "Nepodařilo se zjistit poslední verzi z $GITEA." fi -ok "Instaluje se $VERSION pro $PLATFORMA" +ok "Instaluje se $VERSION ($ASSET)" BASE="$GITEA/$REPO/releases/download/$VERSION" TMP=$(mktemp -d) trap 'rm -rf "$TMP"' EXIT msg "Stahuji binárku" -# Do vydání 1.2.x se přílohy jmenovaly kostky-*. Starší vydání se tak dají -# nainstalovat dál; až stará jména z releasů zmizí, zůstane jen to první. -ASSET="" -for jmeno in "dice-counter-$PLATFORMA" "kostky-$PLATFORMA"; do - curl -fsSL -o "$TMP/$jmeno" "$BASE/$jmeno" 2>/dev/null && { ASSET="$jmeno"; break; } -done -[ -n "$ASSET" ] \ - || die "Binárka pro $PLATFORMA ve vydání $VERSION není. Pro tuhle architekturu možná ještě nevyšla." - +curl -fsSL -o "$TMP/$ASSET" "$BASE/$ASSET" \ + || die "$ASSET pro $VERSION na releasu není. Vydání pro tuhle architekturu možná ještě neproběhlo." curl -fsSL -o "$TMP/$ASSET.sha256" "$BASE/$ASSET.sha256" \ || die "Chybí kontrolní součet — radši nic neinstaluju." @@ -143,38 +129,6 @@ id -u "$USER_NAME" >/dev/null 2>&1 \ install -d -o root -g root -m 755 "$HOME_DIR" -# Instalace z doby, kdy se všechno jmenovalo kostky, se tady převezme. Bez -# přestěhování databáze by po aktualizaci zmizela historie her, takže se to -# nedá odbýt smazáním staré služby. -# -# Starý domovský adresář se maže až úplně na konci skriptu: při aktualizaci -# běžícího kontejneru se instalátor pouští právě z něj a `$0` z něj ještě -# potřebujeme zkopírovat na nové místo. -if [ -f "/etc/systemd/system/$STARA_SLUZBA.service" ] \ - || [ -d "$STARY_HOME" ] || [ -d "$STARY_DATA" ]; then - msg "Našel jsem instalaci pod starým jménem, stěhuji ji" - - systemctl is-active --quiet "$STARA_SLUZBA" && systemctl stop "$STARA_SLUZBA" - systemctl disable --quiet "$STARA_SLUZBA" 2>/dev/null || true - rm -f "/etc/systemd/system/$STARA_SLUZBA.service" - systemctl daemon-reload - - # Když nový adresář z nějakého důvodu už existuje, starý se nechá být. - # Přepsat cizí databázi je horší než nechat po sobě adresář navíc. - if [ -d "$STARY_DATA" ] && [ ! -e "$DATA_DIR" ]; then - mv "$STARY_DATA" "$DATA_DIR" - ok "Databáze přestěhována do $DATA_DIR" - elif [ -d "$STARY_DATA" ]; then - msg "$DATA_DIR už existuje, $STARY_DATA nechávám na místě" - fi - - id -u "$STARY_USER" >/dev/null 2>&1 && userdel "$STARY_USER" 2>/dev/null || true -fi - -# Po stěhování patří soubory uživateli, který už neexistuje. StateDirectory -# to u založeného adresáře nedorovná, tak se to udělá rovnou tady. -[ -d "$DATA_DIR" ] && chown -R "$USER_NAME:$USER_NAME" "$DATA_DIR" - # Zastavit se dá jen to, co běží — při první instalaci služba ještě není. if systemctl is-active --quiet "$SERVICE"; then systemctl stop "$SERVICE" @@ -273,14 +227,6 @@ UPDATE chmod 755 /usr/bin/update ok "Aktualizovat půjde příkazem: update" -# Teď už je `$0` zkopírovaný na nové místo a starý domov nikdo nepotřebuje. -# Bash si drží otevřený popisovač na skript, takže smazat se dá i ten, který -# se zrovna vykonává. -if [ -d "$STARY_HOME" ]; then - rm -rf "$STARY_HOME" - ok "Staré $STARY_HOME uklizeno" -fi - msg "Čekám, až začne odpovídat" for _ in $(seq 30); do curl -fsS -o /dev/null "http://127.0.0.1:$PORT/" 2>/dev/null && break diff --git a/deploy/pve-kostky.sh b/deploy/pve-kostky.sh deleted file mode 100755 index b9ad019..0000000 --- a/deploy/pve-kostky.sh +++ /dev/null @@ -1,23 +0,0 @@ -#!/usr/bin/env bash -# Skript se přejmenoval na deploy/pve-dice-counter.sh. -# -# Tenhle soubor tu zůstává schválně. Příkaz `update` v už založených -# kontejnerech si instalátor stahuje z téhle adresy — kdyby zmizela, -# aktualizace by u nich přestala fungovat dřív, než se stihnou přemigrovat. -# Až se tak stane, zmizí i tenhle soubor. -# -# Předává se všechno beze změny, včetně argumentů a proměnných prostředí. -# Na stdout nesmí přibýt ani řádek navíc: starý `update` si sem chodí pro -# `instalator` a výstup rovnou kontroluje přes `bash -n`. -set -euo pipefail - -GITEA="${GITEA:-https://gitea.spacilovi.eu}" -REPO="${REPO:-david-spacil/dice-counter}" - -NOVY=$(mktemp) -trap 'rm -f "$NOVY"' EXIT - -curl -fsSL "$GITEA/$REPO/raw/branch/main/deploy/pve-dice-counter.sh" -o "$NOVY" \ - || { echo "Skript se přesunul do deploy/pve-dice-counter.sh, ale nejde stáhnout." >&2; exit 1; } - -bash "$NOVY" "$@" diff --git a/storage.py b/storage.py index a77eea2..0710b25 100644 --- a/storage.py +++ b/storage.py @@ -27,14 +27,6 @@ def data_home() -> Path: or Path.home() / ".local" / "share") -APP_DIR = "dice-counter" - -# Do vydání 1.2.x se adresář jmenoval jinak. Kdo má databázi po staru, o ni -# přejmenováním nepřijde — použije se dál. Až se stará jména přestanou -# podporovat, zmizí i tohle. -STARY_APP_DIR = "kostky" - - def default_db() -> Path: """Kam se ukládá databáze. @@ -46,14 +38,9 @@ def default_db() -> Path: chosen = os.environ.get("DICE_DB") if chosen: return Path(chosen) - if not getattr(sys, "frozen", False): - return Path("dice.db") - - nova = data_home() / APP_DIR / "dice.db" - stara = data_home() / STARY_APP_DIR / "dice.db" - if not nova.exists() and stara.exists(): - return stara - return nova + if getattr(sys, "frozen", False): + return data_home() / "dice-counter" / "dice.db" + return Path("dice.db") DB_PATH = default_db() diff --git a/tests/test_storage.py b/tests/test_storage.py index f456914..1cbf746 100644 --- a/tests/test_storage.py +++ b/tests/test_storage.py @@ -155,28 +155,6 @@ def test_umisteni_databaze_z_binarky(monkeypatch, tmp_path): assert storage.default_db() == tmp_path / "dice-counter" / "dice.db" -def test_umisteni_databaze_po_starem(monkeypatch, tmp_path): - """Kdo má databázi pod starým jménem, o ni přejmenováním nepřijde.""" - monkeypatch.delenv("DICE_DB", raising=False) - monkeypatch.setattr(storage.sys, "frozen", True, raising=False) - monkeypatch.setattr(storage.sys, "platform", "linux") - monkeypatch.setenv("XDG_DATA_HOME", str(tmp_path)) - - stara = tmp_path / "kostky" / "dice.db" - stara.parent.mkdir() - stara.touch() - - assert storage.default_db() == stara - - # Jakmile nová existuje, stará se ignoruje — jinak by se dvě databáze - # přetahovaly o to, která platí. - nova = tmp_path / "dice-counter" / "dice.db" - nova.parent.mkdir() - nova.touch() - - assert storage.default_db() == nova - - def test_data_home_podle_systemu(monkeypatch, tmp_path): """Každý systém má svůj adresář na data; XDG je jen ten linuxový.""" monkeypatch.setenv("LOCALAPPDATA", str(tmp_path / "AppData" / "Local")) -- 2.47.3