From 1874ddfa926fc842e1ffe068687642d0ef5ad490 Mon Sep 17 00:00:00 2001 From: Thore Cimbal Date: Wed, 19 Aug 2026 12:00:00 +0000 Subject: [PATCH] docs(issues): #0099 step 3 - the graft holds and turns twelve patches into four With the full upstream history the common ancestor could be searched rather than guessed: measuring tree distance, not dates, over every develop commit in the import window. deadd548 from 2026-05-08 wins with 43 differing files against 783 for the tag we wrongly assumed. Thirty-one of those are mode-only, the historical import bug, and the content remainder is precisely our own Discord feature plus LICENSE and CHANGELOG. Tested in a throwaway clone rather than asserted: without the graft there is no merge-base, with it deadd548 becomes one, and merging three months of develop yields 32 conflicting files. Only four are source, and they are exactly our patches - the rest are GitHub workflows we do not use and the lockfile. One intermediate result was worthless and nearly passed as success: merging v1.12.26 reported zero conflicts while not running at all, because the tag was fetched shallow and carries a single commit. Checking MERGE_HEAD is what caught it. The real gain is not the number. The issue warns that if Element moves a viewmodels file during the MVVM rework, our lines vanish without a conflict and git says nothing. With a genuine ancestor, git says something. Adopting this is ADR-worthy either way - a shared replace ref or a one-time unrelated- histories merge - so the decision stays with sorb. --- ...am-sicherheitsfixes-lassen-sich-nicht-m.md | 69 +++++++++++++++++++ 1 file changed, 69 insertions(+) diff --git a/docs/issues/0099-threadnet-web-12-upstream-sicherheitsfixes-lassen-sich-nicht-m.md b/docs/issues/0099-threadnet-web-12-upstream-sicherheitsfixes-lassen-sich-nicht-m.md index 000b7dc..29d4d80 100644 --- a/docs/issues/0099-threadnet-web-12-upstream-sicherheitsfixes-lassen-sich-nicht-m.md +++ b/docs/issues/0099-threadnet-web-12-upstream-sicherheitsfixes-lassen-sich-nicht-m.md @@ -160,3 +160,72 @@ einer falschen Zielmarke. Der Basisstand liegt zwischen 1.12.17 und 1.12.18 und damit klar unter 1.12.22 — `GHSA-wrcp-5v3v-3j6v` trifft uns weiterhin. Die Korrektur ändert die Dringlichkeit nicht, nur den Weg dorthin. + +## Schritt 3 beantwortet 2026-08-19 — der Graft trägt, und er halbiert das Problem + +Volle Upstream-Historie geholt (70.330 Commits, `.git` wächst von 87 MB auf 603 MB). +Damit ließ sich der gesuchte gemeinsame Vorfahre **suchen statt raten**. + +### Die Basis ist `deadd548` vom 2026-05-08 + +Verfahren: für jeden `develop`-Commit im Fenster 25.04.–16.05. die Zahl der gegen +unseren Import abweichenden Dateien messen — der Basis-Commit ist das Minimum. Gemessen +wurde **der Baum, nicht das Datum**. + +Ergebnis: `deadd548` („Update storybook", #33437) mit **43 abweichenden Dateien** — +gegenüber **783** beim fälschlich angenommenen Tag `v1.12.17`. Und diese 43 zerfallen +sauber: + +| Art | Anzahl | Was es ist | +|---|---|---| +| nur Modus (755 → 644) | **31** | der Import-Bug, den die Fork-Doku als historisch beschreibt | +| echte Inhaltsänderung | 12 | davon 5 + 1 Test = **unser Discord-Feature**, dazu `LICENSE` und `CHANGELOG.md` | +| Hinzufügungen | 2 | unsere Feature-Dateien | + +Der inhaltliche Rest ist also **genau das, was wir damals selbst geändert haben**. Damit +ist `deadd548` der Stand, aus dem der Fork genommen wurde. + +### Der Graft wurde getestet, nicht behauptet + +In einem **Wegwerf-Klon** (Produktions-Repo unberührt, danach entfernt): + +| | | +|---|---| +| vor dem Graft | `git merge-base main upstream/develop` → **leer** | +| nach `git replace --graft 3da3635 deadd548` | gemeinsamer Vorfahre **`deadd548`** | +| `git merge upstream/develop` | läuft durch, **32 konfliktbehaftete Dateien** | + +⚠️ Ein Zwischenergebnis war wertlos und wäre fast als Erfolg durchgegangen: Der erste +Merge-Versuch gegen `v1.12.26` meldete „0 Konflikte" — er war aber **gar nicht +gelaufen** („refusing to merge unrelated histories"), weil der Tag flach geholt war und +nur einen einzigen Commit trägt. Erst die Gegenprobe auf `MERGE_HEAD` deckte das auf. + +### Was die 32 Konflikte sind + +**Nur vier sind Quellcode** — und es sind genau unsere Patches: +`MImageBody.tsx`, `MAudioBody.tsx` (ClamAV), `SdkConfig.ts` (Branding), +`RoomListItemViewModel.ts` (Discord-Feature). Der Rest sind +`.github/workflows/*` (die Fork-Doku führt sie als „gering — eigene Strecke") und +`pnpm-lock.yaml`, das ohnehin regeneriert wird. + +### Was das ändert + +Aus „neuen Upstream-Baum beschaffen und **zwölf Patches von Hand neu auftragen**" wird +„**vier Quellcode-Konflikte in einem normalen Drei-Wege-Merge** lösen". + +Wichtiger noch ist die stille Gefahr, die verschwindet. Das Issue warnt: *„Verschiebt +Element beim MVVM-Umbau eine der `viewmodels/`-Dateien, entsteht kein Konflikt — unsere +Zeilen sind schlicht weg, und Git meldet nichts."* Mit echtem gemeinsamem Vorfahren +**meldet Git es**. Das ist der eigentliche Gewinn, nicht die Zahl. + +### Entscheidung, die noch aussteht + +Der Graft ist eine **lokale** Ersetzung (`refs/replace/*`). Damit alle davon haben, +müsste er mitgeliefert werden — `git push origin 'refs/replace/*'` und ein Hinweis in +der Doku, dass Klone `git fetch origin 'refs/replace/*:refs/replace/*'` brauchen. +Alternative: kein Graft, sondern beim nächsten Update einmalig einen echten +Merge-Commit mit `--allow-unrelated-histories` bauen und ab dann normal weitermergen. + +Beides ändert die Historie-Wahrnehmung des Repos dauerhaft und ist damit +**ADR-pflichtig**. Entscheidung sorb steht aus; Schritt 4 (Auftragsverfahren für die +Patches) wird bei Weg 1 oder 2 weitgehend gegenstandslos.