From 96701f87a114557f1a013229e889b4b726aa7dc1 Mon Sep 17 00:00:00 2001 From: Flu0r1ne Date: Thu, 2 Sep 2021 02:16:20 -0500 Subject: Break searching / error handling for standard directory structure into auxiliary file / struct --- stddirs.go | 177 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 177 insertions(+) create mode 100644 stddirs.go (limited to 'stddirs.go') diff --git a/stddirs.go b/stddirs.go new file mode 100644 index 0000000..adefce8 --- /dev/null +++ b/stddirs.go @@ -0,0 +1,177 @@ +package planr + +import ( + "os" + "log" + "path" + "path/filepath" +) + +// Standard Directories: +// +// Planr relies on a standard directory structure to resolve paths to source code +// These directories can be overridden via environmental variables // +// Directories: +// - `.` root directory +// - `src` contains source code +// - `planr` contains test metadata (also called configuration directory) +// - `planr/rubric` contains test case configuration +// - `planr/tests` contains source code for test cases +// - `planr/build` contains all files written during the build process (ephemeral) + +// Env overrides +const ( + ENV_CONFIG_DIR="PLANR_PLANR_DIR" + ENV_SRC_DIR="ENV_SRC_DIR" + ENV_BUILD_DIR="PLANR_BUILD_DIR" +) + +// Try these search directories +var CONFIG_SEARCH_DIRS = [2] string { + "planr", + ".planr", +} + +// Path are relative to the "planr" project config directory +const ( + DEFAULT_PATH_SRC="../src" + DEFAULT_PATH_BUILD="build" + DEFAULT_PATH_RUBRIC="rubric" + DEFAULT_PATH_TESTS="tests" +) + +type dirConfig struct { + src string + config string + build string +} + +func dieDirAbsent(name, path string) { + if !directoryExists(path) { + log.Fatalf("Could not find %s directory tried %s", name, path) + } +} + +func dirFromEnv(name, env string) *string { + if dir, isSet := os.LookupEnv(env); isSet { + + dieDirAbsent(name, dir) + + return &dir + } + + return nil +} + +func (c *dirConfig) SetSrcDir(srcDir string) { + dieDirAbsent("src", srcDir) + c.src = srcDir +} + +func (c *dirConfig) SetConfigDir(configDir string) { + dieDirAbsent("planr (config)", configDir) + c.config = configDir +} + +func (c *dirConfig) SetBuildDir(buildDir string) { + dieDirAbsent("build", buildDir) + c.build = buildDir +} + +func (c *dirConfig) SetConfigDirFromTree(cdir string) { + var configDir string + + found := traverseUp(cdir, func (path string) bool { + + for _, dir := range CONFIG_SEARCH_DIRS { + configDir = filepath.Join(path, dir) + + if directoryExists(configDir) { + return true + } + } + + return false + }); + + if !found { + log.Fatal("Could not find planr directory"); + } + + c.config = configDir +} + +func (c dirConfig) ConfigDir() string { + if c.config != "" { + return c.config + } + + dir := dirFromEnv("config", ENV_CONFIG_DIR) + if dir == nil { + log.Fatal("Could not find directory") + } + + c.config = *dir + return c.config +} + +func (c dirConfig) SrcDir() string { + if c.src != "" { + return c.src + } + + if dir := dirFromEnv("src", ENV_SRC_DIR); dir != nil { + c.src = *dir + return c.src + } + + // set path relative to config + dir := c.ConfigDir() + return path.Join(dir, DEFAULT_PATH_SRC) +} + +func (c dirConfig) BuildDir() string { + if c.src != "" { + return c.src + } + + if dir := dirFromEnv("build", ENV_BUILD_DIR); dir != nil { + c.build = *dir + return c.build + } + + dir := c.ConfigDir() + return path.Join(dir, DEFAULT_PATH_BUILD) +} + +func (c dirConfig) CleanBuildDir() { + build := c.BuildDir() + + if err := os.RemoveAll(build); err != nil { + log.Fatalf("Cannot build directory %v\n", err) + } + + if err := os.Remove(build); err != nil { + log.Fatalf("Could not remove build directory %v\n", err) + } +} + +func (c dirConfig) MkBuildDir() { + build := c.BuildDir() + + if err := os.Mkdir(build, 0755); err != nil { + log.Fatalf("Could not create build directory %v\n", err) + } +} + +func (c dirConfig) RubricDir() string { + rubric := path.Join(c.ConfigDir(), "rubric") + dieDirAbsent("rubric", rubric) + return rubric +} + +func (c dirConfig) TestsDir() string { + tests := path.Join(c.ConfigDir(), "tests") + dieDirAbsent("tests", tests) + return tests +} -- cgit v1.2.3 From d078f6dc10eb265a5d88cd96adf86173d6d3ba2e Mon Sep 17 00:00:00 2001 From: Flu0r1ne Date: Thu, 2 Sep 2021 03:14:47 -0500 Subject: Make adapters and internals complient with new directory structure --- stddirs.go | 53 ++++++++++++++++++++++++++++++----------------------- 1 file changed, 30 insertions(+), 23 deletions(-) (limited to 'stddirs.go') diff --git a/stddirs.go b/stddirs.go index adefce8..14776d8 100644 --- a/stddirs.go +++ b/stddirs.go @@ -40,10 +40,13 @@ const ( DEFAULT_PATH_TESTS="tests" ) -type dirConfig struct { - src string - config string - build string +type DirConfig struct { + src string + config string + build string + + // Config falls back to the config found in the parent directory if the env variable hasn't been overridden + pdFallback string } func dieDirAbsent(name, path string) { @@ -63,22 +66,22 @@ func dirFromEnv(name, env string) *string { return nil } -func (c *dirConfig) SetSrcDir(srcDir string) { +func (c *DirConfig) SetSrcDir(srcDir string) { dieDirAbsent("src", srcDir) c.src = srcDir } -func (c *dirConfig) SetConfigDir(configDir string) { +func (c *DirConfig) SetConfigDir(configDir string) { dieDirAbsent("planr (config)", configDir) c.config = configDir } -func (c *dirConfig) SetBuildDir(buildDir string) { +func (c *DirConfig) SetBuildDir(buildDir string) { dieDirAbsent("build", buildDir) c.build = buildDir } -func (c *dirConfig) SetConfigDirFromTree(cdir string) { +func (c *DirConfig) SetConfigDirFromTree(cdir string) { var configDir string found := traverseUp(cdir, func (path string) bool { @@ -94,28 +97,32 @@ func (c *dirConfig) SetConfigDirFromTree(cdir string) { return false }); - if !found { - log.Fatal("Could not find planr directory"); - } - c.config = configDir + if found { + c.pdFallback = configDir + } } -func (c dirConfig) ConfigDir() string { +func (c DirConfig) ConfigDir() string { if c.config != "" { return c.config } - dir := dirFromEnv("config", ENV_CONFIG_DIR) - if dir == nil { - log.Fatal("Could not find directory") + + if dir := dirFromEnv("config", ENV_CONFIG_DIR); dir != nil { + c.config = *dir + return c.config + } + + if c.pdFallback == "" { + log.Fatal("Could not find planr directory"); } - c.config = *dir + c.config = c.pdFallback; return c.config } -func (c dirConfig) SrcDir() string { +func (c DirConfig) SrcDir() string { if c.src != "" { return c.src } @@ -130,7 +137,7 @@ func (c dirConfig) SrcDir() string { return path.Join(dir, DEFAULT_PATH_SRC) } -func (c dirConfig) BuildDir() string { +func (c DirConfig) BuildDir() string { if c.src != "" { return c.src } @@ -144,7 +151,7 @@ func (c dirConfig) BuildDir() string { return path.Join(dir, DEFAULT_PATH_BUILD) } -func (c dirConfig) CleanBuildDir() { +func (c DirConfig) CleanBuildDir() { build := c.BuildDir() if err := os.RemoveAll(build); err != nil { @@ -156,7 +163,7 @@ func (c dirConfig) CleanBuildDir() { } } -func (c dirConfig) MkBuildDir() { +func (c DirConfig) MkBuildDir() { build := c.BuildDir() if err := os.Mkdir(build, 0755); err != nil { @@ -164,13 +171,13 @@ func (c dirConfig) MkBuildDir() { } } -func (c dirConfig) RubricDir() string { +func (c DirConfig) RubricDir() string { rubric := path.Join(c.ConfigDir(), "rubric") dieDirAbsent("rubric", rubric) return rubric } -func (c dirConfig) TestsDir() string { +func (c DirConfig) TestsDir() string { tests := path.Join(c.ConfigDir(), "tests") dieDirAbsent("tests", tests) return tests -- cgit v1.2.3 From 287d029975b7718109f81b480079f375f7d8700a Mon Sep 17 00:00:00 2001 From: Flu0r1ne Date: Fri, 3 Sep 2021 00:02:31 -0500 Subject: Add clean option and fix issue with dir propegation --- stddirs.go | 41 ++++++++++++++++++++--------------------- 1 file changed, 20 insertions(+), 21 deletions(-) (limited to 'stddirs.go') diff --git a/stddirs.go b/stddirs.go index 14776d8..2385529 100644 --- a/stddirs.go +++ b/stddirs.go @@ -66,22 +66,22 @@ func dirFromEnv(name, env string) *string { return nil } -func (c *DirConfig) SetSrcDir(srcDir string) { +func (c *DirConfig) SetSrc(srcDir string) { dieDirAbsent("src", srcDir) c.src = srcDir } -func (c *DirConfig) SetConfigDir(configDir string) { +func (c *DirConfig) SetConfig(configDir string) { dieDirAbsent("planr (config)", configDir) c.config = configDir } -func (c *DirConfig) SetBuildDir(buildDir string) { +func (c *DirConfig) SetBuild(buildDir string) { dieDirAbsent("build", buildDir) c.build = buildDir } -func (c *DirConfig) SetConfigDirFromTree(cdir string) { +func (c *DirConfig) SetConfigFromTree(cdir string) { var configDir string found := traverseUp(cdir, func (path string) bool { @@ -103,12 +103,11 @@ func (c *DirConfig) SetConfigDirFromTree(cdir string) { } } -func (c DirConfig) ConfigDir() string { +func (c DirConfig) Config() string { if c.config != "" { return c.config } - if dir := dirFromEnv("config", ENV_CONFIG_DIR); dir != nil { c.config = *dir return c.config @@ -122,7 +121,7 @@ func (c DirConfig) ConfigDir() string { return c.config } -func (c DirConfig) SrcDir() string { +func (c DirConfig) Src() string { if c.src != "" { return c.src } @@ -133,11 +132,11 @@ func (c DirConfig) SrcDir() string { } // set path relative to config - dir := c.ConfigDir() + dir := c.Config() return path.Join(dir, DEFAULT_PATH_SRC) } -func (c DirConfig) BuildDir() string { +func (c DirConfig) Build() string { if c.src != "" { return c.src } @@ -147,38 +146,38 @@ func (c DirConfig) BuildDir() string { return c.build } - dir := c.ConfigDir() + dir := c.Config() return path.Join(dir, DEFAULT_PATH_BUILD) } -func (c DirConfig) CleanBuildDir() { - build := c.BuildDir() +func (c DirConfig) CleanBuild() { + build := c.Build() if err := os.RemoveAll(build); err != nil { log.Fatalf("Cannot build directory %v\n", err) } - if err := os.Remove(build); err != nil { - log.Fatalf("Could not remove build directory %v\n", err) - } + // if err := os.Remove(build); err != nil { + // log.Fatalf("Could not remove build directory %v\n", err) + // } } -func (c DirConfig) MkBuildDir() { - build := c.BuildDir() +func (c DirConfig) MkBuild() { + build := c.Build() if err := os.Mkdir(build, 0755); err != nil { log.Fatalf("Could not create build directory %v\n", err) } } -func (c DirConfig) RubricDir() string { - rubric := path.Join(c.ConfigDir(), "rubric") +func (c DirConfig) Rubric() string { + rubric := path.Join(c.Config(), "rubric") dieDirAbsent("rubric", rubric) return rubric } -func (c DirConfig) TestsDir() string { - tests := path.Join(c.ConfigDir(), "tests") +func (c DirConfig) Tests() string { + tests := path.Join(c.Config(), "tests") dieDirAbsent("tests", tests) return tests } -- cgit v1.2.3 From 0e6b7378a564bb51b3a4289059e80fe9e3c6545b Mon Sep 17 00:00:00 2001 From: Flu0r1ne Date: Fri, 3 Sep 2021 00:51:47 -0500 Subject: BUG: Fix decoding when no defaults is present --- stddirs.go | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) (limited to 'stddirs.go') diff --git a/stddirs.go b/stddirs.go index 2385529..e6b510d 100644 --- a/stddirs.go +++ b/stddirs.go @@ -21,13 +21,13 @@ import ( // Env overrides const ( - ENV_CONFIG_DIR="PLANR_PLANR_DIR" - ENV_SRC_DIR="ENV_SRC_DIR" + ENV_CONFIG_DIR="PLANR_CONFIG_DIR" + ENV_SRC_DIR="PLANR_SRC_DIR" ENV_BUILD_DIR="PLANR_BUILD_DIR" ) // Try these search directories -var CONFIG_SEARCH_DIRS = [2] string { +var CONFIG_SEARCH_DIRS = [] string { "planr", ".planr", } @@ -88,7 +88,7 @@ func (c *DirConfig) SetConfigFromTree(cdir string) { for _, dir := range CONFIG_SEARCH_DIRS { configDir = filepath.Join(path, dir) - + if directoryExists(configDir) { return true } @@ -157,9 +157,6 @@ func (c DirConfig) CleanBuild() { log.Fatalf("Cannot build directory %v\n", err) } - // if err := os.Remove(build); err != nil { - // log.Fatalf("Could not remove build directory %v\n", err) - // } } func (c DirConfig) MkBuild() { -- cgit v1.2.3 From aff7b69cab2ac1d09b47f28c6fa653febd8595ea Mon Sep 17 00:00:00 2001 From: Flu0r1ne Date: Fri, 3 Sep 2021 18:12:38 -0500 Subject: Ensure stddirs returns an absolute path for correct operation in adapter build directories --- stddirs.go | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) (limited to 'stddirs.go') diff --git a/stddirs.go b/stddirs.go index e6b510d..1eae439 100644 --- a/stddirs.go +++ b/stddirs.go @@ -109,7 +109,7 @@ func (c DirConfig) Config() string { } if dir := dirFromEnv("config", ENV_CONFIG_DIR); dir != nil { - c.config = *dir + c.config = abs(*dir) return c.config } @@ -117,7 +117,7 @@ func (c DirConfig) Config() string { log.Fatal("Could not find planr directory"); } - c.config = c.pdFallback; + c.config = abs(c.pdFallback); return c.config } @@ -136,6 +136,16 @@ func (c DirConfig) Src() string { return path.Join(dir, DEFAULT_PATH_SRC) } +func abs(path string) string { + apath, err := filepath.Abs(path) + + if err != nil { + log.Fatalf("Could not find path %s", path) + } + + return apath +} + func (c DirConfig) Build() string { if c.src != "" { return c.src @@ -168,13 +178,13 @@ func (c DirConfig) MkBuild() { } func (c DirConfig) Rubric() string { - rubric := path.Join(c.Config(), "rubric") + rubric := path.Join(c.Config(), DEFAULT_PATH_RUBRIC) dieDirAbsent("rubric", rubric) return rubric } func (c DirConfig) Tests() string { - tests := path.Join(c.Config(), "tests") + tests := path.Join(c.Config(), DEFAULT_PATH_TESTS) dieDirAbsent("tests", tests) return tests } -- cgit v1.2.3 From fd66fb134967067ed7e1c3182325f646b73c730b Mon Sep 17 00:00:00 2001 From: Flu0r1ne Date: Sun, 5 Sep 2021 20:17:00 -0500 Subject: Fix bug where standard dirs are not set due to abs positioning --- stddirs.go | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) (limited to 'stddirs.go') diff --git a/stddirs.go b/stddirs.go index 1eae439..581af87 100644 --- a/stddirs.go +++ b/stddirs.go @@ -68,17 +68,17 @@ func dirFromEnv(name, env string) *string { func (c *DirConfig) SetSrc(srcDir string) { dieDirAbsent("src", srcDir) - c.src = srcDir + c.src = abs(srcDir) } func (c *DirConfig) SetConfig(configDir string) { dieDirAbsent("planr (config)", configDir) - c.config = configDir + c.config = abs(configDir) } func (c *DirConfig) SetBuild(buildDir string) { dieDirAbsent("build", buildDir) - c.build = buildDir + c.build = abs(buildDir) } func (c *DirConfig) SetConfigFromTree(cdir string) { @@ -147,8 +147,8 @@ func abs(path string) string { } func (c DirConfig) Build() string { - if c.src != "" { - return c.src + if c.build != "" { + return c.build } if dir := dirFromEnv("build", ENV_BUILD_DIR); dir != nil { -- cgit v1.2.3