package main import ( "errors" "io/fs" "os" "github.com/charmbracelet/log" "github.com/go-git/go-billy/v5/osfs" "github.com/go-git/go-git/v5" "github.com/go-git/go-git/v5/plumbing/cache" "github.com/go-git/go-git/v5/storage/filesystem" ) func getRepo(url string, path string) (*git.Repository, error) { _, err := os.Stat(path) if err == nil { log.Info("Retrieve existing repo") fs := osfs.New(path) if _, err := fs.Stat(git.GitDirName); err == nil { fs, err = fs.Chroot(git.GitDirName) CheckIfError(err) } s := filesystem.NewStorageWithOptions(fs, cache.NewObjectLRUDefault(), filesystem.Options{KeepDescriptors: true}) repo, err := git.Open(s, fs) defer s.Close() return repo, err } else if errors.Is(err, fs.ErrNotExist) { log.Info("Clone repo from " + url + " to " + path) repo, err := git.PlainClone(path, false, &git.CloneOptions{ URL: url, }) CheckIfError(err) worktree, err := repo.Worktree() _ = worktree.Pull(&git.PullOptions{RemoteName: "origin"}) return repo, err } else { return nil, err } }