1
0
Fork 0
mirror of https://github.com/vbatts/go-mtree.git synced 2025-10-03 20:21:01 +00:00

compare: export official way to modify InodeDelta.Diff

At the moment, filtering out keyword changes from an InodeDelta after
doing Compare is a little complicated and error-prone. The simplest
solution is to allow for callers to access a pointer to the underlying
slice so it can be modified properly.

The filtering logic in the gomtree command-line implicitly depends on
the behaviour of InodeDelta.Diff -- DiffPtr would be a far more
appropriate replacement.

Signed-off-by: Aleksa Sarai <cyphar@cyphar.com>
This commit is contained in:
Aleksa Sarai 2025-09-16 18:23:15 +10:00
parent d02f298ad4
commit 02df712987
No known key found for this signature in database
GPG key ID: 2897FAD2B7E9446F
2 changed files with 20 additions and 13 deletions

View file

@ -6,6 +6,7 @@ import (
"fmt"
"io"
"os"
"slices"
"strings"
cli "github.com/urfave/cli/v2"
@ -463,19 +464,14 @@ loop:
}
// Only filter out the size keyword.
// NOTE: This currently takes advantage of the fact the
// diff.Diff() returns the actual slice to diff.keys.
keys := diff.Diff()
for idx, k := range keys {
// Delete the key if it's "size". Unfortunately in Go you
// can't delete from a slice without reassigning it. So we
// just overwrite it with the last value.
if k.Name() == "size" {
if len(keys) < 2 {
continue loop
}
keys[idx] = keys[len(keys)-1]
}
keys := diff.DiffPtr()
*keys = slices.DeleteFunc(*keys, func(kd mtree.KeyDelta) bool {
return kd.Name() == "size"
})
// If there are no key deltas left after filtering, the entry
// should be filtered out entirely.
if len(*keys) == 0 {
continue loop
}
}
}

View file

@ -77,6 +77,17 @@ func (i InodeDelta) Diff() []KeyDelta {
return i.keys
}
// DiffPtr returns a pointer to the internal slice that would be returned by
// [InodeDelta.Diff]. This is intended to be used by tools which need to filter
// aspects of [InodeDelta] entries. If the [DifferenceType] of the inode is not
// [Modified], then DiffPtr returns nil.
func (i *InodeDelta) DiffPtr() *[]KeyDelta {
if i.diff == Modified {
return &i.keys
}
return nil
}
// Old returns the value of the inode Entry in the "old" DirectoryHierarchy (as
// determined by the ordering of parameters to Compare).
func (i InodeDelta) Old() *Entry {