package main import ( "embed" "os" "path/filepath" "strings" "go.wit.com/gui" "go.wit.com/lib/gui/shell" "go.wit.com/log" ) // 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") 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() log.Info("sleep(1)") log.Sleep(1) // 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(showHideRepos) // 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 } func setTargetVersion() { // go through and set the target versions for each repo // todo: add sanity checking in repolist to verify these and/or autocompute them // for now, just don't be stupid when you set your ENV vars // widget I versioned early before I knew what the hell this would mean and can // not be down versioned because that's not how GO versioning works. Once you // set the version for a path, it's set in stone forever. (smart system!) // we could rename go.wit.com/widget to go.wit.com/newwidget and restart the versioning // system, but that's rediculous and this servers to always remind me to never make this mistake again var count int for i, repo := range me.repos.View.AllRepos() { if repo == nil { log.Info("initial scan repo = nil", i) continue } if repo.Status == nil { log.Info("repo.status == nil", repo.Name()) continue } if repo.GoPath() == "go.wit.com/widget" { repo.Status.SetTargetVersion("v" + widgetVersion) } else { repo.Status.SetTargetVersion("v" + releaseVersion) } if strings.HasPrefix(repo.GoPath(), "go.wit.com/dev/") { lasttag := repo.Status.GetLastTagVersion() repo.Status.SetTargetVersion(lasttag) } // repo.NewScan() count += 1 } log.Info("target versions set for", count, "repos") }