// Copyright 2025 WIT.COM Inc Licensed GPL 3.0 package forgepb import ( "os" "go.wit.com/lib/config" "go.wit.com/lib/fhelp" "go.wit.com/lib/protobuf/gitpb" "go.wit.com/log" ) /* better syntax from gin Default returns an Engine instance with the Logger and Recovery middleware already attached. func Default(opts ...OptionFunc) *Engine { debugPrintWARNINGDefault() engine := New() engine.Use(Logger(), Recovery()) return engine.With(opts...) } */ func Init() *Forge { cfg := new(ForgeConfigs) err := config.ConfigLoad(cfg, "forge", "forge") if err != nil { log.Info("forge has not been configured yet filename =", cfg.Filename) log.Info("go install go.wit.com/apps/forge@latest") os.Exit(-1) } f := initFromConfig(cfg) log.Info("forge.Init() ok len(repos) =", f.Repos.Len()) return f } func InitByAppname(argname string) *Forge { cfg := new(ForgeConfigs) err := config.ConfigLoad(cfg, argname, "forge") if err != nil { log.Info("forge has not been configured yet", cfg.Filename) log.Info("go install go.wit.com/apps/forge@latest") os.Exit(-1) } f := initFromConfig(cfg) log.Info("forge.Init() ok len(repos) =", f.Repos.Len()) return f } /* func (f *Forge) InitScan() { if f.hasFullScan { // duplicate time checking below. which one to keep? if f.FullScanAge() > time.Minute { log.Log(INFO, "forgepb.Scan() skipping scan. been run a minute ago", f.FullScanAge()) return } } now := time.Now() start := f.Repos.Len() f.ScanGoSrc() f.FullScanRan() end := f.Repos.Len() if (end - start) == 0 { log.Log(INFO, "forgepb.Scan() Scan did not find new git repositories. Total =", end) if f.FullScanAge() > time.Minute { f.rillUpdate(20, 10) } } else { log.Log(INFO, "forgepb.Scan() Scan found", end-start, "new git repositories. Total =", end) f.rillUpdate(20, 10) } if f.configSave { // taking this out to debug Marshal() panic f.ConfigSave() f.configSave = false } log.Log(INFO, "update() check took", shell.FormatDuration(time.Since(now))) } */ func initFromConfig(cfg *ForgeConfigs) *Forge { f := new(Forge) f.Config = cfg if f.configENV() { log.Info("ENV changed config. todo: save config here") f.Config.ConfigSave() } f.Repos = gitpb.NewRepos() f.Repos.ConfigLoad() if f.Repos.HasFullScan { f.hasFullScan = true } // init the Patchsets f.Patchsets = NewPatchsets() // todo: play with these / determine good values based on user's machine f.rillX = 10 f.rillY = 20 return f } /* func (f *Forge) InitMachine() { if f.Config.Username == "" { usr, _ := user.Current() f.Config.Username = usr.Username } f.hostname, _ = os.Hostname() // log.Info(hostname, err) } */ func (f *Forge) SetConfigSave(b bool) { f.configSave = b } // saves the config if there have been changes func (f *Forge) Exit() { // log.Info("forge.configSave =", f.configSave) if f.configSave { f.ConfigSave() } // log.Info("forge.Exit() ok") os.Exit(0) } // the first thing done is process any ENV settings // try to NOT use the ENV settings anywhere but here // all initial ENV settings should be stored in the forge struct func (f *Forge) setenv() { f.once.Do(func() { if err := fhelp.ConfigureENV(); err != nil { log.Info("forge ConfigureENV() failed", err) os.Exit(-1) } if f.Config == nil { log.Info("forge.Config() was nil") os.Exit(-1) } f.configDir = os.Getenv("FORGE_CONFIG") f.goSrc = os.Getenv("FORGE_GOSRC") f.forgeURL = os.Getenv("FORGE_URL") f.hostname = os.Getenv("HOSTNAME") if os.Getenv("FORGE_GOWORK") == "true" { f.goWork = true } f.Config.ReposPB = os.Getenv("FORGE_REPOPB") f.Config.PatchDir = os.Getenv("FORGE_PATCHDIR") }) } /* // if the env vars are set, this is probably not a new user func checkenv() bool { if os.Getenv("FORGE_CONFIG") != "" { return true } if os.Getenv("FORGE_GOSRC") != "" { return true } if os.Getenv("FORGE_REPOPB") != "" { return true } if os.Getenv("FORGE_URL") != "" { return true } if os.Getenv("FORGE_PATCHDIR") != "" { return true } if os.Getenv("FORGE_VERBOSE") != "" { return true } return false } */ func (f *Forge) GetForgeURL() string { return f.forgeURL } // set the URL for forge otherwise fallback to ENV or to forge.wit.com func (f *Forge) SetForgeURL(url string) { if url == "" { url = os.Getenv("FORGE_URL") } if url == "" { url = "https://forge.wit.com/" } f.forgeURL = url os.Setenv("FORGE_URL", f.forgeURL) log.Info("Forge URL has been set to", f.forgeURL) } // the first thing done is process any ENV settings // try to NOT use the ENV settings anywhere but here // all initial ENV settings should be stored in the forge struct func (f *Forge) configENV() bool { var changed bool f.once.Do(func() { if err := fhelp.ConfigureENV(); err != nil { log.Info("forge ConfigureENV() failed", err) os.Exit(-1) } if os.Getenv("FORGE_REPOPB") != "" && f.Config.ReposPB != os.Getenv("FORGE_REPOPB") { log.Info("ENV: updating FORGE_REPOSPB from", f.Config.ReposPB, "to", os.Getenv("FORGE_REPOPB")) f.Config.ReposPB = os.Getenv("FORGE_REPOPB") changed = true } if os.Getenv("FORGE_GOSRC") != "" && f.Config.ReposDir != os.Getenv("FORGE_GOSRC") { log.Info("ENV: updating FORGE_GOSRC from", f.Config.ReposDir, "to", os.Getenv("FORGE_GOSRC")) f.Config.ReposDir = os.Getenv("FORGE_GOSRC") changed = true } if os.Getenv("FORGE_PATCHDIR") != "" && f.Config.PatchDir != os.Getenv("FORGE_PATCHDIR") { log.Info("ENV: updating FORGE_PATCHDIR from", f.Config.PatchDir, "to", os.Getenv("FORGE_PATCHDIRC")) f.Config.PatchDir = os.Getenv("FORGE_PATCHDIR") changed = true } f.configDir = os.Getenv("FORGE_CONFIG") f.goSrc = os.Getenv("FORGE_GOSRC") f.forgeURL = os.Getenv("FORGE_URL") // f.patchDir = os.Getenv("FORGE_PATCHDIR") f.hostname = os.Getenv("HOSTNAME") if os.Getenv("FORGE_GOWORK") == "true" { f.goWork = true } }) if changed { // save config here } return changed }