Kai Moritz [Fri, 12 Jun 2026 16:59:52 +0000 (16:59 +0000)]
fix(push.sh): Backup-Tags nur anlegen, wenn mind. ein Remote-Stand ungetagged ist
Bisher wurde nur geprüft, ob Branches überschrieben werden (kein Fast-Forward)
und dabei ungetagged sind. Jetzt gilt: sind alle Remote-Stände bereits remote
getagged (einheitlich oder nicht), werden keine TIMESTAMP-Backup-Tags angelegt.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Kai Moritz [Fri, 12 Jun 2026 16:56:22 +0000 (16:56 +0000)]
docs(CLAUDE.md): push.sh-Beschreibung und Session-Tagging-Schema aktualisiert
push.sh-Eintrag in der Skripttabelle beschreibt jetzt --tag und --force.
Session-Tagging: manuellen Loop am Sitzungsende durch ./push.sh --tag claude-N --force ersetzt.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Kai Moritz [Fri, 12 Jun 2026 16:54:20 +0000 (16:54 +0000)]
feat(push.sh): --tag und --force für explizites Tagging beim Push
Neu: --tag <suffix> erstellt <branch>--<suffix> für alle Branches
und pusht die Tags nach den Branches. Mit --force werden bestehende
Tags lokal (-f) und remote (--force) überschrieben.
Die bisherige automatische Suche nach gemeinsamen lokalen Tags und
deren Push entfällt. Das Backup-Tagging für überschriebene Remote-
Stände (TIMESTAMP) bleibt unverändert.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Kai Moritz [Fri, 12 Jun 2026 16:46:47 +0000 (16:46 +0000)]
refactor: $BRANCHES enthält direkt Branch-Namen statt Variablennamen
Die Indirektionsebene (Variablenname → Wert über declare -n) wird
entfernt. branches.sh definiert nur noch $BRANCHES mit direkten
Branch-Namen; grundlagen/docker ist jetzt darin enthalten.
lib.sh und copy.sh brauchen keine Namensauflösung mehr.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Kai Moritz [Sun, 31 May 2026 20:59:36 +0000 (20:59 +0000)]
copy.sh: schulung.conf für selektives Kopieren von Branches
Neue optionale Konfigurationsdatei schulung.conf (eine Branch-Angabe
pro Zeile, #-Kommentare): Nur gelistete Branches werden kopiert.
technik-check und --livecoding-Branches werden immer kopiert.
Ein --vorlage-Eintrag schließt den zugehörigen Lösungs-Branch
automatisch mit ein. Ohne schulung.conf: Verhalten wie bisher.
schulung.conf ist per .gitignore lokal; schulung.conf.example
dokumentiert das Format.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Der Branch braucht kein --vorlage-Suffix mehr, da copy.sh ihn ohnehin
per Sonderfall behandelt. Angepasst in:
- branches.sh: Variable und BRANCHES-Liste
- copy.sh: Sonderfall-Match
- CLAUDE.md: ROOT-Tabelle, Ausnahme-Hinweis, Skripte-Abschnitt, TGZ-Abschnitt
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Kai Moritz [Sun, 31 May 2026 20:08:26 +0000 (20:08 +0000)]
copy.sh: technik-check nach training-exercises/technik-check/ kopieren
Sonderfall für springkafka/technik-check--vorlage: wird nicht wie andere
--vorlage-Branches nach vorlagen/springkafka/technik-check/ kopiert,
sondern direkt nach training-exercises/technik-check/ — sichtbar neben
den Übungsverzeichnissen statt tief verschachtelt in vorlagen/.
CLAUDE.md: Ausnahme in Suffix-Tabelle, TGZ-Abschnitt und Skript-Pfad
aktualisiert.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Kai Moritz [Sun, 31 May 2026 19:49:35 +0000 (19:49 +0000)]
copy.sh: Verweigert Ausführung bei schmutziger Arbeitskopie
Vor dem ersten git checkout wird geprüft, ob die Arbeitskopie sauber ist.
Bei geänderten, gestagten oder nicht versionierten Dateien wird abgebrochen
und die betroffenen Dateien werden aufgelistet.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
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