From ce0fd10064440ebce0fe4941bb15cf4beb14540a Mon Sep 17 00:00:00 2001 From: Jeff Carr Date: Wed, 17 Sep 2025 01:08:30 -0500 Subject: [PATCH] common argv handling --- argv.go | 12 +++++++++--- doCommit.go | 7 +------ doMerge.go | 28 +++++++++++++++++++++++++++- doTag.go | 16 +++++++++++----- exit.go | 2 +- main.go | 50 ++++++++++++++++++++++++++++---------------------- 6 files changed, 77 insertions(+), 38 deletions(-) diff --git a/argv.go b/argv.go index 6f34737..ac5419c 100644 --- a/argv.go +++ b/argv.go @@ -6,6 +6,7 @@ package main import ( "fmt" "os" + "strings" ) /* @@ -151,7 +152,12 @@ forge -- a tool to manage lots of git repos. forge includes a GUI and TUI. // handles shell autocomplete // -func DoAutoComplete(argv []string) { +func DoAutoComplete(arg0 string, arg1 string, argv []string) { + if strings.HasPrefix(argv[0], "-") { + fmt.Fprintf(os.Stderr, "stuff --gui --all '%s' '%s' %v\n", arg0, arg1, argv) + fmt.Println("--all --gui") + return + } switch argv[0] { case "checkout": fmt.Println("devel master user") @@ -214,6 +220,6 @@ func ifBlank(arg string) bool { return false } -func (a args) DoAutoComplete(argv []string) { - DoAutoComplete(argv) +func (a args) DoAutoComplete(arg0 string, arg1 string, argv []string) { + DoAutoComplete(arg0, arg1, argv) } diff --git a/doCommit.go b/doCommit.go index d462e4e..55d2af8 100644 --- a/doCommit.go +++ b/doCommit.go @@ -31,12 +31,7 @@ func doCommit() error { okExit("") } - pwd, _ := os.Getwd() - repo := me.forge.Repos.FindByFullPath(pwd) - if repo == nil { - log.Info("todo: forge doesn't know how to work here yet") - okExit("") - } + repo := findCurrentPwdRepoOrDie() if !repo.CheckDirty() { okExit(log.Sprintf("this repo %s is not dirty.\n\n--all # commit all changes in all repos", repo.GetFullPath())) diff --git a/doMerge.go b/doMerge.go index 4ec018c..7831f52 100644 --- a/doMerge.go +++ b/doMerge.go @@ -32,7 +32,7 @@ func doMergeDevel() (*gitpb.Repos, error) { found := findMergeToDevel() for repo := range found.IterAll() { if repo.CheckDirty() { - log.Info("repo is dirty", repo.GetGoPath()) + log.Info("repo is dirty", repo.GetFullPath()) continue } log.Infof("%s starting git merge\n", repo.FullPath) @@ -59,6 +59,32 @@ func doMergeDevel() (*gitpb.Repos, error) { return done, err } +func repoMergeToDevel(repo *gitpb.Repo) error { + if repo.CheckDirty() { + return log.Errorf("can not merge. repo is dirty") + } + log.Infof("%s starting git merge\n", repo.FullPath) + if repo.CheckoutDevel() { + log.Info("checkout devel failed", repo.GetGoPath()) + err := log.Errorf("checkout devel failed") + badExit(err) + } + // hash differences when merging user into devel branch + out := repo.GetBranchDifferences(repo.GetDevelBranchName(), repo.GetUserBranchName()) + for i, hash := range out { + log.Info("MERGE HASH FROM USER TO DEVEL", i, hash) + } + if _, err := repo.MergeToDevel(); err != nil { + log.Info("merge from user failed", repo.GetGoPath(), err) + // err := log.Errorf("merge from user failed") + // log.Info(strings.Join(r.Stdout, "\n")) + // log.Info(strings.Join(r.Stderr, "\n")) + badExit(err) + } + config.SetChanged("repos", true) + return nil +} + func doMergeMaster() (*gitpb.Repos, error) { var err error setForgeMode(forgepb.ForgeMode_MASTER) diff --git a/doTag.go b/doTag.go index 8d0692a..161a581 100644 --- a/doTag.go +++ b/doTag.go @@ -24,14 +24,20 @@ func FindRepoByFullPath(wd string) *gitpb.Repo { return nil } +func findCurrentPwdRepoOrDie() *gitpb.Repo { + wd, err := os.Getwd() + repo := FindRepoByFullPath(wd) + if repo == nil { + log.Info("Could not find repo:", wd) + badExit(err) + } + return repo +} + func doTag() error { wd, _ := os.Getwd() if argv.Tag.List != nil { - repo := FindRepoByFullPath(wd) - if repo == nil { - log.Info("Could not find repo:", wd) - return nil - } + repo := findCurrentPwdRepoOrDie() tagTablePB := makeTagTablePB(repo.Tags) // tbox := win.Bottom.Box().SetProgName("TBOX") diff --git a/exit.go b/exit.go index 1155858..d317d3b 100644 --- a/exit.go +++ b/exit.go @@ -28,6 +28,6 @@ func badExit(err error) { } func badRepoExit(repo *gitpb.Repo, err error) { - log.Printf("forge failed on %s with %v\n", repo.GetNamespace(), err) + log.Printf("%s FAILED: %v\n", repo.GetNamespace(), err) os.Exit(-1) } diff --git a/main.go b/main.go index 222ef20..180cfb5 100644 --- a/main.go +++ b/main.go @@ -7,7 +7,6 @@ package main import ( "embed" - "fmt" "strings" "time" @@ -45,8 +44,8 @@ func getVersion(repo *gitpb.Repo, name string) string { func main() { me = new(mainType) - prep.Bash(ARGNAME, argv.DoAutoComplete) // this line should be: prep.Bash(argv) - me.myGui = prep.Gui() // prepares the GUI package for go-args + prep.Bash2(ARGNAME, argv.DoAutoComplete) // this line should be: prep.Bash(argv) + me.myGui = prep.Gui() // prepares the GUI package for go-args me.pp = arg.MustParse(&argv) me.forge = forgepb.Init() @@ -158,28 +157,35 @@ func main() { } if argv.Merge != nil { - if argv.Merge.Devel != nil { - start := time.Now() - repos, err := doMergeDevel() - dur := time.Since(start) - if err != nil { - badExit(err) - } - log.Printf("Merged %d devel branches in %s\n", repos.Len(), shell.FormatDuration(dur)) - okExit("") - } + if argv.All == true { - if argv.Merge.Master != nil { - start := time.Now() - repos, err := doMergeMaster() - dur := time.Since(start) - if err != nil { - badExit(err) + if argv.Merge.Devel != nil { + start := time.Now() + repos, err := doMergeDevel() + dur := time.Since(start) + if err != nil { + badExit(err) + } + log.Printf("Merged %d devel branches in %s\n", repos.Len(), shell.FormatDuration(dur)) + okExit("") + } + + if argv.Merge.Master != nil { + start := time.Now() + repos, err := doMergeMaster() + dur := time.Since(start) + if err != nil { + badExit(err) + } + log.Printf("Merged %d master branches in %s\n", repos.Len(), shell.FormatDuration(dur)) + okExit("") } - log.Printf("Merged %d master branches in %s\n", repos.Len(), shell.FormatDuration(dur)) - okExit("") } - badExit(fmt.Errorf("You must choose which branch to merge to (devel or master)")) + repo := findCurrentPwdRepoOrDie() + if err := repoMergeToDevel(repo); err != nil { + badRepoExit(repo, err) + } + okExit("") } if argv.Pull != nil {