fix(gui): word a queued edit kept as a conflict copy in the user's language (B181)

The daemon logs it as "<reason>; local changes uploaded as <copy>" or
"...kept at <path>", which the Activity page showed as written, in
English. It now reads both and the three reasons, one sentence each.
This commit is contained in:
nvrl committed 2026-10-05 00:17:11 +02:00
1 parent 457a9d26f4
commit da013c29d6
13 files changed
+786 -199

No files matched your search

+27
View File
@@ -12,6 +12,33 @@ Conventions:
---
## B181 — The app shows a queued edit kept as a conflict copy in English
**Status:** Fixed.
**Found:** 2026-10-05, checking that every name collision and conflict the drain resolves is
reported (`docs/MILESTONE-3.0.0.md` §6.2). Each one is in the activity log, and the app words
each in the user's language but one.
**Where:** `detail_label` in `crates/pdfs-gui/src/app/pages/activity_text.rs`; the daemon
writes the entry in `Core::keep_as_conflict_copy` and `Core::abandon_to_staging`
(`crates/pdfs-fuse/src/drain.rs`).
**Cause.** A queued edit whose file was changed, trashed or removed on Drive meanwhile is
uploaded as a conflict copy, or kept in staging when it cannot be. The entry's detail is the
reason followed by "; local changes uploaded as {copy}" or "; local changes kept at {path}".
The app knew neither shape, so it showed the detail as the daemon wrote it, in English: "The
remote revision changed under the queued write (based on revision …); local changes uploaded
as …".
**Fix.** The app reads both shapes and the three reasons the daemon gives, and says each as
one sentence: "It was changed on Proton Drive, so your changes were uploaded as {name}". A
reason it does not know still gets a sentence without the why. Translated in every catalog.
**Test:** `an_edit_kept_as_a_copy_says_why_in_words` in
`crates/pdfs-gui/src/app/pages/activity_text.rs`.
---
## B180 — A stop waits 10 s for a drain worker that slept through it
**Status:** Fixed.
+2
View File
@@ -89,6 +89,8 @@ by its local id, in the queue, the stored tree and pins alike.
- **A folder made while offline or with sync paused no longer fails with "Input/output
error"** once it is refreshed or the connection comes back (B125).
- **The daemon no longer hangs when a file being read changes on Drive** (B130).
- **The Activity page says in your language why an edit was kept as a conflicting copy**,
instead of the daemon's English (B181).
- **A file renamed just as its upload finished keeps its new name.** The mount no longer showed
the old name, and a second rename no longer failed with "No such file or directory" (B152,
B172).
+4 -1
View File
@@ -9,7 +9,7 @@ Tracks `docs/MILESTONE-3.0.0.md`. Update it with every commit that moves a phase
- **Phase 2**: local ids, inode = local id, one tree for every mount (2.10.0).
- **Phase 3, first part**: mkdir, create, rename, unlink and rmdir on the mount are recorded
locally and sent from the queue; `"local_first": false` brings back the old path (5e0f30c).
- Fixes from the simulation and account runs since then: B125, B127, B130 and B141 to B180.
- Fixes from the simulation and account runs since then: B125, B127, B130 and B141 to B181.
- **Sync issues, first cut** (§6.2): refusals sorted into issues, shown at once in the app,
tray and CLI; Export button and `pdfs sync export`; `pdfs sync issues`.
@@ -24,6 +24,9 @@ Tracks `docs/MILESTONE-3.0.0.md`. Update it with every commit that moves a phase
- [x] `pdfs sync issues`, and the issue shown in `pdfs sync queue`.
- [x] The app's Sync page shows each issue with what the user can do; Export and Retry
buttons; translated in every catalog.
- [x] A name collision lands under a conflict name (create, rename, move, re-homed create)
and goes in the activity log, as does a queued edit kept as a conflict copy. The app
words each one in the user's language (the last one since B181).
- [ ] Discard an issue on purpose (after export, or for a change with no content), and
undo the local change it stood for. Not in the first cut.
- [ ] Show the issue on the node itself (file browser emblem or status). Not in the first