forked from TrueCloudLab/restic
Add bitrot detection to "diff" command
This introduces a new modifier to the output of the diff command. It appears whenever two files being compared only differ in their content but not in their metadata. As far as we know, under normal circumstances, this should only ever happen if some kind of bitrot has happened in the source file. The prerequisite for this detection to work is that the right-side snapshot of the comparison has been created with "backup --force".
This commit is contained in:
parent
634e2a46d9
commit
a7dc18e697
3 changed files with 22 additions and 1 deletions
11
changelog/unreleased/pull-4526
Normal file
11
changelog/unreleased/pull-4526
Normal file
|
@ -0,0 +1,11 @@
|
|||
Enhancement: Add bitrot detection to `diff` command
|
||||
|
||||
The output of the `diff` command now includes the modifier `?` for files
|
||||
to indicate bitrot in backed up files. It will appear whenever there is a
|
||||
difference in content while the metadata is exactly the same. Since files with
|
||||
unchanged metadata are normally not read again when creating a backup, the
|
||||
detection is only effective if the right-hand side of the diff has been created
|
||||
with "backup --force".
|
||||
|
||||
https://github.com/restic/restic/issues/805
|
||||
https://github.com/restic/restic/pull/4526
|
|
@ -27,6 +27,7 @@ directory:
|
|||
* U The metadata (access mode, timestamps, ...) for the item was updated
|
||||
* M The file's content was modified
|
||||
* T The type was changed, e.g. a file was made a symlink
|
||||
* ? Bitrot detected: The file's content has changed but all metadata is the same
|
||||
|
||||
To only compare files in specific subfolders, you can use the
|
||||
"<snapshotID>:<subfolder>" syntax, where "subfolder" is a path within the
|
||||
|
@ -272,6 +273,14 @@ func (c *Comparer) diffTree(ctx context.Context, stats *DiffStatsContainer, pref
|
|||
!reflect.DeepEqual(node1.Content, node2.Content) {
|
||||
mod += "M"
|
||||
stats.ChangedFiles++
|
||||
|
||||
node1NilContent := node1
|
||||
node2NilContent := node2
|
||||
node1NilContent.Content = nil
|
||||
node2NilContent.Content = nil
|
||||
if node1NilContent.Equals(*node2NilContent) {
|
||||
mod += "?"
|
||||
}
|
||||
} else if c.opts.ShowMetadata && !node1.Equals(*node2) {
|
||||
mod += "U"
|
||||
}
|
||||
|
|
|
@ -201,7 +201,8 @@ change
|
|||
+------------------+--------------------------------------------------------------+
|
||||
| ``modifier`` | Type of change, a concatenation of the following characters: |
|
||||
| | "+" = added, "-" = removed, "T" = entry type changed, |
|
||||
| | "M" = file content changed, "U" = metadata changed |
|
||||
| | "M" = file content changed, "U" = metadata changed, |
|
||||
| | "?" = bitrot detected |
|
||||
+------------------+--------------------------------------------------------------+
|
||||
|
||||
statistics
|
||||
|
|
Loading…
Reference in a new issue