Repository navigation
fix(guard): treat mass renames as renames, not deletions - #336
Merged
Merged
Conversation
The delete guard compared paths only, so a burst of local renames (for example a photo renamer rewriting names from EXIF) looked like a mass deletion and churned the server trash bin with delete+upload. Store size and mtime per file in the manifest (format v2) and, in check(), cross-match disappeared files against newly created ones by (size, mtime). A matching pair is a rename and is excluded from the deletion count, so only genuine deletions trip the guard.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Closes #335
Problem
The delete guard compared paths only, so a burst of local renames (for example a photo renamer rewriting names from EXIF, producing
-1copies) looked like a mass deletion and churned the server trash bin with delete+upload.Fix
(path, size, mtime)per file.check(), compute bothmissingandcreated, and cross-match them by(size, mtime). A disappeared file matching a created file on size and mtime is a rename and is excluded from the deletion count.missingpaths count against the mass-deletion thresholds.Matching key
(size, mtime)exact, not size-only: a rename (mv,exiftool -FileName) preserves both. Size-only would risk a false negative where an unrelated same-size creation hides a real deletion.Tests
mass_rename_alone_stays_quiet: a batch rename produces no alert.rename_is_excluded_but_real_deletions_still_alert: renames are excluded frommissing_paths, genuine deletions still fire the guard.Gates: 788 tests (0 failed, 3 ignored), clippy
-D warnings, fmt.