package git import ( "fmt" "io" "os" gogit "github.com/go-git/go-git/v5" ) type GitOptions struct { URL string Name string RecurseSubmodule bool } func (g *GitOptions) Clone() error { a := &gogit.CloneOptions{ URL: g.URL, Progress: os.Stdout, } if err := a.Validate(); err != nil { return err } if err := os.Mkdir(g.Name, 0750); err != nil && !os.IsExist(err) { return err } _, err := gogit.PlainClone(g.Name, false, a) if err != nil { return err } return nil } func (g *GitOptions) Open() (*gogit.Repository, error) { return gogit.PlainOpen(g.Name) } func (g *GitOptions) Fetch() error { repo, err := g.Open() if err != nil { return err } a := &gogit.FetchOptions{ RemoteName: "origin", Progress: os.Stdout, } if err := a.Validate(); err != nil { return err } if err = repo.Fetch(a); err != nil { if err == gogit.NoErrAlreadyUpToDate { // not an actual error io.WriteString(os.Stdout, fmt.Sprintln("already up to date")) // keeping this here just for debug return nil } return err } return nil }