diff --git a/interactive_archive_sync.sh b/interactive_archive_sync.sh new file mode 100644 index 0000000..0510702 --- /dev/null +++ b/interactive_archive_sync.sh @@ -0,0 +1,92 @@ +#!/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