1
0
Fork 0
mirror of https://github.com/vbatts/go-mtree.git synced 2024-11-22 08:25:38 +00:00

Merge pull request #148 from cyphar/compare-improvements

compare: allow nil newDh and oldDh
This commit is contained in:
Vincent Batts 2018-05-31 12:30:39 -07:00 committed by GitHub
commit 1bcf4de08f
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 38 additions and 30 deletions

View file

@ -1,9 +1,9 @@
language: go language: go
go: go:
- 1.x - 1.x
- 1.10.x
- 1.9.x
- 1.8.x - 1.8.x
- 1.7.x
- 1.6.3
sudo: false sudo: false

View file

@ -325,6 +325,10 @@ func compareEntry(oldEntry, newEntry Entry) ([]KeyDelta, error) {
// missing entries and the like). A missing or extra key is treated as a // missing entries and the like). A missing or extra key is treated as a
// Modified type. // Modified type.
// //
// If oldDh or newDh are empty, we assume they are a hierarchy that is
// completely empty. This is purely for helping callers create synthetic
// InodeDeltas.
//
// NB: The order of the parameters matters (old, new) because Extra and // NB: The order of the parameters matters (old, new) because Extra and
// Missing are considered as different discrepancy types. // Missing are considered as different discrepancy types.
func Compare(oldDh, newDh *DirectoryHierarchy, keys []Keyword) ([]InodeDelta, error) { func Compare(oldDh, newDh *DirectoryHierarchy, keys []Keyword) ([]InodeDelta, error) {
@ -338,43 +342,47 @@ func Compare(oldDh, newDh *DirectoryHierarchy, keys []Keyword) ([]InodeDelta, er
// map to make sure we don't start comparing unrelated entries. // map to make sure we don't start comparing unrelated entries.
diffs := map[string]*stateT{} diffs := map[string]*stateT{}
// First, iterate over the old hierarchy. // First, iterate over the old hierarchy. If nil, pretend it's empty.
for _, e := range oldDh.Entries { if oldDh != nil {
if e.Type == RelativeType || e.Type == FullType { for _, e := range oldDh.Entries {
path, err := e.Path() if e.Type == RelativeType || e.Type == FullType {
if err != nil { path, err := e.Path()
return nil, err if err != nil {
} return nil, err
}
// Cannot take &kv because it's the iterator. // Cannot take &kv because it's the iterator.
copy := new(Entry) copy := new(Entry)
*copy = e *copy = e
_, ok := diffs[path] _, ok := diffs[path]
if !ok { if !ok {
diffs[path] = &stateT{} diffs[path] = &stateT{}
}
diffs[path].Old = copy
} }
diffs[path].Old = copy
} }
} }
// Then, iterate over the new hierarchy. // Then, iterate over the new hierarchy. If nil, pretend it's empty.
for _, e := range newDh.Entries { if newDh != nil {
if e.Type == RelativeType || e.Type == FullType { for _, e := range newDh.Entries {
path, err := e.Path() if e.Type == RelativeType || e.Type == FullType {
if err != nil { path, err := e.Path()
return nil, err if err != nil {
} return nil, err
}
// Cannot take &kv because it's the iterator. // Cannot take &kv because it's the iterator.
copy := new(Entry) copy := new(Entry)
*copy = e *copy = e
_, ok := diffs[path] _, ok := diffs[path]
if !ok { if !ok {
diffs[path] = &stateT{} diffs[path] = &stateT{}
}
diffs[path].New = copy
} }
diffs[path].New = copy
} }
} }