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
101
102
103
104
105
106
107
108
109
110
111
112
113
  | 
package main
import (
	"errors"
	"go.wit.com/lib/protobuf/gitpb"
	"go.wit.com/log"
)
func rePrepareReleaseNew(check *gitpb.Repo) error {
	// me.forge.RillFuncError(rillRestore)
	var test string
	if check.FullPath == "/home/jcarr/go/src/go.wit.com/lib/virtigolib" {
		test = "bob"
	}
	if alreadyDone(check) {
		// means it was already published
		// protects against logic errors that might result
		// in an infinite loop
		log.Info("WARNING alreadyDone rePrepareRelease()", check.GetGoPath())
		return nil
	}
	if me.forge.Config.IsReadOnly(check.GetGoPath()) {
		// can't release readonly repos
		return nil
	}
	master := check.GetMasterVersion()
	lastTag := check.GetLastTag()
	if master != lastTag {
		log.Info("LAST TAG != master", check.FullPath, master, lastTag)
	} else {
	}
	if me.forge.Config.IsPrivate(check.GetGoPath()) {
		if master != lastTag {
			return errors.New("adding private repo: " + check.FullPath)
		}
		return nil
	}
	// this is detailed. It makes sure the go.* files are absolutely perfect
	if err := checkPublishedGodeps(check); err != nil {
		// this means the published godeps are no longer up to date
		// forceReleaseVersion(check)
		// log.Info("checkPublishedGodeps failed with err", check.GetGoPath(), err)
		return err
	}
	// if master != lastTag, always increment
	if master != lastTag {
		newmhash := check.GetTagHash(master)
		oldlhash := check.GetTagHash(lastTag)
		if newmhash == oldlhash {
			// they are actually equal
			return nil
		}
		b1, err := check.CountDiffObjects(oldlhash, newmhash)
		if err != nil {
			badExit(err)
		}
		b2, err := check.CountDiffObjects(newmhash, oldlhash)
		if err != nil {
			badExit(err)
		}
		if b1 != 0 {
			log.Printf("HASH ERROR       %-50s tag %s  < %s\n", check.GetGoPath(), newmhash, oldlhash)
			log.Info("old vs new count", b1, b2, "git merge", oldlhash)
		}
		if b1 == 0 && b2 == 0 {
			log.Info("got to identical repo", check.GetGoPath(), b1, b2)
			log.Info("got to identical repo", check.GetGoPath(), oldlhash, newmhash)
			// actually identical. do nothing
			return nil
		}
		if gitpb.IsGoTagVersionGreater(lastTag, master) {
			// this function is not right really. the hash error above should catch it correctly
			// log.Printf("PROBABLY NOT NEE %-50s tag %s  < %s\n", check.GetGoPath(), lastTag, master)
			return errors.New("gitpb.IsGoTagVersionGreater(lastTag, master)")
		}
		log.Printf("NEED RELEASE FOR TAG %-50s tag %s != %s\n", check.GetGoPath(), master, lastTag)
		// forceReleaseVersion(check)
		return errors.New("master != lastTag")
	}
	if argv.Protobuf && check.GetRepoType() == "protobuf" {
		log.Printf("NEED RELEASE FOR TYPE %s err: %v\n", check.GetGoPath(), "because --protobuf")
		// if --protobuf, this will force upgrade each one
		// forceReleaseVersion(check)
		// me.found.AppendByFullPath(check)
		return errors.New("protobuf repo deps changed")
	}
	// if the repo is a go binary or plugin for a new release for
	// any library version change
	//		if check.GetRepoType() == "binary" || check.GetRepoType() == "plugin" {
	// check if the package dependancies changed, if so, re-publish
	if err := finalGoDepsCheckOk(check); err == nil {
		// log.Printf("go.sum is perfect! %s\n", check.GetGoPath())
		return nil
	} else {
		log.Printf("NEED RELEASE FOR CHECK %-50s err: %v\n", check.GetGoPath(), err)
		log.Println("RETURNING ERROR IN IN me.forge.RunOnReposNew() rePrepareReleaseNew(check) for", check.FullPath)
		log.Println("bob = ", test)
		return errors.New("FinalGoDepsCheckOk() failed even though master tag == last tag")
	}
	return nil
}
  |