repostatus/draw.go

403 lines
10 KiB
Go

package repostatus
import (
"strconv"
"strings"
"go.wit.com/log"
"go.wit.com/gui/gui"
"go.wit.com/gui/gadgets"
)
// creates the actual widgets.
// it's assumed you are always passing in a box
func (rs *RepoStatus) draw() {
if ! rs.Ready() {return}
// display the status of the git repository
rs.drawGitStatus()
// display the git branches and options
rs.drawGitBranches()
// show standard git commit and merge controls
rs.drawGitCommands()
// figure out what the state of the git repository is
// rs.Update()
}
func (rs *RepoStatus) drawGitBranches() {
rs.gitBranchesGroup = rs.window.Box().NewGroup("branches")
newgrid := rs.gitBranchesGroup.NewGrid("gridnuts", 2, 2)
rs.masterDrop = gadgets.NewBasicDropdown(newgrid, "main branch")
rs.develDrop = gadgets.NewBasicDropdown(newgrid, "devel branch")
rs.userDrop = gadgets.NewBasicDropdown(newgrid, "user branch")
var master = ""
all := rs.getBranches()
for _, branch := range all {
log.Warn("getBranches()", branch)
rs.masterDrop.Add(branch)
rs.develDrop.Add(branch)
rs.userDrop.Add(branch)
if branch == "master" {
master = "master"
}
if branch == "main" {
master = "main"
}
}
// relabel the various gadgets with the right branch name
rs.masterBranchVersion.SetLabel(master)
var count *gui.Node
rs.showBranchesButton = newgrid.NewButton("show branches", func() {
all := rs.getBranches()
i := len(all)
count.Set(strconv.Itoa(i) + " branches")
})
count = newgrid.NewLabel("")
rs.checkBranchesButton = newgrid.NewButton("check branches", func() {
if rs.CheckBranches() {
log.Warn("Branches are perfect")
} else {
log.Warn("Branches are not perfect")
}
})
}
func (rs *RepoStatus) drawGitStatus() {
rs.gitStatusGroup = rs.window.Box().NewGroup("What GO Knows It Has")
newgrid := rs.gitStatusGroup.NewGrid("gridnuts", 2, 2)
// newgrid.SetNext(1,1)
newgrid.Margin()
newgrid.Pad()
rs.path = gadgets.NewOneLiner(newgrid, "path")
rs.currentBranch = gadgets.NewOneLiner(newgrid, "branch")
rs.lasttag = gadgets.NewOneLiner(newgrid, "last tag")
rs.currentVersion = gadgets.NewOneLiner(newgrid, "Version")
rs.tagsDrop = gadgets.NewBasicDropdown(newgrid, "existing tags")
rs.masterBranchVersion = gadgets.NewOneLiner(newgrid, "master")
rs.develBranchVersion = gadgets.NewOneLiner(newgrid, "devel")
rs.userBranchVersion = gadgets.NewOneLiner(newgrid, "user")
rs.dirtyLabel = gadgets.NewOneLiner(newgrid, "dirty")
rs.speed = gadgets.NewOneLiner(newgrid, "refresh speed =")
rs.speedActual = gadgets.NewOneLiner(newgrid, "speed actual =")
}
func (rs *RepoStatus) drawGitCommands() {
rs.gitCommandsGroup = rs.window.Box().NewGroup("git commands")
newgrid := rs.gitCommandsGroup.NewGrid("gridnuts", 2, 2)
newgrid.NewButton("update", func() {
rs.Update()
})
label := "merge devel to " + rs.masterDrop.Get()
rs.develMerge = newgrid.NewButton(label, func() {
rs.develMerge.Disable()
master := rs.masterDrop.Get()
rs.checkoutBranch("master", master)
if rs.getCurrentBranchName() != master {
log.Warn("something went wrong switching to the master branch. full stop!")
return
}
if ! rs.runGitCommands() {
log.Warn("SOMETHING WENT WRONG")
return
}
rs.Update()
log.Warn("THINGS SEEM OK")
})
rs.major = gadgets.NewBasicCombobox(newgrid, "major")
rs.major.Custom = func () {
rs.setTag()
rs.generateCmd()
}
rs.minor = gadgets.NewBasicCombobox(newgrid, "minor")
rs.minor.Custom = func () {
rs.setTag()
rs.generateCmd()
}
rs.revision = gadgets.NewBasicCombobox(newgrid, "revision")
rs.revision.Custom = func () {
rs.setTag()
rs.generateCmd()
}
newgrid.NewLabel("new tag version")
rs.newversion = newgrid.NewLabel("3.1.4")
rs.versionMessage = gadgets.NewBasicEntry(newgrid, "tag message")
rs.versionMessage.Custom = func () {
rs.generateCmd()
}
rs.versionCmdOutput = gadgets.NewOneLiner(newgrid, "tag cmd")
rs.releaseVersion = newgrid.NewButton("tag and release new version", func() {
if ! rs.generateCmd() {
log.Warn("something is wrong. fix the errors first")
return
}
rs.releaseVersion.Disable()
log.Warn("COMMIT IT HERE")
if ! rs.runGitCommands() {
log.Warn("SOMETHING WENT WRONG")
}
rs.Update()
log.Warn("THINGS SEEM OK")
})
newgrid.Margin()
newgrid.Pad()
}
func (rs *RepoStatus) setTag() bool {
lasttag := rs.lasttag.Get()
var major, minor, revision string
major, minor, revision = splitVersion(lasttag)
olda, _ := strconv.Atoi(major)
oldb, _ := strconv.Atoi(minor)
oldc, _ := strconv.Atoi(revision)
log.Warn("current version here", lasttag)
log.Warn("current release a,b,c =", major, minor, revision)
newa, _ := strconv.Atoi(rs.major.Get())
newver := strconv.Itoa(newa)
if newa < olda {
log.Warn("new version bad", newver, "vs old version", lasttag, "newa =", newa, "olda =", olda)
rs.newversion.Set("bad")
return false
}
if newa > olda {
log.Warn("new version ok", newver, "vs old version", lasttag)
rs.newversion.Set(newver)
rs.minor.Set("")
rs.revision.Set("")
return true
}
newb, _ := strconv.Atoi(rs.minor.Get())
newver = strconv.Itoa(newa) + "." + strconv.Itoa(newb)
if newb < oldb {
log.Warn("new version bad", newver, "vs old version", lasttag, "newb =", newb, "oldb =", oldb)
rs.newversion.Set("bad")
return false
}
if newb > oldb {
log.Warn("new version ok", newver, "vs old version", lasttag)
rs.newversion.Set(newver)
rs.revision.Set("")
return true
}
newc, _ := strconv.Atoi(rs.revision.Get())
newver = strconv.Itoa(newa) + "." + strconv.Itoa(newb) + "." + strconv.Itoa(newc)
if newc <= oldc {
log.Warn("new version bad", newver, "vs old version", lasttag)
rs.newversion.Set("bad")
return false
}
log.Warn("new version ok", newver, "vs old version", lasttag)
rs.newversion.Set(newver)
return true
}
func (rs *RepoStatus) incrementVersion() {
lasttag := rs.lasttag.Get()
var major, minor, revision string
major, minor, revision = splitVersion(lasttag)
log.Warn("Should release version here", lasttag)
log.Warn("Should release a,b,c", major, minor, revision)
a, _ := strconv.Atoi(major)
b, _ := strconv.Atoi(minor)
c, _ := strconv.Atoi(revision)
rs.major.Add(a)
rs.major.Add(a + 1)
rs.major.Set(a)
rs.minor.Add(b)
rs.minor.Add(b + 1)
rs.minor.Set(b)
// rs.c := strconv.Atoi(revision)
rs.revision.Add(c + 1)
rs.revision.Add(c + 2)
rs.revision.Set(c + 1)
}
func (rs *RepoStatus) recommend() {
log.Warn("Is repo dirty?", rs.dirtyLabel.Get())
log.Warn("list the known tags")
rs.DisableEverything()
rs.populateTags()
log.Warn("Does devel == user?", rs.develBranchVersion.Get(), rs.userBranchVersion.Get())
if rs.develBranchVersion.Get() != rs.userBranchVersion.Get() {
log.Warn("devel does not equal user")
log.Warn("merge or squash?")
rs.EnableMergeDevel()
rs.setMergeUserCommands()
label := "merge " + rs.GetUserName() + " into " + rs.GetDevelName()
rs.develMerge.SetText(label)
return
}
log.Warn("Does master == devel? ", rs.masterBranchVersion.Get(), rs.develBranchVersion.Get())
if rs.masterBranchVersion.Get() != rs.develBranchVersion.Get() {
log.Warn("master does not equal devel. merge devel into master")
rs.EnableMergeDevel()
rs.setMergeDevelCommands()
label := "merge " + rs.GetDevelName() + " into " + rs.GetMasterName()
rs.develMerge.SetText(label)
return
}
rs.getLastTagVersion()
if rs.lasttag.Get() != rs.masterBranchVersion.Get() {
log.Warn("master does not equal last tag")
rs.incrementVersion()
rs.EnableSelectTag()
rs.setTag()
return
}
log.Warn("Is repo pushed upstream? git.wit.org or github?")
}
func (rs *RepoStatus) generateCmd() bool {
// the length of 24 is arbitrary, but should be short
// they should be things like perhaps, major release names
// or something the users might see.
// aka: "Topsy", "Picasso", "Buzz", etc
if ! rs.setTag() {
log.Warn("tag sucked. fix your tag version")
rs.versionMessage.SetLabel("tag message (bad version)")
rs.releaseVersion.Disable()
return false
}
log.Warn("tag is valid!!!!")
rs.setGitCommands()
if rs.versionMessage.Get() == "" {
log.Warn("tag message is empty!!!!")
rs.releaseVersion.Disable()
return false
}
if len(rs.versionMessage.Get()) > 24 {
rs.versionMessage.SetLabel("tag message (too long)")
} else {
rs.versionMessage.SetLabel("tag message")
}
rs.releaseVersion.Enable()
return true
}
func (rs *RepoStatus) runGitCommands() bool {
for _, line := range rs.versionCmds {
s := strings.Join(line, " ")
log.Warn("NEED TO RUN:", s)
rs.develMerge.SetText(s)
err, b, output := RunCmd(rs.repopath, line)
if err != nil {
log.Warn("ABEND EXECUTION")
log.Warn("error =", err)
log.Warn("output =", output)
return false
}
log.Warn("Returned with b =", b)
log.Warn("output was =", output)
log.Warn("RUN DONE")
}
return true
}
func (rs *RepoStatus) setGitCommands() {
var line1, line2, line3 []string
var all [][]string
newTag := rs.newversion.GetText()
line1 = append(line1, "git", "tag", "v" + newTag, "-m", rs.versionMessage.Get())
all = append(all, line1)
line2 = append(line2, "git", "push", "--tags")
all = append(all, line2)
line3 = append(line3, "git", "push", "--prune", "--tags")
all = append(all, line3)
rs.versionCmds = all
var tmp []string
// convert to displayable to the user text
for _, line := range all {
s := strings.Join(line, " ")
log.Warn("s =", s)
tmp = append(tmp, s)
}
rs.versionCmdOutput.Set(strings.Join(tmp, "\n"))
}
func (rs *RepoStatus) setMergeDevelCommands() {
var line1, line2, line3 []string
var all [][]string
master := rs.GetMasterName()
devel := rs.GetDevelName()
line1 = append(line1, "git", "checkout", master)
all = append(all, line1)
line2 = append(line2, "git", "merge", devel)
all = append(all, line2)
line3 = append(line3, "git", "push")
all = append(all, line3)
rs.versionCmds = all
var tmp []string
// convert to displayable to the user text
for _, line := range all {
s := strings.Join(line, " ")
log.Warn("s =", s)
tmp = append(tmp, s)
}
rs.versionCmdOutput.Set(strings.Join(tmp, "\n"))
}
func (rs *RepoStatus) setMergeUserCommands() {
var line1, line2, line3 []string
var all [][]string
devel := rs.GetDevelName()
user := rs.GetUserName()
line1 = append(line1, "git", "checkout", devel)
all = append(all, line1)
line2 = append(line2, "git", "merge", user)
all = append(all, line2)
line3 = append(line3, "git", "push")
all = append(all, line3)
rs.versionCmds = all
var tmp []string
// convert to displayable to the user text
for _, line := range all {
s := strings.Join(line, " ")
log.Warn("s =", s)
tmp = append(tmp, s)
}
rs.versionCmdOutput.Set(strings.Join(tmp, "\n"))
}