42 lines
1.1 KiB
Go
42 lines
1.1 KiB
Go
|
package dehub
|
||
|
|
||
|
import (
|
||
|
"fmt"
|
||
|
|
||
|
"gopkg.in/src-d/go-git.v4/plumbing"
|
||
|
"gopkg.in/src-d/go-git.v4/plumbing/filemode"
|
||
|
"gopkg.in/src-d/go-git.v4/plumbing/object"
|
||
|
)
|
||
|
|
||
|
type fileChanged struct {
|
||
|
path string
|
||
|
fromMode, toMode filemode.FileMode
|
||
|
fromHash, toHash plumbing.Hash
|
||
|
}
|
||
|
|
||
|
func calcDiff(from, to *object.Tree) ([]fileChanged, error) {
|
||
|
|
||
|
changes, err := object.DiffTree(from, to)
|
||
|
if err != nil {
|
||
|
return nil, fmt.Errorf("could not calculate tree diff: %w", err)
|
||
|
}
|
||
|
|
||
|
filesChanged := make([]fileChanged, len(changes))
|
||
|
for i, change := range changes {
|
||
|
if from := change.From; from.Name != "" {
|
||
|
filesChanged[i].path = from.Name
|
||
|
filesChanged[i].fromMode = from.TreeEntry.Mode
|
||
|
filesChanged[i].fromHash = from.TreeEntry.Hash
|
||
|
}
|
||
|
if to := change.To; to.Name != "" {
|
||
|
if exPath := filesChanged[i].path; exPath != "" && exPath != to.Name {
|
||
|
panic(fmt.Sprintf("DiffTree entry changed path from %q to %q", exPath, to.Name))
|
||
|
}
|
||
|
filesChanged[i].path = to.Name
|
||
|
filesChanged[i].toMode = to.TreeEntry.Mode
|
||
|
filesChanged[i].toHash = to.TreeEntry.Hash
|
||
|
}
|
||
|
}
|
||
|
return filesChanged, nil
|
||
|
}
|