summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--cleanGoSum.go100
1 files changed, 100 insertions, 0 deletions
diff --git a/cleanGoSum.go b/cleanGoSum.go
new file mode 100644
index 0000000..20d3df7
--- /dev/null
+++ b/cleanGoSum.go
@@ -0,0 +1,100 @@
+package forgepb
+
+import (
+ "errors"
+ "fmt"
+
+ "go.wit.com/lib/protobuf/gitpb"
+ "go.wit.com/log"
+)
+
+// This will recreate your go.sum and go.mod files
+
+// checks to see if every 'master' git branch version
+// matches the go.sum file
+func (f *Forge) CleanGoDepsCheckOk(check *gitpb.Repo) error {
+ if check == nil {
+ log.Info("boo, check == nil")
+ return errors.New("*repo == nil")
+ }
+
+ // re-create go.sum and go.mod
+ if _, err := check.RedoGoMod(); err != nil {
+ return err
+ }
+
+ // if go.mod still does not exist. maybe this isn't a golang repo?
+ if !check.Exists("go.mod") {
+ return errors.New("go.mod can not be created in " + check.GoPath)
+ }
+
+ check.GoDeps = nil
+
+ // this assumes that go mod init and go mod tidy worked
+ // if they did, then the go.mod file might be the only
+ // file here. if so, this is called a 'primitive' golang package here
+ // this means, it's totally self contained and requires only the language go
+ // the name 'primitive' doesn't mean they are simple; these packages are usually awesome!
+ if ok, _ := check.IsPrimitive(); ok {
+ return nil
+ }
+
+ // parse the go.sum file
+ if ok, err := check.ParseGoSum(); !ok {
+ log.Info("CleanGoDepsCheckOk() error", err)
+ return err
+ }
+
+ // this probably shouldn't happen and this check should be removed or logged
+ if check.GoDepsLen() == 0 {
+ // this is a primitive go lang library (or an interesting binary?)
+ check.GoPrimitive = true
+ return nil
+ }
+
+ var err error = nil
+ log.Printf("current repo %s go dependancy count: %d", check.GetGoPath(), check.GoDepsLen())
+ deps := check.GoDeps.SortByGoPath()
+ for deps.Scan() {
+ depRepo := deps.Next()
+ found := f.Repos.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.Repos.FindByGoPath(depRepo.GoPath)
+ var ends string
+ if check.CheckDirty() {
+ ends = "(dirty) "
+ }
+
+ if f.Config.IsReadOnly(check.GoPath) {
+ ends += "(ignoring read-only) "
+ log.Printf("%-48s ok error .%s. vs .%s. %s", depRepo.GetGoPath(),
+ depRepo.GetVersion(), found.GetMasterVersion(), ends)
+ } else {
+ if f.checkOverride(depRepo.GetGoPath()) {
+ ends += "(override) "
+ 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)
+ err = errors.New(errs)
+ }
+ }
+ }
+ }
+ return err
+}