initial commit
This commit is contained in:
commit
87346d9452
|
@ -0,0 +1,32 @@
|
||||||
|
package repostatus
|
||||||
|
|
||||||
|
/*
|
||||||
|
this enables command line options from other packages like 'gui' and 'log'
|
||||||
|
*/
|
||||||
|
|
||||||
|
import (
|
||||||
|
"go.wit.com/log"
|
||||||
|
)
|
||||||
|
|
||||||
|
var NOW *log.LogFlag
|
||||||
|
var INFO *log.LogFlag
|
||||||
|
|
||||||
|
var SPEW *log.LogFlag
|
||||||
|
var WARN *log.LogFlag
|
||||||
|
|
||||||
|
var CHANGE *log.LogFlag
|
||||||
|
var STATUS *log.LogFlag
|
||||||
|
|
||||||
|
func init() {
|
||||||
|
full := "go.wit.com/gui/gadgets/repostatus"
|
||||||
|
short := "repostatus"
|
||||||
|
|
||||||
|
NOW = log.NewFlag( "NOW", true, full, short, "temp debugging stuff")
|
||||||
|
INFO = log.NewFlag("INFO", false, full, short, "normal debugging stuff")
|
||||||
|
|
||||||
|
WARN = log.NewFlag("WARN", true, full, short, "bad things")
|
||||||
|
SPEW = log.NewFlag("SPEW", false, full, short, "spew stuff")
|
||||||
|
|
||||||
|
CHANGE = log.NewFlag("CHANGE", true, full, short, "when repo changes")
|
||||||
|
STATUS = log.NewFlag("STATUS", false, full, short, "current status")
|
||||||
|
}
|
|
@ -0,0 +1,85 @@
|
||||||
|
package repostatus
|
||||||
|
|
||||||
|
import (
|
||||||
|
"go.wit.com/log"
|
||||||
|
"go.wit.com/gui/gui"
|
||||||
|
)
|
||||||
|
|
||||||
|
// reports externally if something has changed
|
||||||
|
// since the last time it was asked about it
|
||||||
|
func (ls *RepoStatus) Changed() bool {
|
||||||
|
if ! ls.Ready() {return false}
|
||||||
|
if ls.changed {
|
||||||
|
ls.changed = false
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
func (ls *RepoStatus) Make() {
|
||||||
|
if ! ls.Ready() {return}
|
||||||
|
log.Log(CHANGE, "Make() window ready =", ls.ready)
|
||||||
|
ls.window.Make()
|
||||||
|
ls.ready = true
|
||||||
|
}
|
||||||
|
func (ls *RepoStatus) Draw() {
|
||||||
|
if ! ls.Ready() {return}
|
||||||
|
log.Log(CHANGE, "Draw() window ready =", ls.ready)
|
||||||
|
ls.window.Draw()
|
||||||
|
ls.ready = true
|
||||||
|
}
|
||||||
|
func (ls *RepoStatus) Draw2() {
|
||||||
|
if ! ls.Ready() {return}
|
||||||
|
log.Log(CHANGE, "draw(ls) ready =", ls.ready)
|
||||||
|
draw(ls)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (ls *RepoStatus) Show() {
|
||||||
|
if ! ls.Ready() {return}
|
||||||
|
log.Log(CHANGE, "Show() window ready =", ls.ready)
|
||||||
|
ls.window.Show()
|
||||||
|
ls.hidden = false
|
||||||
|
}
|
||||||
|
|
||||||
|
func (ls *RepoStatus) Hide() {
|
||||||
|
if ! ls.Ready() {return}
|
||||||
|
log.Log(CHANGE, "Hide() window ready =", ls.ready)
|
||||||
|
ls.window.Hide()
|
||||||
|
ls.hidden = true
|
||||||
|
}
|
||||||
|
|
||||||
|
func (ls *RepoStatus) Toggle() {
|
||||||
|
if ! ls.Ready() {return}
|
||||||
|
log.Log(CHANGE, "Toggle() window ready =", ls.ready)
|
||||||
|
if ls.hidden {
|
||||||
|
ls.Show()
|
||||||
|
} else {
|
||||||
|
ls.Hide()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (ls *RepoStatus) Ready() bool {
|
||||||
|
log.Log(SPEW, "Ready() maybe not ready? ls =", ls)
|
||||||
|
if ls == nil {return false}
|
||||||
|
if ls.window == nil {return false}
|
||||||
|
return ls.ready
|
||||||
|
}
|
||||||
|
|
||||||
|
func (ls *RepoStatus) Initialized() bool {
|
||||||
|
log.Log(CHANGE, "checking Initialized()")
|
||||||
|
if ls == nil {return false}
|
||||||
|
if ls.parent == nil {return false}
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
func (ls *RepoStatus) SetParent(p *gui.Node) {
|
||||||
|
log.Log(CHANGE, "Attempting SetParent")
|
||||||
|
if ls == nil {return}
|
||||||
|
if ls.parent == nil {
|
||||||
|
log.Log(CHANGE, "SetParent =", p)
|
||||||
|
ls.parent = p
|
||||||
|
return
|
||||||
|
} else {
|
||||||
|
log.Log(CHANGE, "SetParent was already set to =", ls.parent)
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,48 @@
|
||||||
|
package repostatus
|
||||||
|
|
||||||
|
import (
|
||||||
|
"go.wit.com/log"
|
||||||
|
"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}
|
||||||
|
rs.group = rs.window.Box().NewGroup("What GO Knows It Has")
|
||||||
|
|
||||||
|
rs.grid = rs.group.NewGrid("gridnuts", 2, 2)
|
||||||
|
|
||||||
|
rs.grid.SetNext(1,1)
|
||||||
|
|
||||||
|
rs.path = gadgets.NewOneLiner(rs.grid, "path")
|
||||||
|
rs.currentBranch = gadgets.NewOneLiner(rs.grid, "branch")
|
||||||
|
rs.lasttag = gadgets.NewOneLiner(rs.grid, "last tag")
|
||||||
|
rs.currentVersion = gadgets.NewOneLiner(rs.grid, "Version")
|
||||||
|
|
||||||
|
rs.grid.NewLabel("tags")
|
||||||
|
rs.tagsDrop = rs.grid.NewDropdown("tags")
|
||||||
|
rs.masterBranch = gadgets.NewOneLiner(rs.grid, "master")
|
||||||
|
rs.develBranch = gadgets.NewOneLiner(rs.grid, "devel")
|
||||||
|
rs.jcarrBranch = gadgets.NewOneLiner(rs.grid, "jcarr")
|
||||||
|
|
||||||
|
rs.dirtyLabel = gadgets.NewOneLiner(rs.grid, "dirty")
|
||||||
|
|
||||||
|
rs.speed = gadgets.NewOneLiner(rs.grid, "refresh speed =")
|
||||||
|
rs.speedActual = gadgets.NewOneLiner(rs.grid, "speed actual =")
|
||||||
|
|
||||||
|
rs.grid.NewButton("update", func() {
|
||||||
|
rs.Update()
|
||||||
|
})
|
||||||
|
rs.grid.NewButton("recommend", func() {
|
||||||
|
log.Warn("Is repo dirty?", rs.dirtyLabel.Get())
|
||||||
|
log.Warn("list the known tags")
|
||||||
|
rs.populateTags()
|
||||||
|
log.Warn("Does master == devel? ")
|
||||||
|
log.Warn("Does devel == jcarr?")
|
||||||
|
log.Warn("Is repo pushed upstream? git.wit.org or github?")
|
||||||
|
})
|
||||||
|
|
||||||
|
rs.grid.Margin()
|
||||||
|
rs.grid.Pad()
|
||||||
|
}
|
|
@ -0,0 +1,81 @@
|
||||||
|
package repostatus
|
||||||
|
|
||||||
|
import (
|
||||||
|
"go.wit.com/log"
|
||||||
|
)
|
||||||
|
|
||||||
|
func (rs *RepoStatus) getCurrentBranchName() string {
|
||||||
|
out := run(rs.repopath, "git", "branch --show-current")
|
||||||
|
log.Warn("getCurrentBranchName() =", out)
|
||||||
|
rs.currentBranch.Set(out)
|
||||||
|
return out
|
||||||
|
}
|
||||||
|
|
||||||
|
func (rs *RepoStatus) getCurrentBranchVersion() string {
|
||||||
|
out := run(rs.repopath, "git", "describe --tags")
|
||||||
|
log.Warn("getCurrentBranchVersion()", out)
|
||||||
|
rs.currentVersion.Set(out)
|
||||||
|
return out
|
||||||
|
}
|
||||||
|
|
||||||
|
func (rs *RepoStatus) getLastTagVersion() string {
|
||||||
|
out := run(rs.repopath, "git", "rev-list --tags --max-count=1")
|
||||||
|
log.Warn("getLastTagVersion()", out)
|
||||||
|
rs.lasttagrev = out
|
||||||
|
|
||||||
|
lastreal := "describe --tags " + out
|
||||||
|
// out = run(r.path, "git", "describe --tags c871d5ecf051a7dc4e3a77157cdbc0a457eb9ae1")
|
||||||
|
out = run(rs.repopath, "git", lastreal)
|
||||||
|
rs.lasttag.Set(out)
|
||||||
|
// rs.lastLabel.Set(out)
|
||||||
|
return out
|
||||||
|
}
|
||||||
|
|
||||||
|
func (rs *RepoStatus) populateTags() {
|
||||||
|
tmp := fullpath(rs.repopath + "/.git/refs/tags")
|
||||||
|
log.Warn("populateTags() path =", tmp)
|
||||||
|
for _, tag := range listFiles(tmp) {
|
||||||
|
if rs.tags[tag] == "" {
|
||||||
|
log.Warn("populateTags() Adding new tag", tag)
|
||||||
|
rs.tagsDrop.AddText(tag)
|
||||||
|
rs.tags[tag] = "origin"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
rs.tagsDrop.SetText(rs.lasttagrev)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (rs *RepoStatus) checkDirty() bool {
|
||||||
|
out := run(rs.repopath, "git", "diff-index HEAD")
|
||||||
|
if out == "" {
|
||||||
|
log.Warn("checkDirty() no", rs.repopath)
|
||||||
|
rs.dirtyLabel.Set("no")
|
||||||
|
return false
|
||||||
|
} else {
|
||||||
|
log.Warn("checkDirty() true", rs.repopath)
|
||||||
|
rs.dirtyLabel.Set("dirty")
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
func (rs *RepoStatus) checkoutBranch(branch string) {
|
||||||
|
if rs.checkDirty() {
|
||||||
|
log.Warn("checkoutBranch() checkDirty() == true for repo", rs.repopath, "looking for branch:", branch)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
out := run(rs.repopath, "git", "checkout " + branch)
|
||||||
|
log.Warn(rs.repopath, "git checkout " + branch, "returned", out)
|
||||||
|
|
||||||
|
realname := rs.getCurrentBranchName()
|
||||||
|
realversion := rs.getCurrentBranchVersion()
|
||||||
|
log.Warn(rs.repopath, "realname =", realname, "realversion =", realversion)
|
||||||
|
if realname == "jcarr" {
|
||||||
|
rs.jcarrBranch.Set(realversion)
|
||||||
|
}
|
||||||
|
if realname == "devel" {
|
||||||
|
rs.develBranch.Set(realversion)
|
||||||
|
}
|
||||||
|
if realname == "master" {
|
||||||
|
rs.masterBranch.Set(realversion)
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,35 @@
|
||||||
|
package repostatus
|
||||||
|
|
||||||
|
import (
|
||||||
|
"go.wit.com/log"
|
||||||
|
|
||||||
|
"go.wit.com/gui/gui"
|
||||||
|
"go.wit.com/gui/gadgets"
|
||||||
|
)
|
||||||
|
|
||||||
|
func New(p *gui.Node, path string) *RepoStatus {
|
||||||
|
rs := &RepoStatus {
|
||||||
|
hidden: true,
|
||||||
|
ready: false,
|
||||||
|
parent: p,
|
||||||
|
repopath: path,
|
||||||
|
}
|
||||||
|
rs.tags = make(map[string]string)
|
||||||
|
return rs
|
||||||
|
}
|
||||||
|
|
||||||
|
func (rs *RepoStatus) InitWindow() {
|
||||||
|
if ! rs.Initialized() {
|
||||||
|
log.Log(WARN, "not initalized yet (no parent for the window?)")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if rs.window != nil {
|
||||||
|
log.Log(WARN, "You already have a window")
|
||||||
|
rs.ready = true
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
log.Log(WARN, "Creating the Window")
|
||||||
|
rs.window = gadgets.NewBasicWindow(rs.parent, "GO Repo Details")
|
||||||
|
rs.ready = true
|
||||||
|
}
|
|
@ -0,0 +1,38 @@
|
||||||
|
package repostatus
|
||||||
|
|
||||||
|
import (
|
||||||
|
"go.wit.com/gui/gui"
|
||||||
|
"go.wit.com/gui/gadgets"
|
||||||
|
)
|
||||||
|
|
||||||
|
type RepoStatus struct {
|
||||||
|
ready bool
|
||||||
|
hidden bool
|
||||||
|
changed bool
|
||||||
|
|
||||||
|
repopath string
|
||||||
|
lasttagrev string
|
||||||
|
tags map[string]string
|
||||||
|
|
||||||
|
parent *gui.Node
|
||||||
|
|
||||||
|
window *gadgets.BasicWindow
|
||||||
|
group *gui.Node
|
||||||
|
grid *gui.Node
|
||||||
|
|
||||||
|
// status *gadgets.OneLiner
|
||||||
|
dirtyLabel *gadgets.OneLiner
|
||||||
|
path *gadgets.OneLiner
|
||||||
|
|
||||||
|
currentBranch *gadgets.OneLiner
|
||||||
|
currentVersion *gadgets.OneLiner
|
||||||
|
tagsDrop *gui.Node
|
||||||
|
|
||||||
|
lasttag *gadgets.OneLiner
|
||||||
|
masterBranch *gadgets.OneLiner
|
||||||
|
develBranch *gadgets.OneLiner
|
||||||
|
jcarrBranch *gadgets.OneLiner
|
||||||
|
|
||||||
|
speed *gadgets.OneLiner
|
||||||
|
speedActual *gadgets.OneLiner
|
||||||
|
}
|
|
@ -0,0 +1,17 @@
|
||||||
|
package repostatus
|
||||||
|
|
||||||
|
import (
|
||||||
|
"time"
|
||||||
|
)
|
||||||
|
|
||||||
|
// timeFunction takes a function as an argument and returns the execution time.
|
||||||
|
func timeFunction(f func()) time.Duration {
|
||||||
|
startTime := time.Now() // Record the start time
|
||||||
|
f() // Execute the function
|
||||||
|
return time.Since(startTime) // Calculate the elapsed time
|
||||||
|
}
|
||||||
|
|
||||||
|
func (ls *RepoStatus) SetSpeedActual(s string) {
|
||||||
|
if ! ls.Ready() {return}
|
||||||
|
ls.speedActual.Set(s)
|
||||||
|
}
|
|
@ -0,0 +1,54 @@
|
||||||
|
// This is a simple example
|
||||||
|
package repostatus
|
||||||
|
|
||||||
|
import (
|
||||||
|
"os"
|
||||||
|
"os/exec"
|
||||||
|
"strings"
|
||||||
|
|
||||||
|
"go.wit.com/log"
|
||||||
|
)
|
||||||
|
|
||||||
|
func fullpath(repo string) string {
|
||||||
|
return "/home/jcarr/go/src/" + repo
|
||||||
|
}
|
||||||
|
|
||||||
|
func run(path string, thing string, cmdline string) string {
|
||||||
|
parts := strings.Split(cmdline, " ")
|
||||||
|
// Create the command
|
||||||
|
cmd := exec.Command(thing, parts...)
|
||||||
|
|
||||||
|
// Set the working directory
|
||||||
|
cmd.Dir = fullpath(path)
|
||||||
|
|
||||||
|
// Execute the command
|
||||||
|
output, err := cmd.CombinedOutput()
|
||||||
|
if err != nil {
|
||||||
|
log.Error(err, "cmd error'd out", parts)
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
|
||||||
|
tmp := string(output)
|
||||||
|
tmp = strings.TrimSpace(tmp)
|
||||||
|
|
||||||
|
// Print the output
|
||||||
|
log.Log(WARN, "run()", path, thing, cmdline, "=", tmp)
|
||||||
|
return tmp
|
||||||
|
}
|
||||||
|
|
||||||
|
func listFiles(directory string) []string {
|
||||||
|
var files []string
|
||||||
|
fileInfo, err := os.ReadDir(directory)
|
||||||
|
if err != nil {
|
||||||
|
log.Error(err)
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, file := range fileInfo {
|
||||||
|
if !file.IsDir() {
|
||||||
|
files = append(files, file.Name())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return files
|
||||||
|
}
|
|
@ -0,0 +1,57 @@
|
||||||
|
package repostatus
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"time"
|
||||||
|
"errors"
|
||||||
|
|
||||||
|
"go.wit.com/log"
|
||||||
|
)
|
||||||
|
|
||||||
|
func (rs *RepoStatus) Update() {
|
||||||
|
if ! rs.Ready() {
|
||||||
|
log.Log(WARN, "can't update yet. ready is false")
|
||||||
|
log.Error(errors.New("Update() is not ready yet"))
|
||||||
|
return
|
||||||
|
}
|
||||||
|
log.Log(WARN, "Update() START")
|
||||||
|
duration := timeFunction(func () {
|
||||||
|
rs.path.Set(rs.repopath)
|
||||||
|
rs.getCurrentBranchName()
|
||||||
|
rs.window.Title(rs.repopath + " GO repo Details")
|
||||||
|
rs.getCurrentBranchVersion()
|
||||||
|
|
||||||
|
rs.getLastTagVersion()
|
||||||
|
rs.populateTags()
|
||||||
|
|
||||||
|
// rs.checkDirty() this runs
|
||||||
|
log.Log(WARN, "")
|
||||||
|
log.Log(WARN, "checkoutBranch master")
|
||||||
|
rs.checkoutBranch("master")
|
||||||
|
log.Log(WARN, "")
|
||||||
|
log.Log(WARN, "checkoutBranch devel")
|
||||||
|
rs.checkoutBranch("devel")
|
||||||
|
log.Log(WARN, "")
|
||||||
|
log.Log(WARN, "checkoutBranch jcarr")
|
||||||
|
rs.checkoutBranch("jcarr")
|
||||||
|
})
|
||||||
|
rs.setSpeed(duration)
|
||||||
|
log.Log(WARN, "Update() END")
|
||||||
|
}
|
||||||
|
|
||||||
|
func (rs *RepoStatus) setSpeed(duration time.Duration) {
|
||||||
|
s := fmt.Sprint(duration)
|
||||||
|
if rs.speedActual == nil {
|
||||||
|
log.Log(WARN, "can't actually warn")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
rs.speedActual.Set(s)
|
||||||
|
|
||||||
|
if (duration > 500 * time.Millisecond ) {
|
||||||
|
rs.speed.Set("SLOW")
|
||||||
|
} else if (duration > 100 * time.Millisecond ) {
|
||||||
|
rs.speed.Set("OK")
|
||||||
|
} else {
|
||||||
|
rs.speed.Set("FAST")
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue