diff options
| author | 2026-03-04 08:26:56 +0800 | |
|---|---|---|
| committer | 2026-03-04 08:59:53 +0800 | |
| commit | ab7501be34032fb9e5c48726a68ae90a917af9eb (patch) | |
| tree | 20d005647569befea8133e953c3270e8fd2a2a5b /diff/trees/diff.go | |
| parent | *: gofumpt (diff) | |
| signature | No signature | |
*: Lint
Diffstat (limited to 'diff/trees/diff.go')
| -rw-r--r-- | diff/trees/diff.go | 81 |
1 files changed, 59 insertions, 22 deletions
diff --git a/diff/trees/diff.go b/diff/trees/diff.go index 836b71cc..9583c939 100644 --- a/diff/trees/diff.go +++ b/diff/trees/diff.go @@ -12,9 +12,12 @@ import ( // reaches directory entries. func Diff(a, b *object.Tree, readTree func(objectid.ObjectID) (*object.Tree, error)) ([]Entry, error) { var out []Entry - if err := diffRecursive(a, b, nil, readTree, &out); err != nil { + + err := diffRecursive(a, b, nil, readTree, &out) + if err != nil { return nil, err } + return out, nil } @@ -27,17 +30,23 @@ func diffRecursive(a, b *object.Tree, prefix []byte, readTree func(objectid.Obje for i := range b.Entries { entry := &b.Entries[i] full := joinPath(prefix, entry.Name) + *out = append(*out, Entry{Path: full, Kind: EntryKindAdded, Old: nil, New: entry}) - if entry.Mode == object.FileModeDir { - sub, err := readTree(entry.ID) - if err != nil { - return err - } - if err := diffRecursive(nil, sub, full, readTree, out); err != nil { - return err - } + if entry.Mode != object.FileModeDir { + continue + } + + sub, err := readTree(entry.ID) + if err != nil { + return err + } + + err = diffRecursive(nil, sub, full, readTree, out) + if err != nil { + return err } } + return nil } @@ -45,25 +54,33 @@ func diffRecursive(a, b *object.Tree, prefix []byte, readTree func(objectid.Obje for i := range a.Entries { entry := &a.Entries[i] full := joinPath(prefix, entry.Name) + *out = append(*out, Entry{Path: full, Kind: EntryKindDeleted, Old: entry, New: nil}) - if entry.Mode == object.FileModeDir { - sub, err := readTree(entry.ID) - if err != nil { - return err - } - if err := diffRecursive(sub, nil, full, readTree, out); err != nil { - return err - } + if entry.Mode != object.FileModeDir { + continue + } + + sub, err := readTree(entry.ID) + if err != nil { + return err + } + + err = diffRecursive(sub, nil, full, readTree, out) + if err != nil { + return err } } + return nil } i := 0 + j := 0 for i < len(a.Entries) && j < len(b.Entries) { left := &a.Entries[i] right := &b.Entries[j] + cmp := object.TreeEntryNameCompare( left.Name, left.Mode, @@ -73,49 +90,63 @@ func diffRecursive(a, b *object.Tree, prefix []byte, readTree func(objectid.Obje switch { case cmp < 0: full := joinPath(prefix, left.Name) + *out = append(*out, Entry{Path: full, Kind: EntryKindDeleted, Old: left, New: nil}) if left.Mode == object.FileModeDir { sub, err := readTree(left.ID) if err != nil { return err } - if err := diffRecursive(sub, nil, full, readTree, out); err != nil { + + err = diffRecursive(sub, nil, full, readTree, out) + if err != nil { return err } } + i++ case cmp > 0: full := joinPath(prefix, right.Name) + *out = append(*out, Entry{Path: full, Kind: EntryKindAdded, Old: nil, New: right}) if right.Mode == object.FileModeDir { sub, err := readTree(right.ID) if err != nil { return err } - if err := diffRecursive(nil, sub, full, readTree, out); err != nil { + + err = diffRecursive(nil, sub, full, readTree, out) + if err != nil { return err } } + j++ default: full := joinPath(prefix, left.Name) + modified := left.Mode != right.Mode || left.ID != right.ID if modified { *out = append(*out, Entry{Path: full, Kind: EntryKindModified, Old: left, New: right}) } + if left.Mode == object.FileModeDir && right.Mode == object.FileModeDir && left.ID != right.ID { leftSub, err := readTree(left.ID) if err != nil { return err } + rightSub, err := readTree(right.ID) if err != nil { return err } - if err := diffRecursive(leftSub, rightSub, full, readTree, out); err != nil { + + err = diffRecursive(leftSub, rightSub, full, readTree, out) + if err != nil { return err } } + i++ j++ } @@ -124,13 +155,16 @@ func diffRecursive(a, b *object.Tree, prefix []byte, readTree func(objectid.Obje for ; i < len(a.Entries); i++ { left := &a.Entries[i] full := joinPath(prefix, left.Name) + *out = append(*out, Entry{Path: full, Kind: EntryKindDeleted, Old: left, New: nil}) if left.Mode == object.FileModeDir { sub, err := readTree(left.ID) if err != nil { return err } - if err := diffRecursive(sub, nil, full, readTree, out); err != nil { + + err = diffRecursive(sub, nil, full, readTree, out) + if err != nil { return err } } @@ -139,13 +173,16 @@ func diffRecursive(a, b *object.Tree, prefix []byte, readTree func(objectid.Obje for ; j < len(b.Entries); j++ { right := &b.Entries[j] full := joinPath(prefix, right.Name) + *out = append(*out, Entry{Path: full, Kind: EntryKindAdded, Old: nil, New: right}) if right.Mode == object.FileModeDir { sub, err := readTree(right.ID) if err != nil { return err } - if err := diffRecursive(nil, sub, full, readTree, out); err != nil { + + err = diffRecursive(nil, sub, full, readTree, out) + if err != nil { return err } } |
