diff --git a/cleanGoSum.go b/cleanGoSum.go new file mode 100644 index 0000000..1221212 --- /dev/null +++ b/cleanGoSum.go @@ -0,0 +1,161 @@ +package forgepb + +import ( + "errors" + "fmt" + "os" + "path/filepath" + "sort" + "strings" + + "go.wit.com/lib/protobuf/gitpb" + "go.wit.com/log" +) + +// This will recreate your go.sum and go.mod files +var cleanVerbose bool = false + +// checks to see if every 'master' git branch version +// matches the go.sum file +func (f *Forge) CleanGoDepsCheckOk(check *gitpb.Repo) error { + var err error = nil + var fixes [][]string + log.Printf("current repo %s go dependancy count: %d", check.GetGoPath(), check.GoDepsLen()) + if check.GoDeps == nil { + return errors.New("check.GoDeps == nil") + } + all := check.GoDeps.SortByGoPath() + for all.Scan() { + depRepo := all.Next() + found := f.FindByGoPath(depRepo.GetGoPath()) + if found == nil { + if f.CheckOverride(depRepo.GetGoPath()) { + // skip this gopath because it's probably broken forever + continue + } + log.Info("not found:", depRepo.GetGoPath()) + err = errors.New("not found: " + depRepo.GetGoPath()) + continue + } + // log.Info("found dep", depRepo.GetGoPath()) + if depRepo.GetVersion() != found.GetMasterVersion() { + check := f.FindByGoPath(depRepo.GetGoPath()) + var ends string + if check.CheckDirty() { + ends = "(dirty) " + } + + if f.Config.IsReadOnly(check.GetGoPath()) { + ends += "(ignoring read-only) " + if cleanVerbose { + log.Printf("%-48s ok error .%s. vs .%s. %s", depRepo.GetGoPath(), + depRepo.GetVersion(), found.GetMasterVersion(), ends) + } + } else { + if f.CheckOverride(depRepo.GetGoPath()) { + ends += "(override) " + if cleanVerbose { + log.Printf("%-48s ok error .%s. vs .%s. %s", depRepo.GetGoPath(), + depRepo.GetVersion(), found.GetMasterVersion(), ends) + // skip this gopath because it's probably broken forever + } + continue + } else { + log.Printf("%-48s error %10s vs %10s %s", depRepo.GetGoPath(), + depRepo.GetVersion(), found.GetMasterVersion(), ends) + errs := fmt.Sprintf("%s error %s vs %s %s", depRepo.GetGoPath(), + depRepo.GetVersion(), found.GetMasterVersion(), ends) + if ok, _ := ValidGoVersion(found.GetMasterVersion()); ok { + // can't go get invalid version numbers + cmd := []string{"go", "get", depRepo.GetGoPath() + "@" + found.GetMasterVersion()} + fixes = append(fixes, cmd) + } + err = errors.New(errs) + } + } + } + } + for i, cmd := range fixes { + log.Info("try cmd", i, cmd) + check.RunRealtime(cmd) + } + return err +} + +func (f *Forge) TrimGoSum(check *gitpb.Repo) error { + var stuff map[string]string + stuff = make(map[string]string) + + var modver map[string]string + modver = make(map[string]string) + + var good map[string]bool + good = make(map[string]bool) + + if check == nil { + log.Info("boo, check == nil") + return errors.New("*repo == nil") + } + filename := filepath.Join(filepath.Join(check.FullPath, "go.sum")) + data, err := os.ReadFile(filename) + if err != nil { + return err + } + + for _, line := range strings.Split(string(data), "\n") { + parts := strings.Fields(line) + if len(parts) < 3 { + log.Info("WIERD OR BAD:", line) + continue + } + + gopath := parts[0] + version := parts[1] + hash := parts[2] + + if strings.HasSuffix(version, "/go.mod") { + if _, ok := stuff[gopath]; ok { + if cleanVerbose { + log.Info("MATCHED: gopath:", gopath, "version:", version) + } + modver[gopath] = version + " " + hash + good[gopath] = true + } else { + if cleanVerbose { + log.Info("GARBAGE: gopath:", gopath, "version:", version) + } + } + } else { + if cleanVerbose { + log.Info("GOOD : gopath:", gopath, "version:", version) + } + stuff[gopath] = version + " " + hash + } + } + + keys := make([]string, 0, len(stuff)) + for k := range stuff { + keys = append(keys, k) + } + + // rewrite the go.sum file + newfilename := filepath.Join(filepath.Join(check.FullPath, "go.sum")) + newf, err := os.OpenFile(newfilename, os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0644) + if err != nil { + return err + } + defer newf.Close() + sort.Strings(keys) + for _, gopath := range keys { + if good[gopath] { + fmt.Fprintf(newf, "%s %s\n", gopath, stuff[gopath]) + fmt.Fprintf(newf, "%s %s\n", gopath, modver[gopath]) + check := f.FindByGoPath(gopath) + if check == nil { + log.Info("gopath does not really exist:", gopath) + } + } + } + // fmt.Fprintln(newf, "test") + return nil +}