From 98467dec72f0a894b7a2fef319d73d3320d94d0f Mon Sep 17 00:00:00 2001 From: Jeff Carr Date: Thu, 11 Sep 2025 02:20:06 -0500 Subject: [PATCH] using new config package --- config.go | 135 +--------------------- doDirty.go | 3 +- config.common.go => forgeConfig.common.go | 0 forgeConfig.config.go | 25 ++++ patchset.Send.go | 31 +++++ 5 files changed, 60 insertions(+), 134 deletions(-) rename config.common.go => forgeConfig.common.go (100%) create mode 100644 forgeConfig.config.go diff --git a/config.go b/config.go index 963202f..dc94480 100644 --- a/config.go +++ b/config.go @@ -2,31 +2,16 @@ package forgepb -// functions to import and export the protobuf -// data to and from config files - import ( - "errors" - "fmt" - "os" - "path/filepath" "time" "go.wit.com/log" timestamppb "google.golang.org/protobuf/types/known/timestamppb" ) +// returns err1 || err2 func (f *Forge) ConfigSave() error { var err error - /* - // backup the current config files - if e := f.backupConfig(); e != nil { - log.Info("forge.BackupConfig() error", e) - err = e - // continue here? notsure. could be bad either way - // out of disk space? - } - */ if f.Config != nil { if e := f.Config.ConfigSave(); e != nil { log.Info("forge.Config.ConfigSave() error", e) @@ -34,6 +19,7 @@ func (f *Forge) ConfigSave() error { } } if f.Repos != nil { + // ??? if f.HasFullScan() { f.Repos.HasFullScan = true t := time.Now() @@ -46,120 +32,3 @@ func (f *Forge) ConfigSave() error { } return err } - -// write to ~/.config/forge/ -func (f *ForgeConfigs) ConfigSave() error { - data, err := f.Marshal() - if err != nil { - log.Info("proto.Marshal() failed len", len(data), err) - return err - } - // log.Info("forgepb.ConfigSave() proto.Marshal() worked len", len(data)) - - s := f.FormatTEXT() - configWrite("forge.text", []byte(s)) - - s = f.FormatJSON() - configWrite("forge.json", []byte(s)) - - return nil -} - -// load the ~/.config/forge/ files -func (c *ForgeConfigs) ConfigLoad(fullpath string) error { - // var data []byte - // var err error - if c == nil { - // can't safely do c = new(ForgeConfig) if c is in a struct from the caller. notsure why - // TODO: recheck this. it might work now? It's probably still a bad idea(?) - return errors.New("It's not safe to run ConfigLoad() on a nil") - } - - if err := c.loadText(); err == nil { - return nil - } - - // forge.text doesn't exist. try forge.json - // this lets the user hand edit the JSON config - // probably just deprecate this - if data, err := loadFile("forge.json"); err != nil { - if data != nil { - // this means the forge.json file exists and was read - if len(data) != 0 { - if err = c.UnmarshalJSON(data); err == nil { - log.Info("forge.ConfigLoad()", len(c.ForgeConfigs), "entries in ~/.config/forge") - // forge.text file was broken. save on load right away - log.Info("attempting forge.ConfigSave()") - c.ConfigSave() - return nil - } - } - } - } - - cpath := filepath.Join(os.Getenv("FORGE_CONFIG"), ".") - if _, err := os.Stat(cpath); err == nil { - log.Info("Something has gone wrong. Your", os.Getenv("FORGE_CONFIG"), "directory exists") - log.Info("However, the config files could not be loaded") - } - - return nil -} - -func (c *ForgeConfigs) loadText() error { - // this lets the user hand edit the config - data, err := loadFile("forge.text") - if err != nil { - return err - } - if data == nil { - return fmt.Errorf("forge.text data was nil") - } - if len(data) == 0 { - return fmt.Errorf("forge.text was empty") - } - - // attempt to marshal forge.text - if err := c.UnmarshalTEXT(data); err != nil { - return err - } - log.Log(INFO, "forge.loadText()", len(c.ForgeConfigs), "entries in ~/.config/forge") - return nil -} - -func loadFile(filename string) ([]byte, error) { - fullname := filepath.Join(os.Getenv("FORGE_CONFIG"), filename) - data, err := os.ReadFile(fullname) - if errors.Is(err, os.ErrNotExist) { - // if file does not exist, just return nil. this - // will cause ConfigLoad() to try the next config file like "forge.text" - // because the user might want to edit the .config by hand - return nil, nil - } - if err != nil { - // log.Info("open config file :", err) - return nil, err - } - return data, nil -} - -func configWrite(filename string, data []byte) error { - fullname := filepath.Join(os.Getenv("FORGE_CONFIG"), filename) - - cfgfile, err := os.OpenFile(fullname, os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0644) - defer cfgfile.Close() - if err != nil { - log.Warn("open config file :", err) - return err - } - if filename == "forge.text" { - log.Infof("%s : your preferences file has been updated. (%d) bytes\n", fullname, len(data)) - // add header - cfgfile.Write([]byte("\n")) - cfgfile.Write([]byte("# this file is intended to be used to customize settings on what\n")) - cfgfile.Write([]byte("# git repos you have write access to. That is, where you can run 'git push'\n")) - cfgfile.Write([]byte("\n")) - } - cfgfile.Write(data) - return nil -} diff --git a/doDirty.go b/doDirty.go index 70e018a..4a45ed3 100644 --- a/doDirty.go +++ b/doDirty.go @@ -22,7 +22,7 @@ func (f *Forge) CheckDirtyQuiet() { for _, s := range stats { if s.Err == nil { } else { - // log.Info(i, s.Err) + log.Info("forge SetConfigSave(true)") f.SetConfigSave(true) changed = true } @@ -73,6 +73,7 @@ func doCheckDirty(repo *gitpb.Repo) error { // nothing changed } else { log.Info("Repo changed to clean", repo.FullPath) + return log.Errorf("%s repo changed to clean", repo.FullPath) // f.SetConfigSave(true) } } else { diff --git a/config.common.go b/forgeConfig.common.go similarity index 100% rename from config.common.go rename to forgeConfig.common.go diff --git a/forgeConfig.config.go b/forgeConfig.config.go new file mode 100644 index 0000000..6102d03 --- /dev/null +++ b/forgeConfig.config.go @@ -0,0 +1,25 @@ +// Copyright 2025 WIT.COM Inc Licensed GPL 3.0 + +package forgepb + +import ( + "go.wit.com/lib/config" +) + +// 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 += "# this file is intended to be used to customize settings on what\n" + header += "# git repos you have write access to. That is, where you can run 'git push'\n" + header += "\n" + return config.ConfigSaveWithHeader(cfg, header) +} + +// load the ~/.config/forge/ files +func (c *ForgeConfigs) ConfigLoad(fullpath string) error { + return nil +} diff --git a/patchset.Send.go b/patchset.Send.go index eaac09e..1601663 100644 --- a/patchset.Send.go +++ b/patchset.Send.go @@ -5,6 +5,8 @@ package forgepb import ( "errors" + "os" + "path/filepath" "strings" "time" @@ -137,3 +139,32 @@ func (f *Forge) SubmitPatchesNew(pset *Patches, urlpath string) (*Patches, error log.Info("Total patches sent ok:", newpb.Len()) return newpb, nil } + +func loadFile(filename string) ([]byte, error) { + fullname := filepath.Join(os.Getenv("FORGE_CONFIG"), filename) + data, err := os.ReadFile(fullname) + if errors.Is(err, os.ErrNotExist) { + // if file does not exist, just return nil. this + // will cause ConfigLoad() to try the next config file like "forge.text" + // because the user might want to edit the .config by hand + return nil, nil + } + if err != nil { + // log.Info("open config file :", err) + return nil, err + } + return data, nil +} + +func configWrite(filename string, data []byte) error { + fullname := filepath.Join(os.Getenv("FORGE_CONFIG"), filename) + + cfgfile, err := os.OpenFile(fullname, os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0644) + defer cfgfile.Close() + if err != nil { + log.Warn("open config file :", err) + return err + } + cfgfile.Write(data) + return nil +}