aboutsummaryrefslogtreecommitdiff
path: root/diff/trees/diff.go
diff options
context:
space:
mode:
authorGravatar Runxi Yu2026-03-04 08:26:56 +0800
committerGravatar Runxi Yu2026-03-04 08:59:53 +0800
commitab7501be34032fb9e5c48726a68ae90a917af9eb (patch)
tree20d005647569befea8133e953c3270e8fd2a2a5b /diff/trees/diff.go
parent*: gofumpt (diff)
signatureNo signature
*: Lint
Diffstat (limited to 'diff/trees/diff.go')
-rw-r--r--diff/trees/diff.go81
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
}
}