// Copyright 2025 WIT.COM Inc Licensed GPL 3.0 package forgepb import ( "errors" "fmt" "go.wit.com/lib/config" "go.wit.com/lib/env" "go.wit.com/lib/protobuf/argvpb" "go.wit.com/log" ) func (f *Forge) Save() error { var allerr error var err error if f.Config == nil { log.Info("forge.Config == nil. Init failed. die here(?)") return log.Errorf("forge.Config == nil") } // MOVE THIS TO /lib/config ? if !(argvpb.GetAPPNAME() == "forge" || argvpb.GetAPPNAME() == "guireleaser") { // fmt.Printf("TODO: need proper file locking here. this app (%s) is not forge\n", argvpb.GetAPPNAME()) fmt.Printf("TODO: need proper file locking here. can not save. this app (%s) is not forge\n", argvpb.GetAPPNAME()) return log.Errorf("Only forge can save the forge config file") } // THIS IS NOT RIGHT ANYMORE ? if config.HasChanged("repos") { log.Info("forgepb.Save() thinks repos changed") if env.Verbose() { log.Info("forgepb.Save() trying SaveVerbose()") err = f.Repos.SaveVerbose() } else { log.Info("forgepb.Save() trying Save()") err = f.Repos.SaveVerbose() // err = f.Repos.Save() } if err == nil { config.SetChanged("repos", false) } allerr = errors.Join(allerr, err) } if config.HasChanged("forge") { log.Info("forgepb.Save() things forge.text changed") // 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.Printf("%s Save() about to save Config at %s\n", argvpb.GetAPPNAME(), f.Config.Filename) err = f.Config.configSave() if err != nil { log.Info("forge.Config.configSave() error", err) } if err == nil { config.SetChanged("forge", false) } allerr = errors.Join(allerr, err) return nil } if allerr != nil { log.Info("forge.Save() errors:", allerr) } return allerr } func (f *Forge) saveRepos() error { if env.Verbose() { return f.Repos.SaveVerbose() } return f.Repos.Save() } // 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.SaveWithHeader(cfg, header) } func (f *Forge) SetConfigSave(b bool) { config.SetChanged("forge", b) } func (pb *ForgeConfigs) saveVerbose() error { err := config.Save(pb) if err == nil { log.Printf("Saved %s with len(%d) ForgeConfigs.\n", pb.Filename, pb.Len()) } else { log.Printf("Save err %s with len(%d) ForgeConfigs. err(%v)\n", pb.Filename, pb.Len(), err) } return err } // 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.Printf("%s configSave() about to save Config at %s\n", argvpb.GetAPPNAME(), f.Config.Filename) if err := f.Config.configSave(); err != nil { log.Info("forge.Config.ConfigSave() error", err) return err } return nil } // name to simplify tracking of code flow func (f *Forge) flush() error { if err := f.Save(); err != nil { return err } return nil } func (pb *Cache) Save() error { return config.Save(pb) }