interactive_archive_sync.sh hinzugefügt
This commit is contained in:
92
interactive_archive_sync.sh
Normal file
92
interactive_archive_sync.sh
Normal file
@ -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
|
||||
Reference in New Issue
Block a user