guireleaser/releaseBox.go

398 lines
10 KiB
Go

// This is a simple example
package main
import (
"fmt"
"os"
"path/filepath"
"go.wit.com/gui"
"go.wit.com/log"
"go.wit.com/lib/gadgets"
"go.wit.com/lib/gui/repolist"
)
var release releaseStruct
type releaseStruct struct {
current *repolist.Repo
box *gui.Node
group *gui.Node
grid *gui.Node
repo *gadgets.OneLiner
status *gadgets.OneLiner
readOnly *gadgets.OneLiner
notes *gadgets.OneLiner
version *gadgets.OneLiner
// versionS string
// widgetVersionS string
releaseVersionB *gui.Node
// unreleaseB *gui.Node
reason *gadgets.BasicEntry
// reasonS string
openrepo *gui.Node
goGetB *gui.Node
checkGoSumB *gui.Node
checkDirtyB *gui.Node
makeRedomodB *gui.Node
sendVersionB *gui.Node
checkSafeB *gui.Node
whitelist map[string]*repolist.Repo
// store myself here. use myself to
// do garbage go get tests and other potential junk
guireleaser *repolist.Repo
}
func (w *autoType) Disable() {
// w.mainWindow.Disable()
release.box.Disable()
// buttonDisable()
}
func (w *autoType) Enable() {
// w.mainWindow.Enable()
release.box.Enable()
// buttonEnable()
}
func createReleaseBox(box *gui.Node) {
initWhitelist()
release.box = box
release.group = release.box.NewGroup("Current Repo")
release.grid = release.group.NewGrid("buildOptions", 0, 0)
// do an initial scan of all the repos
scanGoSum()
release.grid.NewButton("scan for Ready", func() {
me.Disable()
scanForReady()
me.Enable()
})
release.grid.NewButton("findNextDirty()", func() {
me.Disable()
defer me.Enable()
if findNextDirty("PRIMATIVE") {
log.Info("findNextDirty() found a repo")
return
}
if findNextDirty("") {
log.Info("findNextDirty() found a repo")
return
}
})
release.releaseVersionB = release.grid.NewButton("release version", func() {
buttonDisable()
if doRelease() {
buttonEnable()
log.Info("doRelease() worked")
} else {
log.Info("doRelease() failed")
}
})
release.openrepo = release.grid.NewButton("open repo", func() {
release.current.Status.Toggle()
})
release.openrepo.Disable()
release.grid.NextRow()
release.repo = gadgets.NewOneLiner(release.grid, "repo")
release.grid.NextRow()
release.status = gadgets.NewOneLiner(release.grid, "status")
release.grid.NextRow()
release.readOnly = gadgets.NewOneLiner(release.grid, "read-only")
release.grid.NextRow()
release.notes = gadgets.NewOneLiner(release.grid, "notes")
release.grid.NextRow()
release.version = gadgets.NewOneLiner(release.grid, "version")
release.grid.NextRow()
release.reason = gadgets.NewBasicEntry(release.grid, "release reason")
release.reason.SetText(me.releaseReasonS)
release.grid.NextRow()
me.autoWorkingPwd = gadgets.NewOneLiner(release.grid, "working directory (pwd)")
release.grid.NextRow()
me.userHomePwd = gadgets.NewOneLiner(release.grid, "user home")
release.grid.NextRow()
me.goSrcPwd = gadgets.NewOneLiner(release.grid, "go src home")
release.grid.NextRow()
homeDir, err := os.UserHomeDir()
if err != nil {
log.Warn("Error getting home directory:", err)
homeDir = "/home/autotypist"
}
me.userHomePwd.SetText(homeDir)
srcDir := filepath.Join(homeDir, "go/src")
me.goSrcPwd.SetText(srcDir)
testf := filepath.Join(srcDir, "go.wit.com/apps/guireleaser", "go.sum")
if !Exists(testf) {
log.Info("go.sum missing", testf)
panic("redo go.sum")
}
release.grid.NewButton("Check Ready", func() {
buttonDisable()
defer buttonEnable()
goSumS := release.current.GoState()
dirtyS := release.current.State()
lastS := release.current.LastTag()
if CheckReady() {
log.Info("repo is ready", release.current.Name(), goSumS, dirtyS, lastS)
return
} else {
log.Info("\trepo is not ready", release.current.Name(), goSumS, dirtyS, lastS)
}
})
release.grid.NewButton("set ignore", func() {
tmp := release.current.GoState()
log.Info("trying to set repo IGNORE is now =", tmp)
release.current.SetGoState("IGNORE")
release.whitelist[release.current.GoPath()] = release.current
})
release.checkSafeB = release.grid.NewButton("fullDoubleCheckFix()", func() {
buttonDisable()
if fullDoubleCheckFix() {
log.Info("go.sum is clean")
} else {
log.Info("repo go.sum FAILED")
return
}
buttonEnable()
})
release.checkGoSumB = release.grid.NewButton("CheckGoSum()", func() {
buttonDisable()
if ok, _ := release.current.Status.CheckGoSum(); ok {
log.Info("repo has go.sum requirements that are clean")
// release.current.setGoSumStatus("CLEAN")
release.status.SetText("GOOD")
release.notes.SetText("CheckGoSum() does not seem to lie")
}
buttonEnable()
})
release.makeRedomodB = release.grid.NewButton("make redomod", func() {
buttonDisable()
if release.current.Status.MakeRedomod() {
} else {
log.Info("This is bad. stop here")
}
buttonEnable()
})
release.grid.NewButton("goodCheckGoSum()", func() {
buttonDisable()
if goodCheckGoSum() {
log.Info("goodCheckGoSum() GOOD")
} else {
log.Info("goodCheckGoSum() FAILED")
}
buttonEnable()
})
release.grid.NextRow()
release.grid.NewButton("release all", func() {
var worked bool = true
buttonDisable()
// rather than loop forever, at least limit this to the number of repos
// incase something, somewhere, goes wrong
duration := repolist.TimeFunction(func() {
for n := 0; n <= len(me.repos.View.AllRepos()); n++ {
if doRelease() {
log.Info("doRelease() worked")
} else {
if release.status.String() == "ALL DONE?" {
log.Info("maybe ALL DONE?")
buttonEnable()
worked = true
break
}
log.Info("doRelease() failed")
worked = false
break
}
}
})
s := fmt.Sprint(duration)
log.Info("release returned", worked, "and ran for", s)
buttonEnable()
})
release.grid.NextRow()
}
func fullDoubleCheckFix() bool {
release.current.Status.CheckSafeGoSumRemake()
if !release.current.Status.MakeRedomod() {
log.Info("go mod failed")
return false
}
if ok, _ := release.current.Status.CheckGoSum(); ok {
log.Info("go.sum is clean")
} else {
log.Info("repo go.sum FAILED")
return false
}
if ok, _ := release.current.Status.CheckGoSum(); ok {
log.Info("repo has go.sum requirements that are clean")
// release.current.setGoSumStatus("CLEAN")
release.status.SetValue("GOOD")
release.notes.SetValue("CheckGoSum() does not seem to lie")
return true
}
return false
}
func goodCheckGoSum() bool {
tmp := release.current.Name()
log.Info("goodCheckGoSum() START on repo:", tmp, "STATUS =", release.current.GoState())
var maybe bool = true
goConfig := release.current.Status.GetGoDeps()
for depname, version := range goConfig {
log.Info("Checking repo deps:", depname, version)
repo := me.repos.View.FindRepo(depname)
if repo != nil {
log.Info(" repo deps: IGNORE", depname, version)
continue
}
goSumS := repo.GoState()
// ignore dependencies on whitelisted repos
// TODO: warn the user about the whitelist
if goSumS == "WHITELIST" {
continue
}
// check if the dependent repo is ReadOnly
// if so, there isn't anything we can do about
// version mis-matches
if repo.ReadOnly() {
continue
}
lastS := repo.LastTag()
targetS := repo.Status.GetTargetVersion()
log.Info(" repo deps:", depname, version, "vs", goSumS, lastS, targetS)
if lastS != targetS {
log.Info("repo deps: FALSE lastS != targetS", lastS, targetS)
log.Info("repo deps: FALSE status.ReadOnly()", release.current.ReadOnly())
log.Info("repo deps: FALSE path", release.current.GoPath())
maybe = false
}
}
if maybe {
log.Info("SUCCEEDED.", release.current.Name())
log.Info("SUCCEEDED. goSumStatus.String() =", release.current.GoState())
log.Info("SUCCEEDED. MAYBE. try it again get go.sum requirements")
return true
} else {
log.Info("FAILED. move on")
}
return false
}
func buttonDisable() {
me.Disable()
}
func buttonEnable() {
me.Enable()
}
func setCurrentRepo(newcur *repolist.Repo, s string, note string) bool {
if newcur.ReadOnly() {
return false
}
release.repo.SetText(newcur.GoPath())
release.status.SetText(s)
release.notes.SetText(note)
release.current = newcur
release.version.SetText(release.current.Status.GetTargetVersion())
release.releaseVersionB.SetText("release version " + release.current.Status.GetTargetVersion())
// release.unreleaseB.SetText("un-release version " + release.current.targetVersion.String())
release.openrepo.Enable()
return true
}
func scanForReady() bool {
for _, repo := range me.repos.View.AllRepos() {
goSumS := repo.GoState()
dirtyS := repo.State()
log.Info("findNextDirty()", repo.GoPath(), goSumS, dirtyS)
if whitelist(repo.GoPath()) {
log.Info("found WHITELIST", repo.GoPath())
repo.SetGoState("WHITELIST")
continue
}
log.Info("scan for Ready: found a repo")
if setCurrentRepo(repo, "checking ready", "notsure") {
CheckReady()
}
}
return true
}
// trys to figure out if there is still something to update
// todo: redo this logic as it is terrible
func findNextDirty(onlyKind string) bool {
for _, repo := range me.repos.View.AllRepos() {
goSumS := repo.GoState()
// dirtyS := repo.State()
log.Info("findNextDirty()", repo.GoPath(), goSumS)
if repo.ReadOnly() {
log.Info("findNextDirty() skipping readonly")
continue
}
if goSumS == "PRIMATIVE" {
if setCurrentRepo(repo, "PRIMATIVE", "release new version") {
if release.version.String() == release.current.Status.GetLastTagVersion() {
// everything is fine. the primative has already been released
} else {
return true
}
}
continue
} else {
if onlyKind == "PRIMATIVE" {
continue
}
}
if goSumS == "IGNORE" {
continue
}
if goSumS == "RELEASED" {
continue
}
if goSumS == "WHITELIST" {
continue
}
setCurrentRepo(repo, "REDO GOSUM", "try redoing the gosum")
newgoSumS := release.current.GoState()
// newdirtyS := release.current.dirtyLabel.String()
newlastS := release.current.LastTag()
if goodCheckGoSum() {
log.Info("findNextDirty() returning true from goodCheckGoSum()", newgoSumS, newgoSumS, newlastS)
return true
}
}
log.Info("tried to findNextDirty() but not sure what to do next")
release.status.SetText("ALL DONE?")
return false
}