package main import ( "embed" "os" "path/filepath" "go.wit.com/gui" "go.wit.com/lib/gui/shell" "go.wit.com/log" ) var VERSION string // TODO: autocompute these in the gui var releaseReasonS string var releaseVersion string var widgetVersion string //go:embed resources/* var resToolkit embed.FS func main() { me = new(autoType) // TODO: autocompute these in the gui releaseReasonS = os.Getenv("GUIRELEASE_REASON") releaseVersion = os.Getenv("GUIRELEASE_VERSION") widgetVersion = os.Getenv("GUIRELEASE_WIDGET") if releaseVersion == "" { log.Info("GUIRELEASE_VERSION not set") os.Exit(0) } // unset the go development ENV var to generate release files // this is required for go mod init & tidy. Also, if the // user drops to a shell or xterm, then they shouldn't be set there either os.Unsetenv("GO111MODULE") me.myGui = gui.New() me.myGui.InitEmbed(resToolkit) me.myGui.Default() // our main window me.mainWindow = me.myGui.NewWindow("GUI release manager " + VERSION) me.mainBox = me.mainWindow.NewBox("bw hbox", true) // sanity check of things that might be around that mess // up things later // if you have a go.work file, you must delete it // TODO: check for go.work files anywhere homeDir, _ := os.UserHomeDir() gowork := filepath.Join(homeDir, "go/src/go.work") if shell.Exists(gowork) { log.Info("go.work must be deleted") os.Exit(0) } // sanity check of things that might be around that mess // up things later // check to make sure we have a go.sum here gosum := filepath.Join(homeDir, "go/src/go.wit.com/apps/guireleaser/go.sum") if !shell.Exists(gosum) { log.Info("go.sum must exist here") os.Exit(0) } // save the ENV var here me.releaseReasonS = releaseReasonS log.Info("Creating the Release Window") // initialize the repo list window // which should be all the git repositories in ~/go/src & the .config file me.repos = makeRepoView() // the left side of the window options globalDisplayOptions(me.mainBox) // create the right side of the main window createReleaseBox(me.mainBox) // disable the open repo button. this isn't really important // but does indicates the app (and toolkit) is working // this can be removed later, but in these early days, I'm using this // tool to release the code for this app, the gui and the gui toolkits // and sometimes they lie, don't display stuff, don't even disable things // so I can't trust even what I see. It's complicated right now still. me.release.openrepo.Disable() me.Disable() // parse config file and scan for .git repos me.repos.initRepoList() setTargetVersion() // register a Show/Hide function for the repo list table me.repos.View.RegisterHideFunction(hideFunction) // scan in the State of all the repos // TODO: should not really be necessary directly after init() me.repos.View.ScanRepositories() // find myself. the guireleaser directory is used as a working scratchpad // for running go commands that can mess up the go.* files for _, repo := range me.repos.View.AllRepos() { if repo.GoPath() == "go.wit.com/apps/guireleaser" { if me.release.guireleaser == nil { me.release.guireleaser = repo } } } if me.release.guireleaser == nil { log.Info("Can not release if guireleaser was not found") os.Exit(0) } me.Enable() // intermittently scans the status indefinitly me.repos.View.Watchdog(func() { log.Info("In main()") // processing is done. update the repo summary box // me.summary.Update() }) } // start the initail scan and make sure each repo is set // to the master branch func setAllBranchesToMaster() bool { var worked bool = true for _, repo := range me.repos.View.AllRepos() { if repo.ReadOnly() { continue } if repo.IsDirty() { continue } if whitelist(repo.GoPath()) { continue } if repo.Status.CheckoutMaster() { log.Warn("git checkout master branch worked", repo.Name()) } else { log.Warn("git checkout master branch failed", repo.Name()) worked = false } // repo.NewScan() } return worked }