Skip to content

Fix: Restore locally deleted files during sync - #258

Merged
philips merged 1 commit into
philips:mainfrom
agonzalezreyes:fix/sync-engine
Sep 21, 2026
Merged

philips merged 1 commit into
philips:mainfrom
agonzalezreyes:fix/sync-engine

Conversation

@agonzalezreyes

Copy link
Copy Markdown
Contributor

Restore locally deleted files during sync: Previously, if a file's device copy hadn't changed but its vault copy had been deleted, sync would just flag it as unchanged (and potentially log it as a "skip-conflict" candidate) without ever re-downloading it.

This adds a pass after planSync that checks each "unchanged" listing's vault file: if it's missing (currentHash returns null), the listing is moved into the toSync set so it gets restored, instead of staying in the drift-check loop where a missing file was never actually recoverable.

No changes to deviceSync.ts's decision logic, this only re-partitions planSync's output in syncEngine.ts before acting on it.

@philips
philips merged commit f18ea4f into philips:main Sep 21, 2026
pull Bot pushed a commit to ben-vargas/supernote-obsidian-plugin that referenced this pull request Sep 22, 2026
runDeviceSync had no direct coverage: the file was deliberately thin and
relied on deviceSync.ts's unit tests for the decision logic. The pending
restore-deleted-files change (PR philips#258) adds real re-partitioning logic to
the orchestration layer, which needs its own tests.

Uses an in-memory fake vault plus vi.mock for obsidian (a real TFile
class, for the instanceof checks), scanDeviceSupernoteTree, and
fetchFromDevice; manifest fixtures are built with the real
buildSyncRecord/hashBytes so they stay honest. Covers:

- restoring a locally deleted file whose device copy is unchanged
  (deleted file re-downloaded at the same path, counts, manifest refresh)
- restoring into a deleted subfolder (folders recreated)
- intact unchanged files left untouched and un-fetched
- locally edited unchanged files still flagged as skip-conflict,
  never clobbered or re-downloaded
- a mixed run partitioning each file into exactly one bucket
- a failed restore download reported per-file without aborting the run

One test is skipped for now: fault isolation when an unchanged vault
file can't be read. It encodes the expected per-file degradation, but
the re-partition pass calls currentHash() unguarded, so it currently
fails with the error escaping runDeviceSync entirely. To be unskipped
by the fix in the next commit.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants