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}