v0.8.09-beta - twee repo's met dezelfde id braken de app store
Some checks failed
Deploy server-up (dev) / deploy (push) Has been cancelled

Met twee repo's die dezelfde id dragen tekende de 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 repolijst wordt getekend met :key="repo.id". Dubbele keys zijn voor Alpine
ongedefinieerd gedrag, dus ontbrekende of verkeerde blokken, terwijl de tellers
gewoon doorrekenen over de gegevens.

GET /api/repos geeft een id nu nog maar een keer terug.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Q9eqpADJSRs49SoGGr4NAy
This commit is contained in:
Ramon 2026-08-03 23:34:42 +02:00
parent 8bb3771d2b
commit c608647582
4 changed files with 43 additions and 1 deletions

View file

@ -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 # v0.8.08-beta — Paden rechtzetten en er verandert niets
Zet je in Instellingen → Paden je mappen goed, dan bleef de appslijst leeg. Niet Zet je in Instellingen → Paden je mappen goed, dan bleef de appslijst leeg. Niet

View file

@ -1 +1 @@
0.8.08-beta 0.8.09-beta

View file

@ -1238,10 +1238,19 @@ def api_repos():
# Een repo zonder id gaf hier een KeyError, dus een 500, dus een lege # 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. # 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. # 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 = [] result = []
gezien = set()
for r in repos: for r in repos:
if not isinstance(r, dict) or not r.get("id"): if not isinstance(r, dict) or not r.get("id"):
continue continue
if r["id"] in gezien:
continue
gezien.add(r["id"])
result.append({**r, "cloned": git.cache_dir(r["id"]).exists()}) result.append({**r, "cloned": git.cache_dir(r["id"]).exists()})
return jsonify(result) return jsonify(result)

View file

@ -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 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 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"