// 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 ( "errors" "fmt" "os" "path/filepath" "go.wit.com/lib/env" "go.wit.com/lib/fhelp" "go.wit.com/lib/gui/shell" "go.wit.com/lib/protobuf/argvpb" "go.wit.com/lib/protobuf/gitpb" "go.wit.com/log" ) // download forge. A good way to check things work func doRebuild() (string, error) { var s string var err error if env.AddPath(filepath.Join(env.Get("homeDir"), "go/bin")) { // means the path wasn't there. TODO: warn the user } if ipv6fails() { // never returns if fail } if argv.Rebuild.Forge != nil { s, err = doRebuildForge() } return s, err } func doRebuildForge() (string, error) { var s string var err error s, err = checkBuildRequirements() if err != nil { log.Info("build requirements failed", err) s, err = doVerifyNamespace() if err != nil { log.Info("doVerifyNamespace() failed", err) return s, err } return s, err } s, err = doRebuildPart2() if err != nil { log.Info("build Part2 failed", err) s, err = doVerifyNamespace() if err != nil { log.Info("doVerifyNamespace() failed", err) return s, err } } forge, err := doRebuildPart3() if err != nil { log.Info("build Part3 failed", err) s, err = doVerifyNamespace() if err != nil { log.Info("doVerifyNamespace() failed", err) return s, err } } // finally try 'make' in the forge sources err = forge.RunVerbose([]string{"make", "install-verbose"}) if err != nil { return "make failed", err } log.Info("") log.Info("#########################################################") log.Info("# forge rebuild forge worked #") log.Info("#########################################################") log.Info("") return "done", nil } func checkBuildRequirements() (string, error) { var allerr error log.Info("download here") if !fhelp.CheckProtoc() { } if !fhelp.CheckProtoc() { } if !fhelp.CheckProtoc() { badExit(fmt.Errorf("you do not have 'protoc' installed")) } if path, err := fhelp.CheckCmd("goimports"); err != nil { log.Printf("goimports missing path(%s) err(%v)\n", path, err) cmd := []string{"go", "install", "-v", "-x", "golang.org/x/tools/cmd/goimports@latest"} log.Info("TRYING TO INSTALL goimports", cmd) log.Info("TRYING TO INSTALL goimports", cmd) log.Info("TRYING TO INSTALL goimports", cmd) log.Info("TRYING TO INSTALL goimports", cmd) shell.RunVerboseOnError(cmd) allerr = errors.Join(allerr, err) } else { log.Info("goimports at path:", path) } if path, err := fhelp.CheckCmd("go-clone"); err != nil { log.Printf("go-clone missing path(%s) err(%v)\n", path, err) cmd := []string{"go", "install", "-v", "-x", "go.wit.com/apps/go-clone@latest"} shell.RunRealtime(cmd) allerr = errors.Join(allerr, err) } else { log.Info("go-clone at path:", path) } if path, err := fhelp.CheckCmd("autogenpb"); err != nil { log.Printf("autogenpb missing path(%s) err(%v)\n", path, err) cmd := []string{"go", "install", "-v", "-x", "go.wit.com/apps/autogenpb@latest"} shell.RunRealtime(cmd) allerr = errors.Join(allerr, err) } else { log.Info("autogenpb at path:", path) } if path, err := fhelp.CheckCmd("go-mod-clean"); err != nil { log.Printf("go-mod-clean missing path(%s) err(%v)\n", path, err) cmd := []string{"go", "install", "-v", "-x", "go.wit.com/apps/go-mod-clean@latest"} shell.RunRealtime(cmd) allerr = errors.Join(allerr, err) } else { log.Info("go-mod-clean at path:", path) } return "part1", allerr } func doRebuildPart2() (string, error) { if path, err := fhelp.CheckCmd("go-clone"); err != nil { pfile, _ := resources.ReadFile("resources/GOPATH") log.Info("") log.Info(string(pfile)) log.Info("may be at:", path) s := fmt.Sprintf("setup PATH") return s, errors.New("prep build failed") } var basecmd []string var cmd []string if me.forge.IsGoWork() { log.Info("Using go.work directory") basecmd = []string{"go-clone", "--work", "--repo"} } else { basecmd = []string{"go-clone", "--repo"} } // log.Info("Running:", cmd) // shell.RunRealtime(cmd) doVerifyNamespace() r := shell.Run([]string{"forge", "show"}) if r.Error != nil { return "download go-mod-clean failed", r.Error } cmd = append(basecmd, "go.wit.com/apps/go-mod-clean") log.Info("Running:", cmd) r = shell.RunRealtime(cmd) if r.Error != nil { return "download go-mod-clean failed", r.Error } doVerifyNamespace() cmd = append(basecmd, "go.wit.com/apps/autogenpb") log.Info("Running:", cmd) r = shell.RunRealtime(cmd) if r.Error != nil { return "download autogenpb failed", r.Error } doVerifyNamespace() cmd = append(basecmd, "go.wit.com/apps/forge") log.Info("Running:", cmd) r = shell.RunRealtime(cmd) if r.Error != nil { argvpb.BadExit("download forge failed", r.Error) } doVerifyNamespace() cmd = append(basecmd, "go.wit.com/toolkits/gocui") log.Info("Running:", cmd) r = shell.RunRealtime(cmd) if r.Error != nil { argvpb.BadExit("download CUI GO plugin toolkit failed", r.Error) } doVerifyNamespace() cmd = append(basecmd, "go.wit.com/toolkits/andlabs") log.Info("Running:", cmd) r = shell.RunRealtime(cmd) if r.Error != nil { argvpb.BadExit("download GTK GO plugin toolkit failed", r.Error) } _, err := doVerifyNamespace() _, err = doVerifyNamespace() if (me.forge == nil) || (me.forge.Repos == nil) { log.Info("RUN forge --rebuild again. it might work after a few tries") return "forge is new. this may not work yet", errors.New("forge init not working yet") } return "build part2 might have worked", err } func doRebuildPart3() (*gitpb.Repo, error) { _, err := doVerifyNamespace() if err != nil { log.Info("doVerifyNamespace() failed", err) return nil, err } repo := me.forge.Repos.FindByNamespace("go.wit.com/apps/forge") if repo == nil { _, err := shell.RunVerbose([]string{"forge", "show"}) log.Info("still can't find the forge sources", err) return nil, err } log.Info("trying build Part3") // yay. it might work os.Chdir(repo.FullPath) r := shell.RunRealtime([]string{"make", "generate"}) if r.Exit != 0 { log.Info("make generate failed", r.Exit) return nil, errors.New("make generate failed -1") } return repo, nil }