// Copyright 2017-2025 WIT.COM Inc. All rights reserved. // Use of this source code is governed by the GPL 3.0 package main import ( "errors" "fmt" "os" "path/filepath" "go.wit.com/lib/env" "go.wit.com/lib/protobuf/argvpb" "go.wit.com/lib/protobuf/gitpb" "go.wit.com/log" ) func rillRestore(repo *gitpb.Repo) error { if me.forge.Config.IsReadOnly(repo.GetGoPath()) { return nil } if me.forge.Config.IsPrivate(repo.GetGoPath()) { return nil } var err error if argv.Verbose { log.Info("go-mod-clean lax START", repo.GetGoPath()) result := repo.RunRealtime([]string{"go-mod-clean", "lax"}) log.Info("go-mod-clean lax END", repo.GetGoPath()) if result.Exit != 0 { err = fmt.Errorf("repo %s failed %d", repo.GetGoPath(), result.Exit) } } else { _, err = repo.RunQuiet([]string{"go-mod-clean", "lax"}) } if err != nil { log.Info("go-mod-clean lax failed", repo.GetGoPath(), err) return err } return nil } func doPublish() error { initForge() env.PrintTable() me.forge.RillFuncError(rillRestore) // publish := me.forge.RunOnReposNewDumb(me.forge.Repos, rePrepareReleaseNew) // doesn't use Rill() publish := me.forge.RunOnReposNew(me.forge.Repos, rePrepareReleaseNew) if publish == nil { return errors.New("nothing to publish. you actually have to write code first") } for repo := range publish.IterAll() { // update the target version // repo.IncrementTargetMinor() repo.IncrementTargetRevision() } publish = publish.SortActual() footer := publish.PrintPublishNewTB() fmt.Printf("publish.len(%d) PrintPublishTable() footer: %s\n", publish.Len(), footer) tryme := findNext(publish) if len(tryme) == 0 { return errors.New("can't find something safe to publish") } startRepo := me.forge.Repos.FindByNamespace("go.wit.com/lib/xgb") if startRepo == nil { return errors.New("a startRepo can't be found") } releaseReason := "new attempt" for i, repo := range tryme { log.Info("tryme:", i, repo.FullPath) gomod, err := os.ReadFile(filepath.Join(repo.FullPath, "go.mod")) if err != nil { panic("go.mod missing") } log.Info(string(gomod)) if env.True("--doit") { err := doRelease(repo, startRepo, releaseReason) if err != nil { return err } } else { log.Printf("WOULD HAVE RUN: doRelease(%s, %s, %s) %s\n", repo.Namespace, startRepo.Namespace, releaseReason, repo.GetTargetVersion()) } } if !env.True("--doit") { return errors.New("run with --doit to actually try to publish") } // me.forge.RillFuncError(rillPurge) /* saferepo := me.forge.Repos.FindByNamespace("go.wit.com/lib/xgb") // safe to run things here if saferepo == nil { return log.Errorf("need a safe place to run GO commands from") } os.Chdir(saferepo.FullPath) if os.Getenv("GUIRELEASE_REASON") == "" { log.Info("$ENV[GUIRELEASE_REASON] was not set") reason := fhelp.InputFromUser("set tag message:") if reason == "" { argvpb.BadExit("merge failed", fmt.Errorf("GUIRELEASE_REASON was blank")) } os.Setenv("GUIRELEASE_REASON", reason) } var cmd []string cmd = []string{"forge", "merge", "--all"} if _, err := shell.RunRealtimeError(cmd); err != nil { argvpb.BadExit("merge failed", nil) } cmd = []string{"forge", "merge", "check"} if _, err := shell.RunRealtimeError(cmd); err != nil { if _, err := shell.RunVerbose(cmd); err != nil { argvpb.BadExit("merge failed", nil) } } // todo: os.Stat() file time.Sleep(time.Second) me.forge.Repos.Load() if err := doInstall(me.forge.Repos); err != nil { log.Info("doInstall() failed", err) argvpb.BadExit("merge failed", nil) } if os.Getenv("GUIRELEASE_REASON") == "" { os.Setenv("GUIRELEASE_REASON", "automated") } */ argvpb.GoodExit("PUBLISH WORKED") return nil }