403 lines
10 KiB
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"))
|
|
}
|