package git import ( "errors" "fmt" "io" "github.com/go-git/go-git/v5" "github.com/go-git/go-git/v5/plumbing" "github.com/go-git/go-git/v5/plumbing/object" ) var () var ( MissingHeadErr = errors.New("Head not found") ) type ( GitRepository struct { path string } ) func NewGitRepository(dir string) *GitRepository { return &GitRepository{ path: dir, } } func (g *GitRepository) Path() string { return g.path } func (g *GitRepository) LastCommit() (*object.Commit, error) { repo, err := git.PlainOpen(g.path) if err != nil { return nil, err } ref, err := repo.Head() if err != nil { return nil, errors.Join(MissingHeadErr, err) } c, err := repo.CommitObject(ref.Hash()) if err != nil { return nil, err } return c, nil } func (g *GitRepository) Commits() ([]*object.Commit, error) { repo, err := git.PlainOpen(g.path) if err != nil { return nil, err } ref, err := repo.Head() if err != nil { return nil, errors.Join(MissingHeadErr, err) } ci, err := repo.Log(&git.LogOptions{From: ref.Hash()}) if err != nil { return nil, fmt.Errorf("commits from ref: %w", err) } commits := []*object.Commit{} // TODO: for now only load first 1000 for x := 0; x < 1000; x++ { c, err := ci.Next() if err != nil && errors.Is(err, io.EOF) { break } else if err != nil { return nil, err } commits = append(commits, c) } if err != nil { return nil, err } return commits, nil } func (g *GitRepository) Tags() ([]*object.Tag, error) { repo, err := git.PlainOpen(g.path) if err != nil { return nil, err } ti, err := repo.TagObjects() if err != nil { return nil, err } tags := []*object.Tag{} err = ti.ForEach(func(t *object.Tag) error { tags = append(tags, t) return nil }) if err != nil { return nil, err } return tags, nil } func (g *GitRepository) Branches() ([]*plumbing.Reference, error) { repo, err := git.PlainOpen(g.path) if err != nil { return nil, err } bs, err := repo.Branches() if err != nil { return nil, err } branches := []*plumbing.Reference{} err = bs.ForEach(func(ref *plumbing.Reference) error { branches = append(branches, ref) return nil }) if err != nil { return nil, err } return branches, nil }