bidet / internal / handlers / directory.go

@ c362fc5ff73740244ceaacba31cdae3e6098ac04 | history


package handlers

import (
	"errors"
	"os"
	"path"
	"strings"

	"github.com/go-git/go-git/v6"
	"nmyk.io/bidet/internal/core"
)

const dotGit = ".git"

func (s Server) List() ([]*core.Repo, error) {
	entries, err := os.ReadDir(s.Dir)
	if err != nil {
		return nil, err
	}
	var repos []*core.Repo
	for _, e := range entries {
		if e.Name() == dotGit {
			continue
		}
		repo, err := s.Open(strings.TrimSuffix(e.Name(), dotGit))
		if err == nil {
			if _, err = repo.Worktree(); errors.Is(err, git.ErrIsBareRepository) {
				repos = append(repos, repo)
			}
		}
	}
	if len(repos) == 0 {
		return nil, errors.New("No repos found in " + s.Dir)
	}
	return repos, nil
}

func (s Server) repoPath(repoName string) string {
	return path.Join(s.Dir, repoName) + dotGit
}

func (s Server) Open(repoName string) (*core.Repo, error) {
	if _, err := os.Stat(s.repoPath(repoName)); os.IsNotExist(err) {
		return nil, err
	}
	repo, err := git.PlainOpen(s.repoPath(repoName))
	if err != nil {
		return nil, err
	}
	return &core.Repo{Repository: repo, Name: repoName}, nil
}