mirror of
https://github.com/johannesjo/super-productivity.git
synced 2026-07-20 18:08:55 +00:00
Two compounding bugs trapped iOS WebDAV users in a per-minute conflict dialog that no button could resolve: 1. FileBasedSyncAdapter's snapshotReplacement heuristic re-fires gapDetected on every sync from a non-writing client (clientId \!= excludeClient is true forever), so the download keeps coming back with snapshotState and OperationLogSyncService keeps throwing LocalDataConflictError despite the local clock already dominating the remote snapshot. Skip hydration and conflict when compareVectorClocks(local, remote) is EQUAL or GREATER_THAN, gated on both clocks being non-empty so a fresh client still hydrates a legacy/clockless snapshot. 2. SyncWrapperService._openConflictDialog$ filtered undefined out of the afterClosed() stream, so a programmatic close (iOS WebView lifecycle, re-entry) collapsed the observable and firstValueFrom threw EmptyError — the user's Use Local/Use Remote/Cancel click never reached the resolution branches. Drop the filter so undefined flows through to the existing cancellation path. The dominate-skip deliberately does NOT append result.newOps to the op log: VectorClockService.getEntityFrontier is last-write-wins by seq, and writing historical remote ops at the current tail would regress per-entity frontiers and let future LWW resolution overwrite local data. Trade-off documented inline. Adds an adapter-level integration reproducer that asserts gapDetected re-fires forever for a non-writing client (the upstream loop trigger), a 3-client WebDAV e2e that reproduces the loop end-to-end against a real provider, plus service-level tests for the dominate-skip, the empty-clock guard, the concurrent-clock conservative path, and consecutive-sync loop prevention. |
||
|---|---|---|
| .. | ||
| add-task-bar | ||
| app-features | ||
| autocomplete | ||
| boards | ||
| break | ||
| daily-summary | ||
| focus-mode | ||
| import-export | ||
| issue-provider-panel | ||
| keyboard | ||
| menu | ||
| migration | ||
| navigation | ||
| notes | ||
| performance | ||
| planner | ||
| plugins | ||
| project | ||
| recurring | ||
| reminders | ||
| schedule | ||
| search | ||
| settings | ||
| short-syntax | ||
| sync | ||
| tags | ||
| task-basic | ||
| task-detail | ||
| task-dragdrop | ||
| task-list-basic | ||
| work-view | ||
| workflow | ||
| worklog | ||
| all-basic-routes-without-error.spec.ts | ||