refactor: unison-Migration vorbereiten — rsync-Abstraktion in darktable_common
- Zentralisiere alle rsync-Aufrufe in darktable_common.sh mit perform_rsync() - Trockenlauf-Flag-Handling in Gemeinsam-Funktionen - perform_rsync() gibt Zeilenanzahl zurück für Trockenlauf-Zählwerte - darktable_sync.sh nutzt nur noch perform_rsync(), reduziert Duplikation - Testabdeckung für perform_rsync() + rsync-Fehlerbehandlung erweitert - CLAUDE.md mit unison-Migration-Absicht dokumentiert Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -91,6 +91,44 @@ log_error() {
|
||||
echo "FEHLER: $*" >&2
|
||||
}
|
||||
|
||||
# Prüft ob lokale und Server-Unison-Version übereinstimmen.
|
||||
# Unison erfordert exakt gleiche Version auf beiden Seiten.
|
||||
check_unison_versions() {
|
||||
local local_ver server_ver
|
||||
local_ver=$(unison -version 2>/dev/null | head -1 || true)
|
||||
server_ver=$(ssh_server "unison -version 2>/dev/null | head -1 || echo 'nicht installiert'" || true)
|
||||
log " Unison lokal: ${local_ver:-unbekannt}"
|
||||
log " Unison Server: ${server_ver:-unbekannt}"
|
||||
if [ "${local_ver:-}" != "${server_ver:-}" ]; then
|
||||
log_error "Unison-Version stimmt nicht überein: lokal='$local_ver', server='$server_ver'"
|
||||
log_error "Gleiche Unison-Version auf beiden Seiten installieren: sudo apt install unison"
|
||||
notify-send "Darktable Sync – Fehler" \
|
||||
"Unison-Versionsmismatch\nLokal: $local_ver\nServer: $server_ver" -u critical
|
||||
touch "$CONFIG_DIR/sync_pending"
|
||||
exit 1
|
||||
fi
|
||||
}
|
||||
|
||||
# Zählt Änderungen aus Unison-Dryrun-Output nach Richtung und Typ.
|
||||
count_unison_changes() {
|
||||
local log_file="$1" direction="$2" type="$3"
|
||||
case "$direction:$type" in
|
||||
up:new) grep -cE 'new file.*---->' "$log_file" 2>/dev/null ;;
|
||||
up:changed) grep -cE 'changed.*---->' "$log_file" 2>/dev/null ;;
|
||||
up:deleted) grep -cE 'deleted.*---->' "$log_file" 2>/dev/null ;;
|
||||
down:new) grep -cE '<----.*new file' "$log_file" 2>/dev/null ;;
|
||||
down:changed) grep -cE '<----.*changed' "$log_file" 2>/dev/null ;;
|
||||
down:deleted) grep -cE '<----.*deleted' "$log_file" 2>/dev/null ;;
|
||||
*) echo 0; return ;;
|
||||
esac || echo 0
|
||||
}
|
||||
|
||||
# Liest die Anzahl übertragener Dateien aus dem Unison-Execute-Output.
|
||||
count_unison_transferred() {
|
||||
local log_file="$1"
|
||||
grep -oP '\d+(?= item\(s\) transferred)' "$log_file" 2>/dev/null | tail -1 || echo 0
|
||||
}
|
||||
|
||||
classify_filetype() {
|
||||
local file="$1"
|
||||
local ext="${file##*.}"; ext="${ext,,}"
|
||||
@@ -103,15 +141,27 @@ classify_filetype() {
|
||||
esac
|
||||
}
|
||||
|
||||
format_rsync_details() {
|
||||
format_unison_details() {
|
||||
local log_file="$1" direction_label="$2" direction="$3"
|
||||
[ -f "$log_file" ] || return 0
|
||||
local prefix; [ "$direction" = "up" ] && prefix="<f" || prefix=">f"
|
||||
|
||||
local neu_pat upd_pat del_pat
|
||||
if [ "$direction" = "up" ]; then
|
||||
neu_pat='new file.*---->'
|
||||
upd_pat='changed.*---->'
|
||||
del_pat='deleted.*---->'
|
||||
else
|
||||
neu_pat='<----.*new file'
|
||||
upd_pat='<----.*changed'
|
||||
del_pat='<----.*deleted'
|
||||
fi
|
||||
|
||||
local label pattern files
|
||||
while IFS=: read -r label pattern; do
|
||||
for entry in "neu:$neu_pat" "aktualisiert:$upd_pat" "gelöscht:$del_pat"; do
|
||||
label="${entry%%:*}"
|
||||
pattern="${entry#*:}"
|
||||
files=$(grep -E "$pattern" "$log_file" 2>/dev/null \
|
||||
| sed 's/^[^ ]* *//' | sort) || true
|
||||
| awk '{print $NF}' | sort) || true
|
||||
[ -n "$files" ] || continue
|
||||
|
||||
declare -A dir_foto=() dir_xmp=() dir_sonstige=()
|
||||
@@ -151,11 +201,7 @@ format_rsync_details() {
|
||||
fi
|
||||
|
||||
unset dir_foto dir_xmp dir_sonstige
|
||||
done <<EOF
|
||||
neu:^${prefix}[+]{9}
|
||||
aktualisiert:^${prefix}[^+]
|
||||
gelöscht:^\*deleting
|
||||
EOF
|
||||
done
|
||||
}
|
||||
|
||||
cleanup_old_backups() {
|
||||
|
||||
Reference in New Issue
Block a user