all repos — glog @ a507639246bfd7d68efd05373e55bf74bd4a963d

git.go (view raw)

 1package main
 2
 3import (
 4	"errors"
 5	"io/fs"
 6	"os"
 7
 8	"github.com/charmbracelet/log"
 9	"github.com/go-git/go-billy/v5/osfs"
10	"github.com/go-git/go-git/v5"
11	"github.com/go-git/go-git/v5/plumbing/cache"
12	"github.com/go-git/go-git/v5/storage/filesystem"
13)
14
15func getRepo(url string, path string) (*git.Repository, error) {
16	_, err := os.Stat(path)
17
18	if err == nil {
19		log.Info("Retrieve existing repo")
20		fs := osfs.New(path)
21		if _, err := fs.Stat(git.GitDirName); err == nil {
22			fs, err = fs.Chroot(git.GitDirName)
23			CheckIfError(err)
24		}
25
26		s := filesystem.NewStorageWithOptions(fs, cache.NewObjectLRUDefault(), filesystem.Options{KeepDescriptors: true})
27		repo, err := git.Open(s, fs)
28		defer s.Close()
29		return repo, err
30
31	} else if errors.Is(err, fs.ErrNotExist) {
32		log.Info("Clone repo from " + url + " to " + path)
33		repo, err := git.PlainClone(path, false, &git.CloneOptions{
34			URL: url,
35		})
36		CheckIfError(err)
37		worktree, err := repo.Worktree()
38		_ = worktree.Pull(&git.PullOptions{RemoteName: "origin"})
39		return repo, err
40
41	} else {
42		return nil, err
43	}
44}