// Copyright 2025 WIT.COM Inc Licensed GPL 3.0 package forgepb import ( "errors" "os" "os/user" "path/filepath" "go.wit.com/lib/cobol" "go.wit.com/lib/config" "go.wit.com/lib/env" "go.wit.com/lib/fhelp" "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 { engine := New() engine.Use(Logger(), Recovery()) return engine.With(opts...) } */ func Init() (*Forge, error) { f := new(Forge) f.Config = NewForgeConfigs() err := f.Config.loadConfig() err = errors.Join(err, f.postInit()) return f, err } func InitByAppname(argname string) (*Forge, error) { log.Info("InitByAppname() IS DEPRECATED AND DOESNT DO ANYTHING") return Init() } func InitByFullpath(filename string) (*Forge, error) { f := new(Forge) cfg := NewForgeConfigs() cfg.Filename = filename err := config.ReLoad(cfg) f.Config = cfg err = errors.Join(err, f.postInit()) if err != nil { log.Info("forge.InitByFullpath() error:", filename, err) } return f, err } // saves the config if there have been changes func (f *Forge) Close() error { if err := f.Save(); err != nil { return err } return nil } func (f *Forge) postInit() error { cache := "auto" if env.Get("cache") == "" { // leave "auto" by default } else { // get the users default preference cache = env.Get("cache") } // if cache is set to "auto", this detects if you are in a // a golang directory (~/go/src) or in a dir that has a "go.work" file if cache == "auto" { if godir, ok := fhelp.FindGoWork(); ok { f.mode = ForgeMode_GOLANG cache = "gowork" env.SetGlobal("lib/forgepb", "GoWork", "true") env.SetGlobal("lib/forgepb", "gopath", godir) fullname := filepath.Join(godir, "gowork.pb") env.SetGlobal("lib/forgepb", "ReposPB", fullname) } else { gopath := filepath.Join(env.Get("homedir"), "go/src") pwd, err := os.Getwd() if err == nil { _, err := filepath.Rel(gopath, pwd) if err == nil { f.mode = ForgeMode_GOLANG // user is running forge from within ~/go/src env.SetGlobal("lib/forgepb", "gopath", gopath) cache = "gosrc" } } // always define if env.Get("gopath") == "" { env.SetGlobal("lib/forgepb", "gopath", gopath) } } } f.configureCache(cache) // always define if env.Get("username") == "" { usr, _ := user.Current() env.SetGlobal("lib/forgepb", "username", usr.Username) env.Save() } // always define if env.Get("homeDir") == "" { homeDir, _ := os.UserHomeDir() env.SetGlobal("lib/forgepb", "homeDir", homeDir) env.Save() } // always define if env.Get("curpatches") == "" { env.SetGlobal("lib/forgepb", "curpatches", "curpatches.pb") } // converts the lib/ENV "mode" string // todo: rethink all this f.mode = getModeENV() // todo: play with these / determine good values based on user's machine if cobol.Int(env.Get("RillX")) == 0 { env.SetGlobal("lib/forgepb", "RillX", "10") } if cobol.Int(env.Get("RillY")) == 0 { env.SetGlobal("lib/forgepb", "RillY", "20") env.Save() } // create an initial repos.pb file // panic() here? // warning? // (probably not. it's just the repos.pb cache file err := f.reposCacheLoad() // loads the file from ~/.cache/forge/repos.pb if err == nil { if env.Verbose() { log.Printf("forge loaded %s file with len(%d) repos\n", f.Repos.Filename, f.Repos.Len()) } } else { log.Printf("forge failed to load %s file with len(%d) repos err=(%v)\n", f.Repos.Filename, f.Repos.Len(), err) panic("failed to load repos.pb") } err = f.patchesCacheLoad() // loads the file from ~/.cache/forge/patches.pb if err == nil { // log.Printf("forge loaded %s file with len(%d) repos\n", f.Repos.Filename, f.Repos.Len()) } else { log.Printf("forge failed to load %s file with len(%d) patches err=(%v)\n", f.Patches.Filename, f.Patches.Len(), err) panic("failed to load repos.pb") } return err }