diff options
Diffstat (limited to 'pkg/git')
| -rw-r--r-- | pkg/git/git.go | 82 | 
1 files changed, 82 insertions, 0 deletions
| diff --git a/pkg/git/git.go b/pkg/git/git.go new file mode 100644 index 0000000..85a3b95 --- /dev/null +++ b/pkg/git/git.go @@ -0,0 +1,82 @@ +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 +} | 
