#!/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