From 483f80e032ecb63f86be3df8ee3281313483602e Mon Sep 17 00:00:00 2001 From: Ramon Date: Thu, 6 Aug 2026 22:10:42 +0200 Subject: [PATCH] feat(repos): branch van een app-repo tonen en wijzigen MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Sjablonen komen uit de git-cache van een app-repo, niet uit het image. Welke branch die volgt was nergens te zien en alleen te wijzigen door de repo te verwijderen en opnieuw toe te voegen — waarbij de id een volgnummer krijgt en het bronsjabloon van bestaande apps onvindbaar wordt. - PUT /api/repos/ past naam, branch, submap en optioneel de URL aan; de id blijft staan zodat .serverup.json van bestaande stacks blijft kloppen. - Een leeg tokenveld laat het bestaande token staan. - De repolijst toont de branch en heeft een bewerkknop; na opslaan wordt de repo meteen opnieuw opgehaald. - Nieuwe auditactie 'edit' vertaald in nl en en. Co-Authored-By: Claude Opus 5 Claude-Session: https://claude.ai/code/session_01H9Vcwu7owJZ3nj5dCf4VFT --- CHANGELOG.md | 16 +++++++ VERSION | 2 +- server-up/app.py | 43 +++++++++++++++++++ server-up/templates/index.html | 44 +++++++++++++++++++ server-up/translations/en.json | 3 ++ server-up/translations/nl.json | 3 ++ tests/test_repo_urls.py | 77 ++++++++++++++++++++++++++++++++++ 7 files changed, 187 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ad17957..bfa36cd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,19 @@ +# v0.8.23-beta — De branch van een repo is te zien en te wijzigen + +Sjablonen komen uit de git-cache van een app-repo, niet uit het image van +Server Up. Welke branch die repo volgt was nergens te zien, en alleen te +veranderen door de repo te verwijderen en opnieuw toe te voegen. De id wordt +dan uit de URL afgeleid en krijgt er een volgnummer bij zodra hij al bestaat — +en juist die id staat in de metadata van elke app uit die repo. Overstappen +maakte zo stilzwijgend het bronsjabloon van je apps onvindbaar. + +- **De branch staat in de lijst.** Zo is te zien waarom een app een oudere + versie van zijn sjabloon blijft renderen. +- **Bewerken zonder de id te raken.** Naam, branch en submap zijn aan te passen; + na opslaan wordt de repo meteen opnieuw opgehaald. +- **Een leeg tokenveld wist het token niet.** De interface krijgt het token + nooit te zien, dus zou opslaan hem anders weggooien. + # v0.8.22-beta — UniFi leest zijn databasegegevens opnieuw in Het linuxserver-image schrijft `/config/data/system.properties` alleen bij de diff --git a/VERSION b/VERSION index b553cab..61c94b0 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -0.8.22-beta +0.8.23-beta diff --git a/server-up/app.py b/server-up/app.py index 296f50c..0fcc997 100644 --- a/server-up/app.py +++ b/server-up/app.py @@ -1445,6 +1445,49 @@ def api_repos_add(): return jsonify(ok=True) +@app.route("/api/repos/", methods=["PUT"]) +def api_repos_edit(rid): + """Naam, branch of submap van een bestaande repo aanpassen. + + Zonder dit kon je alleen verwijderen en opnieuw toevoegen. De id wordt + daarbij uit de URL afgeleid en krijgt er een volgnummer bij zodra hij al + bestaat — en juist die id staat in de `.serverup.json` van elke stack die + uit deze repo komt. Overstappen van de ene branch naar de andere maakte zo + stilletjes het bronsjabloon van je apps onvindbaar. + """ + d = request.json or {} + repos = list(cfg.load().get("APP_REPOS", [])) + repo = next((r for r in repos + if isinstance(r, dict) and r.get("id") == rid), None) + if not repo: + return jsonify(ok=False, msg="niet gevonden"), 404 + + if "url" in d: + url = str(d.get("url") or "").strip() + if not url: + return jsonify(ok=False, msg="URL vereist"), 400 + if not cfg.valid_repo_url(url): + return jsonify(ok=False, msg=_BAD_URL_MSG), 400 + repo["url"] = url + for veld in ("name", "branch", "subdir"): + if veld in d: + repo[veld] = str(d.get(veld) or "").strip() + # Een leeg tokenveld betekent "ongewijzigd": de interface krijgt het token + # nooit te zien, dus zou opslaan hem anders wissen. + if str(d.get("token") or "").strip(): + repo["token"] = d["token"].strip() + if not repo.get("branch"): + repo["branch"] = "main" + + cfg.patch({"APP_REPOS": repos}) + audit.log("repos", "edit", "ok", ref=rid, detail=repo.get("branch", ""), + ip=request.remote_addr) + # De cache staat nog op de oude branch; die haalt de eerstvolgende sync op. + veilig = {k: v for k, v in repo.items() if k != "token"} + veilig["has_token"] = bool((repo.get("token") or "").strip()) + return jsonify(ok=True, repo=veilig) + + @app.route("/api/repos/", methods=["DELETE"]) def api_repos_del(rid): # `r["id"]` op een regel zonder id gaf hier een KeyError, dus een 500 — diff --git a/server-up/templates/index.html b/server-up/templates/index.html index ddf78c0..4088d48 100644 --- a/server-up/templates/index.html +++ b/server-up/templates/index.html @@ -1395,7 +1395,12 @@ tailwind.config = {
+ + +
@@ -1462,6 +1467,29 @@ tailwind.config = {
+ + +