From c23e7ac3dbcfd58fab23a9666792face547d44c2 Mon Sep 17 00:00:00 2001 From: Milas Bowman Date: Mon, 26 Sep 2022 09:38:48 -0400 Subject: [PATCH] restore deleted functions as deprecated --- dotenv/godotenv.go | 89 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 89 insertions(+) diff --git a/dotenv/godotenv.go b/dotenv/godotenv.go index d48a30c16..c1c12eafe 100644 --- a/dotenv/godotenv.go +++ b/dotenv/godotenv.go @@ -15,9 +15,13 @@ package dotenv import ( "bytes" + "fmt" "io" "os" + "os/exec" "regexp" + "sort" + "strconv" "strings" "github.com/compose-spec/compose-go/template" @@ -124,6 +128,16 @@ func Read(filenames ...string) (map[string]string, error) { return ReadWithLookup(nil, filenames...) } +// Unmarshal reads an env file from a string, returning a map of keys and values. +func Unmarshal(str string) (map[string]string, error) { + return UnmarshalBytes([]byte(str)) +} + +// UnmarshalBytes parses env file from byte slice of chars, returning a map of keys and values. +func UnmarshalBytes(src []byte) (map[string]string, error) { + return UnmarshalBytesWithLookup(src, nil) +} + // UnmarshalBytesWithLookup parses env file from byte slice of chars, returning a map of keys and values. func UnmarshalBytesWithLookup(src []byte, lookupFn LookupFn) (map[string]string, error) { out := make(map[string]string) @@ -131,6 +145,65 @@ func UnmarshalBytesWithLookup(src []byte, lookupFn LookupFn) (map[string]string, return out, err } +// Exec loads env vars from the specified filenames (empty map falls back to default) +// then executes the cmd specified. +// +// Simply hooks up os.Stdin/err/out to the command and calls Run() +// +// If you want more fine grained control over your command it's recommended +// that you use `Load()` or `Read()` and the `os/exec` package yourself. +// +// Deprecated: Use the `os/exec` package directly. +func Exec(filenames []string, cmd string, cmdArgs []string) error { + if err := Load(filenames...); err != nil { + return err + } + + command := exec.Command(cmd, cmdArgs...) + command.Stdin = os.Stdin + command.Stdout = os.Stdout + command.Stderr = os.Stderr + return command.Run() +} + +// Write serializes the given environment and writes it to a file +// +// Deprecated: The serialization functions are untested and unmaintained. +func Write(envMap map[string]string, filename string) error { + //goland:noinspection GoDeprecation + content, err := Marshal(envMap) + if err != nil { + return err + } + file, err := os.Create(filename) + if err != nil { + return err + } + defer file.Close() + _, err = file.WriteString(content + "\n") + if err != nil { + return err + } + return file.Sync() +} + +// Marshal outputs the given environment as a dotenv-formatted environment file. +// Each line is in the format: KEY="VALUE" where VALUE is backslash-escaped. +// +// Deprecated: The serialization functions are untested and unmaintained. +func Marshal(envMap map[string]string) (string, error) { + lines := make([]string, 0, len(envMap)) + for k, v := range envMap { + if d, err := strconv.Atoi(v); err == nil { + lines = append(lines, fmt.Sprintf(`%s=%d`, k, d)) + } else { + lines = append(lines, fmt.Sprintf(`%s="%s"`, k, doubleQuoteEscape(v))) // nolint // Cannot use %q here + } + } + sort.Strings(lines) + return strings.Join(lines, "\n"), nil +} + func filenamesOrDefault(filenames []string) []string { if len(filenames) == 0 { return []string{".env"} @@ -182,3 +255,19 @@ func expandVariables(value string, envMap map[string]string, lookupFn LookupFn) } return retVal, nil } + +// Deprecated: only used by unsupported/untested code for Marshal/Write. +func doubleQuoteEscape(line string) string { + const doubleQuoteSpecialChars = "\\\n\r\"!$`" + for _, c := range doubleQuoteSpecialChars { + toReplace := "\\" + string(c) + if c == '\n' { + toReplace = `\n` + } + if c == '\r' { + toReplace = `\r` + } + line = strings.ReplaceAll(line, string(c), toReplace) + } + return line +}