diff --git a/commit-interaktiv.sh b/commit-interaktiv.sh new file mode 100644 index 0000000..9150e8d --- /dev/null +++ b/commit-interaktiv.sh @@ -0,0 +1,90 @@ +### commit-interaktiv.sh (manuelle Nutzung) + +#!/bin/bash +set -euo pipefail + +cd "$(dirname "$0")" + +LOGFILE="archiv.log" +TIMESTAMP() { date '+%Y-%m-%d %H:%M:%S'; } + +log() { + echo "[$(TIMESTAMP)] $1" | tee -a "$LOGFILE" +} + +RESTORE_SCRIPT="./restore-archiv.sh" + +log "➔ Starte interaktive Archivierung..." + +find Neu/ -type f | while read -r file; do + relative_path="${file#Neu/}" + target="Archiv/$relative_path" + + base=$(basename "$file") + target_dir=$(dirname "$target") + mkdir -p "$target_dir" + + if [ -e "$target" ]; then + echo "⚠️ Datei '$relative_path' existiert bereits im Archiv." + + base_name="${base%.*}" + ext="${base##*.}" + if [ "$base_name" = "$ext" ]; then ext=""; else ext=".$ext"; fi + + version=2 + new_base="${base_name}_v${version}${ext}" + new_target="$target_dir/$new_base" + while [ -e "$new_target" ]; do + version=$((version + 1)) + new_base="${base_name}_v${version}${ext}" + new_target="$target_dir/$new_base" + done + + echo "Vorschlag zum Umbenennen: '$new_base'" + read -rp "▶️ Umbenennen? (j = ja, n = nein, sonst abbrechen): " answer + + if [[ "$answer" =~ ^[Jj]$ ]]; then + cp "$file" "$new_target" + log "✅ '$file' → '$new_target' (umbenannt)" + elif [[ "$answer" =~ ^[Nn]$ ]]; then + read -rp "Neuer Dateiname eingeben (ohne Pfad): " user_input + [ -z "$user_input" ] && log "⚠️ Abbruch durch Benutzer." && continue + custom_target="$target_dir/$user_input" + if [ -e "$custom_target" ]; then + echo "⚠️ '$user_input' existiert ebenfalls. Übersprungen." + log "⚠️ '$file' nicht archiviert (Name doppelt)." + continue + fi + cp "$file" "$custom_target" + log "✅ '$file' → '$custom_target' (benutzerdefiniert)" + else + log "⚠️ Abbruch durch Benutzer." + continue + fi + else + cp "$file" "$target" + log "✅ '$file' → '$target'" + fi + +done + +# Aufräumen +find Neu/ -type f -delete +find Neu/ -mindepth 1 -type d -empty -delete +log "🛋 Neu-Verzeichnis aufgeräumt." + +# Staging + Commit +git add --all +if git status --porcelain | grep . >/dev/null; then + if git commit -m "Manuelle Archivierung am $(TIMESTAMP)"; then + log "✅ Commit erfolgreich." + else + log "❌ Commit fehlgeschlagen. Starte Restore." + if [ -x "$RESTORE_SCRIPT" ]; then + "$RESTORE_SCRIPT" + log "♻️ Restore ausgeführt." + fi + fi +else + log "📥 Keine Änderungen zum Committen." +fi diff --git a/commit-wrapper.sh b/commit-wrapper.sh index 352719f..139b963 100644 --- a/commit-wrapper.sh +++ b/commit-wrapper.sh @@ -1,3 +1,5 @@ +### commit-wrapper.sh (für Cron) + #!/bin/bash set -euo pipefail @@ -12,87 +14,47 @@ log() { RESTORE_SCRIPT="./restore-archiv.sh" -log "➡️ Starte Archivierungslauf..." +log "➔ Starte Archivierungslauf (cron-tauglich, rekursiv)..." -# 1. Dateien aus Neu/ prüfen und nach Archiv/ kopieren -for file in Neu/*; do - [ -e "$file" ] || continue - base=$(basename "$file") - target="Archiv/$base" +# 1. Dateien rekursiv aus Neu nach Archiv kopieren, falls sie nicht existieren +find Neu/ -type f | while read -r file; do + relative_path="${file#Neu/}" + target="Archiv/$relative_path" + if [ -e "$target" ]; then - log "⚠️ Datei '$base' existiert bereits im Archiv. Archivierung abgebrochen." - echo "⚠️ Datei '$base' existiert bereits im Archiv! Bitte umbenennen oder löschen." - exit 1 + log "⚠️ Datei '$relative_path' existiert bereits im Archiv. Übersprungen." + continue fi -done -# Kopieren & Löschen -for file in Neu/*; do - [ -e "$file" ] || continue - base=$(basename "$file") - target="Archiv/$base" + mkdir -p "$(dirname "$target")" cp "$file" "$target" - log "✅ '$base' nach Archiv kopiert." -done - -for file in Neu/*; do - [ -e "$file" ] || continue - base=$(basename "$file") + log "✅ '$file' nach '$target' kopiert." rm "$file" - log "🧹 '$base' aus Neu gelöscht." + log "🛋 '$file' gelöscht." + done -# 2. Änderungen vormerken (inkl. Löschungen) -# Änderungen vollständig vormerken (auch neue Dateien) +# 2. Aufräumen leerer Unterverzeichnisse, aber nicht Neu/ selbst +find Neu/ -mindepth 1 -type d -empty -delete + +# 3. Alles zum Commit vormerken git add --all -log "📝 Alle Änderungen vorgemerkt (git add --all)." +log "📍 Alle Änderungen vorgemerkt." -# Prüfen, ob es Änderungen gibt (gestaged oder nicht) +# 4. Commit-Versuch if git status --porcelain | grep . >/dev/null; then - # es gibt Änderungen, Commit starten - if git commit -m "Archivierung von Dateien aus Neu am $(TIMESTAMP)"; then + if git commit -m "Archivierung automatisch am $(TIMESTAMP)"; then log "✅ Commit erfolgreich." else - # Commit fehlgeschlagen: Restore ausführen ... - log "❌ Commit fehlgeschlagen. Versuche Archiv wiederherzustellen..." - echo "⚠️ Commit abgebrochen, da Änderungen im Archiv blockiert wurden." + log "❌ Commit fehlgeschlagen. Starte Restore." if [ -x "$RESTORE_SCRIPT" ]; then "$RESTORE_SCRIPT" - log "♻️ Archiv wurde automatisch wiederhergestellt." - echo "ℹ️ Archiv wurde auf den letzten Commit zurückgesetzt." + log "♻️ Restore ausgeführt." else - log "❌ Restore-Skript '$RESTORE_SCRIPT' nicht gefunden oder nicht ausführbar!" - echo "⚠️ Restore-Skript nicht gefunden oder nicht ausführbar!" + log "⚠️ Restore-Skript nicht gefunden." fi exit 1 fi else - log "📭 Keine Änderungen zum Committen." - echo "Keine Änderungen zum Committen." - exit 0 -fi - - -# 3. Commit versuchen -if git diff --cached --quiet; then - log "📭 Keine Änderungen zum Committen." - echo "Keine Änderungen zum Committen." - exit 0 -else - if git commit -m "Archivierung von Dateien aus Neu am $(TIMESTAMP)"; then - log "✅ Commit erfolgreich." - exit 0 - else - log "❌ Commit fehlgeschlagen. Versuche Archiv wiederherzustellen..." - echo "⚠️ Commit abgebrochen, da Änderungen im Archiv blockiert wurden." - if [ -x "$RESTORE_SCRIPT" ]; then - "$RESTORE_SCRIPT" - log "♻️ Archiv wurde automatisch wiederhergestellt." - echo "ℹ️ Archiv wurde auf den letzten Commit zurückgesetzt." - else - log "❌ Restore-Skript '$RESTORE_SCRIPT' nicht gefunden oder nicht ausführbar!" - echo "⚠️ Restore-Skript nicht gefunden oder nicht ausführbar!" - fi - exit 1 - fi + log "📥 Keine Änderungen zum Committen." fi