Say which sidecar the server refused, and where

A queued sidecar failing to upload was reported as a count and a reason —
"1 queued sidecar(s) still undelivered: permission denied" — with the path
only at debug level, which the app filters out by default.

That is unsynced user work: a rating or an edit that exists on one device and
nowhere else. Which photograph it belongs to, and which path the server
refused, is the whole of what makes the failure actionable, and without it a
403 on a single file reads the same as a whole library failing to sync.

Observed on the tablet, where writes to the derived folder succeed on the same
credential — the catalog pushes fine — while one sidecar beside its image is
refused. That combination says the path matters and the account does not, so
the path is the thing worth printing.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
2026-08-17 14:11:30 +02:00
co-authored by Claude Opus 5
parent dea826811e
commit 6a7ed37aed
+14 -2
View File
@@ -413,7 +413,13 @@ pub fn spawn_sidecar_writes(
Ok(Outcome::Uploaded) => report.written += 1, Ok(Outcome::Uploaded) => report.written += 1,
Ok(Outcome::Queued) => report.queued += 1, Ok(Outcome::Queued) => report.queued += 1,
Err(e) => { Err(e) => {
log::debug!("sidecar for {}: {e}", w.image_path); // Warn, not debug. This is unsynced user work — a rating or an
// edit that exists only on this device — and the path is
// the only thing that says *which* photograph and *where*
// the server refused it. Filtered out at the default
// level, a 403 on one file is indistinguishable from a
// whole library failing.
log::warn!("sidecar for {}: {e}", w.image_path);
report.last_error = Some(e); report.last_error = Some(e);
report.failed += 1; report.failed += 1;
} }
@@ -433,7 +439,13 @@ pub fn spawn_sidecar_writes(
Ok(Outcome::Uploaded) => report.written += 1, Ok(Outcome::Uploaded) => report.written += 1,
Ok(Outcome::Queued) => report.queued += 1, Ok(Outcome::Queued) => report.queued += 1,
Err(e) => { Err(e) => {
log::debug!("sidecar for {}: {e}", w.image_path); // Warn, not debug. This is unsynced user work — a rating or an
// edit that exists only on this device — and the path is
// the only thing that says *which* photograph and *where*
// the server refused it. Filtered out at the default
// level, a 403 on one file is indistinguishable from a
// whole library failing.
log::warn!("sidecar for {}: {e}", w.image_path);
report.last_error = Some(e); report.last_error = Some(e);
report.failed += 1; report.failed += 1;
} }