1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70
|
package cmd
import (
"fmt"
"github.com/direnv/direnv/v2/pkg/dotenv"
"os"
"path/filepath"
)
// CmdDotEnv is `direnv dotenv [SHELL [PATH_TO_DOTENV]]`
// Transforms a .env file to evaluatable `export KEY=PAIR` statements.
//
// See: https://github.com/bkeepers/dotenv and https://github.com/ddollar/foreman
var CmdDotEnv = &Cmd{
Name: "dotenv",
Desc: "Transforms a .env file to evaluatable `export KEY=PAIR` statements",
Args: []string{"[SHELL]", "[PATH_TO_DOTENV]"},
Private: true,
Action: actionSimple(cmdDotEnvAction),
}
func cmdDotEnvAction(_ Env, args []string) (err error) {
var shell Shell
var newenv Env
var target string
if len(args) > 1 {
shell = DetectShell(args[1])
} else {
shell = Bash
}
if len(args) > 2 {
target = args[2]
}
if target == "" {
target = ".env"
}
var data []byte
if data, err = os.ReadFile(target); err != nil {
return
}
// Set PWD env var to the directory the .env file resides in. This results
// in the least amount of surprise, as a dotenv file is most often defined
// in the same directory it's loaded from, so referring to PWD should match
// the directory of the .env file.
path, err := filepath.Abs(target)
if err != nil {
return err
}
if err := os.Setenv("PWD", filepath.Dir(path)); err != nil {
return err
}
newenv, err = dotenv.Parse(string(data))
if err != nil {
return err
}
str, err := newenv.ToShell(shell)
if err != nil {
return err
}
fmt.Println(str)
return
}
|