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" ) // ChangedFile describes a single file which has been changed in some way // between two object.Trees. If the From fields are empty then the file was // created, if the To fields are empty then the file was deleted. type ChangedFile struct { Path string FromMode, ToMode filemode.FileMode FromHash, ToHash plumbing.Hash } // ChangedFilesBetweenTrees returns the ChangedFile objects which represent the // difference between the two given trees. func ChangedFilesBetweenTrees(from, to *object.Tree) ([]ChangedFile, error) { changes, err := object.DiffTree(from, to) if err != nil { return nil, fmt.Errorf("could not calculate tree diff: %w", err) } changedFiles := make([]ChangedFile, len(changes)) for i, change := range changes { if from := change.From; from.Name != "" { changedFiles[i].Path = from.Name changedFiles[i].FromMode = from.TreeEntry.Mode changedFiles[i].FromHash = from.TreeEntry.Hash } if to := change.To; to.Name != "" { if exPath := changedFiles[i].Path; exPath != "" && exPath != to.Name { panic(fmt.Sprintf("unexpected changed path from %q to %q", exPath, to.Name)) } changedFiles[i].Path = to.Name changedFiles[i].ToMode = to.TreeEntry.Mode changedFiles[i].ToHash = to.TreeEntry.Hash } } return changedFiles, nil }