diff options
Diffstat (limited to 'redomod.go')
| -rw-r--r-- | redomod.go | 287 |
1 files changed, 287 insertions, 0 deletions
diff --git a/redomod.go b/redomod.go new file mode 100644 index 0000000..ac17c78 --- /dev/null +++ b/redomod.go @@ -0,0 +1,287 @@ +package repostatus + +import ( + "bufio" + "os" + "path/filepath" + "strings" + + "go.wit.com/log" +) + +// this checks to see if the repo is truly not dependent on _anything_ else +// like spew or lib/widget +func (rs *RepoStatus) CheckPrimativeGoMod() bool { + log.Log(WARN, "CheckPrimativeGoMod()", rs.realPath.String()) + tmp := filepath.Join(rs.realPath.String(), "go.mod") + gomod, err := os.Open(tmp) + if err != nil { + log.Log(WARN, "missing go.mod", rs.realPath.String()) + rs.goConfig = nil + return false + } + defer gomod.Close() + + scanner := bufio.NewScanner(gomod) + for scanner.Scan() { + line := strings.TrimSpace(scanner.Text()) + + parts := strings.Split(line, " ") + log.Log(INFO, " gomod:", parts) + if len(parts) >= 1 { + log.Log(INFO, " gomod: part[0] =", parts[0]) + if parts[0] == "require" { + log.Log(INFO, " should return false here") + return false + } + + } + } + return true +} + +// readGoMod reads and parses the go.sum file (TODO: do the go.mod file) +func (rs *RepoStatus) ReadGoMod() bool { + if rs.CheckPrimativeGoMod() { + log.Info("PRIMATIVE repo:", rs.String()) + return true + } + + tmp := filepath.Join(rs.realPath.String(), "go.sum") + gosum, err := os.Open(tmp) + if err != nil { + log.Log(WARN, "missing go.sum", rs.realPath.String()) + rs.goConfig = nil + return false + } + defer gosum.Close() + + var deps GoConfig + deps = make(GoConfig) + + scanner := bufio.NewScanner(gosum) + log.Log(INFO, "gosum:", tmp) + for scanner.Scan() { + line := strings.TrimSpace(scanner.Text()) + + parts := strings.Split(line, " ") + if len(parts) == 3 { + godep := strings.TrimSpace(parts[0]) + version := strings.TrimSpace(parts[1]) + if strings.HasSuffix(version, "/go.mod") { + version = strings.TrimSuffix(version, "/go.mod") + } + currentversion, ok := deps[godep] + if ok { + if currentversion != version { + // ignore these warnings for now + depname := rs.String() + if strings.HasPrefix(depname, "go.wit.com") { + log.Log(INFO, "REPO:", rs.realPath.String()) + log.Log(INFO, " version mismatch:", godep, version, currentversion) + } else { + log.Log(INFO, "REPO:", rs.realPath.String()) + log.Log(INFO, " version mismatch:", godep, version, currentversion) + } + } + } else { + deps[godep] = version + log.Log(INFO, "\t", godep, "=", version) + } + } else { + log.Log(WARN, "\t INVALID:", parts) + } + } + + if err := scanner.Err(); err != nil { + rs.goConfig = nil + return false + } + + rs.goConfig = deps + return true +} + +// check if it is safe to remake the go.sum & go.mod files +func (rs *RepoStatus) CheckSafeGoSumRemake() (bool, []string) { + myGoSumS := rs.goSumStatus.String() + if rs.ReadGoMod() { + log.Log(INFO, "parsed go.mod", rs.realPath.String()) + } else { + log.Log(WARN, "Something went wrong parsing go.mod", rs.realPath.String()) + return false, nil + } + log.Log(WARN, "go.sum:", rs.realPath.String()) + var clean []string + for depname, version := range rs.goConfig { + if strings.HasSuffix(depname, "/v2") { + log.Log(WARN, " FOUND /v2 wierd golang stuff. instead, look for:", depname) + depname = strings.TrimSuffix(depname, "/v2") + } + log.Log(WARN, " ", depname, version) + deprs, ok := windowMap[depname] + if ok { + if deprs.CheckDirty() { + log.Log(WARN, " IS DIRTY", deprs.String()) + clean = append(clean, deprs.String()) + } + if deprs.readOnly.String() == "true" { + log.Log(WARN, " SKIPPING Read Only", deprs.String()) + } else { + goSumS := deprs.goSumStatus.String() + log.Log(WARN, " FOUND", deprs.String(), goSumS) + username := deprs.mainWorkingName.String() + userhash, _ := deprs.gitConfig.hashes[username] + userversion, _ := deprs.gitConfig.versions[userhash] + log.Log(WARN, " username :"+username, userhash) + log.Log(WARN, " username :"+username, userversion) + if version == userversion { + log.Log(WARN, " USER VERSIONS MATCH", version, userversion, goSumS) + clean = append(clean, deprs.String()) + } else { + os.Unsetenv("GO111MODULE") + log.Log(WARN, " USER VERSIONS MISMATCH", version, userversion, myGoSumS) + log.Log(WARN, " IGNORE UNCHANGED REPO. RUNNING 'go get'", depname, userversion) + err, output := rs.RunCmd([]string{"go", "get", depname + "@" + userversion}) + log.Log(WARN, " go get", depname, err, output) + /* + switch goSumS { + case "SAFE": + log.Log(WARN, " USER VERSIONS MISMATCH", version, userversion) + log.Log(WARN, " IGNORE SAFE REPO") + err, output := rs.RunCmd([]string{"go", "get", depname + "@" + userversion}) + log.Log(WARN, " go get", depname, err, output) + case "CLEAN": + log.Log(WARN, " USER VERSIONS MISMATCH", version, userversion) + log.Log(WARN, " IGNORE CLEAN REPO") + case "PRIMATIVE": + log.Log(WARN, " USER VERSIONS MISMATCH", version, userversion) + log.Log(WARN, " IGNORE PRIMATIVE REPO") + err, output := rs.RunCmd([]string{"go", "get", depname + "@" + userversion}) + log.Log(WARN, " go get", depname, err, output) + default: + log.Log(WARN, " USER VERSIONS MISMATCH default", version, userversion) + clean = append(clean, deprs.String()) + if myGoSumS == "UNCHANGED" { + } + } + */ + } + } + } else { + // log.Log(WARN, " NOT FOUND", depname) + // only fail on our stuff + if strings.HasPrefix(depname, "go.wit.com") { + log.Log(WARN, " go get -v", depname) + // rs.RunCmd([]string{"go", "get", "-v", depname}) + return false, clean + } + // log.Log(WARN, " NOT FOUND BUT IGNORING FOR NOW") + } + } + if len(clean) == 0 { + return true, nil + } + return false, clean +} + +func (rs *RepoStatus) CheckGoSum() (bool, string) { + if rs.ReadGoMod() { + log.Log(INFO, "parsed go.mod", rs.realPath.String()) + } else { + log.Log(WARN, "Something went wrong parsing go.mod", rs.realPath.String()) + return false, "" + } + log.Log(WARN, "go.sum:", rs.realPath.String()) + for depname, version := range rs.goConfig { + if strings.HasSuffix(depname, "/v2") { + log.Log(WARN, " FOUND /v2 wierd golang stuff. instead, look for:", depname) + depname = strings.TrimSuffix(depname, "/v2") + } + log.Log(WARN, " ", depname, version) + deprs, ok := windowMap[depname] + if ok { + if deprs.CheckDirty() { + log.Log(WARN, " IS DIRTY", deprs.String()) + return false, "" + } + if deprs.readOnly.String() == "true" { + log.Log(WARN, " SKIPPING Read Only", deprs.String()) + } else { + log.Log(WARN, " FOUND", deprs.String(), deprs.goSumStatus.String()) + username := deprs.mainWorkingName.String() + userhash, _ := deprs.gitConfig.hashes[username] + userversion, _ := deprs.gitConfig.versions[userhash] + log.Log(WARN, " username :"+username, userhash) + log.Log(WARN, " username :"+username, userversion) + if version == userversion { + log.Log(WARN, " USER VERSIONS MATCH", version, userversion) + if deprs.goSumStatus.String() == "BAD" { + log.Log(WARN, " USER VERSION IS BAD!! return false") + return false, "" + } + } else { + log.Log(WARN, " USER VERSIONS MISMATCH", version, userversion) + return false, "" + } + } + } else { + // log.Log(WARN, " NOT FOUND", depname) + if strings.HasSuffix(depname, "/v2") { + log.Log(WARN, " FOUND /v2 wierd golang stuff. instead, look for:", depname) + } + // only fail on our stuff + if strings.HasPrefix(depname, "go.wit.com") { + log.Log(WARN, " go get -v", depname) + // rs.RunCmd([]string{"go", "get", "-v", depname}) + return false, depname + } + // log.Log(WARN, " NOT FOUND BUT IGNORING FOR NOW") + } + } + err, output := rs.RunCmd([]string{"git", "branch", "--remotes"}) + if err == nil { + lines := strings.Split(output, "\n") + for i, s := range lines { + log.Log(WARN, "add line", i, s) + } + } else { + log.Log(WARN, "git branch --remotes failed", err) + } + return true, "" +} + +func (rs *RepoStatus) MakeRedomod() bool { + var err error + var b bool + var output string + var worked bool = true + if rs.ReadOnly() { + log.Log(WARN, "will not go mod redo read only repos", rs.String()) + return false + } + + os.Unsetenv("GO111MODULE") + path := rs.realPath.String() + err, b, output = RunCmd(path, []string{"rm", "-f", "go.mod", "go.sum"}) + if err != nil { + worked = false + log.Log(WARN, "rm failed", err, b, output) + } + err, b, output = RunCmd(path, []string{"go", "mod", "init"}) + if err != nil { + worked = false + log.Log(WARN, "go mod init failed", err, b, output) + } + err, b, output = RunCmd(path, []string{"go", "mod", "tidy"}) + if err != nil { + worked = false + log.Log(WARN, "go mod tidy failed", err, b, output) + } + if worked { + log.Log(WARN, "MakeRedomod() worked", path) + } else { + log.Log(WARN, "MakeRedomod() failed", path) + } + return worked +} |
