forge/windowRepos.go

412 lines
9.7 KiB
Go
Raw Normal View History

2025-03-04 04:29:14 -06:00
// Copyright 2017-2025 WIT.COM Inc. All rights reserved.
// Use of this source code is governed by the GPL 3.0
package main
// An app to submit patches for the 30 GO GUI repos
import (
2025-03-04 14:32:17 -06:00
"fmt"
"os"
2025-03-04 15:45:52 -06:00
"time"
2025-03-04 14:32:17 -06:00
2025-03-04 04:29:14 -06:00
"go.wit.com/lib/gadgets"
"go.wit.com/lib/protobuf/gitpb"
"go.wit.com/log"
)
func makeReposWin() *gadgets.GenericWindow {
win := gadgets.NewGenericWindow("git repos", "All about git repos")
grid := win.Group.RawGrid()
me.repoDirtyB = grid.NewButton("dirty", func() {
doCheckDirtyAndConfigSave()
found := findDirty()
tb, box := makeStandardReposWindow("dirty repos", found)
hbox := box.Box().Horizontal()
hbox.NewButton("commit all", func() {
all := found.SortByFullPath()
for all.Scan() {
repo := all.Next()
log.Info("do commit here on", repo.GetGoPath())
}
log.Info("TODO: fix this")
log.Info("run 'forge commit --all'")
})
hbox.NewButton("update table", func() {
me.forge.PrintHumanTable(found)
found2 := findDirty()
me.forge.PrintHumanTable(found2)
tb.Update()
tb.UpdateTable(found2)
})
hbox.NewButton("delete table", func() {
tb.Delete()
})
})
var writeWin *gadgets.GenericWindow
me.repoWritableB = grid.NewButton("writable", func() {
// if the window exists, just toggle it open or closed
if writeWin != nil {
writeWin.Toggle()
return
}
// make the window for the first time
found := new(gitpb.Repos)
all := me.forge.Repos.SortByFullPath()
for all.Scan() {
repo := all.Next()
if me.forge.Config.IsReadOnly(repo.GetGoPath()) {
continue
}
found.AppendByGoPath(repo)
}
writeWin, _ = makeWritableWindow(found)
writeWin.Win.Custom = func() {
log.Info("closing window. could do somethine here")
}
})
me.repoAllB = grid.NewButton("All", func() {
me.found = new(gitpb.Repos)
all := me.forge.Repos.SortByFullPath()
for all.Scan() {
repo := all.Next()
me.found.AppendByGoPath(repo)
}
makeStandardReposWindow("All repos", me.found)
})
2025-03-04 15:45:52 -06:00
var insertWin *gadgets.GenericWindow
me.repoWritableB = grid.NewButton("insert test", func() {
// if the window exists, just toggle it open or closed
if insertWin != nil {
insertWin.Toggle()
return
}
insertWin = makeWindowForPB()
insertWin.Win.Custom = func() {
log.Info("test delete window here")
}
grid := insertWin.Group.RawGrid()
2025-03-04 21:04:57 -06:00
var t *gitpb.ReposTable
grid.NewButton("dirty", func() {
if t != nil {
t.Delete()
t = nil
}
found := findDirty()
// display the protobuf
t = addWindowPB(insertWin, found)
log.Info("table has uuid", t.GetUuid())
})
grid.NewButton("all", func() {
if t != nil {
t.Delete()
t = nil
}
2025-03-05 02:58:31 -06:00
found := new(gitpb.Repos)
all := me.forge.Repos.SortByFullPath()
for all.Scan() {
repo := all.Next()
found.AppendByGoPath(repo)
}
// display the protobuf
2025-03-04 20:29:23 -06:00
t = addWindowPB(insertWin, found)
2025-03-04 15:45:52 -06:00
log.Info("table has uuid", t.GetUuid())
})
2025-03-04 21:04:57 -06:00
grid.NewButton("writeable", func() {
if t != nil {
t.Delete()
t = nil
}
found := new(gitpb.Repos)
all := me.forge.Repos.SortByFullPath()
for all.Scan() {
repo := all.Next()
if me.forge.Config.IsReadOnly(repo.GetGoPath()) {
continue
}
2025-03-05 02:58:31 -06:00
found.AppendByGoPath(repo)
}
2025-03-05 02:58:31 -06:00
// make the window for the first time
t = addWindowPB(insertWin, found)
log.Info("table has uuid", t.GetUuid())
2025-03-04 20:29:23 -06:00
})
2025-03-04 15:45:52 -06:00
})
2025-03-04 04:29:14 -06:00
grid.NewButton("Configure", func() {
log.Info("add a forge config window here")
})
2025-03-04 14:32:17 -06:00
win.Stack.NewGroup("misc (works in progress)")
grid = win.Stack.RawGrid()
var found *gitpb.Repos
var txt string
found = develBehindMasterProblem()
txt = fmt.Sprintf("devel is behind master (%d)", found.Len())
grid.NewButton(txt, func() {
win := gadgets.RawBasicWindow("devel branches that are out of sync with master")
win.Make()
win.Show()
win.Custom = func() {
// sets the hidden flag to false so Toggle() works
win.Hide()
}
box := win.Box().NewBox("bw vbox", false)
found := develBehindMasterProblem()
group := box.NewGroup("test buttons")
hbox := group.Box().Horizontal()
hbox.NewButton("git merge master devel", func() {
all := found.SortByFullPath()
for all.Scan() {
repo := all.Next()
mname := repo.GetMasterBranchName()
dname := repo.GetDevelBranchName()
if dname != repo.GetCurrentBranchName() {
log.Info("Repo is not on the devel branch", repo.GetGoPath())
}
cmd := []string{"git", "merge", mname}
log.Info(repo.GetGoPath(), cmd)
repo.RunVerbose(cmd)
}
})
hbox.NewButton("test", func() {
})
t := makeStandardReposGrid(found)
t.SetParent(box)
t.ShowTable()
})
found = remoteUserBranchProblem()
txt = fmt.Sprintf("user branch is remote (%d)", found.Len())
grid.NewButton(txt, func() {
win := gadgets.RawBasicWindow("repos that seem to have remote user branches")
win.Make()
win.Show()
win.Custom = func() {
// sets the hidden flag to false so Toggle() works
win.Hide()
}
box := win.Box().NewBox("bw vbox", false)
found := remoteUserBranchProblem()
group := box.NewGroup("test buttons")
hbox := group.Box().Horizontal()
hbox.NewButton("git branch delete", func() {
win.Disable()
defer win.Enable()
all := found.SortByFullPath()
for all.Scan() {
repo := all.Next()
brname := repo.GetUserBranchName()
// git push origin --delete jcarr
os.Setenv("GIT_TERMINAL_PROMPT", "0")
cmd := []string{"git", "push", "origin", "--delete", brname}
log.Info("You may want to run:", repo.GetGoPath(), cmd)
repo.RunVerbose(cmd)
os.Unsetenv("GIT_TERMINAL_PROMPT")
// git branch --delete --remote origin/jcarr
cmd = []string{"git", "branch", "--delete", "--remote", "origin/" + brname}
log.Info(repo.GetGoPath(), cmd)
repo.RunVerbose(cmd)
repo.Reload()
}
me.forge.SetConfigSave(true)
me.forge.ConfigSave()
})
t := makeStandardReposGrid(found)
t.SetParent(box)
t.ShowTable()
})
grid.NewButton("unknown branches", func() {
log.Info("unknown branches not done yet")
2025-03-04 14:32:17 -06:00
})
grid.NextRow()
found = develRemoteProblem()
txt = fmt.Sprintf("remote devel != local devel (%d)", found.Len())
grid.NewButton(txt, func() {
found := develRemoteProblem()
makeStandardReposWindow(txt, found)
})
found = masterRemoteProblem()
txt = fmt.Sprintf("remote master != local master (%d)", found.Len())
grid.NewButton(txt, func() {
found := masterRemoteProblem()
makeStandardReposWindow(txt, found)
})
grid.NextRow()
2025-03-04 04:29:14 -06:00
return win
}
2025-03-04 14:32:17 -06:00
func develBehindMasterProblem() *gitpb.Repos {
found := new(gitpb.Repos)
all := me.forge.Repos.SortByFullPath()
for all.Scan() {
repo := all.Next()
if repo.GetDevelVersion() == repo.GetMasterVersion() {
continue
}
found.AppendByGoPath(repo)
}
return found
}
func remoteUserBranchProblem() *gitpb.Repos {
found := new(gitpb.Repos)
all := me.forge.Repos.SortByFullPath()
for all.Scan() {
repo := all.Next()
username := repo.GetUserBranchName()
if repo.IsBranchRemote(username) {
found.AppendByGoPath(repo)
}
}
return found
}
func develRemoteProblem() *gitpb.Repos {
found := new(gitpb.Repos)
all := me.forge.Repos.SortByFullPath()
for all.Scan() {
repo := all.Next()
brname := repo.GetDevelBranchName()
if !repo.IsBranchRemote(brname) {
// log.Info("repo does not have remote devel branch", repo.GetGoPath())
continue
}
lhash := repo.GetLocalHash(brname)
rhash := repo.GetRemoteHash(brname)
// log.Info(lhash, rhash, repo.GetGoPath())
if lhash == "" || rhash == "" {
// something is wrong if either of these are blank
found.AppendByGoPath(repo)
continue
}
if lhash == rhash {
continue
}
found.AppendByGoPath(repo)
}
return found
}
func masterRemoteProblem() *gitpb.Repos {
found := new(gitpb.Repos)
all := me.forge.Repos.SortByFullPath()
for all.Scan() {
repo := all.Next()
brname := repo.GetMasterBranchName()
if !repo.IsBranchRemote(brname) {
// log.Info("repo does not have remote devel branch", repo.GetGoPath())
continue
}
lhash := repo.GetLocalHash(brname)
rhash := repo.GetRemoteHash(brname)
// log.Info(lhash, rhash, repo.GetGoPath())
if lhash == "" || rhash == "" {
// something is wrong if either of these are blank
found.AppendByGoPath(repo)
continue
}
if lhash == rhash {
continue
}
found.AppendByGoPath(repo)
}
return found
}
2025-03-04 15:45:52 -06:00
func makeWritableWindow(pb *gitpb.Repos) (*gadgets.GenericWindow, *gitpb.ReposTable) {
win := gadgets.NewGenericWindow("Repos You have write access to", "Configure")
t := pb.NewTable("testForgeRepos")
t.NewUuid()
grid := win.Group.RawGrid()
grid.NewButton("git pull", func() {
log.Info("todo: run git pull on each repo")
})
grid.NewButton("do repos.ReScan()", func() {
t.Update()
})
tbox := win.Bottom.Box()
t.SetParent(tbox)
sf := t.AddStringFunc("repo", func(r *gitpb.Repo) string {
return r.GetGoPath()
})
sf.Custom = func(r *gitpb.Repo) {
log.Info("do button click on", r.GetGoPath())
}
t.AddTimeFunc("age", func(repo *gitpb.Repo) time.Time {
return repo.NewestTime()
})
t.AddMasterVersion()
t.AddDevelVersion()
t.AddUserVersion()
t.AddCurrentBranchName()
t.AddState()
t.ShowTable()
return win, t
}
func makeWindowForPB() *gadgets.GenericWindow {
win := gadgets.NewGenericWindow("Raw PB View", "Configure")
return win
}
func addWindowPB(win *gadgets.GenericWindow, pb *gitpb.Repos) *gitpb.ReposTable {
t := pb.NewTable("testForgeRepos")
t.NewUuid()
2025-03-05 02:58:31 -06:00
tbox := win.Bottom.Box().SetProgName("TBOX")
2025-03-04 15:45:52 -06:00
t.SetParent(tbox)
sf := t.AddStringFunc("repo", func(r *gitpb.Repo) string {
return r.GetGoPath()
})
sf.Custom = func(r *gitpb.Repo) {
log.Info("do button click on", r.GetGoPath())
}
t.AddTimeFunc("age", func(repo *gitpb.Repo) time.Time {
return repo.NewestTime()
})
t.AddMasterVersion()
t.AddDevelVersion()
t.AddUserVersion()
t.AddCurrentBranchName()
t.AddState()
t.ShowTable()
return t
}