summaryrefslogtreecommitdiff
path: root/cleanGoSum.go
blob: 20d3df7e6d8ceec4e658e93f0370f3419d389fad (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
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
}