diff options
| author | Jeff Carr <[email protected]> | 2024-12-01 10:46:32 -0600 |
|---|---|---|
| committer | Jeff Carr <[email protected]> | 2024-12-01 10:46:32 -0600 |
| commit | 8e9ec30b29ae53e28592e8ac7f48b2f46b8f935b (patch) | |
| tree | 587c3e588629d3e76a7af9555b460a2d224e61d6 /config.go | |
| parent | 455ea31d70b3dfa95ca4f269e42cf6a8dcf5f0d9 (diff) | |
save GoDeps at the time of publication to pkg.go.dev
Diffstat (limited to 'config.go')
| -rw-r--r-- | config.go | 103 |
1 files changed, 103 insertions, 0 deletions
diff --git a/config.go b/config.go new file mode 100644 index 0000000..3f4d976 --- /dev/null +++ b/config.go @@ -0,0 +1,103 @@ +package gitpb + +// functions to import and export the protobuf +// data to and from config files + +import ( + "errors" + "os" + "path/filepath" + + "go.wit.com/log" +) + +// write to ~/.config/forge/ unless ENV{FORGE_HOME} is set +func (all *Repos) ConfigSave() error { + if os.Getenv("FORGE_HOME") == "" { + homeDir, _ := os.UserHomeDir() + fullpath := filepath.Join(homeDir, ".config/forge") + os.Setenv("FORGE_HOME", fullpath) + } + if all == nil { + log.Warn("gitpb all == nil") + panic("why is this nil?") + } + + data, err := all.Marshal() + if err != nil { + log.Info("gitpb proto.Marshal() failed len", len(data), err) + return err + } + log.Info("gitpb.ConfigSave() repos.Marshal() worked len", len(data)) + configWrite("repos.pb", data) + return nil +} + +// load the ~/.config/forge/ files +func (all *Repos) ConfigLoad() error { + if os.Getenv("FORGE_HOME") == "" { + homeDir, _ := os.UserHomeDir() + fullpath := filepath.Join(homeDir, ".config/forge") + os.Setenv("FORGE_HOME", fullpath) + } + var data []byte + var err error + + if data, err = loadFile("repos.pb"); err != nil { + // something went wrong loading the file + return err + } + if data != nil { + // this means the forge.pb file exists and was read + if len(data) == 0 { + // todo: error out if the file is empty? + // try forge.text & forge.json? + } + if err = all.Unmarshal(data); err != nil { + log.Warn("broken forge.pb config file") + return err + } + log.Info("found", len(all.Repos), "repos in ~/.config/forge/repos.pb") + return nil + } + return nil +} + +func loadFile(filename string) ([]byte, error) { + fullname := filepath.Join(os.Getenv("FORGE_HOME"), 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_HOME"), filename) + + cfgfile, err := os.OpenFile(fullname, os.O_RDWR|os.O_CREATE, 0666) + defer cfgfile.Close() + if err != nil { + log.Warn("open config file :", err) + return err + } + if filename == "forge.text" { + // add header + cfgfile.Write([]byte("# this file is automatically re-generated from forge.pb, however,\n")) + cfgfile.Write([]byte("# if you want to edit it by hand, you can:\n")) + cfgfile.Write([]byte("# stop forge; remove forge.pb; edit forge.text; start forge\n")) + cfgfile.Write([]byte("# this will cause the default behavior to fallback to parsing this file for the config\n")) + 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(data) + return nil +} |
