From ddfc4261e5fc4eec6227660805ea7fd36e363b66 Mon Sep 17 00:00:00 2001 From: duffyduck Date: Tue, 2 Jun 2026 13:59:42 +0200 Subject: [PATCH] =?UTF-8?q?fix(diagnostic):=20Versions-Liste=20deduplizier?= =?UTF-8?q?t=20via=20Blob-Hash=20=E2=80=94=20keine=20Restore-Duplikate?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Stefan-Beobachtung: Wenn man V1 restored, taucht der neue Restore-Commit als V4 in der Liste auf, mit identischem Inhalt wie V1. Bei mehrfachem Hin- und Herrestoren wird die Liste schnell unuebersichtlich. Fix: listVersionsForFile dedupliziert auf Blob-Hash-Ebene. Pro inhaltlich identischer Datei-Variante wird nur der AELTESTE (= zuerst in der History entstandene) Commit gezeigt. Restore-Commits werden damit gefiltert da ihr Blob = der Blob eines aelteren Commits ist. AKTIV-Marker wandert mit: vergleicht Blob der Working-Copy mit jedem sichtbaren Eintrag — der Match-Eintrag bekommt isCurrent=true. So zeigt das UI nach Restore "V1 ist AKTIV" obwohl im git ein neuer V4-Commit existiert. Implementation: - log --format=%H + ls-tree pro Commit → blob-hash sammeln - rueckwaerts durchgehen (chronologisch aelteste zuerst), seen-Set dedupliziert - Reverse fuer UI (neueste-zuerst) - git hash-object → currentBlob, mit jedem Eintrag vergleichen fuer den AKTIV-Marker - blob-Feld aus Response strippen (sieht aus wie zweite Commit-ID) Audit-Trail bleibt im git intakt — Restore-Commits sind weiterhin da, nur nicht im UI sichtbar. Falls jemals forensische Untersuchung noetig: `git log` im /shared/uploads zeigt alle, inkl. Restore-Commits. --- diagnostic/server.js | Bin 115929 -> 117331 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/diagnostic/server.js b/diagnostic/server.js index edb65829912e8cd0c77945a54a028360dfa04fca..843c806cb05eb542f7e6f0866c6aabcad8fe2679 100644 GIT binary patch delta 1558 zcmZ8h&uiR96vl@VFoYhPll>}6kjP4wVJXzk8q# zSybpLX9og-+;YsJxBekL_1N~*e<0_+nbF!CvmmWz=Dqj5@B7~T_4?MIZ*Kh_tUZoa z0X8<^;Q4+y!kS5@D+wtpxrR|Q`2`cLzqZzG#3rJjRG}HifTg9 zqA7~Ef4^I~(-w+8*^Cj0DcAnkD^#c@qSphHqX%9X(tnA?QJ3F#^r(_0(_7$e#__lP zzRP>RABQ=f?!3_VYo_xZ&*A|CLun|fP@y8F)2h)CMJKtx(ON+MI1ayKVRm%UkLSV0 zRUy+#87x4T<4tPXv^a;vgoFQc02kLqmU^9EQ(-FHq+&s2^hMpM+`s&0eXH%cI&)jy z#FKElm^L-ACWG%OOE{dMK=|j^H}DJpzNFtaPMop`2ils{? zZ48MCbc&uXHiDm!PZ3(tkTq!e!Epa@I6532fIooq1|@Mvk0j?*oPL4JHsnG}HicSN zz$s31I)bGI8o{ph*rZ@cUh2R?$`SUt(%5;7`Z5M}^0W%6I9UT{FhcEH8r)VR_{#=q z&zKG%BM0~Kl%sVxW$_iUDIXTWhiL78Z z6*K4}mZpn+X9R~VvLc>b3D>PkJR#nYILIHoA6zlLjsMg;m1lIb1@|o)MpVKFcQ3@+DSBHf+}jTNv(^F zzBg?!(sZl`BRBWPYv$AxGfpm%WE7XI%iKB6=w>8H8YxM82hEPPAx6tHI~SK@*8UL`dmlRz96mfk4d|uU;-B81;SKxU;q$Mw% ze`r)&!t>d@n$fZrT3DjWz$vysWbiJRxO*3zD~SEUa?1g&bM?@1K=8G6cU?EVmX($@ z%E(gFC4`^|TU`^sW{4Fx)4@xUpVU!64uSI-avBgfo8jJWkFbdfHJ=*FCF(|s4ldnc lweMfpYoiBI6d7e<9>8G7icEf-ud?4ht^e_9edXT|{{y&R?iBz4 delta 228 zcmcaSh5cqH`vy(9$^TWQC-=!U$&{rQ6=&w>6)V^(lda z7?d=vxfFn)D7B=tC{JPXZUw7)g<6nUEm%fhU%@xAC|e;hyCkzLRUr&wpn`@+VsVB- zN@|fpPHIV2Not;gV`?6dTbh@ykeCOSa7ipl&C~=Ml$oZW0dt66PHJ9yNrt8ZOd#4I nRxh*IxwNP#HLnEd%#xzg$q!Um`JwKCDQnJF-JY$=_+kkFODj&#