package service import ( "path" "git.gabrielgio.me/cerrado/pkg/config" "git.gabrielgio.me/cerrado/pkg/git" "github.com/go-git/go-git/v5/plumbing" "github.com/go-git/go-git/v5/plumbing/object" ) type ( Repository struct { Name string Title string LastCommitMessage string LastCommitDate string Ref string } GitService struct { configRepo configurationRepository } configurationRepository interface { List() []*config.GitRepositoryConfiguration GetByName(name string) *config.GitRepositoryConfiguration } ) // TODO: make it configurable const timeFormat = "2006.01.02 15:04:05" func NewGitService(configRepo configurationRepository) *GitService { return &GitService{ configRepo: configRepo, } } func (g *GitService) ListRepositories() ([]*Repository, error) { rs := g.configRepo.List() repos := make([]*Repository, len(rs)) for i, r := range rs { repo, err := git.OpenRepository(r.Path) if err != nil { return nil, err } if err != nil { return nil, err } obj, err := repo.LastCommit() if err != nil { return nil, err } head, err := repo.Head() if err != nil { return nil, err } baseName := path.Base(r.Path) repos[i] = &Repository{ Name: baseName, Title: baseName, LastCommitMessage: obj.Message, LastCommitDate: obj.Author.When.Format(timeFormat), Ref: head.Name().Short(), } } return repos, nil } func (g *GitService) ListCommits(name, ref string) ([]*object.Commit, error) { // TODO: handle nil r := g.configRepo.GetByName(name) repo, err := git.OpenRepository(r.Path) if err != nil { return nil, err } err = repo.SetRef(ref) if err != nil { return nil, err } return repo.Commits() } func (g *GitService) ListTags(name string) ([]*object.Tag, error) { // TODO: handle nil r := g.configRepo.GetByName(name) repo, err := git.OpenRepository(r.Path) if err != nil { return nil, err } return repo.Tags() } func (g *GitService) ListBranches(name string) ([]*plumbing.Reference, error) { // TODO: handle nil r := g.configRepo.GetByName(name) repo, err := git.OpenRepository(r.Path) if err != nil { return nil, err } return repo.Branches() } func (g *GitService) GetHead(name string) (*plumbing.Reference, error) { // TODO: handle nil r := g.configRepo.GetByName(name) repo, err := git.OpenRepository(r.Path) if err != nil { return nil, err } return repo.Head() }