summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--env/env.go60
-rw-r--r--flags/flags.go1
-rw-r--r--go.mod1
-rw-r--r--go.sum2
-rw-r--r--run/run.go6
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")
)
diff --git a/go.mod b/go.mod
index eff6a64..85accfd 100644
--- a/go.mod
+++ b/go.mod
@@ -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
diff --git a/go.sum b/go.sum
index 58c065b..cc62c63 100644
--- a/go.sum
+++ b/go.sum
@@ -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=
diff --git a/run/run.go b/run/run.go
index 26d2913..d175823 100644
--- a/run/run.go
+++ b/run/run.go
@@ -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