commit 36260e2e098ab3eff5c0a9d3e8a1d731ff8e5e13 Author: Tai Groot Date: Fri Jan 27 23:50:56 2023 -0800 initial commit diff --git a/cmd/mrpaths.go b/cmd/mrpaths.go new file mode 100644 index 0000000..6b68ff4 --- /dev/null +++ b/cmd/mrpaths.go @@ -0,0 +1,17 @@ +package main + +import ( + "fmt" + + "github.com/taigrr/mg/parse" +) + +func main() { + mrconf, err := parse.LoadMRConfig() + if err != nil { + panic(err) + } + for _, path := range mrconf.GetRepoPaths() { + fmt.Println(path) + } +} diff --git a/go.mod b/go.mod new file mode 100644 index 0000000..f4c4a0f --- /dev/null +++ b/go.mod @@ -0,0 +1,3 @@ +module github.com/taigrr/mg + +go 1.19 diff --git a/parse/myrepos.go b/parse/myrepos.go new file mode 100644 index 0000000..703af76 --- /dev/null +++ b/parse/myrepos.go @@ -0,0 +1,92 @@ +package parse + +import ( + "errors" + "fmt" + "io/ioutil" + "os" + "path/filepath" + "strings" +) + +type MRConfig struct { + Unregister string + GC string + Repos []Repo +} +type Repo struct { + Path string + Checkout string +} + +func (m MRConfig) GetRepoPaths() []string { + paths := []string{} + for _, r := range m.Repos { + paths = append(paths, r.Path) + } + return paths +} + +func LoadMRConfig() (MRConfig, error) { + home, err := os.UserHomeDir() + if err != nil { + return MRConfig{}, err + } + mrconfPath := filepath.Join(home, ".mrconfig") + s, err := os.Stat(mrconfPath) + if err != nil { + return MRConfig{}, err + } + if s.IsDir() { + return MRConfig{}, errors.New("expected mrconfig file but got a directory") + } + f, err := ioutil.ReadFile(mrconfPath) + if err != nil { + return MRConfig{}, err + } + text := string(f) + lines := strings.Split(text, "\n") + config := MRConfig{} + + length := -1 + mode := "default" + for n, line := range lines { + if line == "" { + continue + } + if line == "[DEFAULT]" { + mode = "default" + continue + } else if strings.HasPrefix(line, "[") && strings.HasSuffix(line, "]") { + length++ + path := strings.Trim(line, "[]") + if !strings.HasPrefix(path, "/") { + path = filepath.Join(home, path) + } + mode = "repo" + config.Repos = append(config.Repos, Repo{Path: path}) + continue + } + split := strings.SplitN(line, " = ", 2) + if len(split) != 2 { + return MRConfig{}, fmt.Errorf("unexpected argument on line %d: %s", n, line) + } + switch mode { + case "repo": + if split[0] != "checkout" { + return MRConfig{}, fmt.Errorf("unexpected argument on line %d: %s", n, line) + } + config.Repos[length].Checkout = split[1] + case "default": + switch split[0] { + case "unregister": + config.Unregister = split[1] + case "git_gc": + config.GC = split[1] + default: + return MRConfig{}, fmt.Errorf("unexpected argument on line %d: %s", n, line) + } + } + } + return config, nil +}