package gitpb import ( "bufio" "errors" "os" "path/filepath" "strings" "go.wit.com/log" ) // scans in a new git repo. If it detects the repo is a golang project, // then it parses the go.mod/go.sum files // TODO: try adding python, rails, perl, rust, other language things? // I probably will never have time to try that, but I'd take patches for anyone // that might see this note and feel so inclined. func (all *Repos) NewGoPath(basepath string, gopath string) (*Repo, error) { if r := all.FindByGoPath(gopath); r != nil { // already had this gopath return r, nil } // if .git doesn't exist, error out here gitpath := filepath.Join(basepath, gopath, ".git") _, err := os.Stat(gitpath) if err != nil { return nil, err } // add a new one here newr := Repo{ FullPath: filepath.Join(basepath, gopath), GoPath: gopath, } newr.Tags = new(GitTags) // newr.UpdateGit() newr.UpdateGitTags() newr.GoDeps = new(GoDeps) // newr.RedoGoMod() switch newr.goListRepoType() { case "library": newr.GoLibrary = true case "binary": newr.GoBinary = true } all.AppendUniqueGoPath(&newr) return &newr, nil } // Detect a 'Primative' package. Sets the isPrimative flag // will return true if the repo is truly not dependent on _anything_ else // like spew or lib/widget // it assumes go mod ran init and tidy ran without error func (repo *Repo) isPrimativeGoMod() (bool, error) { // go mod init & go mod tidy ran without errors log.Log(GITPB, "isPrimativeGoMod()", repo.FullPath) tmp := filepath.Join(repo.FullPath, "go.mod") gomod, err := os.Open(tmp) if err != nil { log.Log(GITPB, "missing go.mod", repo.FullPath) repo.GoDeps = nil return false, err } defer gomod.Close() scanner := bufio.NewScanner(gomod) for scanner.Scan() { line := strings.TrimSpace(scanner.Text()) parts := strings.Split(line, " ") log.Log(GITPB, " gomod:", parts) if len(parts) >= 1 { log.Log(GITPB, " gomod: part[0] =", parts[0]) if parts[0] == "require" { log.Log(GITPB, " should return false here") return false, errors.New("go.mod file is not primative") } } } repo.GoPrimitive = true return true, nil } func (repo *Repo) SetMasterBranchName(bname string) { repo.MasterBranchName = bname } func (repo *Repo) SetDevelBranchName(bname string) { repo.DevelBranchName = bname } func (repo *Repo) SetUserBranchName(bname string) { repo.UserBranchName = bname }