From 599ce03ca44219e254ffc34141cc8bfda76f2578 Mon Sep 17 00:00:00 2001 From: Mikhail Klementev Date: Sat, 13 May 2023 08:44:28 +0000 Subject: [PATCH] Implement config paths helpers --- config/directory.go | 47 ++++++++++++++++ config/directory_test.go | 114 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 161 insertions(+) create mode 100644 config/directory.go create mode 100644 config/directory_test.go diff --git a/config/directory.go b/config/directory.go new file mode 100644 index 0000000..4613fff --- /dev/null +++ b/config/directory.go @@ -0,0 +1,47 @@ +package config + +import ( + "os" + "os/user" + "path/filepath" + + "github.com/rs/zerolog/log" +) + +// Directory for config files +var Directory string + +func directory() string { + if Directory != "" { + return Directory + } + + usr, err := user.Current() + if err != nil { + log.Fatal().Err(err).Msg("get current user") + } + + Directory = filepath.Join(usr.HomeDir, ".out-of-tree") + + return Directory +} + +// Dir that exist relative to config directory +func Dir(s ...string) (dir string) { + dir = filepath.Join(append([]string{directory()}, s...)...) + err := os.MkdirAll(dir, os.ModePerm) + if err != nil { + log.Fatal().Err(err).Msg("mkdir") + } + return +} + +// File in existing dir relative to config directory +func File(s ...string) (file string) { + file = filepath.Join(append([]string{directory()}, s...)...) + err := os.MkdirAll(filepath.Dir(file), os.ModePerm) + if err != nil { + log.Fatal().Err(err).Msg("mkdir") + } + return +} diff --git a/config/directory_test.go b/config/directory_test.go new file mode 100644 index 0000000..a1c1fff --- /dev/null +++ b/config/directory_test.go @@ -0,0 +1,114 @@ +package config + +import ( + "io/ioutil" + "os" + "path/filepath" + "testing" +) + +func TestDirectory(t *testing.T) { + testdir := "test" + + Directory = testdir + + if directory() != testdir { + t.Fatalf("%s != %s", directory(), testdir) + } +} + +func TestDir(t *testing.T) { + tmpdir, err := ioutil.TempDir("", "out-of-tree_") + if err != nil { + return + } + defer os.RemoveAll(tmpdir) + + Directory = tmpdir + + for _, testdir := range []string{"a", "a/b", "a/b/c"} { + expected := filepath.Join(tmpdir, testdir) + t.Log(testdir, "->", expected) + resdir := Dir(testdir) + if resdir != expected { + t.Fatalf("%s != %s", resdir, expected) + } + + fi, err := os.Stat(expected) + if err != nil { + t.Fatal(err) + } + + if !fi.IsDir() { + t.Fatal("not a directory") + } + } + + testdir := []string{"a", "b", "c", "d"} + expected := filepath.Join(append([]string{tmpdir}, testdir...)...) + + t.Log(testdir, "->", expected) + resdir := Dir(testdir...) + if resdir != expected { + t.Fatalf("%s != %s", resdir, expected) + } + + fi, err := os.Stat(expected) + if err != nil { + t.Fatal(err) + } + + if !fi.IsDir() { + t.Fatal("not a directory") + } +} + +func TestFile(t *testing.T) { + tmpdir, err := ioutil.TempDir("", "out-of-tree_") + if err != nil { + return + } + defer os.RemoveAll(tmpdir) + + Directory = tmpdir + + for _, testfile := range []string{"a", "a/b", "a/b/c"} { + expected := filepath.Join(tmpdir, testfile) + t.Log(testfile, "->", expected) + resfile := File(testfile) + if resfile != expected { + t.Fatalf("%s != %s", resfile, expected) + } + + _, err := os.Stat(expected) + if err == nil { + t.Fatal("should not exist") + } + + fi, err := os.Stat(filepath.Dir(expected)) + if err != nil { + t.Fatal(err) + } + + if !fi.IsDir() { + t.Fatal("not a directory") + } + } + + testfile := []string{"a", "b", "c"} + expected := filepath.Join(append([]string{tmpdir}, testfile...)...) + t.Log(testfile, "->", expected) + resdir := Dir(testfile...) + if resdir != expected { + t.Fatalf("%s != %s", resdir, expected) + } + + fi, err := os.Stat(expected) + if err != nil { + t.Fatal(err) + } + + if !fi.IsDir() { + t.Fatal("not a directory") + } +}