From 8e9ec30b29ae53e28592e8ac7f48b2f46b8f935b Mon Sep 17 00:00:00 2001 From: Jeff Carr Date: Sun, 1 Dec 2024 10:46:32 -0600 Subject: save GoDeps at the time of publication to pkg.go.dev --- config.go | 103 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 103 insertions(+) create mode 100644 config.go (limited to 'config.go') 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 +} -- cgit v1.2.3