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 }