Skip to content

Instantly share code, notes, and snippets.

@josharian
Created January 27, 2018 00:18
Show Gist options
  • Save josharian/093b417a6ea6d0f4b0330dc31c875cfb to your computer and use it in GitHub Desktop.
Save josharian/093b417a6ea6d0f4b0330dc31c875cfb to your computer and use it in GitHub Desktop.
package main
import (
"flag"
"fmt"
"log"
"os"
git "gopkg.in/libgit2/git2go.v26"
)
func main() {
log.SetPrefix("git-whose-tree: ")
log.SetFlags(0)
pwd, err := os.Getwd()
check(err)
repo, err := git.OpenRepositoryExtended(pwd, 0, "")
check(err)
flag.Parse()
var trees []*git.Tree
for _, s := range flag.Args() {
oid, err := git.NewOid(s)
check(err)
tree, err := repo.LookupTree(oid)
check(err)
trees = append(trees, tree)
}
rw, err := repo.Walk()
check(err)
// Add all known refs.
refiter, err := repo.NewReferenceIterator()
check(err)
for {
ref, err := refiter.Next()
if git.IsErrorCode(err, git.ErrIterOver) {
break
}
// fmt.Printf("ref: %v\n", ref)
rw.Push(ref.Target())
}
err = rw.Iterate(func(commit *git.Commit) bool {
t, err := commit.Tree()
check(err)
for _, tree := range trees {
if t.Id().Equal(tree.Id()) {
fmt.Printf("tree %v -> commit %v\n", tree.Id(), commit.Id())
}
}
return true
})
check(err)
}
func check(err error) {
if err != nil {
log.Fatal(err)
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment