diff options
| author | Gabriel A. Giovanini <mail@gabrielgio.me> | 2024-06-01 19:59:43 +0200 | 
|---|---|---|
| committer | Gabriel A. Giovanini <mail@gabrielgio.me> | 2024-06-01 19:59:43 +0200 | 
| commit | e3705f35c642e578625ce4574d189fa0b0869403 (patch) | |
| tree | f63d779d4eb817ad6b5abed30f50ad3b85ffcab1 /pkg/git | |
| parent | f1643ffcbd543cacfe9ab5e46eafdd0c39cd47fd (diff) | |
| download | cerrado-e3705f35c642e578625ce4574d189fa0b0869403.tar.gz cerrado-e3705f35c642e578625ce4574d189fa0b0869403.tar.bz2 cerrado-e3705f35c642e578625ce4574d189fa0b0869403.zip | |
feat: Add ref support
Now log and tree can be loaded using a given reference.
Diffstat (limited to 'pkg/git')
| -rw-r--r-- | pkg/git/git.go | 82 | 
1 files changed, 52 insertions, 30 deletions
| diff --git a/pkg/git/git.go b/pkg/git/git.go index 7ef23f7..ce72465 100644 --- a/pkg/git/git.go +++ b/pkg/git/git.go @@ -13,19 +13,50 @@ import (  var ()  var ( -	MissingHeadErr = errors.New("Head not found") +	MissingRefErr = errors.New("Reference not found")  )  type (  	GitRepository struct { -		path string +		path       string +		repository *git.Repository + +		ref plumbing.Hash +		// this is setRef when ref is setRef +		setRef bool  	}  ) -func NewGitRepository(dir string) *GitRepository { -	return &GitRepository{ +func OpenRepository(dir string) (*GitRepository, error) { +	g := &GitRepository{  		path: dir,  	} + +	repo, err := git.PlainOpen(dir) +	if err != nil { +		return nil, err +	} +	g.repository = repo + +	return g, nil +} + +func (g *GitRepository) SetRef(ref string) error { +	if ref == "" { +		head, err := g.repository.Head() +		if err != nil { +			return errors.Join(MissingRefErr, err) +		} +		g.ref = head.Hash() +	} else { +		hash, err := g.repository.ResolveRevision(plumbing.Revision(ref)) +		if err != nil { +			return errors.Join(MissingRefErr, err) +		} +		g.ref = *hash +	} +	g.setRef = true +	return nil  }  func (g *GitRepository) Path() string { @@ -33,17 +64,12 @@ func (g *GitRepository) Path() string {  }  func (g *GitRepository) LastCommit() (*object.Commit, error) { -	repo, err := git.PlainOpen(g.path) +	err := g.validateRef()  	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()) +	c, err := g.repository.CommitObject(g.ref)  	if err != nil {  		return nil, err  	} @@ -51,17 +77,12 @@ func (g *GitRepository) LastCommit() (*object.Commit, error) {  }  func (g *GitRepository) Commits() ([]*object.Commit, error) { -	repo, err := git.PlainOpen(g.path) +	err := g.validateRef()  	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()}) +	ci, err := g.repository.Log(&git.LogOptions{From: g.ref})  	if err != nil {  		return nil, fmt.Errorf("commits from ref: %w", err)  	} @@ -84,13 +105,12 @@ func (g *GitRepository) Commits() ([]*object.Commit, error) {  	return commits, nil  } -func (g *GitRepository) Tags() ([]*object.Tag, error) { -	repo, err := git.PlainOpen(g.path) -	if err != nil { -		return nil, err -	} +func (g *GitRepository) Head() (*plumbing.Reference, error) { +	return g.repository.Head() +} -	ti, err := repo.TagObjects() +func (g *GitRepository) Tags() ([]*object.Tag, error) { +	ti, err := g.repository.TagObjects()  	if err != nil {  		return nil, err  	} @@ -108,12 +128,7 @@ func (g *GitRepository) Tags() ([]*object.Tag, error) {  }  func (g *GitRepository) Branches() ([]*plumbing.Reference, error) { -	repo, err := git.PlainOpen(g.path) -	if err != nil { -		return nil, err -	} - -	bs, err := repo.Branches() +	bs, err := g.repository.Branches()  	if err != nil {  		return nil, err  	} @@ -129,3 +144,10 @@ func (g *GitRepository) Branches() ([]*plumbing.Reference, error) {  	return branches, nil  } + +func (g *GitRepository) validateRef() error { +	if !g.setRef { +		return g.SetRef("") +	} +	return nil +} | 
