package repostatus import ( "io/ioutil" "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 draw(rs *RepoStatus) { 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" } } rs.masterDrop.Set(master) // relabel the various gadgets with the right branch name rs.masterBranch.SetLabel(master) rs.major.SetTitle(master) rs.develDrop.Set("devel") rs.userDrop.Set("jcarr") var count *gui.Node newgrid.NewButton("show branches", func() { all := rs.getBranches() i := len(all) count.Set(strconv.Itoa(i)) }) count = newgrid.NewLabel("") newgrid.NewButton("check branches", func() { all := rs.getBranches() path := fullpath(rs.repopath + "/.git/refs/") for _, b := range all { parts := strings.Split(b, "/") rdir := "heads" if len(parts) == 2 { rdir = "remotes" } fullfile := path + "/" + rdir + "/" + b content, _ := ioutil.ReadFile(fullfile) hash := strings.TrimSpace(string(content)) // log.Warn(fullfile) log.Warn(hash, b) } }) } 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.masterBranch = gadgets.NewOneLiner(newgrid, "master") rs.develBranch = gadgets.NewOneLiner(newgrid, "devel") rs.jcarrBranch = gadgets.NewOneLiner(newgrid, "jcarr") 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() { 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("THINGS SEEM OK") } else { log.Warn("SOMETHING WENT WRONG") } rs.develMerge.Disable() // don't let this run twice for now }) 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 } log.Warn("COMMIT IT HERE") if rs.runGitCommands() { log.Warn("THINGS SEEM OK") } else { log.Warn("SOMETHING WENT WRONG") } }) 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()) newb, _ := strconv.Atoi(rs.minor.Get()) newc, _ := strconv.Atoi(rs.revision.Get()) newver := strconv.Itoa(newa) if newa < olda { log.Warn("new version bad", newver, "vs old version", lasttag) 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 } newver = strconv.Itoa(newa) + "." + strconv.Itoa(newb) if newb < oldb { log.Warn("new version bad", newver, "vs old version", lasttag) 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 } 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 == jcarr?", rs.develBranch.Get(), rs.jcarrBranch.Get()) if rs.develBranch.Get() != rs.jcarrBranch.Get() { log.Warn("devel does not equal jcarr") log.Warn("merge or squash?") return } log.Warn("Does master == devel? ", rs.masterBranch.Get(), rs.develBranch.Get()) if rs.masterBranch.Get() != rs.develBranch.Get() { log.Warn("master does not equal devel. merge devel into master") rs.EnableMergeDevel() rs.setMergeDevelCommands() return } rs.getLastTagVersion() if rs.lasttag.Get() != rs.masterBranch.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) 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 []string var all [][]string line1 = append(line1, "git", "merge", "devel") all = append(all, line1) line2 = append(line2, "git", "push") all = append(all, line2) 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")) }