diff options
Diffstat (limited to 'pkg')
| -rw-r--r-- | pkg/git/git.go | 35 | ||||
| -rw-r--r-- | pkg/handler/git/handler.go | 15 | ||||
| -rw-r--r-- | pkg/service/git.go | 10 | 
3 files changed, 58 insertions, 2 deletions
| diff --git a/pkg/git/git.go b/pkg/git/git.go index b9ab235..80c0e46 100644 --- a/pkg/git/git.go +++ b/pkg/git/git.go @@ -2,6 +2,8 @@ package git  import (  	"errors" +	"fmt" +	"io"  	"github.com/go-git/go-git/v5"  	"github.com/go-git/go-git/v5/plumbing/object" @@ -46,3 +48,36 @@ func (g *GitRepository) LastCommit() (*object.Commit, error) {  	}  	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 +} diff --git a/pkg/handler/git/handler.go b/pkg/handler/git/handler.go index 45cd865..ebfb37f 100644 --- a/pkg/handler/git/handler.go +++ b/pkg/handler/git/handler.go @@ -6,6 +6,7 @@ import (  	"git.gabrielgio.me/cerrado/pkg/service"  	"git.gabrielgio.me/cerrado/templates" +	"github.com/go-git/go-git/v5/plumbing/object"  	"github.com/gorilla/mux"  ) @@ -16,6 +17,7 @@ type (  	gitService interface {  		ListRepositories() ([]*service.Repository, error) +		ListCommits(string) ([]*object.Commit, error)  	}  ) @@ -74,9 +76,18 @@ func (g *GitHandler) Tree(w http.ResponseWriter, r *http.Request) {  func (g *GitHandler) Log(w http.ResponseWriter, r *http.Request) {  	name := mux.Vars(r)["name"] + +	commits, err := g.gitService.ListCommits(name) +	if err != nil { +		slog.Error("Error loading commits", "error", err) +		return +	} +  	gitList := &templates.GitItemPage{ -		Name:        name, -		GitItemBase: &templates.GitItemLogPage{}, +		Name: name, +		GitItemBase: &templates.GitItemLogPage{ +			Commits: commits, +		},  	}  	templates.WritePageTemplate(w, gitList)  } diff --git a/pkg/service/git.go b/pkg/service/git.go index 2b1fe25..614770f 100644 --- a/pkg/service/git.go +++ b/pkg/service/git.go @@ -5,6 +5,7 @@ import (  	"git.gabrielgio.me/cerrado/pkg/config"  	"git.gabrielgio.me/cerrado/pkg/git" +	"github.com/go-git/go-git/v5/plumbing/object"  )  type ( @@ -21,6 +22,7 @@ type (  	configurationRepository interface {  		List() []*config.GitRepositoryConfiguration +		GetByName(name string) *config.GitRepositoryConfiguration  	}  ) @@ -55,3 +57,11 @@ func (g *GitService) ListRepositories() ([]*Repository, error) {  	return repos, nil  } + +func (g *GitService) ListCommits(name string) ([]*object.Commit, error) { +	// TODO: handle nil +	r := g.configRepo.GetByName(name) + +	repo := git.NewGitRepository(r.Path) +	return repo.Commits() +} | 
