Skip to content

Instantly share code, notes, and snippets.

@g4s8
Created November 30, 2021 09:13
Show Gist options
  • Save g4s8/b7dbe3d3c4e614e482115be91bc554ee to your computer and use it in GitHub Desktop.
Save g4s8/b7dbe3d3c4e614e482115be91bc554ee to your computer and use it in GitHub Desktop.
package main
import (
"fmt"
"log"
"os"
git "github.com/libgit2/git2go/v30"
)
// usage: start in git repository with tree hash as first arg
func main() {
repo, err := git.OpenRepository(os.Getenv("PWD"))
if err != nil {
log.Fatalf("failed to open repo: %s", err)
}
hash := os.Args[1]
fmt.Printf("parsing tree `%s`\n", hash)
oid, err := git.NewOid(hash)
if err != nil {
log.Fatalf("failed to create oid: %s", err)
}
t, err := repo.LookupTree(oid)
if err != nil {
log.Fatalf("failed to lookup tree: %s", err)
}
tw := &treeWalker{t: t, repo: repo}
err = tw.start()
if err != nil {
log.Fatalf("failed to walk tree: %s", err)
}
}
type treeWalker struct {
repo *git.Repository
t *git.Tree
space string
}
func (tw *treeWalker) start() error {
return tw.t.Walk(tw.walk)
}
func (tw *treeWalker) push() *treeWalker {
return &treeWalker{t: tw.t, repo: tw.repo, space: tw.space + " "}
}
func (tw *treeWalker) walk(root string, entry *git.TreeEntry) int {
fmt.Printf("%s%s - %s: %s %s\n", tw.space, root, entry.Name, entry.Type, entry.Id)
if entry.Type == git.ObjectTree {
subt, err := tw.repo.LookupTree(entry.Id)
if err != nil {
fmt.Printf("lookup error: %s\n", err)
return 1
}
if err := subt.Walk(tw.push().walk); err != nil {
fmt.Printf("walk error: %s\n", err)
return 1
}
}
return 0
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment