submit-patchset/submitPatches.go

359 lines
9.2 KiB
Go

package main
import (
"path/filepath"
"strconv"
"go.wit.com/gui"
"go.wit.com/lib/gadgets"
"go.wit.com/lib/gui/repolist"
"go.wit.com/lib/gui/repostatus"
"go.wit.com/lib/gui/shell"
"go.wit.com/log"
)
type patch struct {
ref string
giturl string
comment string
rs *repostatus.RepoStatus
}
type patchSummary struct {
grid *gui.Node
updateB *gui.Node
docsB *gui.Node
gitPushB *gui.Node
gitPullB *gui.Node
checkB *gui.Node
// stats
totalOL *gadgets.OneLiner
totalGoOL *gadgets.OneLiner
dirtyOL *gadgets.OneLiner
readonlyOL *gadgets.OneLiner
totalPatchesOL *gadgets.OneLiner
totalUserRepos *gui.Node
totalDevelRepos *gui.Node
totalMasterRepos *gui.Node
totalUserPatches *gui.Node
totalDevelPatches *gui.Node
totalMasterPatches *gui.Node
// patch set generation
unknownOL *gadgets.OneLiner
unknownSubmitB *gui.Node
reason *gadgets.BasicEntry
submitB *gui.Node
allp []*patch
}
func submitPatchesBox(box *gui.Node) *patchSummary {
s := new(patchSummary)
group1 := box.NewGroup("Submit Patches Summary")
s.grid = group1.RawGrid()
s.grid.NewButton("List Patches", func() {
for i, p := range s.allp {
log.Info(i, p.ref, p.rs.String())
}
// update the stats
s.Update()
})
s.gitPullB = s.grid.NewButton("git pull", func() {
me.Disable()
defer me.Enable()
for _, repo := range repolist.AllRepos() {
// gitcmd := []string{"git", "fetch", "origin"}
gitcmd := []string{"git", "pull"}
err, output := repo.RunCmd(gitcmd)
log.Info("output =", output)
if err == nil {
log.Info("git fetch worked", repo.Name())
} else {
log.Info("git fetch failed", repo.Name())
return
}
}
s.gitPullB.SetText("GOOD")
// update the stats
s.Update()
})
s.gitPushB = s.grid.NewButton("git push", func() {
me.Disable()
defer me.Enable()
for _, repo := range repolist.AllRepos() {
gitcmd := []string{"git", "push"}
err, output := repo.RunCmd(gitcmd)
log.Info("output =", output)
if err == nil {
log.Info("git push worked", repo.Name())
} else {
log.Info("git push failed", repo.Name())
return
}
}
s.gitPushB.SetText("GOOD")
// update the stats
s.Update()
})
s.checkB = s.grid.NewButton("Check repos are working", func() {
/*
me.Disable()
defer me.Enable()
for _, repo := range repolist.AllRepos() {
if repo.GitURL() != "" {
log.Info("repo already checked. do they match?")
log.Info("go.wit.com =", repo.GoURL())
log.Info("localurl =", repo.Path())
} else {
ok, giturl := gowit.CheckRegistered(repo)
if ok {
log.Info("is url correct?", repo.Path(), "vs", giturl)
repo.giturl = giturl
if giturl != repo.Path() {
log.Info("repo check failed", repo.String())
s.unknownOL.SetText(repo.String())
s.unknownOL.Show()
s.unknownSubmitB.Show()
return
}
} else {
log.Info("repo check failed", repo.String())
repo.giturl = "look in .git/config"
s.unknownOL.SetText(repo.String())
s.unknownOL.Show()
s.unknownSubmitB.Show()
return
}
}
}
s.checkB.SetText("GOOD")
*/
})
s.grid.NextRow()
s.unknownOL = gadgets.NewOneLiner(s.grid, "Unknown Repo:")
s.unknownSubmitB = s.grid.NewButton("Register Repo", func() {
/*
log.Info("Submit repo:", s.unknownOL.String())
if repolist.Exists(s.unknownOL.String()) {
log.Info("found repo:", repo.String(), "with giturl", repo.giturl)
localurl := repo.status.GitURL()
if localurl == "" {
log.Info("local repo check failed. repo is not uploaded?")
} else {
log.Info("local repo has", localurl)
// attempts to register the unknown repo
if gowit.Register(repo.String(), localurl) {
s.unknownOL.Hide()
s.unknownSubmitB.Hide()
}
}
} else {
log.Info("what is this?", s.unknownOL.String())
}
*/
})
s.unknownOL.Hide()
s.unknownSubmitB.Hide()
s.grid.NextRow()
s.grid = group1.RawGrid()
s.grid.NewLabel("")
s.grid.NewLabel("")
s.grid.NewLabel("user to devel")
s.grid.NewLabel("devel to master")
s.grid.NewLabel("master to last tag")
s.grid.NextRow()
s.totalOL = gadgets.NewOneLiner(s.grid, "Total")
s.grid.NextRow()
s.totalGoOL = gadgets.NewOneLiner(s.grid, "Total GO")
s.totalUserRepos = s.grid.NewLabel("5 go repos")
s.totalDevelRepos = s.grid.NewLabel("3 go repos")
s.totalMasterRepos = s.grid.NewLabel("8 go repos")
s.grid.NextRow()
s.dirtyOL = gadgets.NewOneLiner(s.grid, "dirty")
s.grid.NextRow()
s.readonlyOL = gadgets.NewOneLiner(s.grid, "read-only")
s.grid.NextRow()
s.totalPatchesOL = gadgets.NewOneLiner(s.grid, "total commits")
s.totalUserPatches = s.grid.NewLabel("5 patches")
s.totalDevelPatches = s.grid.NewLabel("3 patches")
s.totalMasterPatches = s.grid.NewLabel("8 patches")
s.grid.NextRow()
s.grid.NewLabel("")
s.grid.NewLabel("")
s.grid.NewButton("merge from user", func() {})
s.grid.NewButton("merge from devel", func() {})
s.grid.NextRow()
group1 = box.NewGroup("Create GUI Patch Set")
s.grid = group1.RawGrid()
s.reason = gadgets.NewBasicEntry(s.grid, "patch name:")
s.reason.Custom = func() {
if s.reason.String() != "" {
s.submitB.Enable()
} else {
s.submitB.Disable()
}
}
s.submitB = s.grid.NewButton("Submit Patches", func() {
patchdir := filepath.Join(me.userHomePwd.String(), "autotypist.patchset")
if shell.Exists(patchdir) {
log.Info("patchset dir already exists", patchdir)
return
} else {
shell.Mkdir(patchdir)
}
if !shell.Exists(patchdir) {
log.Info("something went wrong making", patchdir)
return
}
// if makePatchset(patchdir) {
// }
})
// disable these until there are not dirty repos
s.reason.Disable()
s.submitB.Disable()
return s
}
func (s *patchSummary) Update() {
var total, totalgo, dirty, readonly int
var userT, develT, masterT int
// var userP, develP, masterP int
for _, repo := range repolist.AllRepos() {
total += 1
if repo.Status.IsDirty() {
if repo.Status.GoPath() == "go.wit.com/apps/autotypist" {
// log.Info("ignoring dirty autotypist for now")
dirty += 1
} else {
dirty += 1
}
}
if repo.Status.ReadOnly() {
readonly += 1
}
if repo.Status.IsGoLang() {
totalgo += 1
}
userV := repo.Status.GetUserVersion()
develV := repo.Status.GetDevelVersion()
masterV := repo.Status.GetMasterVersion()
lastV := repo.Status.GetLastTagVersion()
if userV != develV {
userT += 1
}
if develV != masterV {
develT += 1
}
if masterV != lastV {
masterT += 1
}
}
s.totalOL.SetText(strconv.Itoa(total) + " repos")
s.totalGoOL.SetText(strconv.Itoa(totalgo) + " repos")
s.dirtyOL.SetText(strconv.Itoa(dirty) + " repos")
s.readonlyOL.SetText(strconv.Itoa(readonly) + " repos")
s.totalUserRepos.SetText(strconv.Itoa(userT) + " repos")
s.totalDevelRepos.SetText(strconv.Itoa(develT) + " repos")
s.totalMasterRepos.SetText(strconv.Itoa(masterT) + " repos")
/* move all this to repolist and gowit repos
p, allp := s.GetPatches()
if s.allp == nil {
s.allp = make([]*patch, 0, 0)
s.allp = append(s.allp, allp...)
}
if dirty == 0 {
s.totalPatchesOL.SetText(strconv.Itoa(p) + " patches")
s.reason.Enable()
// force the user to submit a reason to enable the submit button
// s.submitB.Enable()
} else {
s.totalPatchesOL.SetText(strconv.Itoa(p) + " patches + ? dirty")
}
*/
}
// move all this to repolist and gowit repos
/*
func (s *patchSummary) GetPatches() (int, []*patch) {
var patchcount int
patches := make([]*patch, 0, 0)
for _, repo := range repolist.AllRepos() {
// git log --oneline devel..jcarr
userv := repo.GetUserVersion()
develv := repo.GetDevelVersion()
usern := repo.GetUserBranchName()
develn := repo.GetDevelBranchName()
if userv == develv {
// log.Info("skipping unchanged repo", repo.String())
} else {
// log.Info("repo userv, develv", userv, develv)
gitcmd := []string{"git", "log", "--oneline", develn + ".." + usern}
// log.Info("Run:", gitcmd)
err, output := repo.status.RunCmd(gitcmd)
if err == nil {
// patches := strings.Split(output, "\n")
for _, line := range strings.Split(output, "\n") {
parts := strings.Split(line, " ")
newp := new(patch)
newp.rs = repo.status
newp.ref = parts[0]
newp.comment = strings.Join(parts[1:], " ")
log.Info("patch:", line, newp.rs.String())
patchcount += 1
patches = append(patches, newp)
}
} else {
log.Info("git failed err=", err)
}
}
}
return patchcount, patches
}
func makePatchset(setdir string) bool {
for _, repo := range me.allrepos {
userv := repo.status.GetUserVersion()
develv := repo.status.GetDevelVersion()
usern := repo.status.GetUserBranchName()
develn := repo.status.GetDevelBranchName()
if userv == develv {
// this repo is unchanged
continue
}
repodir := filepath.Join(setdir, repo.String())
shell.Mkdir(repodir)
// git format-patch branch1..branch2
gitcmd := []string{"git", "format-patch", "-o", repodir, develn + ".." + usern}
log.Info("Run:", gitcmd)
err, output := repo.status.RunCmd(gitcmd)
log.Info("output =", output)
if err == nil {
log.Info("patches made okay for:", repo.String())
continue
}
log.Info("patches failed for:", repo.String())
return false
}
return true
}
*/