Skip to content

Instantly share code, notes, and snippets.

@roscopecoltran
Forked from abhisheksoniDX/git.go
Created November 16, 2018 00:15
Show Gist options
  • Save roscopecoltran/a32d06a4ff1ea0b8d89ef0731990bbe6 to your computer and use it in GitHub Desktop.
Save roscopecoltran/a32d06a4ff1ea0b8d89ef0731990bbe6 to your computer and use it in GitHub Desktop.
package main
import (
"errors"
"flag"
"fmt"
"gopkg.in/src-d/go-git.v4"
"gopkg.in/src-d/go-git.v4/plumbing"
"gopkg.in/src-d/go-git.v4/plumbing/object"
"gopkg.in/src-d/go-git.v4/utils/merkletrie"
"os"
)
var applyCommit string
func apply() error {
cm, err := getCurrentCommitObject()
if err != nil {
return err
}
tree1, err := getTree(cm)
if err != nil {
return err
}
cm2, err := getPreviousCommitObject(cm)
tree2, err := getTree(cm2)
if err != nil {
return err
}
changes, err := tree1.Diff(tree2)
if err != nil {
return err
}
return printChanges(changes)
}
func printChanges(chng object.Changes) error {
for _, v := range chng {
action, err := v.Action()
if err != nil {
return err
}
switch action {
case merkletrie.Modify:
fmt.Println("File Modified: " + v.From.Name)
case merkletrie.Delete:
fmt.Println("File Deleted: " + v.From.Name)
case merkletrie.Insert:
fmt.Println("File Inserted: " + v.To.Name)
default:
return errors.New("Unknown Action on Files")
}
}
return nil
}
func getCurrentCommitObject() (*object.Commit, error) {
repo, _ := git.PlainOpen(".")
return repo.CommitObject(plumbing.NewHash(applyCommit))
}
func getPreviousCommitObject(cm *object.Commit) (*object.Commit, error) {
itr := cm.Parents()
return itr.Next()
}
func getTree(cm *object.Commit) (*object.Tree, error) {
return cm.Tree()
}
func main() {
flag.StringVar(&applyCommit, "commit", "", "commit hash")
flag.Parse()
if err := apply(); err != nil {
fmt.Println(err)
os.Exit(1)
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment