diff --git a/CHANGELOG.md b/CHANGELOG.md index 5cbc838..d9a939f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,17 @@ +# 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 +store geen kaarten terwijl de knop "Nog N tonen" een dalend getal liet zien. +Klikken verlaagde het getal met zestig en er verscheen niets. + +De interface tekent de repolijst met `:key="repo.id"`. Dubbele keys zijn voor +Alpine ongedefinieerd gedrag — je krijgt ontbrekende of verkeerde blokken. De +tellers rekenen ondertussen gewoon door over de gegevens, dus je ziet een getal +onder een leeg scherm en nergens een fout. + +`GET /api/repos` geeft een id nu nog maar één keer terug. Dat is geen +schoonheidsreparatie: zolang er twee in zaten, was de hele storepagina stuk. + # v0.8.08-beta — Paden rechtzetten en er verandert niets Zet je in Instellingen → Paden je mappen goed, dan bleef de appslijst leeg. Niet diff --git a/VERSION b/VERSION index dbbb9a4..b2baf83 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -0.8.08-beta +0.8.09-beta diff --git a/server-up/app.py b/server-up/app.py index 8c6c357..8028c86 100644 --- a/server-up/app.py +++ b/server-up/app.py @@ -1238,10 +1238,19 @@ def api_repos(): # Een repo zonder id gaf hier een KeyError, dus een 500, dus een lege # repolijst in de interface — en daarmee een app store zonder enkele kaart. # Eén rare regel in de configuratie hoort de rest niet mee te nemen. + # Twee repo's met dezelfde id zijn niet alleen verwarrend: de interface + # tekent de lijst met `:key="repo.id"`, en dubbele keys zijn voor Alpine + # ongedefinieerd gedrag — je krijgt ontbrekende of verkeerde blokken, + # terwijl de tellers gewoon doorrekenen. Een dalend getal onder een leeg + # scherm, zonder dat er ergens een fout te zien is. result = [] + gezien = set() for r in repos: if not isinstance(r, dict) or not r.get("id"): continue + if r["id"] in gezien: + continue + gezien.add(r["id"]) result.append({**r, "cloned": git.cache_dir(r["id"]).exists()}) return jsonify(result) diff --git a/tests/test_repo_urls.py b/tests/test_repo_urls.py index 5e58ee6..5e6e7b5 100644 --- a/tests/test_repo_urls.py +++ b/tests/test_repo_urls.py @@ -243,3 +243,22 @@ def test_twee_synchronisaties_tegelijk_botsen_niet(env, tmp_path, monkeypatch): assert not tegelijk, f"{len(tegelijk)} fetches liepen door elkaar heen" assert (cache_na := (git.cache_dir("proef") / "app.txt")).read_text() == "van main", cache_na + + +def test_dubbele_repo_ids_komen_maar_een_keer_terug(client, env): + """De interface tekent de repolijst met `:key="repo.id"`. Dubbele keys zijn + voor Alpine ongedefinieerd gedrag: je krijgt ontbrekende blokken terwijl de + tellers doorrekenen — een dalend getal onder een leeg scherm.""" + import core + from conftest import login + login(client) + core.patch({"APP_REPOS": [ + {"id": "server-up", "url": "https://voorbeeld/a.git", "name": "A"}, + {"id": "boilerplates", "url": "https://voorbeeld/b.git", "name": "B"}, + {"id": "server-up", "url": "https://voorbeeld/c.git", "name": "C"}, + {"url": "https://voorbeeld/d.git", "name": "zonder id"}, + ]}) + d = client.get("/api/repos").get_json() + 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"