package git import ( "errors" "os" "path" "git.gabrielgio.me/cerrado/pkg/u" "github.com/go-git/go-git/v5" "github.com/go-git/go-git/v5/plumbing/object" ) var ( ScanPathErr = errors.New("Scan path does not exist") RepoPathErr = errors.New("Repository path does not exist") missingHeadErr = errors.New("Head not found") ) type ( GitServerRepository struct { scanPath string } GitRepository struct { path string } ) func NewGitServerRepository(scanPath string) *GitServerRepository { return &GitServerRepository{scanPath} } func NewGitRepository(dir string) *GitRepository { return &GitRepository{ path: dir, } } func (g *GitServerRepository) List() ([]*GitRepository, error) { if !u.FileExist(g.scanPath) { return nil, ScanPathErr } entries, err := os.ReadDir(g.scanPath) if err != nil { return nil, err } repos := make([]*GitRepository, 0) for _, e := range entries { if !e.IsDir() { continue } fullPath := path.Join(g.scanPath, e.Name()) repos = append(repos, NewGitRepository(fullPath)) } return repos, nil } 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 }