// Copyright 2025 WIT.COM Inc Licensed GPL 3.0 package forgepb import ( "errors" "os" "os/user" "path/filepath" "go.wit.com/lib/config" "go.wit.com/lib/gui/prep" "go.wit.com/log" ) // returns err1 || err2 func (f *Forge) ConfigSave() error { if f.Config == nil { return log.Errorf("forge.Config == nil") } if !config.HasChanged("forge") { return nil } // only let forge edit & save the config files // inforce this in lib config? if !(prep.AppName() == "forge" || prep.AppName() == "guireleaser") { log.Info("This is not forge") return log.Errorf("Only forge can save the forge config file") } // migrate from the old gopath to "namespace" for fc := range f.Config.IterAll() { if fc.Namespace != "" { continue } if fc.Namespace != fc.GoPath { fc.Namespace = fc.GoPath } // todo: deprecate this // fc.GoPath = "" // I want to do this but it might be a bad idea at this point } log.Info("Okay, this is", prep.AppName()) if err := f.Config.ConfigSave(); err != nil { log.Info("forge.Config.ConfigSave() error", err) return err } return nil } func (f *Forge) SaveRepos() error { return f.Repos.ConfigSave(f.Config.ReposPB) } func (f *Forge) SetMode(newmode ForgeMode) error { if f.Config.Mode == newmode { // nothing changed return nil } f.Config.Mode = newmode err := f.Config.SaveVerbose() return err } // functions to import and export the protobuf // data to and from config files // write to ~/.config/forge/ func (cfg *ForgeConfigs) ConfigSave() error { var header string header += "\n" header += "# the forge config file\n" header += "# You can customize things like:\n" header += "#\n" header += "# * which repos you have write access to\n" header += "# * custom branch names for 'master', 'devel' and 'user'\n" header += "# * 'favorites' so you can remember which things you like\n" header += "# * sometimes protobuf TEXT can fail so as a backup this also creates a .json file\n" header += "#\n" header += "\n" return config.ConfigSaveWithHeader(cfg, header) } func (cfg *ForgeConfigs) DumpENV() { log.Info("s/DumpENV/DumpPB/") cfg.DumpPB() } func (cfg *ForgeConfigs) DumpPB() { log.Infof("Config.Filename = %s\n", cfg.Filename) log.Infof("Config.ReposPB = %s\n", cfg.ReposPB) log.Infof("Config.ReposDir = %s\n", cfg.ReposDir) log.Infof("Config.PatchPB = %s\n", cfg.PatchPB) log.Infof("Config.ForgeURL = %s\n", cfg.ForgeURL) if cfg.GoWork { log.Infof("Config.GoWork = %v\n", cfg.GoWork) } // log.Infof("ConfigCfgPB.Hostname=%s\n", cfg.Hostname) } /* if f.Config.Xterm == "" { f.Config.Xterm = "xterm" f.Config.XtermArgv = append(f.Config.XtermArgv, "-bg") f.Config.XtermArgv = append(f.Config.XtermArgv, "black") f.Config.XtermArgv = append(f.Config.XtermArgv, "-fg") f.Config.XtermArgv = append(f.Config.XtermArgv, "white") f.SetConfigSave(true) } */ func LoadStdConfig() *ForgeConfigs { cfg := NewForgeConfigs() err := config.ConfigLoad(cfg, "forge", "forge") if cfg.Filename == "" { panic("wtf filename blank") } if err == nil { return cfg } if errors.Is(err, os.ErrNotExist) { log.Info("no files existed err=", err) } else if errors.Is(err, config.ErrEmpty) { log.Info("files were blank err=", err) } else if errors.Is(err, config.ErrMarshal) { log.Info("files existed and could not be Marshalled() err=", err) } else { log.Info("some other bad problem err=", err) } // this is probably the users first time // TODO: check if ./config/forge exists, then something else went wrong... usr, _ := user.Current() cfg.Username = usr.Username homeDir, _ := os.UserHomeDir() cfgdir := filepath.Join(homeDir, ".config/forge") cfg.HomeDir = cfgdir os.MkdirAll(cfgdir, 0755) cfg.ReposPB = filepath.Join(cfgdir, "repos.pb") cfg.PatchPB = filepath.Join(cfgdir, "patches.pb") cfg.ForgeURL = "http://forge.wit.com/" cfg.ReposDir = filepath.Join(homeDir, "go/src") // todo: check working directory os.MkdirAll(cfg.ReposDir, 0755) cfg.addSampleConfigs() cfg.DumpENV() config.SetChanged("forge", true) // if !fhelp.QuestionUser("This is your first time using forge, use these default values?") { // os.Exit(-1) // } if err := cfg.ConfigSave(); err != nil { log.Info("config save error:", err) os.Exit(-1) } return cfg } // first time user. add go.wit.com as an example func (cfg *ForgeConfigs) addSampleConfigs() { newc := new(ForgeConfig) newc.GoPath = "go.wit.com" newc.Writable = true newc.Directory = true cfg.Append(newc) newc = new(ForgeConfig) newc.GoPath = "priv.wit.com/corp" newc.Writable = true newc.Private = true newc.Directory = true cfg.Append(newc) }