Show rsync verbose output in TUI and application log

Replace tee with _snaplog_tee shell function that writes each line
unbuffered to three destinations: snapshot log, application log file,
and stderr (which the TUI captures for live display). This fixes the
issue where rsync file-by-file output was invisible in both the Logs
screen and the Running Tasks view due to pipe buffering.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
shuki
2026-03-06 19:33:15 +02:00
parent ba93a74f8e
commit 3eb6c31509
3 changed files with 13 additions and 3 deletions

View File

@@ -98,7 +98,7 @@ _rclone_cmd() {
local rc=0 local rc=0
if [[ -n "${_TRANSFER_LOG:-}" && "$subcmd" == "copy" ]]; then if [[ -n "${_TRANSFER_LOG:-}" && "$subcmd" == "copy" ]]; then
echo "=== rclone copy $* ===" >> "$_TRANSFER_LOG" echo "=== rclone copy $* ===" >> "$_TRANSFER_LOG"
rclone "$subcmd" "${rclone_opts[@]}" --verbose "$@" > >(tee -a "$_TRANSFER_LOG") 2>&1 || rc=$? rclone "$subcmd" "${rclone_opts[@]}" --verbose "$@" > >(_snaplog_tee) 2>&1 || rc=$?
else else
rclone "$subcmd" "${rclone_opts[@]}" "$@" || rc=$? rclone "$subcmd" "${rclone_opts[@]}" "$@" || rc=$?
fi fi

View File

@@ -4,6 +4,16 @@
[[ -n "${_GNIZA4LINUX_SNAPLOG_LOADED:-}" ]] && return 0 [[ -n "${_GNIZA4LINUX_SNAPLOG_LOADED:-}" ]] && return 0
_GNIZA4LINUX_SNAPLOG_LOADED=1 _GNIZA4LINUX_SNAPLOG_LOADED=1
# Tee helper: writes each line to the transfer log, app log, and stderr (TUI).
# Used as process substitution target: cmd > >(_snaplog_tee) 2>&1
_snaplog_tee() {
while IFS= read -r line; do
echo "$line" >> "${_TRANSFER_LOG}"
[[ -n "${LOG_FILE:-}" ]] && echo "$line" >> "${LOG_FILE}"
echo "$line" >&2
done
}
# Initialize snapshot log directory and transfer log file. # Initialize snapshot log directory and transfer log file.
snaplog_init() { snaplog_init() {
_SNAP_LOG_DIR=$(mktemp -d "${WORK_DIR}/gniza-snaplog-XXXXXX") _SNAP_LOG_DIR=$(mktemp -d "${WORK_DIR}/gniza-snaplog-XXXXXX")

View File

@@ -57,7 +57,7 @@ rsync_to_remote() {
local rc=0 local rc=0
if [[ -n "${_TRANSFER_LOG:-}" ]]; then if [[ -n "${_TRANSFER_LOG:-}" ]]; then
echo "=== rsync: $source_dir -> ${REMOTE_USER}@${REMOTE_HOST}:${remote_dest} ===" >> "$_TRANSFER_LOG" echo "=== rsync: $source_dir -> ${REMOTE_USER}@${REMOTE_HOST}:${remote_dest} ===" >> "$_TRANSFER_LOG"
"${rsync_cmd[@]}" > >(tee -a "$_TRANSFER_LOG") 2>&1 || rc=$? "${rsync_cmd[@]}" > >(_snaplog_tee) 2>&1 || rc=$?
else else
"${rsync_cmd[@]}" || rc=$? "${rsync_cmd[@]}" || rc=$?
fi fi
@@ -133,7 +133,7 @@ rsync_local() {
local rc=0 local rc=0
if [[ -n "${_TRANSFER_LOG:-}" ]]; then if [[ -n "${_TRANSFER_LOG:-}" ]]; then
echo "=== rsync (local): $source_dir -> $local_dest ===" >> "$_TRANSFER_LOG" echo "=== rsync (local): $source_dir -> $local_dest ===" >> "$_TRANSFER_LOG"
rsync "${rsync_opts[@]}" "$source_dir" "$local_dest" > >(tee -a "$_TRANSFER_LOG") 2>&1 || rc=$? rsync "${rsync_opts[@]}" "$source_dir" "$local_dest" > >(_snaplog_tee) 2>&1 || rc=$?
else else
rsync "${rsync_opts[@]}" "$source_dir" "$local_dest" || rc=$? rsync "${rsync_opts[@]}" "$source_dir" "$local_dest" || rc=$?
fi fi