Ausgabe-Filter: Zeige nur echte Inhaltsänderungen, keine Zeitstempel-Updates.
rsync --itemize-changes liefert z.B. ">f..t......" wenn git checkout den
Zeitstempel einer Datei aktualisiert, ohne den Inhalt zu ändern (da git
keine Zeitstempel preserviert). Neues Muster:
>f[+c]... neue Datei oder Prüfsumme geändert
>f.[+s]... Dateigröße geändert (= Inhalt geändert)
cd++++... neues Verzeichnis
*deleting Datei/Verzeichnis gelöscht
Bug-Fix: Voriger Fix schloss nur gradle/wrapper/ aus; rsync versuchte
gradle/ selbst zu löschen, scheiterte aber weil das ausgeschlossene
Unterverzeichnis gradle/ nicht-leer ließ. Fix: gradle/ komplett
ausschließen. Das Verzeichnis wird ausschließlich von init-exercises.sh
verwaltet (--gradle befüllt, --maven räumt auf).
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Kai Moritz [Sun, 31 May 2026 19:21:57 +0000 (19:21 +0000)]
copy.sh: rsync-Bug behoben — gradle/wrapper nach init-exercises --gradle
Problem: Nach init-exercises.sh --gradle enthält das Ziel
gradle/wrapper/gradle-wrapper.jar (von init-exercises.sh hinzugefügt).
Beim nächsten copy.sh-Lauf versuchte rsync --delete das Verzeichnis
gradle/wrapper/ zu löschen (nicht in Maven-only-Branches wie grundlagen/*),
scheiterte aber weil die ausgeschlossene JAR das Verzeichnis nicht-leer ließ:
cannot delete non-empty directory: gradle/wrapper
Fix: Das gesamte gradle/wrapper/-Verzeichnis wird von rsync ausgeschlossen
statt nur einzelner Dateien darin. Das Verzeichnis wird ausschließlich
von init-exercises.sh verwaltet (--gradle kopiert Wrapper, --maven räumt auf).
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Kai Moritz [Sun, 31 May 2026 19:21:42 +0000 (19:21 +0000)]
copy.sh: Ausgabe bereinigt — nur tatsächliche Änderungen sichtbar
Statt rsync -av (alle Dateien) jetzt --itemize-changes mit Filter:
Ausgabe zeigt nur neue/geänderte Dateien (>f, cd) und Löschungen (*deleting).
Vor jedem Branch-Sync wird ein Header angezeigt (branch → ziel/pfad),
sodass klar ist, was gerade verarbeitet wird.
Weitere Bereinigungen:
- git checkout/reset/fetch mit -q: keine "Switched to branch"- und
"HEAD is now at"-Ausgaben mehr (lib.sh, copy.sh)
- "Ignoriere Einzelschritte" → "Überspringe <branch>" (kürzer)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Parameter-Vereinheitlichung (alle Skripte):
- Alle Parameter verwenden --name value (Leerzeichen statt =, keine
Positional-Argumente mehr): reset.sh --tag, diff.sh --tag/--from/--to,
copy.sh --tag/--local
- Alle Skripte erhalten --help mit vollständiger Beschreibung
Umstrukturierung:
- build.sh und patch-nexus.sh aus scripting entfernt; beide operieren
auf kopierten Übungsverzeichnissen und gehören zu technik-check--vorlage
- copy.sh: --nexus-url entfernt (patch-nexus.sh liegt jetzt in technik-check)
- copy.sh: RSYNC_OPTS-Excludes für entfernte Skripte bereinigt
CLAUDE.md:
- Skript-Tabelle aufgeteilt nach Branch (scripting vs. technik-check--vorlage)
- Parameter-Dokumentation entfernt (--help in jedem Skript)
- Hinweis ergänzt, dass technik-check-Skripte nach copy.sh bereitstehen
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Kai Moritz [Sun, 31 May 2026 17:06:38 +0000 (17:06 +0000)]
lib.sh: Gemeinsame Logik aus Skripten extrahiert
Neue Shared Library lib.sh, die branches.sh einbindet und drei
zentrale Bausteine bereitstellt, die zuvor in mehreren Skripten
dupliziert waren:
- $BRANCH_NAMES: Array aller Branch-Namen (inkl. grundlagen/docker),
ersetzt das wiederholte `for i in grundlagen__docker $BRANCHES; do
declare -n branch=$i`-Muster in push.sh, reset.sh, diff.sh, copy.sh
und die manuelle BRANCH_LIST-Konstruktion in push.sh.
- find_common_tag_suffixes(): Vereinheitlicht zwei unterschiedliche
Implementierungen desselben Algorithmus (push.sh nutzte git rev-parse,
copy.sh nutzte git tag -l + comm).
- reset_branches_to_remote(): Extrahiert die identische Reset-Schleife
aus copy.sh und reset.sh.
Alle Skripte binden nun lib.sh statt branches.sh ein. lib.sh wird
ebenfalls in den rsync-Excludes von copy.sh geführt.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Kai Moritz [Sun, 31 May 2026 14:57:45 +0000 (14:57 +0000)]
copy.sh: gradle/wrapper/.gradle-version von rsync-Löschung ausschließen
Der Versions-Marker wird von README-gradle.sh erzeugt und ist gitignoriert.
Ohne diesen Ausschluss würde --delete den Marker nach jedem copy.sh-Lauf
entfernen, was README-gradle.sh anschließend mit einem Fehler scheitern lässt.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Kai Moritz [Sun, 31 May 2026 13:41:47 +0000 (13:41 +0000)]
copy.sh: Remote-Stände aktualisieren, wenn kein Tag-Suffix angegeben
Ohne Tag-Suffix-Parameter prüft das Skript vor der Aktualisierung, ob
alle Branches (inkl. grundlagen/docker) einheitlich getagged sind. Fehlt
einem Branch ein gemeinsames Tag, bricht das Skript mit einer Fehlermeldung
ab. Liegt ein gemeinsames Tag vor, werden alle Branches per fetch+reset auf
den jeweiligen origin-Stand gebracht, bevor das Kopieren beginnt.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
push.sh-Beschreibung spiegelt jetzt das neue Verhalten wider:
bedingte TIMESTAMP-Backup-Tags im Remote und Push gemeinsamer lokaler
Tag-Suffixe. Außerdem neue Sektion "Arbeitsanweisungen" mit der Regel,
nach jeder Aufgabe einen Commit zu erzeugen.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Kai Moritz [Sun, 31 May 2026 13:28:15 +0000 (13:28 +0000)]
push.sh: Backup-Tags nur bei Bedarf und nur im Remote anlegen
Bisher wurden automatisch für jeden Branch zwei lokale Backup-Tags
(--BACKUP-ORIGIN--<TIMESTAMP> und --BACKUP-ORIGIN--LAST) erzeugt und
gepusht. Das neue Verhalten:
- Branches werden weiterhin per --force gepusht.
- Backup-Tags werden nur noch dann erzeugt, wenn mindestens ein Branch
durch den Push umgeschrieben (nicht nur erweitert) würde und der
bisherige Remote-Stand in diesem Branch noch keinen Tag im Remote hat.
In diesem Fall werden TIMESTAMP-Tags für alle Remote-Stände direkt im
Remote-Repository angelegt.
- Existiert lokal ein gemeinsames Tag-Suffix (d.h. für jeden Branch B
existiert ein lokaler Tag B--S, z.B. --claude-5), wird dieses
zusammen mit den Branches in den Remote gepusht, sofern es dort noch
nicht vorhanden ist.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Skript-Tabelle: bootstrap-gradle.sh durch init-exercises.sh ersetzt,
README-gradle.sh-Beschreibung auf neue --update-Logik aktualisiert
- Reine Docker-Verzeichnisse: Beschreibung präzisiert (Image-Artefakte in
unterschiedlichen Setups zum Analysieren des Verhaltens)
- gradle-wrapper.properties als maßgebliche Gradle-Versionsquelle dokumentiert
- Versions-Marker .gradle-version als gitignoriert erwähnt
- TGZ-Verzeichnisstruktur: Referenz auf bootstrap-gradle.sh aktualisiert
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Kai Moritz [Sun, 31 May 2026 09:47:24 +0000 (09:47 +0000)]
copy.sh: checkout_branch-Funktion extrahiert, case vor checkout verschoben
TAG_SUFFIX-if/else war dupliziert (grundlagen/docker + Schleife). Jetzt in
checkout_branch() gekapselt. case-Statement steht jetzt vor dem Checkout,
sodass --livecoding--schritte-Branches gar nicht erst ausgecheckt werden.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Kai Moritz [Sun, 31 May 2026 00:51:37 +0000 (00:51 +0000)]
copy.sh: --delete für rsync, veraltete Verzeichnisse bereinigen
- rsync --delete: beim erneuten Kopieren werden aus dem Branch entfernte
Dateien auch im Zielverzeichnis gelöscht
- Nach dem Kopieren: Verzeichnisse in vorlagen/, livecoding/, spickzettel/,
die keinem aktuellen Branch mehr entsprechen, werden gelöscht
- Pfadberechnung im case-Statement vereinheitlicht (dest-Variable)
- trap sichert Cleanup der temporären Datei auch bei Fehlerabbruch
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Kai Moritz [Sat, 30 May 2026 00:34:51 +0000 (00:34 +0000)]
CLAUDE.md: Skripte überarbeitet, alte Referenzen entfernt
- Skript-Tabelle um detaillierte Beschreibungen ergänzt
- Abschnitt für Skripte im technik-check--vorlage-Branch hinzugefügt
- Alle Verweise auf alte Großbuchstaben-Skripte (BRANCHES.sh, REBASE.sh,
PUSH.sh, RESET.sh, DIFF.sh, TAG.sh) auf neue Namen aktualisiert
- Einleitung "Manueller Rebase-Workflow" ohne REBASE.sh-Referenz neu formuliert
- config/flawed-setup--zookeeper vollständig entfernt
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Kai Moritz [Fri, 29 May 2026 23:58:36 +0000 (23:58 +0000)]
COPY.sh → copy.sh: vollständig überarbeitet
- Script-Excludes auf neue Kleinbuchstaben-Namen aktualisiert
- .gitignore nicht mehr ausgeschlossen (Teilnehmer brauchen sie)
- gradle/wrapper/gradle-wrapper.jar explizit ausgeschlossen
- Sonderfall springkafka/technik-check → vorlagen/grundlagen/technik-check/
- --livecoding--schritte vor --livecoding geprüft (Pattern-Reihenfolge)
- Bash-String-Operationen statt sed für Suffix-Entfernung
- --nexus-url=<url> Parameter: ruft patch-nexus.sh auf die Vorlagen auf
- Parameterübergabe für Tag-Suffix und Optionen vereinheitlicht
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Kai Moritz [Fri, 29 May 2026 23:21:44 +0000 (23:21 +0000)]
build.sh: BUILD.sh, MAVEN.sh und GRADLE.sh zusammengeführt
Unterstützt Maven- und Gradle-Branches. Ohne Argument nur Build,
mit --publish auch Docker-Image in die Registry veröffentlichen.
Gradle-Branches rufen automatisch bootstrap-gradle.sh auf, falls
vorhanden.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Kai Moritz [Fri, 29 May 2026 23:20:19 +0000 (23:20 +0000)]
REBASE.sh und TAG.sh gelöscht
REBASE.sh ist obsolet: Rebases werden manuell mit Claude durchgeführt,
da sie von Inhalt und Branch-Abhängigkeiten abhängen und nicht sinnvoll
zu skripten sind.
TAG.sh ist obsolet: Session-Tags werden von Claude direkt vergeben.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Tabelle mit allen Branches und ihren ROOTs direkt in CLAUDE.md eingetragen
- Nicht-intuitive ROOTs markiert (z.B. kafkalistener → consumer/spring-consumer)
- Branches, die nicht in der BRANCHES-Iterationsliste sind, explizit aufgeführt
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Kai Moritz [Fri, 29 May 2026 18:09:17 +0000 (18:09 +0000)]
CLAUDE.md: Rebase-Ansatz auf `git rebase -i` umgestellt; ROOT-Ermittlung dokumentiert
- Rebase-Strategie von manuellem Cherry-Pick auf `git rebase -i` umgestellt
- Dokumentiert, wie der ROOT eines Branches über BRANCHES.sh nachgeschlagen wird
- Erklärt den Umgang mit Konflikten beim interaktiven Rebase
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Kai Moritz [Sat, 12 Apr 2025 09:32:49 +0000 (11:32 +0200)]
Übung zur Fehlerbehandlung basieren auf den Spring-Versionen
* Dadurch kann man ggf. live auf die JSON-Beispiele umgschwenken
* Außerdem erleichtert das den Switch zwischen Vanilla Kafka und Spring Kafka
* Möglich, da das Fehlerhandling jetzt ein fortgeschrittenes Thema ist