diff options
Diffstat (limited to 'pkg/git/git.go')
-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 +} |