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.
This commit is contained in:
@@ -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 —
|
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
|
`GHSA-wrcp-5v3v-3j6v` trifft uns weiterhin. Die Korrektur ändert die Dringlichkeit
|
||||||
nicht, nur den Weg dorthin.
|
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.
|
||||||
|
|||||||
Reference in New Issue
Block a user