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:
2026-04-21 20:49:11 +02:00
parent 6b47b8941c
commit 6074f101ff
7 changed files with 227 additions and 195 deletions
+55 -9
View File
@@ -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() {