diff --git a/cmd/gomtree/cmd/validate.go b/cmd/gomtree/cmd/validate.go index ed451b1..cc45c5e 100644 --- a/cmd/gomtree/cmd/validate.go +++ b/cmd/gomtree/cmd/validate.go @@ -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 } } } diff --git a/compare.go b/compare.go index 81aba20..e3bd222 100644 --- a/compare.go +++ b/compare.go @@ -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 {