// Copyright 2017-2025 WIT.COM Inc. All rights reserved. // Use of this source code is governed by the GPL 3.0 package main // An app to submit patches for the 30 GO GUI repos import ( "embed" "strings" "go.wit.com/lib/gui/prep" "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 // this optionally can store the GUI plugins // //go:embed resources/* var resources embed.FS // 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) // the current os.Argv processing with go-args me.myGui = prep.Gui() // adds the GUI package args support me.sh = prep.Bash(&argv) // adds shell auto complete to go-args // the current forge init process me.forge = forgepb.Init() // init forge.pb me.forge.ScanRepoDir() // looks for new dirs, checks existing repos for changes if me.forge.Config.Mode != forgepb.ForgeMode_NORMAL { me.forge.Config.DumpPB() } // first find the repos or gopaths to operate on if argv.Config != nil { doConfig() okExit("") } if argv.Commit != nil { doCommit() okExit("") } if argv.Checkout != nil { if err := doCheckout(); err != nil { badExit(err) } okExit("") } if argv.Dev != nil { if argv.Dev.Install != "" { if err := doInstall(); err != nil { badExit(err) } } if argv.Dev.Build != "" { if err := doBuild(); err != nil { badExit(err) } } if argv.Dev.BuildForge { buildForge() okExit("") } okExit("") } if argv.Clean != nil { if err := doClean(); err != nil { badExit(err) } me.forge.ConfigSave() okExit("") } if argv.Mode != nil { if s, err := doMode(); err != nil { me.sh.BadExit(s, err) } else { me.sh.GoodExit(s) } } // if you are in "normal" mode, always run normal every time to catch accidental errors // for example, if you accidentally changed branches from your user branch if me.forge.Config.Mode == forgepb.ForgeMode_NORMAL { if doNormal() { log.Infof("all your %d repos are in a normal stete for development\n", me.forge.Repos.Len()) } } if argv.Merge != nil { if err := doMerge(); err != nil { badExit(err) } okExit("") } if argv.Add != nil { doAdd() okExit("") } if argv.Pull != nil { doPull() okExit("") } if argv.Show != nil { if argv.Show.Dirty != nil { doDirty() okExit("") } if argv.Show.Tag != nil { doTag() okExit("") } found := findRepos() if showUrls() { me.forge.PrintForgedTable(found) okExit("") } // print out the repos if argv.All { me.forge.PrintHumanTableFull(found) } else { me.forge.PrintDefaultTB(found) } okExit("") } if argv.Patch != nil { if err := doPatch(); err != nil { badExit(err) } okExit("") } // open the gui unless the user performed some other // basically, if you run just 'forge' it should open the GUI if argv.Gui != nil { // if opening the GUI, always check git for dirty repos me.forge.CheckDirty() me.myGui.Start() // loads the GUI toolkit doGui() // start making our forge GUI debug() // sits here forever } // DEFAULT BEHAVIOR CHANGES BETWEEN MODES if me.forge.Config.Mode == forgepb.ForgeMode_NORMAL || me.forge.Config.Mode == forgepb.ForgeMode_USER { // PROBABLY YOU ARE WRITING CODE // got to the end with nothing to do (?) if showWorkRepos() { // found some repos at least } else { // every repo is in a really clean state. no extra files anywhere // no dirty repos, no repos that need to be published // nothing different between user and master branch version. not common log.Info("All of your git repositories appear to be in perfect shape") } okExit("") } if me.forge.Config.Mode == forgepb.ForgeMode_MASTER { // PROBABLY YOU ARE PUBLISHING / MERGING CODE defaultBehaviorMaster() okExit("") } // PROBABLY A NEW USER found := findAll() me.forge.PrintDefaultTB(found) okExit("") } func showUrls() bool { if argv.Show == nil { return false } if argv.Show.Repo == nil { return false } if argv.Show.Repo.Urls != nil { return true } return false }