From a0b020a78eb0b33965c59460fc093c6959216e44 Mon Sep 17 00:00:00 2001 From: Flu0r1ne Date: Tue, 3 Aug 2021 02:02:40 -0500 Subject: Initial commit with basic build structure --- fs.go | 170 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 170 insertions(+) create mode 100644 fs.go (limited to 'fs.go') diff --git a/fs.go b/fs.go new file mode 100644 index 0000000..905d6d1 --- /dev/null +++ b/fs.go @@ -0,0 +1,170 @@ +package planr + +import ( + "log" + "os" + "io" + "path" + "path/filepath" + // "fmt" +) + +/* CONFIG DIRECTORY */ + +// Consumes path +// Returns true if traversal should halt +type traversalFunc func(path string) bool; + +// Traverse up until the root is reached +// Calls traverseFunc each iteration +// Returns true if prematurely stopped +func traverseUp(reference string, shouldStop traversalFunc) bool { + cursor := reference + + for !shouldStop(cursor) { + if filepath.ToSlash(cursor) == "/" { + return false + } + cursor = filepath.Join(cursor, "..") + } + + return true +} + +func directoryExists(path string) bool { + info, err := os.Stat(path) + + if err != nil { + if !os.IsNotExist(err) { + log.Fatal(err) + } + + return false; + } + + return info.IsDir() +} + +// Find the configuration directory +// Uses: +// 1. PlANR_DIRECTORY env if set +// 2. planr +// 3. .planr +func configDir() string { + + // Return environmental override if set + if dir, isSet := os.LookupEnv("PLANR_DIRECTORY"); isSet { + + if !directoryExists(dir) { + log.Fatalf("Cannot find planr directory %s", dir); + } + + return dir; + } + + cwd, err := os.Getwd() + + if err != nil { + log.Fatal(err) + } + + var rubricDir string + + rubric_search_dirs := [2]string{ + "planr", + ".planr", + } + + found := traverseUp(cwd, func (path string) bool { + + for _, dir := range rubric_search_dirs { + rubricDir = filepath.Join(path, dir) + + if directoryExists(rubricDir) { + return true + } + } + + return false + }); + + if !found { + log.Fatal("Could not find planr directory"); + } + + return rubricDir +} + +// Find rubric directory at PLANR_DIR/rubric +func RubricDir() string { + rubricDir := path.Join(configDir(), "rubric"); + + if !directoryExists(rubricDir) { + log.Fatal("Could not find the rubric directory inside of planr") + } + + return rubricDir +} + +// Collects the units from the configuration tree +// TODO: Cleanup +func collectUnits( + name string, + defaults *Defaults, + cfgs []AdapterConfig, + units *[]TestCase, +) { + fp, err := os.Open(name) + if err != nil { + log.Fatal(err) + } + + // Process defaults for this directory if a defaults.toml is found + defaultsPath := path.Join(name, "defaults.toml") + if info, err := os.Stat(defaultsPath); err == nil && !info.IsDir() { + d := DecodeDefaults(defaultsPath, cfgs) + + // inherit the properties not defined in this defaults + if defaults != nil { + d.Inherit(defaults) + } + + defaults = &d + } + + // Read the entries in this directory + for { + dirs, err := fp.ReadDir(100) + if err == io.EOF { + break + } else if err != nil { + log.Fatal(err) + } + + + for _, ent := range dirs { + child := path.Join(name, ent.Name()) + nm := ent.Name() + + if ent.IsDir() { + collectUnits(child, defaults, cfgs, units) + } else { + if nm == "defaults.toml" { + continue + } + + // Decode a unit + config := DecodeConfig(child, cfgs) + config.Inherit(*defaults) + + tc := TestCase { + Path: child, + Cname: nm, + Config: config, + } + + *units = append(*units, tc) + } + } + } +} -- cgit v1.2.3