mirror of
https://github.com/pepaskopec-blip/Graduately.git
synced 2026-10-27 15:14:35 +00:00
Fix Forgejo mirror path and document the full reading-list release.
Point the CI mirror at edu/, force-push both branches, refresh README/changelog, and add make smoke for installer and builds checks. Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
parent
a9ce04bb3b
commit
ffba2b980c
8 changed files with 130 additions and 18 deletions
17
.github/workflows/build.yml
vendored
17
.github/workflows/build.yml
vendored
|
|
@ -263,6 +263,7 @@ jobs:
|
||||||
env:
|
env:
|
||||||
FORGEJO_TOKEN: ${{ secrets.FORGEJO_TOKEN }}
|
FORGEJO_TOKEN: ${{ secrets.FORGEJO_TOKEN }}
|
||||||
FORGEJO_USER: ${{ secrets.FORGEJO_USER }}
|
FORGEJO_USER: ${{ secrets.FORGEJO_USER }}
|
||||||
|
FORGEJO_URL: ${{ secrets.FORGEJO_URL }}
|
||||||
run: |
|
run: |
|
||||||
git config user.name "github-actions[bot]"
|
git config user.name "github-actions[bot]"
|
||||||
git config user.email "41898282+github-actions[bot]@users.noreply.github.com"
|
git config user.email "41898282+github-actions[bot]@users.noreply.github.com"
|
||||||
|
|
@ -281,16 +282,16 @@ jobs:
|
||||||
echo "No FORGEJO_TOKEN; skipping Forgejo builds publish."
|
echo "No FORGEJO_TOKEN; skipping Forgejo builds publish."
|
||||||
exit 0
|
exit 0
|
||||||
fi
|
fi
|
||||||
# Trim and fall back: an empty FORGEJO_USER secret is still "set", so
|
# Prefer Basic auth over URL userinfo so tokens with @/: never
|
||||||
# ${VAR:-oauth2} would keep "" and produce https://:token@host which
|
# break the URL. Force-push: this is a one-way GitHub → Forgejo
|
||||||
# libcurl rejects as "Bad hostname". Prefer Basic auth over URL userinfo
|
# mirror (repo moved to edu/; non-ff rejects otherwise).
|
||||||
# so tokens with @/: never break the URL either.
|
|
||||||
token="$(printf '%s' "$FORGEJO_TOKEN" | tr -d '\r\n')"
|
token="$(printf '%s' "$FORGEJO_TOKEN" | tr -d '\r\n')"
|
||||||
user="$(printf '%s' "${FORGEJO_USER:-}" | tr -d '\r\n')"
|
user="$(printf '%s' "${FORGEJO_USER:-}" | tr -d '\r\n')"
|
||||||
user="${user:-oauth2}"
|
user="${user:-oauth2}"
|
||||||
basic="$(printf '%s:%s' "$user" "$token" | base64 -w0)"
|
basic="$(printf '%s:%s' "$user" "$token" | base64 -w0)"
|
||||||
|
forgejo_url="${FORGEJO_URL:-https://git.dvorakmortonxd.dev/edu/maturita.c.git}"
|
||||||
git -c "http.extraHeader=Authorization: Basic ${basic}" push -f \
|
git -c "http.extraHeader=Authorization: Basic ${basic}" push -f \
|
||||||
"https://git.dvorakmortonxd.dev/skopcaak/maturita.c.git" \
|
"$forgejo_url" \
|
||||||
HEAD:refs/heads/builds
|
HEAD:refs/heads/builds
|
||||||
|
|
||||||
forgejo-main:
|
forgejo-main:
|
||||||
|
|
@ -304,6 +305,7 @@ jobs:
|
||||||
env:
|
env:
|
||||||
FORGEJO_TOKEN: ${{ secrets.FORGEJO_TOKEN }}
|
FORGEJO_TOKEN: ${{ secrets.FORGEJO_TOKEN }}
|
||||||
FORGEJO_USER: ${{ secrets.FORGEJO_USER }}
|
FORGEJO_USER: ${{ secrets.FORGEJO_USER }}
|
||||||
|
FORGEJO_URL: ${{ secrets.FORGEJO_URL }}
|
||||||
run: |
|
run: |
|
||||||
set -euo pipefail
|
set -euo pipefail
|
||||||
token="$(printf '%s' "${FORGEJO_TOKEN:-}" | tr -d '\r\n')"
|
token="$(printf '%s' "${FORGEJO_TOKEN:-}" | tr -d '\r\n')"
|
||||||
|
|
@ -314,6 +316,7 @@ jobs:
|
||||||
user="$(printf '%s' "${FORGEJO_USER:-}" | tr -d '\r\n')"
|
user="$(printf '%s' "${FORGEJO_USER:-}" | tr -d '\r\n')"
|
||||||
user="${user:-oauth2}"
|
user="${user:-oauth2}"
|
||||||
basic="$(printf '%s:%s' "$user" "$token" | base64 -w0)"
|
basic="$(printf '%s:%s' "$user" "$token" | base64 -w0)"
|
||||||
git -c "http.extraHeader=Authorization: Basic ${basic}" push \
|
forgejo_url="${FORGEJO_URL:-https://git.dvorakmortonxd.dev/edu/maturita.c.git}"
|
||||||
"https://git.dvorakmortonxd.dev/skopcaak/maturita.c.git" \
|
git -c "http.extraHeader=Authorization: Basic ${basic}" push -f \
|
||||||
|
"$forgejo_url" \
|
||||||
HEAD:refs/heads/main
|
HEAD:refs/heads/main
|
||||||
|
|
|
||||||
6
Makefile
6
Makefile
|
|
@ -114,6 +114,10 @@ installer-zips:
|
||||||
chmod +x installers/pack-installer-zips.sh
|
chmod +x installers/pack-installer-zips.sh
|
||||||
./installers/pack-installer-zips.sh
|
./installers/pack-installer-zips.sh
|
||||||
|
|
||||||
|
smoke:
|
||||||
|
chmod +x scripts/smoke-platforms.sh
|
||||||
|
./scripts/smoke-platforms.sh
|
||||||
|
|
||||||
-include $(DEP)
|
-include $(DEP)
|
||||||
|
|
||||||
android:
|
android:
|
||||||
|
|
@ -128,4 +132,4 @@ macos:
|
||||||
chmod +x scripts/bundle-macos-swift.sh
|
chmod +x scripts/bundle-macos-swift.sh
|
||||||
./scripts/bundle-macos-swift.sh
|
./scripts/bundle-macos-swift.sh
|
||||||
|
|
||||||
.PHONY: all clean run bundle installer-zips android ios macos
|
.PHONY: all clean run bundle installer-zips smoke android ios macos
|
||||||
|
|
|
||||||
18
README.md
18
README.md
|
|
@ -67,7 +67,7 @@ Intel Mac, jiná architektura nebo úpravy kódu → [sestavení ze zdroje](#ses
|
||||||
ročníky 2–4 jsou zamčené
|
ročníky 2–4 jsou zamčené
|
||||||
- **Technické vybavení** — 3 lekce (architektura, historie, bit/byte)
|
- **Technické vybavení** — 3 lekce (architektura, historie, bit/byte)
|
||||||
- **Český jazyk a literatura** — mluvnice (20 cvičení) a maturitní četba
|
- **Český jazyk a literatura** — mluvnice (20 cvičení) a maturitní četba
|
||||||
(1984, Spalovač mrtvol); literatura je zatím zamčená
|
(82 knih: zápisky, kvíz, sestavení děje); literární teorie je zatím zamčená
|
||||||
- statistiky, hledání (lupa nebo `Cmd/Ctrl+K`), 10 témat, tmavý/světlý režim, čeština/angličtina
|
- statistiky, hledání (lupa nebo `Cmd/Ctrl+K`), 10 témat, tmavý/světlý režim, čeština/angličtina
|
||||||
- ukončení: `Cmd/Super+Q` nebo `Alt+F4`
|
- ukončení: `Cmd/Super+Q` nebo `Alt+F4`
|
||||||
|
|
||||||
|
|
@ -115,6 +115,7 @@ Na Linuxu a Windows:
|
||||||
make
|
make
|
||||||
make run # nebo ./maturita
|
make run # nebo ./maturita
|
||||||
make bundle # AppImage / Windows složka s DLL
|
make bundle # AppImage / Windows složka s DLL
|
||||||
|
make smoke # instalátory, content packs, dostupnost builds
|
||||||
```
|
```
|
||||||
|
|
||||||
Volitelně CMake (GTK): `cmake -S . -B build && cmake --build build`.
|
Volitelně CMake (GTK): `cmake -S . -B build && cmake --build build`.
|
||||||
|
|
@ -156,11 +157,11 @@ src/ C zdroje (GTK přehrávač pro Linux a Windows)
|
||||||
android/ Jetpack Compose přehrávač (stejný obsah)
|
android/ Jetpack Compose přehrávač (stejný obsah)
|
||||||
ios/ SwiftUI přehrávač (stejný obsah)
|
ios/ SwiftUI přehrávač (stejný obsah)
|
||||||
macos/ nativní SwiftUI aplikace pro Mac (stejný obsah)
|
macos/ nativní SwiftUI aplikace pro Mac (stejný obsah)
|
||||||
data/ style.css, share/, podpisy, Windows .rc
|
data/ style.css, changelog.txt, share/, cetba/*.json
|
||||||
assets/ zdrojová ikona a screenshoty
|
assets/ zdrojová ikona a screenshoty
|
||||||
installers/ instalátory, které stáhnou aktuální build
|
installers/ instalátory, které stáhnou aktuální build
|
||||||
scripts/ balení AppImage, .app, IPA a extract-android-content.py
|
scripts/ balení AppImage, .app, IPA, extract a smoke test
|
||||||
.github/workflows/ CI: push na main → větev builds
|
.github/workflows/ CI: push na main → větev builds (+ zrcadlo Forgejo)
|
||||||
progress/ vzniká za běhu (cvičení, nastavení)
|
progress/ vzniká za běhu (cvičení, nastavení)
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
@ -260,7 +261,7 @@ Intel Mac, another architecture, or hacking on the code →
|
||||||
years 2–4 are locked
|
years 2–4 are locked
|
||||||
- **Computer hardware** — 3 lessons (architecture, history, bit/byte)
|
- **Computer hardware** — 3 lessons (architecture, history, bit/byte)
|
||||||
- **Czech language** — grammar (20 exercises) and required reading
|
- **Czech language** — grammar (20 exercises) and required reading
|
||||||
(1984, Spalovač mrtvol); literature theory is still locked
|
(82 books: notes, quiz, plot ordering); literature theory is still locked
|
||||||
- statistics, search (magnifier or `Cmd/Ctrl+K`), 10 palettes, dark/light mode, Czech/English
|
- statistics, search (magnifier or `Cmd/Ctrl+K`), 10 palettes, dark/light mode, Czech/English
|
||||||
- quit with `Cmd/Super+Q` or `Alt+F4`
|
- quit with `Cmd/Super+Q` or `Alt+F4`
|
||||||
|
|
||||||
|
|
@ -308,6 +309,7 @@ On Linux and Windows:
|
||||||
make
|
make
|
||||||
make run # or ./maturita
|
make run # or ./maturita
|
||||||
make bundle # AppImage / Windows DLL folder
|
make bundle # AppImage / Windows DLL folder
|
||||||
|
make smoke # installers, content packs, builds availability
|
||||||
```
|
```
|
||||||
|
|
||||||
Optional CMake (GTK): `cmake -S . -B build && cmake --build build`.
|
Optional CMake (GTK): `cmake -S . -B build && cmake --build build`.
|
||||||
|
|
@ -349,11 +351,11 @@ src/ C sources (GTK player for Linux and Windows)
|
||||||
android/ Jetpack Compose player (same content)
|
android/ Jetpack Compose player (same content)
|
||||||
ios/ SwiftUI player (same content)
|
ios/ SwiftUI player (same content)
|
||||||
macos/ native SwiftUI Mac app (same content)
|
macos/ native SwiftUI Mac app (same content)
|
||||||
data/ style.css, share/, signing files, Windows .rc
|
data/ style.css, changelog.txt, share/, cetba/*.json
|
||||||
assets/ source icon and screenshots
|
assets/ source icon and screenshots
|
||||||
installers/ fetch-the-latest installers
|
installers/ fetch-the-latest installers
|
||||||
scripts/ AppImage / .app / IPA bundlers and extract-android-content.py
|
scripts/ AppImage / .app / IPA bundlers, extract, smoke test
|
||||||
.github/workflows/ CI: push to main → builds branch
|
.github/workflows/ CI: push to main → builds branch (+ Forgejo mirror)
|
||||||
progress/ created at runtime (exercises, settings)
|
progress/ created at runtime (exercises, settings)
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -9,14 +9,18 @@
|
||||||
--- 2026-09-23
|
--- 2026-09-23
|
||||||
cs: Aplikace se jmenuje Graduately; úvod stále říká „Maturita? To dáme.“
|
cs: Aplikace se jmenuje Graduately; úvod stále říká „Maturita? To dáme.“
|
||||||
cs: Kompletní maturitní četba (82 knih) se zápisky, kvízem a sestavením děje
|
cs: Kompletní maturitní četba (82 knih) se zápisky, kvízem a sestavením děje
|
||||||
cs: Přehlednější studium knih: nejdřív zápisky, pak procvičení
|
cs: Studium knih: nejdřív procvičení (kvíz / sestavte děj), pak zápisky
|
||||||
|
cs: Kvíz a sestavení děje u všech knih i na GTK (Linux / Windows)
|
||||||
cs: Větší a čitelnější rozhraní na Macu
|
cs: Větší a čitelnější rozhraní na Macu
|
||||||
cs: Opravy výběru slov v dialogu a otevření knihy z vyhledávání
|
cs: Opravy výběru slov v dialogu a otevření knihy z vyhledávání
|
||||||
|
cs: Oprava zrcadlení na Forgejo (nová cesta edu/, force-push zrcadla)
|
||||||
en: The app is now Graduately; the welcome line still says “Maturita? We've got this.”
|
en: The app is now Graduately; the welcome line still says “Maturita? We've got this.”
|
||||||
en: Full maturita reading list (82 books) with notes, quiz, and plot ordering
|
en: Full maturita reading list (82 books) with notes, quiz, and plot ordering
|
||||||
en: Clearer book study flow: notes first, then practice
|
en: Book study flow: practice first (quiz / order the plot), then notes
|
||||||
|
en: Quiz and plot assembly for every book on GTK too (Linux / Windows)
|
||||||
en: Larger, more readable Mac interface
|
en: Larger, more readable Mac interface
|
||||||
en: Fixes for dialogue word picking and opening a book from search
|
en: Fixes for dialogue word picking and opening a book from search
|
||||||
|
en: Forgejo mirror fix (edu/ path, force-push mirror)
|
||||||
|
|
||||||
--- 2026-09-18
|
--- 2026-09-18
|
||||||
cs: Po aktualizaci se na hlavní stránce ukáže, co je nového
|
cs: Po aktualizaci se na hlavní stránce ukáže, co je nového
|
||||||
|
|
|
||||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
99
scripts/smoke-platforms.sh
Executable file
99
scripts/smoke-platforms.sh
Executable file
|
|
@ -0,0 +1,99 @@
|
||||||
|
#!/usr/bin/env bash
|
||||||
|
# Local smoke checks for installers, content packs, and published builds.
|
||||||
|
# Does not replace CI; catches packaging / content regressions early.
|
||||||
|
set -euo pipefail
|
||||||
|
|
||||||
|
ROOT="$(cd "$(dirname "$0")/.." && pwd)"
|
||||||
|
cd "$ROOT"
|
||||||
|
REPO="${REPO:-pepaskopec-blip/maturita.c}"
|
||||||
|
fail=0
|
||||||
|
|
||||||
|
say() { printf '==> %s\n' "$*"; }
|
||||||
|
ok() { printf ' ok: %s\n' "$*"; }
|
||||||
|
bad() { printf ' FAIL: %s\n' "$*" >&2; fail=1; }
|
||||||
|
|
||||||
|
say "Rebuild installer zips"
|
||||||
|
chmod +x installers/pack-installer-zips.sh
|
||||||
|
./installers/pack-installer-zips.sh
|
||||||
|
ok "installer zips refreshed"
|
||||||
|
|
||||||
|
say "Installer zip contents"
|
||||||
|
expect_zip() {
|
||||||
|
local zip=$1 want=$2
|
||||||
|
if unzip -Z1 "$zip" | grep -qxF "$want"; then
|
||||||
|
ok "$zip → $want"
|
||||||
|
else
|
||||||
|
bad "$zip missing $want (has: $(unzip -Z1 "$zip" | tr '\n' ' '))"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
expect_zip installers/maturita-installer-macos.zip "Nainstalovat Graduately.app/Contents/MacOS/installer"
|
||||||
|
expect_zip installers/maturita-installer-linux.zip "maturita-installer-linux.sh"
|
||||||
|
expect_zip installers/maturita-installer-windows.zip "maturita-installer-windows.cmd"
|
||||||
|
expect_zip installers/maturita-installer-android.zip "Stahnout Graduately.html"
|
||||||
|
expect_zip installers/maturita-installer-ios.zip "Jak nainstalovat Graduately.html"
|
||||||
|
|
||||||
|
say "Extract content.json"
|
||||||
|
tmp=$(mktemp)
|
||||||
|
python3 scripts/extract-android-content.py --out "$tmp" >/dev/null
|
||||||
|
python3 - "$tmp" <<'PY'
|
||||||
|
import json, sys
|
||||||
|
path = sys.argv[1]
|
||||||
|
d = json.load(open(path, encoding="utf-8"))
|
||||||
|
books = d.get("books") or []
|
||||||
|
assert len(books) == 82, f"expected 82 books, got {len(books)}"
|
||||||
|
for b in books:
|
||||||
|
bid = b.get("id")
|
||||||
|
assert b.get("quiz"), f"{bid}: empty quiz"
|
||||||
|
assert b.get("plot"), f"{bid}: empty plot"
|
||||||
|
assert b.get("notes"), f"{bid}: empty notes"
|
||||||
|
assert b.get("quizTitle"), f"{bid}: missing quizTitle"
|
||||||
|
assert b.get("plotTitle"), f"{bid}: missing plotTitle"
|
||||||
|
assert d.get("changelog"), "changelog missing from content.json"
|
||||||
|
print(f"books={len(books)} changelog={len(d['changelog'])}")
|
||||||
|
PY
|
||||||
|
ok "content packs"
|
||||||
|
rm -f "$tmp"
|
||||||
|
|
||||||
|
say "GTK binary"
|
||||||
|
if [[ -x ./maturita ]]; then
|
||||||
|
./maturita --help >/dev/null
|
||||||
|
ok "maturita --help"
|
||||||
|
else
|
||||||
|
say "Building GTK binary"
|
||||||
|
make -j"$(sysctl -n hw.ncpu 2>/dev/null || nproc 2>/dev/null || echo 2)"
|
||||||
|
./maturita --help >/dev/null
|
||||||
|
ok "maturita --help after make"
|
||||||
|
fi
|
||||||
|
|
||||||
|
say "Published builds tip"
|
||||||
|
sha=$(curl -fsSL --max-time 20 \
|
||||||
|
"https://github.com/$REPO/commits/builds.atom" |
|
||||||
|
sed -n 's/.*Commit\/\([0-9a-f]\{40\}\).*/\1/p' |
|
||||||
|
head -n 1)
|
||||||
|
if [[ ${#sha} -eq 40 ]]; then
|
||||||
|
ok "builds tip ${sha:0:7}"
|
||||||
|
for asset in \
|
||||||
|
maturita-macos-arm64.zip \
|
||||||
|
maturita-windows-x64.zip \
|
||||||
|
maturita-linux-x86_64.AppImage \
|
||||||
|
maturita-android.apk \
|
||||||
|
maturita-ios.ipa \
|
||||||
|
VERSION
|
||||||
|
do
|
||||||
|
code=$(curl -sI -o /dev/null -w '%{http_code}' --max-time 30 \
|
||||||
|
"https://raw.githubusercontent.com/$REPO/$sha/$asset")
|
||||||
|
if [[ "$code" == "200" ]]; then
|
||||||
|
ok "$asset ($code)"
|
||||||
|
else
|
||||||
|
bad "$asset HTTP $code"
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
else
|
||||||
|
bad "could not resolve builds tip SHA"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [[ "$fail" -ne 0 ]]; then
|
||||||
|
echo "smoke failed" >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
echo "smoke passed"
|
||||||
Loading…
Add table
Add a link
Reference in a new issue