From 0401b949c6f900891f1eefaba41295d2c2a96b07 Mon Sep 17 00:00:00 2001 From: Jeff Carr Date: Thu, 28 Nov 2024 00:02:27 -0600 Subject: [PATCH] added Init() and a Forge struct --- config.go | 8 ++++---- forgeConfig/main.go | 33 +++++++++++++++------------------ human.go | 21 ++++++++++----------- init.go | 41 +++++++++++++++++++++++++++++++++++++++++ settings.go | 16 ++++++++-------- structs.go | 6 ++++++ 6 files changed, 84 insertions(+), 41 deletions(-) create mode 100644 init.go create mode 100644 structs.go diff --git a/config.go b/config.go index 923e35c..4da983d 100644 --- a/config.go +++ b/config.go @@ -12,7 +12,7 @@ import ( ) // write to ~/.config/forge/ unless ENV{FORGE_HOME} is set -func (m *ForgeConfigs) ConfigSave() error { +func (f *Forge) ConfigSave() error { if os.Getenv("FORGE_HOME") == "" { homeDir, _ := os.UserHomeDir() fullpath := filepath.Join(homeDir, ".config/forge") @@ -22,7 +22,7 @@ func (m *ForgeConfigs) ConfigSave() error { if err := backupConfig(); err != nil { return err } - data, err := m.Marshal() + data, err := f.Config.Marshal() if err != nil { log.Info("proto.Marshal() failed len", len(data), err) return err @@ -30,10 +30,10 @@ func (m *ForgeConfigs) ConfigSave() error { log.Info("proto.Marshal() worked len", len(data)) configWrite("forge.pb", data) - s := m.FormatTEXT() + s := f.Config.FormatTEXT() configWrite("forge.text", []byte(s)) - s = m.FormatJSON() + s = f.Config.FormatJSON() configWrite("forge.json", []byte(s)) return nil } diff --git a/forgeConfig/main.go b/forgeConfig/main.go index 76d91e0..bd65f26 100644 --- a/forgeConfig/main.go +++ b/forgeConfig/main.go @@ -11,37 +11,34 @@ import ( var VERSION string func main() { - var repos forgepb.ForgeConfigs - if err := repos.ConfigLoad(); err != nil { - log.Warn("forgepb.ConfigLoad() failed", err) - os.Exit(-1) - } + var f forgepb.Forge + f.Init() if argv.List { - repos.PrintTable() - loop := repos.SortByPath() // get the list of repos - for loop.Scan() { - r := loop.Next() - log.Info("repo:", r.GoPath) - } + f.PrintTable() + loop := f.SortByPath() // get the list of forge configs + for loop.Scan() { + r := loop.Next() + log.Info("repo:", r.GoPath) + } os.Exit(0) } // try to delete, then save config and exit if argv.Delete { - if oldr := repos.DeleteByPath(argv.GoPath); oldr == nil { + if oldr := f.Config.DeleteByPath(argv.GoPath); oldr == nil { log.Info("deleted", argv.GoPath, "did not exist. did nothing") os.Exit(0) } log.Info("deleted", argv.GoPath, "ok") - repos.ConfigSave() + f.ConfigSave() os.Exit(0) } // try to update, then save config and exit if argv.Update { /* - if repos.UpdateGoPath(argv.Name, argv.GoPath) { + if f.UpdateGoPath(argv.Name, argv.GoPath) { // save updated config file repos.ConfigSave() } @@ -62,18 +59,18 @@ func main() { Interesting: argv.Interesting, } - if repos.Append(&new1) { + if f.Config.Append(&new1) { log.Info("added", new1.GoPath, "ok") } else { log.Info("added", new1.GoPath, "failed") os.Exit(-1) } - repos.ConfigSave() + f.ConfigSave() os.Exit(0) } - // testMemoryCorruption(repos) - repos.ConfigSave() + // testMemoryCorruption(f) + f.ConfigSave() } /* diff --git a/human.go b/human.go index 294a789..e870524 100644 --- a/human.go +++ b/human.go @@ -2,7 +2,6 @@ package forgepb import ( "fmt" - "os" "go.wit.com/log" ) @@ -18,16 +17,16 @@ func standardHeader() string { return fmt.Sprintf("%-4s %-40s %s", "", "Path", "flags") } -func (all *ForgeConfigs) standardHeader(r *ForgeConfig) string { +func (f *Forge) standardHeader(r *ForgeConfig) string { var flags string var readonly string - if all.IsPrivate(r.GoPath) { + if f.IsPrivate(r.GoPath) { flags += "(private) " } - if all.IsFavorite(r.GoPath) { + if f.IsFavorite(r.GoPath) { flags += "(favorite) " } - if all.IsReadOnly(r.GoPath) { + if f.IsReadOnly(r.GoPath) { readonly = "" } else { readonly = "r/w" @@ -36,15 +35,15 @@ func (all *ForgeConfigs) standardHeader(r *ForgeConfig) string { } // print a human readable table to STDOUT -func (all *ForgeConfigs) PrintTable() { - if all == nil { - log.Info("WTF") - os.Exit(0) +func (f *Forge) ConfigPrintTable() { + if f == nil { + log.Info("WTF forge == nil") + panic("WTF forge == nil") } log.Info(standardHeader()) - loop := all.SortByPath() + loop := f.Config.SortByPath() for loop.Scan() { r := loop.Next() - log.Info(all.standardHeader(r)) + log.Info(f.standardHeader(r)) } } diff --git a/init.go b/init.go new file mode 100644 index 0000000..8c6af82 --- /dev/null +++ b/init.go @@ -0,0 +1,41 @@ +package forgepb + +import ( + "os" + "path/filepath" + + "go.wit.com/log" +) + +// set FORGE_GOSRC env if not already set +func init() { + gosrc := os.Getenv("FORGE_GOSRC") + if gosrc != "" { + // already set. ignore init() + } + homeDir, err := os.UserHomeDir() + if err != nil { + log.Warn("forge init() could not find UserHomeDir()", err) + panic("forge could not find UserHomeDir") + } + fullpath := filepath.Join(homeDir, "go/src") + os.Setenv("FORGE_GOSRC", fullpath) +} + +func (f *Forge) Init() { + if f == nil { + f = new(Forge) + } + if f.Config == nil { + f.Config = new(ForgeConfigs) + } + // load the ~/.config/forge/ config + if err := f.Config.ConfigLoad(); err != nil { + log.Warn("forgepb.ConfigLoad() failed", err) + os.Exit(-1) + } +} + +func (f *Forge) SortByPath() *ForgeConfigIterator { + return f.Config.SortByPath() +} diff --git a/settings.go b/settings.go index 61f0d98..c024d81 100644 --- a/settings.go +++ b/settings.go @@ -28,10 +28,10 @@ func (all *ForgeConfigs) UpdateGoPath(name string, gopath string) bool { // returns true if gopath is readonly() // will attempt to match IsWritable("foo") against anything ending in "foo" -func (all *ForgeConfigs) IsReadOnly(gopath string) bool { +func (f *Forge) IsReadOnly(gopath string) bool { var match *ForgeConfig - loop := all.SortByPath() // get the list of repos + loop := f.Config.SortByPath() // get the list of repos for loop.Scan() { r := loop.Next() if r.GoPath == gopath { @@ -88,11 +88,11 @@ func (all *ForgeConfigs) IsReadOnly(gopath string) bool { // this let's you check a git tag version against a package .deb version // allows gopath's to not need to match the .deb name // this is important in lots of cases! It is normal and happens often enough. -func (all *ForgeConfigs) DebName(gopath string) string { +func (f *Forge) DebName(gopath string) string { // get "zookeeper" from "go.wit.com/apps/zookeeper" normalBase := filepath.Base(gopath) - loop := all.SortByPath() + loop := f.Config.SortByPath() for loop.Scan() { r := loop.Next() if r.GoPath == gopath { @@ -115,13 +115,13 @@ func (all *ForgeConfigs) DebName(gopath string) string { // // IsPrivate("go.foo.com/jcarr/foo") returns true if private // IsPrivate("foo") also returns true if "go.bar.com/jcarr/foo" is private -func (all *ForgeConfigs) IsPrivate(thing string) bool { +func (f *Forge) IsPrivate(thing string) bool { var match *ForgeConfig // sort by path means the simple 'match' logic // here works in the sense the last directory match // is the one that is used - loop := all.SortByPath() // get the list of repos + loop := f.Config.SortByPath() // get the list of repos for loop.Scan() { r := loop.Next() if r.GoPath == thing { @@ -159,10 +159,10 @@ func (all *ForgeConfigs) IsPrivate(thing string) bool { // file that lets you set things as favorites // so you can just go-clone a bunch of common things // on a new box or after you reset/delete your ~/go/src dir -func (all *ForgeConfigs) IsFavorite(thing string) bool { +func (f *Forge) IsFavorite(thing string) bool { var match *ForgeConfig - loop := all.SortByPath() // get the list of repos + loop := f.Config.SortByPath() // get the list of repos for loop.Scan() { r := loop.Next() if r.GoPath == thing { diff --git a/structs.go b/structs.go new file mode 100644 index 0000000..dce9cb4 --- /dev/null +++ b/structs.go @@ -0,0 +1,6 @@ +package forgepb + +// maybe an interface someday? +type Forge struct { + Config *ForgeConfigs +}