diff --git a/cli/options.go b/cli/options.go index ecae4d2e..c1d54ee6 100644 --- a/cli/options.go +++ b/cli/options.go @@ -277,12 +277,27 @@ func GetEnvFromFile(currentEnv map[string]string, workingDir string, filenames [ } dotEnvFile = abs - b, err := os.ReadFile(dotEnvFile) + s, err := os.Stat(dotEnvFile) if os.IsNotExist(err) { - if len(filenames) > 0 { - return nil, errors.Errorf("Couldn't read env file: %s", dotEnvFile) + if len(filenames) == 0 { + return envMap, nil } - return envMap, nil + return envMap, errors.Errorf("Couldn't find env file: %s", dotEnvFile) + } + if err != nil { + return envMap, err + } + + if s.IsDir() { + if len(filenames) == 0 { + return envMap, nil + } + return envMap, errors.Errorf("%s is a directory", dotEnvFile) + } + + b, err := os.ReadFile(dotEnvFile) + if os.IsNotExist(err) { + return nil, errors.Errorf("Couldn't read env file: %s", dotEnvFile) } if err != nil { return envMap, err diff --git a/cli/options_test.go b/cli/options_test.go index 1b322953..8f9a081c 100644 --- a/cli/options_test.go +++ b/cli/options_test.go @@ -20,6 +20,7 @@ import ( "fmt" "os" "path/filepath" + "strings" "testing" "gotest.tools/v3/assert" @@ -308,3 +309,16 @@ func TestEnvMap(t *testing.T) { m = utils.GetAsEqualsMap(l) assert.Equal(t, m["foo"], "bar") } + +func TestGetEnvFromFile(t *testing.T) { + wd := t.TempDir() + f := filepath.Join(wd, ".env") + err := os.Mkdir(f, 0o700) + assert.NilError(t, err) + + _, err = GetEnvFromFile(nil, wd, nil) + assert.NilError(t, err) + + _, err = GetEnvFromFile(nil, wd, []string{f}) + assert.Check(t, strings.HasSuffix(err.Error(), ".env is a directory")) +}