summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--argv.template.go4
-rw-r--r--doAdd.go24
-rw-r--r--doFix.deleteuser.go10
-rw-r--r--doNewUser.go59
-rw-r--r--doPull.go35
-rw-r--r--doRebuild.go6
-rw-r--r--doStats.go2
-rw-r--r--exit.go12
-rw-r--r--ipv6test.go6
-rw-r--r--main.go158
-rw-r--r--structs.go2
-rw-r--r--subCommand.go112
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
diff --git a/doAdd.go b/doAdd.go
index 7267eb5..10347a9 100644
--- a/doAdd.go
+++ b/doAdd.go
@@ -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
}
diff --git a/doPull.go b/doPull.go
index ca88e3a..7e74812 100644
--- a/doPull.go
+++ b/doPull.go
@@ -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()
diff --git a/doStats.go b/doStats.go
index 2ed3e3a..21847be 100644
--- a/doStats.go
+++ b/doStats.go
@@ -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
diff --git a/exit.go b/exit.go
index aa2c87f..bfbaac4 100644
--- a/exit.go
+++ b/exit.go
@@ -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
}
diff --git a/main.go b/main.go
index d7d458a..74ce647 100644
--- a/main.go
+++ b/main.go
@@ -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)
}
diff --git a/structs.go b/structs.go
index d022e67..8f05ff8 100644
--- a/structs.go
+++ b/structs.go
@@ -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
+}