Skip to content

update: fix UPDATE-04, UPDATE-07 - #25

Merged
kridaydave merged 4 commits into
mainfrom
fix/pr-03-update-destructive-order
Nov 8, 2026
Merged

kridaydave merged 4 commits into
mainfrom
fix/pr-03-update-destructive-order

Conversation

@kridaydave

Copy link
Copy Markdown
Contributor

Bugs

  • UPDATE-04: deletes run before the untracked-overwrite check so a bail leaves a half-mutated tree
  • UPDATE-07: the overwrite check is silently skipped when its read fails, then rename fails obscurely over a directory

What was wrong

  • src/update.rs:195,256 (straight path) and src/update.rs:421,525 (merge path): the code deleted tracked files first, then checked whether target writes would overwrite an untracked path. A bail at that check left deletions applied and writes undone, with no rollback.
  • src/update.rs:258,525: the untracked-overwrite guard used if let Ok(existing_bytes) = std::fs::read(&full), so read failures (directory, permission, dangling-target cases) skipped the bail. write_file_atomic then failed later (for example, renaming over a directory) after deletes had already run.

Fix

  • Added check_untracked_overwrite and validate_untracked_writes helpers. They inspect existing paths with symlink_metadata, bail with a clear message for directories, propagate read/inspect errors with context, and compare bytes before allowing an overwrite.
  • Straight path (run): validate all untracked snapshot writes before any delete when not --force.
  • Merge path (materialize_merge): validate untracked collisions for paths that will be written before any delete.
  • Kept the change minimal and updated the nearby comment to describe the check/apply ordering.

Verification

CI green (fmt, clippy, tests, release build, adjudication) + regression tests test_update_untracked_collision_does_not_delete_before_bail, test_update_untracked_symlink_collision_does_not_delete_before_bail, and test_update_merge_untracked_collision_does_not_delete_before_bail in tests/update_test.rs.

@kridaydave kridaydave added the purging Batch purge: bug-fix swarm PRs label Nov 8, 2026
@kridaydave
kridaydave force-pushed the fix/pr-03-update-destructive-order branch from 51c409a to 2ec312e Compare November 8, 2026 18:25
kridaydave and others added 3 commits November 9, 2026 00:27
Check for untracked overwrite collisions before mutating the working tree
so a bail does not leave deletions applied and writes undone. Report
directory and read errors clearly instead of skipping the check and
failing later during rename.

Fixes UPDATE-04, UPDATE-07.
TST2-03 removed fn jj_available() but merge of X-09 added tests that
still called it. Match the #[ignore = "requires jj"] pattern.
@kridaydave
kridaydave force-pushed the fix/pr-03-update-destructive-order branch from c9d17a8 to 2a4ccd8 Compare November 8, 2026 19:04
@kridaydave
kridaydave merged commit 38a1084 into main Nov 8, 2026
5 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

purging Batch purge: bug-fix swarm PRs

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant