diff options
| -rw-r--r-- | env/env.go | 60 | ||||
| -rw-r--r-- | flags/flags.go | 1 | ||||
| -rw-r--r-- | go.mod | 1 | ||||
| -rw-r--r-- | go.sum | 2 | ||||
| -rw-r--r-- | run/run.go | 6 |
5 files changed, 70 insertions, 0 deletions
diff --git a/env/env.go b/env/env.go new file mode 100644 index 0000000..1bf0bd1 --- /dev/null +++ b/env/env.go @@ -0,0 +1,60 @@ +package env + +import ( + "github.com/joho/godotenv" + "io/fs" + "os" + "path/filepath" + "pik/flags" + "pik/indexers/pikdex" + "pik/model" + "pik/spool" + "slices" +) + +func IsEnv(file string) bool { + options := []string{ + ".env", + } + for _, e := range *flags.Env { + options = append(options, + ".env-"+e, + ".env."+e, + e+".env") + } + return slices.Contains(options, file) +} + +func EnvFiles(f fs.FS, p string, deep bool) []string { + var result []string + dir, err := fs.ReadDir(f, p) + if err != nil { + return nil + } + for _, e := range dir { + if e.IsDir() && slices.Contains(pikdex.Roots, e.Name()) && deep { + result = append(result, EnvFiles(f, e.Name(), false)...) + } + if !e.IsDir() && IsEnv(e.Name()) { + result = append(result, filepath.Join(p, e.Name())) + } + } + return result +} + +func Get(src *model.Source) []string { + f := os.DirFS(src.Path) + var result []string + files := EnvFiles(f, ".", true) + for _, f := range files { + res, err := godotenv.Read(filepath.Join(src.Path, f)) + if err != nil { + spool.Warn("%v", err) + continue + } + for k, v := range res { + result = append(result, k+"="+v) + } + } + return result +} diff --git a/flags/flags.go b/flags/flags.go index 9f62c38..19cc84b 100644 --- a/flags/flags.go +++ b/flags/flags.go @@ -10,4 +10,5 @@ var ( Dry = pflag.BoolP("dry", "d", false, "print cmdlines instead of running them") Root = pflag.BoolP("root", "r", false, "run targets (including triggers) with sudo") Yes = pflag.BoolP("yes", "y", false, "auto-confirm y/n confirmations") + Env = pflag.StringArray("env", nil, "environment files or pre- or suffix") ) @@ -13,6 +13,7 @@ require ( github.com/charmbracelet/x/term v0.2.1 // indirect github.com/davecgh/go-spew v1.1.1 // indirect github.com/erikgeiser/coninput v0.0.0-20211004153227-1c3628e74d0f // indirect + github.com/joho/godotenv v1.5.1 // indirect github.com/lucasb-eyer/go-colorful v1.2.0 // indirect github.com/mattn/go-isatty v0.0.20 // indirect github.com/mattn/go-localereader v0.0.1 // indirect @@ -18,6 +18,8 @@ github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/erikgeiser/coninput v0.0.0-20211004153227-1c3628e74d0f h1:Y/CXytFA4m6baUTXGLOoWe4PQhGxaX0KpnayAqC48p4= github.com/erikgeiser/coninput v0.0.0-20211004153227-1c3628e74d0f/go.mod h1:vw97MGsxSvLiUE2X8qFplwetxpGLQrlU1Q9AUEIzCaM= +github.com/joho/godotenv v1.5.1 h1:7eLL/+HRGLY0ldzfGMeQkb7vMd0as4CfYvUVzLqw0N0= +github.com/joho/godotenv v1.5.1/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4= github.com/lucasb-eyer/go-colorful v1.2.0 h1:1nnpGOrhyZZuNyfu1QjKiUICQ74+3FNCN69Aj6K7nkY= github.com/lucasb-eyer/go-colorful v1.2.0/go.mod h1:R4dSotOR9KMtayYi1e77YzuveK+i7ruzyGqttikkLy0= github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= @@ -3,6 +3,7 @@ package run import ( "fmt" "os" + "pik/env" "pik/flags" "pik/menu" "pik/model" @@ -91,6 +92,11 @@ func Exec(source *model.Source, target model.Target, args ...string) error { cmd.Stderr = os.Stderr cmd.Args = append(cmd.Args, args...) + e := env.Get(source) + if len(e) > 0 { + cmd.Env = append(os.Environ(), e...) + } + if *flags.Dry { _, _ = fmt.Fprintln(os.Stderr, menu.InlineCmd(cmd)) return nil |
