// Copyright 2025 WIT.COM Inc Licensed GPL 3.0 package forgepb import ( "errors" "os" "go.wit.com/lib/ENV" "go.wit.com/lib/config" "go.wit.com/lib/protobuf/argvpb" "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 !(argvpb.GetAPPNAME() == "forge" || argvpb.GetAPPNAME() == "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", argvpb.GetAPPNAME()) if err := f.Config.ConfigSave(); err != nil { log.Info("forge.Config.ConfigSave() error", err) return err } return nil } func (f *Forge) SaveRepos() error { if ENV.Verbose() { return f.Repos.SaveVerbose() } return f.Repos.Save() } func (f *Forge) SetMode(newmode ForgeMode) error { if f.mode == newmode { // nothing changed return nil } f.mode = newmode err := ENV.Set("mode", newmode.String()) if err != nil { panic("config.Set() doesn't work") } err = ENV.Save() if err != nil { panic("config.Save() doesn't work") } 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 loadStdConfig() (*ForgeConfigs, error) { cfg := NewForgeConfigs() err := cfg.loadConfig() // todo: do something here with this error? // right now, handled in forge // todo: move the code from forge here 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 if err == nil { // do nothing. probably shoulda started with this } else { log.Info("some other bad problem err=", err) } return cfg, nil } func makeDefaultConfig() (*ForgeConfigs, error) { cfg := NewForgeConfigs() // Get fullpath to ~/.config/forge/forge.text cfg.loadConfig() cfg.addSampleConfigs() ENV.PrintTable() var err error if err = cfg.SaveVerbose(); err != nil { log.Info("config save error:", err) } return cfg, err } // 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) }