From 8e6b57abc3d271efe25ac728f630d629d4c4de55 Mon Sep 17 00:00:00 2001 From: Alf Oberkoetter Date: Wed, 25 Jun 2025 12:47:19 +0200 Subject: [PATCH] Neu nach Konsultation von chatGPT --- commit-wrapper.sh | 98 +++++++++++++++++++++++++++++++++++++ interactive_archive_sync.sh | 92 ---------------------------------- pre-commit | 33 +++++-------- restore-archiv.sh | 37 ++++++++++++++ sync_archive.sh | 45 ----------------- 5 files changed, 148 insertions(+), 157 deletions(-) create mode 100644 commit-wrapper.sh delete mode 100644 interactive_archive_sync.sh mode change 100644 => 100755 pre-commit create mode 100755 restore-archiv.sh delete mode 100644 sync_archive.sh diff --git a/commit-wrapper.sh b/commit-wrapper.sh new file mode 100644 index 0000000..352719f --- /dev/null +++ b/commit-wrapper.sh @@ -0,0 +1,98 @@ +#!/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 Archivierungslauf..." + +# 1. Dateien aus Neu/ prüfen und nach Archiv/ kopieren +for file in Neu/*; do + [ -e "$file" ] || continue + base=$(basename "$file") + target="Archiv/$base" + 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 + fi +done + +# Kopieren & Löschen +for file in Neu/*; do + [ -e "$file" ] || continue + base=$(basename "$file") + target="Archiv/$base" + cp "$file" "$target" + log "✅ '$base' nach Archiv kopiert." +done + +for file in Neu/*; do + [ -e "$file" ] || continue + base=$(basename "$file") + rm "$file" + log "🧹 '$base' aus Neu gelöscht." +done + +# 2. Änderungen vormerken (inkl. Löschungen) +# Änderungen vollständig vormerken (auch neue Dateien) +git add --all +log "📝 Alle Änderungen vorgemerkt (git add --all)." + +# Prüfen, ob es Änderungen gibt (gestaged oder nicht) +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 + log "✅ Commit erfolgreich." + else + # Commit fehlgeschlagen: Restore ausführen ... + 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 +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 +fi diff --git a/interactive_archive_sync.sh b/interactive_archive_sync.sh deleted file mode 100644 index 0510702..0000000 --- a/interactive_archive_sync.sh +++ /dev/null @@ -1,92 +0,0 @@ -#!/bin/bash - -## Anpassen !!! ## -GIT_REPO_PATH="/home/alf/MEINWORM" -NEW_FILES_DIR="Neu" -ARCHIVE_TARGET_DIR="Archiv" -LOG_FILE="/home/alf/archive_sync_interactive.log" # Pfad anpassen - -## Ende des Anpassen-Blocks ## - -log_message() { echo "[$(date +"%Y-%m-%d %H:%M:%S")] $1" | tee -a "$LOG_FILE"; } - -get_next_version_number() { - local base_name="$1" - local extension="$2" - local max_version=0 - local found_files=() - readarray -t found_files < <(find "$ARCHIVE_TARGET_DIR" -type f -name "${base_name}_v*.${extension}") - - for existing_version_file in "${found_files[@]}"; do - local part_without_ext=$(basename "$existing_version_file" ".${extension}") - local current_version_str="${part_without_ext##*_v}" - if [[ -n "$current_version_str" && "$current_version_str" =~ ^[0-9]+$ ]]; then - if (( current_version_str > max_version )); then max_version=$current_version_str; fi - fi - done - echo $((max_version + 1)) -} - -log_message "--- Interactive Archive Sync Script Started ---" -cd "$GIT_REPO_PATH" || { log_message "ERROR: Could not change to Git repository directory. Exiting."; exit 1; } -mkdir -p "$ARCHIVE_TARGET_DIR" - -readarray -t FILES_TO_PROCESS < <(find "$NEW_FILES_DIR" -type f) - -for FILE_PATH_IN_NEW in "${FILES_TO_PROCESS[@]}"; do - FILE_FULL_NAME=$(basename "$FILE_PATH_IN_NEW") - FILE_NAME_NO_EXT="${FILE_FULL_NAME%.*}" - FILE_EXTENSION="${FILE_FULL_NAME##*.}" - TARGET_FILE_PATH_ORIG="$ARCHIVE_TARGET_DIR/$FILE_FULL_NAME" - - log_message "Processing file: $FILE_PATH_IN_NEW" - - if git ls-files --error-unmatch -- "$TARGET_FILE_PATH_ORIG" &>/dev/null; then - log_message " File '$FILE_FULL_NAME' already exists in '$ARCHIVE_TARGET_DIR/'." - echo "" - echo "Die Datei '$FILE_FULL_NAME' existiert bereits im Archiv." - echo "Möchten Sie diese Datei als neue Version (z.B. '${FILE_NAME_NO_EXT}_vX.${FILE_EXTENSION}') hinzufügen?" - read -p "[j/n/a (ja/nein/abbrechen)] " choice - echo "" - - case "$choice" in - j|J ) - NEXT_VERSION=$(get_next_version_number "$FILE_NAME_NO_EXT" "$FILE_EXTENSION") - NEW_VERSIONED_FILE_NAME="${FILE_NAME_NO_EXT}_v${NEXT_VERSION}.${FILE_EXTENSION}" - TARGET_FILE_PATH_VERSIONED="$ARCHIVE_TARGET_DIR/$NEW_VERSIONED_FILE_NAME" - log_message " Adding '$FILE_FULL_NAME' as versioned file: '$NEW_VERSIONED_FILE_NAME'." - cp "$FILE_PATH_IN_NEW" "$TARGET_FILE_PATH_VERSIONED" - git add "$TARGET_FILE_PATH_VERSIONED" - if ! git diff --cached --quiet --exit-code; then - git commit -m "Add versioned file: $NEW_VERSIONED_FILE_NAME" "$TARGET_FILE_PATH_VERSIONED" || { - log_message " ERROR: Commit for '$NEW_VERSIONED_FILE_NAME' failed. Restoring." - git restore --staged "$TARGET_FILE_PATH_VERSIONED"; git restore "$TARGET_FILE_PATH_VERSIONED" - } - if [ $? -eq 0 ]; then log_message " Successfully committed '$NEW_VERSIONED_FILE_NAME'."; fi - else log_message " WARNING: No changes staged for '$NEW_VERSIONED_FILE_NAME'. Skipping commit."; fi - ;; - n|N ) log_message " Skipping '$FILE_FULL_NAME'. File remains in '$NEW_FILES_DIR'.";; - a|A ) log_message " User chose to abort. Exiting."; exit 0;; - * ) log_message " Invalid input for '$FILE_FULL_NAME'. Skipping and continuing.";; - esac - else - log_message " File '$FILE_FULL_NAME' is new to '$ARCHIVE_TARGET_DIR/'. Adding..." - cp "$FILE_PATH_IN_NEW" "$TARGET_FILE_PATH_ORIG" - git add "$TARGET_FILE_PATH_ORIG" - if ! git diff --cached --quiet --exit-code; then - git commit -m "Add new file: $FILE_FULL_NAME to archive" "$TARGET_FILE_PATH_ORIG" || { - log_message " ERROR: Commit for '$FILE_FULL_NAME' failed. (Possible pre-commit hook issue?)" - git restore --staged "$TARGET_FILE_PATH_ORIG"; git restore "$TARGET_FILE_PATH_ORIG" - } - if [ $? -eq 0 ]; then log_message " Successfully committed '$FILE_FULL_NAME'."; fi - else log_message " WARNING: No changes staged for '$FILE_FULL_NAME'. Skipping commit."; fi - fi -done - -log_message "--- Summary ---" -log_message "Total files processed from '$NEW_FILES_DIR'." -log_message "Files committed: $COMMITTED_COUNT" -log_message "Files skipped: $SKIP_COUNT" -log_message "No new files committed. Skipping push." # Da kein Remote genutzt wird -log_message "--- Interactive Archive Sync Script Finished ---" -exit 0 \ No newline at end of file diff --git a/pre-commit b/pre-commit old mode 100644 new mode 100755 index 7a2ae12..dbf1e40 --- a/pre-commit +++ b/pre-commit @@ -1,25 +1,18 @@ #!/bin/bash +LOGFILE="archiv.log" -ARCHIVE_DIR="Archiv" +log() { + local TIMESTAMP + TIMESTAMP=$(date '+%Y-%m-%d %H:%M:%S') + echo "[$TIMESTAMP] $1" >> "$LOGFILE" +} -git diff --cached --name-only | while read FILE -do - if [[ "$FILE" =~ ^"$ARCHIVE_DIR"/ ]]; then - if git rev-parse --verify --quiet HEAD:"$FILE" > /dev/null; then - echo "" - echo "----------------------------------------------------------------------" - echo "FEHLER: Die Datei '$FILE' existiert bereits im Git-Archiv." - echo "Es ist nicht erlaubt, vorhandene Dateien im '$ARCHIVE_DIR/'-Verzeichnis zu ändern oder neu hinzuzufügen." - echo "Die Änderungen an '$FILE' werden nun verworfen." - echo "----------------------------------------------------------------------" - echo "" +# Überprüfe auf Löschungen oder Modifikationen in Archiv +problem=$(git diff --cached --name-status | grep -E '^[MD]\s+Archiv/' || true) - git restore --staged "$FILE" - git restore "$FILE" +if [[ -n "$problem" ]]; then + log "⛔️ Commit blockiert: Änderung oder Löschung in Archiv: $problem" + echo "⛔️ Fehler: Dateien im Archiv dürfen nicht gelöscht oder verändert werden!" + exit 1 +fi - exit 1 - fi - fi -done - -exit 0 \ No newline at end of file diff --git a/restore-archiv.sh b/restore-archiv.sh new file mode 100755 index 0000000..4789d66 --- /dev/null +++ b/restore-archiv.sh @@ -0,0 +1,37 @@ +#!/bin/bash +cd "$(dirname "$0")" + +LOGFILE="archiv.log" + +log() { + local TIMESTAMP + TIMESTAMP=$(date '+%Y-%m-%d %H:%M:%S') + echo "[$TIMESTAMP] $1" | tee -a "$LOGFILE" +} + +log "🔄 Starte Wiederherstellung von Archiv-Dateien..." + +# Alle geänderten oder gelöschten Dateien (im Arbeitsverzeichnis oder Index) +changed_files=$(git diff --name-only Archiv) +staged_files=$(git diff --cached --name-only Archiv) + +all_files=$(echo -e "$changed_files\n$staged_files" | sort -u) + +if [[ -z "$all_files" ]]; then + log "ℹ️ Keine Änderungen an Archiv-Dateien gefunden." +else + for file in $all_files; do + if [[ ! -f "$file" ]]; then + # Datei wurde gelöscht -> Wiederherstellen + log "⏪ Stelle gelöschte Datei '$file' wieder her" + git restore --staged "$file" + git restore "$file" + else + # Datei existiert (modifiziert) -> zurücksetzen + log "⏪ Setze geänderte Datei '$file' zurück" + git restore --staged "$file" + git restore "$file" + fi + done + log "✅ Alle Änderungen an Archiv-Dateien wurden rückgängig gemacht." +fi diff --git a/sync_archive.sh b/sync_archive.sh deleted file mode 100644 index f0a788f..0000000 --- a/sync_archive.sh +++ /dev/null @@ -1,45 +0,0 @@ -#!/bin/bash - -## anpassen!!!!!! ## -GIT_REPO_PATH="/home/alf/MEINWORM" -NEW_FILES_DIR="Neu" -ARCHIVE_TARGET_DIR="Archiv" -LOG_FILE="/home/alf/archive_sync.log" # Pfad anpassen - -## Ende des Anpassen-Blocks - -log_message() { echo "[$(date +"%Y-%m-%d %H:%M:%S")] $1" | tee -a "$LOG_FILE"; } - -log_message "--- Archive Sync Script Started ---" -cd "$GIT_REPO_PATH" || { log_message "ERROR: Could not change to Git repository directory. Exiting."; exit 1; } -mkdir -p "$ARCHIVE_TARGET_DIR" - -find "$NEW_FILES_DIR" -type f | while read FILE_PATH_IN_NEW -do - FILE_FULL_NAME=$(basename "$FILE_PATH_IN_NEW") - TARGET_FILE_PATH="$ARCHIVE_TARGET_DIR/$FILE_FULL_NAME" - - if git ls-files --error-unmatch -- "$TARGET_FILE_PATH" &>/dev/null; then - log_message " File '$FILE_FULL_NAME' already exists in '$ARCHIVE_TARGET_DIR/'. Skipping." - else - log_message " File '$FILE_FULL_NAME' is new to '$ARCHIVE_TARGET_DIR/'. Adding..." - cp "$FILE_PATH_IN_NEW" "$TARGET_FILE_PATH" - git add "$TARGET_FILE_PATH" - if ! git diff --cached --quiet --exit-code; then - git commit -m "Add new file: $FILE_FULL_NAME to archive" "$TARGET_FILE_PATH" || { - log_message " WARNING: Commit for '$FILE_FULL_NAME' failed. (Pre-commit hook active?)" - git restore --staged "$TARGET_FILE_PATH" - git restore "$TARGET_FILE_PATH" - } - if [ $? -eq 0 ]; then - log_message " Successfully committed '$FILE_FULL_NAME'." - # rm "$FILE_PATH_IN_NEW" # Optional: Originaldatei aus Neu/ löschen - fi - else - log_message " No changes staged for $FILE_FULL_NAME. Skipping commit for this file." - fi - fi -done -log_message "No new files committed. Skipping push." # Da kein Remote genutzt wird -log_message "--- Archive Sync Script Finished ---" -exit 0 \ No newline at end of file