| 12 | ) |
| 13 | |
| 14 | func Dotenv(vars *ast.Vars, tf *ast.Taskfile, dir string) (*ast.Vars, error) { |
| 15 | env := ast.NewVars() |
| 16 | cache := &templater.Cache{Vars: vars} |
| 17 | |
| 18 | for _, dotEnvPath := range tf.Dotenv { |
| 19 | dotEnvPath = templater.Replace(dotEnvPath, cache) |
| 20 | if dotEnvPath == "" { |
| 21 | continue |
| 22 | } |
| 23 | dotEnvPath = filepathext.SmartJoin(dir, dotEnvPath) |
| 24 | |
| 25 | if _, err := os.Stat(dotEnvPath); os.IsNotExist(err) { |
| 26 | continue |
| 27 | } |
| 28 | |
| 29 | envs, err := godotenv.Read(dotEnvPath) |
| 30 | if err != nil { |
| 31 | return nil, fmt.Errorf("error reading env file %s: %w", dotEnvPath, err) |
| 32 | } |
| 33 | for key, value := range envs { |
| 34 | if _, ok := env.Get(key); !ok { |
| 35 | env.Set(key, ast.Var{Value: value}) |
| 36 | } |
| 37 | } |
| 38 | } |
| 39 | |
| 40 | return env, nil |
| 41 | } |