config files are cool!

This commit is contained in:
Jeff Carr 2024-11-20 10:31:25 -06:00
parent 35a2db858f
commit 39a8d9e13e
5 changed files with 148 additions and 11 deletions

View File

@ -9,7 +9,6 @@ import (
"path/filepath" "path/filepath"
"go.wit.com/log" "go.wit.com/log"
"google.golang.org/protobuf/proto"
) )
// writes out the cluster information it seperate files // writes out the cluster information it seperate files
@ -29,18 +28,50 @@ func (m *Repos) ConfigSave() error {
} }
func (m *Repos) ConfigLoad() error { func (m *Repos) ConfigLoad() error {
var data []byte
var err error
if m == nil { if m == nil {
return errors.New("It's not safe to run ConfigLoad() on a nil ?") return errors.New("It's not safe to run ConfigLoad() on a nil ?")
} }
if data, err := loadFile("forge.pb"); err == nil { if data, err = loadFile("forge.pb"); err != nil {
if err = proto.Unmarshal(data, m); 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 = m.Unmarshal(data); err != nil {
log.Warn("broken forge.pb config file") log.Warn("broken forge.pb config file")
return err return err
} }
} else { return nil
}
// forge.db doesn't exist. try forge.text
// this lets the user hand edit the config
if data, err = loadFile("forge.text"); err != nil {
// something went wrong loading the file
return err return err
} }
if data != nil {
// this means the forge.text file exists and was read
if len(data) == 0 {
// todo: error out if the file is empty?
}
if err = m.UnmarshalTEXT(data); err != nil {
log.Warn("broken forge.text config file")
return err
}
return nil
}
// first time user. make a template config file
return nil return nil
} }
@ -49,6 +80,12 @@ func loadFile(filename string) ([]byte, error) {
p := filepath.Join(homeDir, ".config/forge") p := filepath.Join(homeDir, ".config/forge")
fullname := filepath.Join(p, filename) fullname := filepath.Join(p, filename)
data, err := os.ReadFile(fullname) 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 { if err != nil {
// log.Info("open config file :", err) // log.Info("open config file :", err)
return nil, err return nil, err

View File

@ -2,21 +2,24 @@ package main
import ( import (
"fmt" "fmt"
"os"
"go.wit.com/lib/protobuf/forgepb" "go.wit.com/lib/protobuf/forgepb"
"go.wit.com/log" "go.wit.com/log"
) )
func main() { func main() {
repos := testRepos() var repos *forgepb.Repos
repos = new(forgepb.Repos)
if err := repos.ConfigLoad(); err != nil {
log.Warn("forgepb.ConfigLoad() failed", err)
os.Exit(-1)
}
testAddRepos(repos)
repos.ConfigSave() repos.ConfigSave()
} }
func testRepos() *forgepb.Repos { func testAddRepos(all *forgepb.Repos) *forgepb.Repos {
var all *forgepb.Repos
all = new(forgepb.Repos)
// r = forgepb.LoadJSON("go.wit.com/lib/protobuf/forgepb")
new1 := new(forgepb.Repo) new1 := new(forgepb.Repo)
new1.Name = "bash" new1.Name = "bash"
new1.Version = "5.2.21" new1.Version = "5.2.21"
@ -26,6 +29,34 @@ func testRepos() *forgepb.Repos {
log.Info("added", new1.Name, "failed") log.Info("added", new1.Name, "failed")
} }
new1 = new(forgepb.Repo)
new1.Name = "zookeeper"
new1.Debname = "zookeeper-go"
if all.Append(new1) {
log.Info("added", new1.Name, "ok")
} else {
log.Info("added", new1.Name, "failed")
}
new1 = new(forgepb.Repo)
new1.Name = "wit-package"
new1.Private = true
if all.Append(new1) {
log.Info("added", new1.Name, "ok")
} else {
log.Info("added", new1.Name, "failed")
}
new1 = new(forgepb.Repo)
new1.Name = "networkQuality"
new1.Debname = "networkquality"
new1.Readonly = true
if all.Append(new1) {
log.Info("added", new1.Name, "ok")
} else {
log.Info("added", new1.Name, "failed")
}
new2 := new(forgepb.Repo) new2 := new(forgepb.Repo)
new2.Name = "go-clone" new2.Name = "go-clone"
new2.Version = "0.6.8" // good version of the macos new2.Version = "0.6.8" // good version of the macos

View File

@ -24,6 +24,11 @@ func (p *Repos) FormatTEXT() string {
return prototext.Format(p) return prototext.Format(p)
} }
// unmarshalTEXT
func (p *Repos) UnmarshalTEXT(data []byte) error {
return prototext.Unmarshal(data, p)
}
// marshal json // marshal json
func (p *Repos) MarshalJSON() ([]byte, error) { func (p *Repos) MarshalJSON() ([]byte, error) {
return protojson.Marshal(p) return protojson.Marshal(p)

View File

@ -19,7 +19,8 @@ message Repo {
bool readonly = 6; // if you have write access to the repo bool readonly = 6; // if you have write access to the repo
bool private = 7; // if the repo can be published bool private = 7; // if the repo can be published
string debname = 8; // this is the actual .deb name of the package string debname = 8; // this is the actual .deb name of the package
google.protobuf.Timestamp verstamp = 9; // the git commit timestamp of the version string gopath = 9; // Examples: 'go.wit.com/apps/go-clone' or "~/mythings" or "/home/src/foo"
google.protobuf.Timestamp verstamp = 10; // the git commit timestamp of the version
} }
// TODO: autogen 'Repos' // TODO: autogen 'Repos'

63
sampleConfig.go Normal file
View File

@ -0,0 +1,63 @@
package forgepb
import (
"fmt"
"go.wit.com/log"
)
func (all *Repos) SampleConfig() {
new1 := new(Repo)
new1.Name = "bash"
new1.Version = "5.2.21"
if all.Append(new1) {
log.Info("added", new1.Name, "ok")
} else {
log.Info("added", new1.Name, "failed")
}
new1 = new(Repo)
new1.Name = "zookeeper"
new1.Debname = "zookeeper-go"
if all.Append(new1) {
log.Info("added", new1.Name, "ok")
} else {
log.Info("added", new1.Name, "failed")
}
new1 = new(Repo)
new1.Name = "wit-package"
new1.Private = true
if all.Append(new1) {
log.Info("added", new1.Name, "ok")
} else {
log.Info("added", new1.Name, "failed")
}
new1 = new(Repo)
new1.Name = "networkQuality"
new1.Debname = "networkquality"
new1.Readonly = true
if all.Append(new1) {
log.Info("added", new1.Name, "ok")
} else {
log.Info("added", new1.Name, "failed")
}
new2 := new(Repo)
new2.Name = "go-clone"
new2.Version = "0.6.8" // good version of the macos
if all.Append(new2) {
log.Info("added", new2.Name, "ok")
} else {
log.Info("added", new2.Name, "failed")
}
if all.Append(new2) {
log.Info("added", new2.Name, "ok (this is bad)")
} else {
log.Info("added", new2.Name, "failed (but ok)")
}
fmt.Println("first time user. adding an example config file with", len(all.Repos), "repos")
}