package main // An app to submit patches for the 30 GO GUI repos import ( "os" "strings" "go.wit.com/dev/alexflint/arg" "go.wit.com/gui" "go.wit.com/lib/gui/shell" "go.wit.com/lib/protobuf/forgepb" "go.wit.com/lib/protobuf/gitpb" "go.wit.com/log" ) // sent via -ldflags var VERSION string var BUILDTIME string // used for shell auto completion var ARGNAME string = "forge" // using this for now. triggers config save var configSave bool func getVersion(repo *gitpb.Repo, name string) string { cmd := []string{"git", "describe", "--tags", "--always", name} result := repo.RunQuiet(cmd) output := strings.Join(result.Stdout, "\n") log.Info("cmd =", cmd, output) return strings.TrimSpace(output) } func main() { me = new(mainType) me.pp = arg.MustParse(&argv) if argv.Bash { argv.doBash() os.Exit(0) } if len(argv.BashAuto) != 0 { argv.doBashAuto() os.Exit(0) } me.urlbase = argv.URL if me.urlbase == "" { me.urlbase = "https://go.wit.com/" } me.urlbase = strings.Trim(me.urlbase, "/") // track down why trailing '/' makes http POST not work // load the ~/.config/forge/ config me.forge = forgepb.Init() me.found = new(gitpb.Repos) // first find the repos or gopaths to operate on if argv.Config != nil { doConfig() okExit("") } if argv.Commit != nil { pwd, _ := os.Getwd() repo := me.forge.Repos.FindByFullPath(pwd) if repo == nil { log.Info("what branch are you on?: todo: examine this") okExit("") } if repo.GetCurrentBranchName() != repo.GetUserBranchName() { me.found.Append(repo) me.forge.PrintHumanTable(me.found) log.Info("") log.Info("wrong branch. Can not commit on", repo.GetCurrentBranchName()) log.Info("") okExit("") } os.Setenv("LESS", "-XR") if err := shell.Exec([]string{"git", "diff"}); err != nil { badExit(err) } if err := shell.ExecCheck([]string{"git", "commit", "--all"}); err != nil { badExit(err) } log.Info("git commit ok. forge done") okExit("") } if argv.Checkout != nil { if err := doCheckout(); err != nil { badExit(err) } okExit("") } if argv.Clean != nil { if err := doClean(); err != nil { badExit(err) } okExit("") } if argv.Dirty != nil { doDirty() okExit("") } if argv.Examine != nil { if err := doExamine(); err != nil { badExit(err) } okExit("") } if argv.Rescan != nil { me.forge.ScanGoSrc() okExit("") } if argv.Show != "" { repo := me.forge.FindByGoPath(argv.Show) me.forge.HumanPrintRepo(repo) // newt := repo.Times.LastUpdate.AsTime() // oldt := repo.Times.MtimeHead.AsTime() if repo.Times.LastUpdate == nil { log.Info("SHOULD RUN Reload() here") repo.Reload() me.forge.HumanPrintRepo(repo) } else { if repo.Times.LastUpdate.Seconds < repo.Times.MtimeHead.Seconds { log.Info("SHOULD RUN Reload() here") } } okExit("") } if argv.GitPull != nil { argv.GitPull.findRepos() doGitPull() okExit("") } if argv.GitReset != nil { findAll() // select all the repos doGitReset() okExit("reset") } if argv.List != nil { argv.List.findRepos() // print out the repos me.forge.PrintHumanTable(me.found) okExit("") } if argv.Patch != nil { if argv.Patch.Submit != "" { doSubmit(argv.Patch.Submit) okExit("") } if argv.Patch.List != nil { if err := listPatches(); err != nil { badExit(err) } okExit("patch list") } } // todo: redo this logic using forgepb if configSave { me.forge.ConfigSave() configSave = false } // if the user doesn't want to open the GUI and // nothing else was specified to be done, // then just list the table to stdout if gui.NoGui() { me.forge.PrintHumanTable(me.found) okExit("") } // open the gui unless the user performed some other // basically, if you run just 'forge' it should open the GUI // if opening the GUI, always check git for dirty repos findAll() // select all the repos doCheckDirtyAndConfigSave() doGui() okExit("") }