diff options
| -rw-r--r-- | argv.template.go | 4 | ||||
| -rw-r--r-- | doAdd.go | 24 | ||||
| -rw-r--r-- | doFix.deleteuser.go | 10 | ||||
| -rw-r--r-- | doNewUser.go | 59 | ||||
| -rw-r--r-- | doPull.go | 35 | ||||
| -rw-r--r-- | doRebuild.go | 6 | ||||
| -rw-r--r-- | doStats.go | 2 | ||||
| -rw-r--r-- | exit.go | 12 | ||||
| -rw-r--r-- | ipv6test.go | 6 | ||||
| -rw-r--r-- | main.go | 158 | ||||
| -rw-r--r-- | structs.go | 2 | ||||
| -rw-r--r-- | subCommand.go | 112 |
12 files changed, 241 insertions, 189 deletions
diff --git a/argv.template.go b/argv.template.go index 07a161f..35a8c99 100644 --- a/argv.template.go +++ b/argv.template.go @@ -63,8 +63,8 @@ func (args) InitGui() error { func (args) Exit() { gui.UnloadToolkits() - if me.sh.Verbose() { - log.Info("argv.Exit() called", APPNAME+".Exit()") + if me.argv.Verbose() { + log.Info("argv.Exit() called", APPNAME+".Exit() because me.argv.Verbose() == true") } // remove this from the template for your app (or make one for youself if you need it) forgeExit() // custom forge shutdown function @@ -4,9 +4,12 @@ package main import ( + "errors" + "fmt" "os" "strings" + "go.wit.com/lib/fhelp" "go.wit.com/lib/protobuf/gitpb" "go.wit.com/log" ) @@ -21,7 +24,10 @@ func workingDirToRepo() *gitpb.Repo { return nil } -func doAdd() error { +func doAdd() (string, error) { + var s string + var err error + wd, _ := os.Getwd() found := gitpb.NewRepos() for repo := range me.forge.Repos.IterAll() { @@ -31,11 +37,17 @@ func doAdd() error { } if found.Len() > 0 { - log.Info("This directory is already in a known repository") - me.forge.PrintDefaultTB(found) - return nil + footer := me.forge.PrintDefaultTB(found) + log.Info(footer) + return "This directory is already in a known repository", nil } - log.Info("todo: scan", wd, "here") - return nil + s = fmt.Sprintf("Scan this directory (%s) for new .git repos?", wd) + if !fhelp.QuestionUser(s) { + // s, err = doModeMaster() + err = errors.New("todo: scan dir") + } else { + err = errors.New("not acked") + } + return s, err } diff --git a/doFix.deleteuser.go b/doFix.deleteuser.go index f61cfb9..43a6563 100644 --- a/doFix.deleteuser.go +++ b/doFix.deleteuser.go @@ -167,7 +167,7 @@ func doFixDeleteUserLocalBranch(repo *gitpb.Repo, remoteRef *gitpb.GitTag, local if err != nil { log.Info(localUser.GetRefname(), repo.FullPath) s := "local user branch could not be deleted" - me.sh.BadExit(s, err) + me.argv.BadExit(s, err) } return nil, notes } @@ -198,7 +198,7 @@ func doFixDeleteUserLocalBranch(repo *gitpb.Repo, remoteRef *gitpb.GitTag, local if err != nil { log.Info(localUser.GetRefname(), repo.FullPath) s := "local user branch could not be deleted" - me.sh.BadExit(s, err) + me.argv.BadExit(s, err) } } return ErrorNeedArgvFix, notes @@ -240,7 +240,7 @@ func doFixDeleteRemoteUserBranch(repo *gitpb.Repo, remoteRef *gitpb.GitTag) (err if err != nil { log.Info(remoteUser.GetRefname(), repo.FullPath) s := "remote user branch could not be deleted" - me.sh.BadExit(s, err) + me.argv.BadExit(s, err) } } return ErrorNeedArgvFix, notes @@ -282,7 +282,7 @@ func doFixDeleteLocalUserByDevel(repo *gitpb.Repo, localRef *gitpb.GitTag) (erro if err != nil { log.Info(localUser.GetRefname(), repo.FullPath) s := "local user branch could not be deleted" - me.sh.BadExit(s, err) + me.argv.BadExit(s, err) } } return ErrorNeedArgvFix, notes @@ -327,7 +327,7 @@ func doFixDeleteLocalUserByMaster(repo *gitpb.Repo, localRef *gitpb.GitTag) (err if err != nil { log.Info(localUser.GetRefname(), repo.FullPath) s := "local user branch could not be deleted" - me.sh.BadExit(s, err) + me.argv.BadExit(s, err) } } return ErrorNeedArgvFix, notes diff --git a/doNewUser.go b/doNewUser.go index b4a5eda..b9f9511 100644 --- a/doNewUser.go +++ b/doNewUser.go @@ -6,6 +6,8 @@ package main // An app to submit patches for the 30 GO GUI repos import ( + "errors" + "go.wit.com/lib/fhelp" "go.wit.com/lib/gui/shell" "go.wit.com/lib/protobuf/forgepb" @@ -16,17 +18,13 @@ func doNewUser() (string, error) { var s string var err error - if me.forge.Config.Mode == forgepb.ForgeMode_NORMAL { - // not new user - return s, err - } if me.forge.Config.Mode == forgepb.ForgeMode_UNKNOWN { dumpDebug() log.Info("---- ----") log.Info("---- Welcome to forge!!! ----") log.Info("---- ----") - // this should never happen if err := me.forge.SetMode(forgepb.ForgeMode_NEWUSER); err != nil { + // this should never happen log.Info("early forge new user handling failed", err) return "forge is still new and under development", err } @@ -34,11 +32,13 @@ func doNewUser() (string, error) { // log.Info("MODE NOT UNKNOWN") } + // TODO: verify config values are valid here if me.forge.Config.ReposPB == "" { log.Info("broken config. load default config here") me.forge.Config, err = forgepb.MakeDefaultConfig() } + // TODO: make checks that make sense here and then exit from NEWUSER mode if shell.Exists(me.forge.Config.ReposPB) { log.Info("looks like you might not be a new user") log.Info("a repos file already exists at", me.forge.Config.ReposPB) @@ -46,33 +46,38 @@ func doNewUser() (string, error) { return s, err } + if me.forge.Config.Mode != forgepb.ForgeMode_NEWUSER { + return s, err + } + // very likely new user pfile, _ := resources.ReadFile("resources/NEWUSER") log.Info("") log.Info(string(pfile)) - me.forge.ScanRepoDir() // looks for new dirs, checks existing repos for changes - if me.forge.Config.Mode == forgepb.ForgeMode_NEWUSER { - log.Info("") - log.Info(" A good thing to try as a new user is to rebuild forge.") - log.Info(" This will attempt to download all the sources & needed tools.") - log.Info("") - log.Info(" Also, you can enable bash & zsh completion with --bash & --zsh") - log.Info("") - log.Info(" todo: make better notes here.") - log.Info("") - if fhelp.QuestionUser("test question") { - log.Info("question true") - } else { - log.Info("question false") - } - me.forge.SetMode(forgepb.ForgeMode_CLEAN) - if err != nil { - log.Info("ConfigSave() failed", err) - } else { - log.Info("ConfigSave() worked filename =", me.forge.Config.Filename) - } + if fhelp.QuestionUser("Scan ~/go/src for .git repos") { + me.forge.ScanRepoDir() // looks for new dirs, checks existing repos for changes + } else { + // log.Info("question false") + return "not scanned", errors.New("~/go/src not scanned") + } + + log.Info("") + log.Info(" A good thing to try as a new user is to rebuild forge.") + log.Info(" This will attempt to download all the sources & needed tools.") + log.Info("") + log.Info(" Also, you can enable bash & zsh completion with --bash & --zsh") + log.Info("") + log.Info(" todo: make better notes here.") + log.Info("") + + // turn off NEWUSER + err = me.forge.SetMode(forgepb.ForgeMode_CLEAN) + if err != nil { + log.Info("ConfigSave() failed filename =", me.forge.Config.Filename, err) + return "ConfigSave() failed", err + } else { + log.Info("ConfigSave() worked filename =", me.forge.Config.Filename) } - me.sh.GoodExit("try running: 'forge rebuild forge' to test out that forge is working on your machine") return s, err } @@ -4,6 +4,7 @@ package main import ( + "errors" "time" "go.wit.com/lib/cobol" @@ -49,7 +50,9 @@ func needToUpdateRepo(repo *gitpb.Repo) (*gitpb.Repo, error) { } // is every repo on the devel branch? -func doPull() error { +func doPull() (string, error) { + var s string + var err error if argv.Pull.Update != nil { submit := me.forge.PrepareCheckRepos() updatepb, regPB, err := submit.HttpPost(myServer(), "updateURL") @@ -61,14 +64,14 @@ func doPull() error { } if updatepb == nil { log.Info("server sent nil back") - return err + return "forge server error", err } - log.Infof("pull update pb.Len()=%d\n", updatepb.Len()) - return nil + s = log.Sprintf("pull update pb.Len()=%d\n", updatepb.Len()) + return s, err } if argv.Pull.Check != nil { - err := doFixUrls() - return err + err = doFixUrls() + return "fixed urls", err } if argv.Pull.List != nil { found := gitpb.NewRepos() @@ -81,14 +84,14 @@ func doPull() error { found.Append(me.forge.Repos.Repos[count]) } found.SortNamespace() - me.forge.PrintPullTable(found) - return nil + footer := me.forge.PrintPullTable(found) + return footer, nil } // below this, you must not be in 'normal' mode if me.forge.Config.Mode == forgepb.ForgeMode_NORMAL { - log.Info("you must check out the devel or master branches") - return nil + s = "you must check out the devel or master branches" + return s, errors.New("wrong mode " + me.forge.GetMode()) } if argv.Pull.Force || argv.Force { @@ -117,12 +120,14 @@ func doPull() error { } repoerr.SortNamespace() footer := me.forge.PrintPullTable(repoerr) - log.Info("git pull FAILED on these:", footer) - me.sh.GoodExit("git pull done") + if repoerr.Len() > 0 { + err = errors.New("git pull FAILED on these: " + footer) + } + s = "git pull done" + } else { + s = "need --force for git pull" } - - log.Info("do a pull check here?") - return nil + return s, err } diff --git a/doRebuild.go b/doRebuild.go index 0276753..febbedc 100644 --- a/doRebuild.go +++ b/doRebuild.go @@ -151,7 +151,7 @@ func doRebuildPart2() (string, error) { log.Info("Running:", cmd) r = shell.RunRealtime(cmd) if r.Error != nil { - me.sh.BadExit("download forge failed", r.Error) + me.argv.BadExit("download forge failed", r.Error) } doVerifyNamespace() @@ -159,7 +159,7 @@ func doRebuildPart2() (string, error) { log.Info("Running:", cmd) r = shell.RunRealtime(cmd) if r.Error != nil { - me.sh.BadExit("download CUI GO plugin toolkit failed", r.Error) + me.argv.BadExit("download CUI GO plugin toolkit failed", r.Error) } doVerifyNamespace() @@ -167,7 +167,7 @@ func doRebuildPart2() (string, error) { log.Info("Running:", cmd) r = shell.RunRealtime(cmd) if r.Error != nil { - me.sh.BadExit("download GTK GO plugin toolkit failed", r.Error) + me.argv.BadExit("download GTK GO plugin toolkit failed", r.Error) } _, err := doVerifyNamespace() _, err = doVerifyNamespace() @@ -233,7 +233,7 @@ func safeDelete(r *gitpb.Repo, deleteHash string, keepHash string) error { if err != nil { log.Info(deleteHash, r.FullPath) s := "local user branch could not be deleted" - me.sh.BadExit(s, err) + me.argv.BadExit(s, err) } } return ErrorNeedArgvFix @@ -13,8 +13,8 @@ import ( // hopefully will allow the GUI plugins to unload properly func forgeExit() { resetTerminalTitle() - if argv.Verbose { - log.Info("argv.Exit() got to forge.Exit()") + if me.argv.Verbose() { + log.Info("argv.Exit() got to forge.Exit() because me.argv.Verbose() was true") } // me.forge.SetConfigSave(configSave) if err := me.forge.Close(); err != nil { @@ -23,18 +23,18 @@ func forgeExit() { } func okExit(thing string) { - me.sh.GoodExit(thing) + me.argv.GoodExit(thing) } func badExit(err error) { - me.sh.BadExit("forge failed", err) + me.argv.BadExit("forge failed", err) } func newBadExit(msg string, err error) { - me.sh.BadExit(msg, err) + me.argv.BadExit(msg, err) } func badRepoExit(repo *gitpb.Repo, err error) { s := log.Sprintf("%s FAILED: %v", repo.GetNamespace(), err) - me.sh.BadExit(s, err) + me.argv.BadExit(s, err) } diff --git a/ipv6test.go b/ipv6test.go index cdcbb20..45ff985 100644 --- a/ipv6test.go +++ b/ipv6test.go @@ -22,7 +22,7 @@ func ipv6fails() bool { log.Info(s) WarningForIpv4() s = "THIS FEATURE IS NOT SUPPORTED ON IPv4" - me.sh.BadExit(s, nil) + me.argv.BadExit(s, nil) } if len(addrs) == 0 { log.Info("wierd. probably ipv6 dns problems") @@ -34,7 +34,7 @@ func ipv6fails() bool { log.Info(s) WarningForIpv4() s = "THIS FEATURE IS NOT SUPPORTED ON IPv4" - me.sh.BadExit(s, nil) + me.argv.BadExit(s, nil) } */ @@ -44,7 +44,7 @@ func ipv6fails() bool { log.Info(s) WarningForIpv4() s = "THIS FEATURE IS NOT SUPPORTED ON IPv4" - me.sh.BadExit(s, nil) + me.argv.BadExit(s, nil) } return true } @@ -8,7 +8,6 @@ package main import ( "embed" - "go.wit.com/lib/gui/shell" "go.wit.com/lib/protobuf/argvpb" "go.wit.com/lib/protobuf/forgepb" "go.wit.com/log" @@ -19,34 +18,30 @@ import ( //go:embed resources/* var resources embed.FS -func main() { - me = new(mainType) - var s string - var err error - - // autocomplete must run before everythingi - // any writes before this to STDOUT or STDERR - // will cause problems for the user at the command line - me.sh = argvpb.Autocomplete(&argv) // adds shell auto complete to go-args - +func doInit() *forgepb.Forge { // the current forge init process - me.forge, err = forgepb.Init() // init forge.pb - if err != nil { - s, err = doNewUser() + forge, err := forgepb.Init() + me.forge = forge + if err == nil { + // do the new user check anyway. should exit right away with no error + s, err := doNewUser() if err != nil { - me.sh.BadExit(s, err) - } - } else { - // do new user evertime for now - s, err = doNewUser() - if err != nil { - me.sh.BadExit(s, err) + // fail if new user check fails + me.argv.BadExit(s, err) } + return forge } - // checks if this is a new forge setup. - // if so, forge needs to configure things first + // Probably a new user + s, err := doNewUser() + if err != nil { + me.argv.BadExit(s, err) + } + me.argv.GoodExit("try running: 'forge rebuild forge' to test out that forge is working on your machine") + return forge +} +func doCoreChecks() { me.forge.ScanRepoDir() // looks for new dirs, checks existing repos for changes if me.forge.Config.Mode != forgepb.ForgeMode_NORMAL { @@ -63,112 +58,35 @@ func main() { doNormalStatus() } - if me.sh.Cmd == "" { - s, err := doDefaultBehavior() - if err != nil { - me.sh.BadExit(s, err) - } - me.sh.GoodExit(s) - } - log.Info("Starting forge with subcommand:", me.sh.Cmd) - - //// start standard argv subcommand processing here //// - if argv.Dev != nil { - // first find the repos or gopaths to operate on - if argv.Dev.Config != nil { - doConfig() - okExit("") - } - s, err := doDev() - if err != nil { - me.sh.BadExit(s, err) - } - me.sh.GoodExit(s) - } - - if argv.Commit != nil { - s, err = doCommit() - } - - if argv.Dev != nil { - s, err = doDev() - } - - if argv.Fixer != nil { - s, err = doFix() - } +} - if argv.Clean != nil { - s, err = doClean() - } +func main() { + me = new(mainType) + me.argv = argvpb.Autocomplete(&argv) // adds shell auto complete to go-args + me.forge = doInit() // init's forge (and checks for new users) - if argv.Mode != nil { - s, err = doMode() - } + // put things to do every time forge runs here + doCoreChecks() - if argv.Normal != nil { - if me.forge.Config.Mode == forgepb.ForgeMode_NORMAL { - s, err = doNormalAll() - } else { - // attempt to switch into Normal mode - s, err = doNormalAttempt() + if me.argv.Cmd == "" { + // no command line arguments were given + // do the default behavior and exit + s, err := doDefaultBehavior() + if err != nil { + me.argv.BadExit(s, err) } + me.argv.GoodExit(s) } - if argv.Merge != nil { - s, err = doMerge() - } - - if argv.Add != nil { - doAdd() - } - - if argv.Pull != nil { - doPull() - } - - if argv.Show != nil { - s, err = doShow() - } + log.Info("Starting forge with subcommand:", me.argv.Cmd) - if argv.Patch != nil { - s, err = doPatch() - } - - if argv.Generate != nil { - s, err = doGenerate() - } - - if argv.Whatchanged != nil { - // this might be deprecated by the git devs - // I put it here because of finger memory and it's nice - // for command line completion - r := shell.RunRealtime([]string{"bash", "-c", "git log"}) - s = "git whatchanged is now: todo" - err = r.Error - } - - if argv.Rebuild != nil { - // attempts to download all the sources - // and binaries needed to build forge - s, err = doRebuild() - } - - if argv.Verify != nil { - s, err = doVerify() - } - //// end standard argv subcommand processing here //// - - // if the gui starts, it doesn't yet go to the end normally - if argv.Gui != nil { - me.myGui.Start() // loads the GUI toolkit - doGui() // start making our forge GUI - debug() // sits here forever - } + var s string + var err error + s, err = doSubcommand() // safe exits back to your shell (with timing and toolkit close) if err != nil { - me.sh.BadExit(s, err) + me.argv.BadExit(s, err) } - me.sh.GoodExit(s) + me.argv.GoodExit(s) } @@ -31,7 +31,7 @@ func myServer() string { // this app's variables type mainType struct { - sh *argvpb.Argv // shell autocomplete + argv *argvpb.Argv // shell autocomplete pp *arg.Parser // the go-arg parser of the command line forge *forgepb.Forge // for holding the forge protobuf files myGui *fhelp.GuiPrep // for initializing the GUI toolkits diff --git a/subCommand.go b/subCommand.go new file mode 100644 index 0000000..5c59227 --- /dev/null +++ b/subCommand.go @@ -0,0 +1,112 @@ +// Copyright 2017-2025 WIT.COM Inc. All rights reserved. +// Use of this source code is governed by the GPL 3.0 + +package main + +import ( + "go.wit.com/lib/gui/shell" + "go.wit.com/lib/protobuf/forgepb" + "go.wit.com/log" +) + +func doSubcommand() (string, error) { + var s string + var err error + + log.Info("Starting forge with subcommand:", me.argv.Cmd) + + //// start standard argv subcommand processing here //// + if argv.Dev != nil { + // first find the repos or gopaths to operate on + if argv.Dev.Config != nil { + doConfig() + okExit("") + } + s, err := doDev() + if err != nil { + me.argv.BadExit(s, err) + } + me.argv.GoodExit(s) + } + + if argv.Commit != nil { + s, err = doCommit() + } + + if argv.Dev != nil { + s, err = doDev() + } + + if argv.Fixer != nil { + s, err = doFix() + } + + if argv.Clean != nil { + s, err = doClean() + } + + if argv.Mode != nil { + s, err = doMode() + } + + if argv.Normal != nil { + if me.forge.Config.Mode == forgepb.ForgeMode_NORMAL { + s, err = doNormalAll() + } else { + // attempt to switch into Normal mode + s, err = doNormalAttempt() + } + } + + if argv.Merge != nil { + s, err = doMerge() + } + + if argv.Add != nil { + doAdd() + } + + if argv.Pull != nil { + doPull() + } + + if argv.Show != nil { + s, err = doShow() + } + + if argv.Patch != nil { + s, err = doPatch() + } + + if argv.Generate != nil { + s, err = doGenerate() + } + + if argv.Whatchanged != nil { + // this might be deprecated by the git devs + // I put it here because of finger memory and it's nice + // for command line completion + r := shell.RunRealtime([]string{"bash", "-c", "git log"}) + s = "git whatchanged is now: todo" + err = r.Error + } + + if argv.Rebuild != nil { + // attempts to download all the sources + // and binaries needed to build forge + s, err = doRebuild() + } + + if argv.Verify != nil { + s, err = doVerify() + } + //// end standard argv subcommand processing here //// + + // if the gui starts, it doesn't yet go to the end normally + if argv.Gui != nil { + me.myGui.Start() // loads the GUI toolkit + doGui() // start making our forge GUI + debug() // sits here forever + } + return s, err +} |
