diff --git a/applyPatch.go b/applyPatch.go index e08bc6c..2824407 100644 --- a/applyPatch.go +++ b/applyPatch.go @@ -8,10 +8,12 @@ import ( "go.wit.com/lib/gui/shell" "go.wit.com/lib/protobuf/forgepb" + "go.wit.com/lib/protobuf/gitpb" "go.wit.com/log" ) -func dumpPatchset(pset *forgepb.Patchs) error { +// returns bad if patches can not be applied +func dumpPatchset(pset *forgepb.Patchs) bool { log.Info("applyPatches() NAME", pset.Name) log.Info("applyPatches() COMMENT", pset.Comment) log.Info("applyPatches() GIT_AUTHOR_NAME", pset.GetGitAuthorName()) @@ -20,28 +22,70 @@ func dumpPatchset(pset *forgepb.Patchs) error { log.Info("applyPatches() Start Hash", pset.GetStartBranchHash()) var count int + var bad int all := pset.SortByFilename() for all.Scan() { p := all.Next() - // log.Info("pset filename FILENAME IS REAL?", p.Filename, pset.Name, pset.Comment) - basepath, filename := filepath.Split(p.Filename) - repo := me.forge.FindByGoPath(basepath) - if repo == nil { - log.Info("can not apply patch! repo not found", basepath, filename) - continue + if IsValidPatch(p) { + // ok + } else { + bad += 1 } - if repo.DevelHash() != p.StartHash { - log.Info("can not apply patch! devel hash mismatch", basepath, filename) - continue - } - log.Info("start:", p.StartHash, "end:", p.CommitHash, "file:", basepath, filename, "devel version", repo.GetDevelVersion()) count += 1 } - log.Info("pset has", count, "patches") - return nil + log.Info("pset has", count, "total patches, ", bad, "bad patches") + if bad == 0 { + return true + } + return false } -func applyPatches(pset *forgepb.Patchs) error { +func IsValidPatch(p *forgepb.Patch) bool { + basepath, filename := filepath.Split(p.Filename) + repo := me.forge.FindByGoPath(basepath) + if repo == nil { + log.Info("can not apply patch! repo not found", basepath, filename) + return false + } + if repo.DevelHash() != p.StartHash { + log.Info("can not apply patch! devel hash mismatch", basepath, filename) + return false + } + log.Info("start:", p.StartHash, "end:", p.CommitHash, "file:", basepath, filename, "devel version", repo.GetDevelVersion()) + for _, line := range p.Files { + log.Info("\t", line) + } + return true +} + +// re-run git CheckDirty() on everything +func IsAnythingDirty() bool { + me.found = new(gitpb.Repos) + findAll() // select all the repos + doCheckDirty() + me.found = new(gitpb.Repos) + findDirty() + if len(me.found.Repos) == 0 { + return false + } else { + return true + } +} + +// From 18ee541f89be2e9f9a91c54873da87885e8ffdf5 Mon Sep 17 00:00:00 2001 +// From: Jeff Carr +// Date: Sun, 5 Jan 2025 01:18:47 -0600 +// Subject: [PATCH] 'forge dirty' will find and list only dirty repos + +// list patches in jcarr but not in devel +// git log --format="%H %Subject" jcarr --not devel +func countCurrentPatches(repo *gitpb.Repo) int { + cmd := []string{"git", "log", "--format=\"%H %s\"", "--no-merges", "jcarr", "--not", "devel"} + result := repo.Run(cmd) + return len(result.Stdout) +} + +func applyPatchset(pset *forgepb.Patchs) error { var everythingworked bool = true tmpdir, err := os.MkdirTemp("", "forge") if err != nil { diff --git a/findRepos.go b/findRepos.go index 03705a7..f90d4ee 100644 --- a/findRepos.go +++ b/findRepos.go @@ -45,35 +45,6 @@ func (f *FindCmd) findRepos() { findAll() } -/* -func findRepos(fargv *FindCmd) { - if fargv == nil { - findMine() - return - } - if fargv.All { - findAll() - return - } - - if fargv.Private { - findPrivate() - return - } - - if fargv.Mine { - findMine() - return - } - if fargv.Favorites { - findFavorites() - return - } - - findMine() -} -*/ - func findPrivate() { all := me.forge.Repos.SortByFullPath() for all.Scan() { diff --git a/main.go b/main.go index 6ac2a80..7895c6d 100644 --- a/main.go +++ b/main.go @@ -81,7 +81,7 @@ func main() { if err != nil { badExit(err) } - if err = applyPatches(pset); err == nil { + if err = applyPatchset(pset); err == nil { okExit("applied patch ok") } badExit(err) diff --git a/windowPatches.go b/windowPatches.go index e153553..443103a 100644 --- a/windowPatches.go +++ b/windowPatches.go @@ -164,17 +164,40 @@ func submitPatchesBox(box *gui.Node) *patchSummary { } }) - s.grid.NewButton("Show Patchsets", func() { + s.grid.NewButton("List Patchsets", func() { listPatches() }) - s.grid.NewButton("Get Latest Patchset", func() { + s.grid.NewButton("Show Latest Patchset", func() { lastp := lastPatch() pset, err := getPatch(lastp) if err != nil { return } - dumpPatchset(pset) + + if !dumpPatchset(pset) { + log.Info("some patches are bad") + return + } + if IsAnythingDirty() { + log.Info("You can't apply patches when repos are dirty") + doCobol() + return + } + }) + + s.grid.NewButton("Apply Latest Patchset", func() { + lastp := lastPatch() + pset, err := getPatch(lastp) + if err != nil { + return + } + if IsAnythingDirty() { + log.Info("You can't apply patches when repos are dirty") + doCobol() + return + } + applyPatchset(pset) }) s.grid.NewButton("Show Repos", func() {