From 030d64475329cd60ae1d8797341b7abf40203ff3 Mon Sep 17 00:00:00 2001 From: Ramon Date: Mon, 3 Aug 2026 23:40:31 +0200 Subject: [PATCH] v0.8.10-beta - een repo verwijderen mag niet struikelen DELETE /api/repos/ las r["id"] zonder controle, dus een regel zonder id gaf een 500 - dezelfde fout die GET /api/repos had. Verwijderen haalt alle regels met die id weg, zodat een dubbele vermelding in een klik weg is. Co-Authored-By: Claude Opus 5 Claude-Session: https://claude.ai/code/session_01Q9eqpADJSRs49SoGGr4NAy --- CHANGELOG.md | 10 ++++++++++ VERSION | 2 +- server-up/app.py | 6 +++++- tests/test_repo_urls.py | 18 ++++++++++++++++++ 4 files changed, 34 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d9a939f..8594e3a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,13 @@ +# v0.8.10-beta — Een repo verwijderen mag niet struikelen + +`DELETE /api/repos/` las `r["id"]` zonder controle. Staat er één regel +zonder id in je configuratie, dan gaf verwijderen een 500 — dezelfde fout die +`GET /api/repos` had en die de hele app store leeg liet. Nu wordt zo'n regel +overgeslagen. + +Verwijderen haalt alle regels met die id weg, dus een dubbele vermelding is in +één klik opgeruimd. + # v0.8.09-beta — Twee repo's met dezelfde naam braken de app store In een configuratie met twee repo's die dezelfde `id` dragen, tekende de app diff --git a/VERSION b/VERSION index b2baf83..6ec662d 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -0.8.09-beta +0.8.10-beta diff --git a/server-up/app.py b/server-up/app.py index 8028c86..1d70812 100644 --- a/server-up/app.py +++ b/server-up/app.py @@ -1281,7 +1281,11 @@ def api_repos_add(): @app.route("/api/repos/", methods=["DELETE"]) def api_repos_del(rid): - repos = [r for r in cfg.load().get("APP_REPOS", []) if r["id"] != rid] + # `r["id"]` op een regel zonder id gaf hier een KeyError, dus een 500 — + # dezelfde fout die /api/repos had. Verwijdert alle regels met deze id, + # zodat een dubbele vermelding in één keer weg is. + repos = [r for r in cfg.load().get("APP_REPOS", []) + if not isinstance(r, dict) or r.get("id") != rid] cfg.patch({"APP_REPOS": repos}) c = git.cache_dir(rid) if c.exists(): diff --git a/tests/test_repo_urls.py b/tests/test_repo_urls.py index 5e6e7b5..0773507 100644 --- a/tests/test_repo_urls.py +++ b/tests/test_repo_urls.py @@ -262,3 +262,21 @@ def test_dubbele_repo_ids_komen_maar_een_keer_terug(client, env): ids = [r["id"] for r in d] assert ids == ["server-up", "boilerplates"], ids assert len(ids) == len(set(ids)), "er zitten nog dubbele ids in" + + +def test_verwijderen_haalt_alle_regels_met_die_id_weg(client, env): + """Een dubbele vermelding hoort in één keer weg. En een regel zonder id + mag hier geen 500 geven — dezelfde fout die /api/repos had.""" + import core + from conftest import login + csrf = login(client) + core.patch({"APP_REPOS": [ + {"id": "server-up", "url": "https://voorbeeld/a.git"}, + {"id": "blijft", "url": "https://voorbeeld/b.git"}, + {"id": "server-up", "url": "https://voorbeeld/c.git"}, + {"url": "https://voorbeeld/d.git"}, + ]}) + r = client.delete("/api/repos/server-up", headers={"X-CSRF-Token": csrf}) + assert r.status_code == 200, r.get_json() + over = core.load()["APP_REPOS"] + assert [x.get("id") for x in over] == ["blijft", None], over