smarter tag window
Signed-off-by: Jeff Carr <jcarr@wit.com>
This commit is contained in:
parent
2b172338f6
commit
ba4051cb0c
46
draw.go
46
draw.go
|
@ -77,42 +77,20 @@ func (rs *RepoStatus) drawGitBranches() {
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
|
rs.TagsW = rs.TagWindow()
|
||||||
|
|
||||||
newgrid.NewButton("Show tags", func() {
|
newgrid.NewButton("Show tags", func() {
|
||||||
tw := rs.TagWindow()
|
if rs.TagsW == nil {
|
||||||
tw.Prune()
|
log.Warn("error: found rs.TagsW == nil")
|
||||||
// git tag --list --sort=taggerdate
|
rs.TagsW = rs.TagWindow()
|
||||||
// git for-each-ref --sort=taggerdate --format '%(tag) %(*objectname) %(taggerdate)'
|
return
|
||||||
// git rev-parse HEAD
|
}
|
||||||
// if last tag == HEAD, then remove it
|
if rs.TagsW.Hidden() {
|
||||||
|
rs.TagsW.Show()
|
||||||
|
} else {
|
||||||
|
rs.TagsW.Show()
|
||||||
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
/*
|
|
||||||
newgrid.NewButton("CheckSafeGoSumRemake()", func() {
|
|
||||||
if ok, bad := rs.CheckSafeGoSumRemake(); ok {
|
|
||||||
log.Log(WARN, "CheckSafeGoSumRemake() is safe to redo")
|
|
||||||
} else {
|
|
||||||
log.Log(WARN, "CheckSafeGoSumRemake() is not safe. problems:", bad)
|
|
||||||
}
|
|
||||||
})
|
|
||||||
|
|
||||||
newgrid.NewButton("CheckGoSum()", func() {
|
|
||||||
if ok, missing := rs.CheckGoSum(); ok {
|
|
||||||
log.Log(WARN, "CheckGoSum() is ok")
|
|
||||||
} else {
|
|
||||||
log.Log(WARN, "CheckGoSum() is not ok. missing:", missing)
|
|
||||||
}
|
|
||||||
})
|
|
||||||
newgrid.NewButton("CheckPrimativeGoMod()", func() {
|
|
||||||
if rs.CheckPrimativeGoMod() {
|
|
||||||
log.Log(WARN, "is primative")
|
|
||||||
} else {
|
|
||||||
log.Log(WARN, "is not primative")
|
|
||||||
}
|
|
||||||
})
|
|
||||||
newgrid.NewButton("MakeRedomod()", func() {
|
|
||||||
rs.MakeRedomod()
|
|
||||||
})
|
|
||||||
*/
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (rs *RepoStatus) drawGitStatus() {
|
func (rs *RepoStatus) drawGitStatus() {
|
||||||
|
|
24
git.go
24
git.go
|
@ -94,12 +94,12 @@ func (rs *RepoStatus) CheckDirty() bool {
|
||||||
path := rs.realPath.String()
|
path := rs.realPath.String()
|
||||||
err, b, out := RunCmd(path, cmd)
|
err, b, out := RunCmd(path, cmd)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Warn("CheckDirty() b =", b)
|
log.Warn("CheckDirty() status b =", b)
|
||||||
log.Warn("CheckDirty() cmd =", cmd)
|
log.Warn("CheckDirty() status cmd =", cmd)
|
||||||
log.Warn("CheckDirty() path =", path)
|
log.Warn("CheckDirty() status path =", path)
|
||||||
log.Warn("CheckDirty() out =", out)
|
log.Warn("CheckDirty() status out =", out)
|
||||||
log.Warn("CheckDirty() err =", err)
|
log.Warn("CheckDirty() status err =", err)
|
||||||
log.Error(err, "CheckDirty() error")
|
log.Error(err, "CheckDirty() git status error")
|
||||||
rs.dirtyLabel.SetValue("error")
|
rs.dirtyLabel.SetValue("error")
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
@ -114,12 +114,12 @@ func (rs *RepoStatus) CheckDirty() bool {
|
||||||
}
|
}
|
||||||
// sometimes b gets exit status 1 when there isn't anything that has changed
|
// sometimes b gets exit status 1 when there isn't anything that has changed
|
||||||
// run git status fixes that for some reason.
|
// run git status fixes that for some reason.
|
||||||
log.Log(WARN, "CheckDirty() true", rs.realPath.String())
|
log.Log(INFO, "CheckDirty() is normal dirty", rs.realPath.String())
|
||||||
log.Log(WARN, "CheckDirty() cmd =", cmd)
|
log.Log(INFO, "CheckDirty() is normal cmd =", cmd)
|
||||||
log.Log(WARN, "CheckDirty() b =", b)
|
log.Log(INFO, "CheckDirty() is normal b =", b)
|
||||||
log.Log(WARN, "CheckDirty() path =", path)
|
log.Log(INFO, "CheckDirty() is normal path =", path)
|
||||||
log.Log(WARN, "CheckDirty() out =", out)
|
log.Log(INFO, "CheckDirty() is normal out =", out)
|
||||||
log.Log(WARN, "CheckDirty() err =", err)
|
log.Log(INFO, "CheckDirty() is normal err =", err)
|
||||||
|
|
||||||
rs.dirtyLabel.SetValue("dirty")
|
rs.dirtyLabel.SetValue("dirty")
|
||||||
return true
|
return true
|
||||||
|
|
63
tagWindow.go
63
tagWindow.go
|
@ -23,6 +23,9 @@ type repoTag struct {
|
||||||
// the .git/ref date
|
// the .git/ref date
|
||||||
date *gui.Node
|
date *gui.Node
|
||||||
|
|
||||||
|
// the tag comment
|
||||||
|
subject *gui.Node
|
||||||
|
|
||||||
// a button to delete the tag
|
// a button to delete the tag
|
||||||
deleteB *gui.Node
|
deleteB *gui.Node
|
||||||
}
|
}
|
||||||
|
@ -43,17 +46,27 @@ type repoTags struct {
|
||||||
tags []*repoTag
|
tags []*repoTag
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (tw *repoTags) Hidden() bool {
|
||||||
|
return tw.window.Hidden()
|
||||||
|
}
|
||||||
|
|
||||||
|
func (tw *repoTags) Show() {
|
||||||
|
log.Info("tw *repoTags Show()")
|
||||||
|
tw.window.Show()
|
||||||
|
}
|
||||||
|
|
||||||
|
func (tw *repoTags) Hide() {
|
||||||
|
log.Info("tw *repoTags Hide()")
|
||||||
|
tw.window.Hide()
|
||||||
|
}
|
||||||
|
|
||||||
func (rs *RepoStatus) TagWindow() *repoTags {
|
func (rs *RepoStatus) TagWindow() *repoTags {
|
||||||
// return the window if it was already created
|
// return the window if it was already created
|
||||||
if rs.TagsW != nil {
|
|
||||||
rs.TagsW.window.Toggle()
|
|
||||||
return rs.TagsW
|
|
||||||
}
|
|
||||||
tags := new(repoTags)
|
tags := new(repoTags)
|
||||||
rs.TagsW = tags
|
rs.TagsW = tags
|
||||||
tags.rs = rs
|
tags.rs = rs
|
||||||
|
|
||||||
tags.window = gadgets.RawBasicWindow("tags " + rs.String())
|
tags.window = gadgets.RawBasicWindow("tags " + rs.String()).Make()
|
||||||
vbox := tags.window.Box()
|
vbox := tags.window.Box()
|
||||||
|
|
||||||
tags.newTagBox(vbox)
|
tags.newTagBox(vbox)
|
||||||
|
@ -63,14 +76,21 @@ func (rs *RepoStatus) TagWindow() *repoTags {
|
||||||
func (tagW *repoTags) newTagBox(box *gui.Node) {
|
func (tagW *repoTags) newTagBox(box *gui.Node) {
|
||||||
tagW.group = box.NewGroup(".git tags for " + tagW.rs.String())
|
tagW.group = box.NewGroup(".git tags for " + tagW.rs.String())
|
||||||
|
|
||||||
tagW.group.NewButton("prune tags", func() {
|
// tagW.group.NewButton("prune tags", func() {
|
||||||
tagW.Prune()
|
// tagW.Prune()
|
||||||
})
|
// })
|
||||||
tagW.group.NewButton("show all", func() {
|
var dups *gui.Node
|
||||||
for _, t := range tagW.tags {
|
|
||||||
t.Show()
|
dups = tagW.group.NewCheckbox("Show duplicate tags").SetChecked(false)
|
||||||
|
dups.Custom = func() {
|
||||||
|
if dups.Checked() {
|
||||||
|
tagW.Prune()
|
||||||
|
} else {
|
||||||
|
for _, t := range tagW.tags {
|
||||||
|
t.Show()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
})
|
}
|
||||||
tagW.group.NewButton("delete all", func() {
|
tagW.group.NewButton("delete all", func() {
|
||||||
for i, t := range tagW.tags {
|
for i, t := range tagW.tags {
|
||||||
if t.hidden {
|
if t.hidden {
|
||||||
|
@ -82,22 +102,22 @@ func (tagW *repoTags) newTagBox(box *gui.Node) {
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
grid := tagW.group.NewGrid("tags", 4, 1)
|
grid := tagW.group.NewGrid("tags", 0, 0)
|
||||||
tagW.grid = grid
|
tagW.grid = grid
|
||||||
|
|
||||||
grid.NewLabel("version")
|
grid.NewLabel("version")
|
||||||
grid.NewLabel("ref")
|
grid.NewLabel("ref")
|
||||||
grid.NewLabel("date")
|
grid.NewLabel("date")
|
||||||
grid.NewLabel("delete")
|
grid.NewLabel("release subject")
|
||||||
// works like a typerwriter
|
// works like a typerwriter
|
||||||
// grid.NextRow()
|
grid.NextRow()
|
||||||
|
|
||||||
// git tag --list --sort=taggerdate
|
// git tag --list --sort=taggerdate
|
||||||
// git for-each-ref --sort=taggerdate --format '%(tag) %(*objectname) %(taggerdate)'
|
// git for-each-ref --sort=taggerdate --format '%(tag) %(*objectname) %(taggerdate)'
|
||||||
// git rev-parse HEAD
|
// git rev-parse HEAD
|
||||||
// if last tag == HEAD, then remove it
|
// if last tag == HEAD, then remove it
|
||||||
|
|
||||||
tags := []string{"%(tag)", "%(*objectname)", "%(taggerdate:raw)"}
|
tags := []string{"%(tag)", "%(*objectname)", "%(taggerdate:raw)", "%(subject)"}
|
||||||
format := strings.Join(tags, "_,,,_")
|
format := strings.Join(tags, "_,,,_")
|
||||||
err, output := tagW.rs.RunCmd([]string{"git", "for-each-ref", "--sort=taggerdate", "--format", format})
|
err, output := tagW.rs.RunCmd([]string{"git", "for-each-ref", "--sort=taggerdate", "--format", format})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -120,14 +140,19 @@ func (tagW *repoTags) newTagBox(box *gui.Node) {
|
||||||
rTag := new(repoTag)
|
rTag := new(repoTag)
|
||||||
rTag.tag = grid.NewLabel(parts[0])
|
rTag.tag = grid.NewLabel(parts[0])
|
||||||
rTag.ref = grid.NewEntrybox(parts[1])
|
rTag.ref = grid.NewEntrybox(parts[1])
|
||||||
rTag.date = grid.NewLabel(parts[2])
|
|
||||||
|
stamp, dur := getDateStamp(parts[2]) //
|
||||||
|
rTag.date = grid.NewLabel(stamp)
|
||||||
|
grid.NewLabel(dur)
|
||||||
|
|
||||||
|
rTag.subject = grid.NewLabel(parts[3])
|
||||||
rTag.deleteB = grid.NewButton("delete", func() {
|
rTag.deleteB = grid.NewButton("delete", func() {
|
||||||
log.Info("remove tag")
|
log.Info("remove tag")
|
||||||
})
|
})
|
||||||
|
|
||||||
tagW.tags = append(tagW.tags, rTag)
|
tagW.tags = append(tagW.tags, rTag)
|
||||||
// works like a typerwriter
|
// works like a typerwriter
|
||||||
// grid.NextRow()
|
grid.NextRow()
|
||||||
}
|
}
|
||||||
// reverse the git order
|
// reverse the git order
|
||||||
// slices.Reverse(rtags.tags)
|
// slices.Reverse(rtags.tags)
|
||||||
|
@ -260,6 +285,7 @@ func (rt *repoTag) Hide() {
|
||||||
rt.tag.Hide()
|
rt.tag.Hide()
|
||||||
rt.ref.Hide()
|
rt.ref.Hide()
|
||||||
rt.date.Hide()
|
rt.date.Hide()
|
||||||
|
rt.subject.Hide()
|
||||||
rt.deleteB.Hide()
|
rt.deleteB.Hide()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -268,5 +294,6 @@ func (rt *repoTag) Show() {
|
||||||
rt.tag.Show()
|
rt.tag.Show()
|
||||||
rt.ref.Show()
|
rt.ref.Show()
|
||||||
rt.date.Show()
|
rt.date.Show()
|
||||||
|
rt.subject.Show()
|
||||||
rt.deleteB.Show()
|
rt.deleteB.Show()
|
||||||
}
|
}
|
||||||
|
|
57
unix.go
57
unix.go
|
@ -2,14 +2,17 @@ package repostatus
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"errors"
|
"errors"
|
||||||
|
"fmt"
|
||||||
"io/ioutil"
|
"io/ioutil"
|
||||||
"os"
|
"os"
|
||||||
"os/exec"
|
"os/exec"
|
||||||
"os/user"
|
"os/user"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
"regexp"
|
"regexp"
|
||||||
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
"syscall"
|
"syscall"
|
||||||
|
"time"
|
||||||
|
|
||||||
"go.wit.com/log"
|
"go.wit.com/log"
|
||||||
)
|
)
|
||||||
|
@ -264,3 +267,57 @@ func readFileToString(filename string) (string, error) {
|
||||||
}
|
}
|
||||||
return strings.TrimSpace(string(data)), nil
|
return strings.TrimSpace(string(data)), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func getDateStamp(raw string) (string, string) {
|
||||||
|
parts := strings.Split(raw, " ")
|
||||||
|
if len(parts) == 0 {
|
||||||
|
// raw was blank here
|
||||||
|
return "Jan 4 1977", "40y" // eh, why not. it'll be easy to grep for this
|
||||||
|
}
|
||||||
|
i, err := strconv.ParseInt(parts[0], 10, 64) // base 10 string, return int64
|
||||||
|
if err != nil {
|
||||||
|
log.Warn("Error converting timestamp:", raw)
|
||||||
|
log.Warn("Error converting timestamp err =", err)
|
||||||
|
return raw, ""
|
||||||
|
}
|
||||||
|
|
||||||
|
// Parse the Unix timestamp into a time.Time object
|
||||||
|
gitTagDate := time.Unix(i, 0)
|
||||||
|
return gitTagDate.UTC().Format("2006/01/02 15:04:05 UTC"), getDurationStamp(gitTagDate)
|
||||||
|
}
|
||||||
|
|
||||||
|
func getDurationStamp(t time.Time) string {
|
||||||
|
|
||||||
|
// Get the current time
|
||||||
|
currentTime := time.Now()
|
||||||
|
|
||||||
|
// Calculate the duration between t current time
|
||||||
|
duration := currentTime.Sub(t)
|
||||||
|
|
||||||
|
return formatDuration(duration)
|
||||||
|
}
|
||||||
|
|
||||||
|
func formatDuration(d time.Duration) string {
|
||||||
|
seconds := int(d.Seconds()) % 60
|
||||||
|
minutes := int(d.Minutes()) % 60
|
||||||
|
hours := int(d.Hours()) % 24
|
||||||
|
days := int(d.Hours()) / 24
|
||||||
|
|
||||||
|
result := ""
|
||||||
|
if days > 0 {
|
||||||
|
result += fmt.Sprintf("%dd ", days)
|
||||||
|
return result
|
||||||
|
}
|
||||||
|
if hours > 0 {
|
||||||
|
result += fmt.Sprintf("%dh ", hours)
|
||||||
|
return result
|
||||||
|
}
|
||||||
|
if minutes > 0 {
|
||||||
|
result += fmt.Sprintf("%dm ", minutes)
|
||||||
|
return result
|
||||||
|
}
|
||||||
|
if seconds > 0 {
|
||||||
|
result += fmt.Sprintf("%ds", seconds)
|
||||||
|
}
|
||||||
|
return result
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue