From d771cdfc11bc789b501b1e786ee4ec14841855ae Mon Sep 17 00:00:00 2001 From: Dennis Jekubczyk Date: Sun, 12 Mar 2023 12:26:07 +0100 Subject: [PATCH 1/4] add test to prove that predefined environment variables take precedence --- task_test.go | 27 +++++++++++++++++++++++++++ testdata/env_override/.gitignore | 1 + testdata/env_override/Taskfile.yaml | 10 ++++++++++ 3 files changed, 38 insertions(+) create mode 100644 testdata/env_override/.gitignore create mode 100644 testdata/env_override/Taskfile.yaml diff --git a/task_test.go b/task_test.go index beebdc5b4d..df493733fe 100644 --- a/task_test.go +++ b/task_test.go @@ -6,6 +6,7 @@ import ( "fmt" "io" "os" + "os/exec" "path/filepath" "runtime" "strings" @@ -13,6 +14,7 @@ import ( "github.com/Masterminds/semver/v3" "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" "github.com/go-task/task/v3" "github.com/go-task/task/v3/internal/filepathext" @@ -1832,3 +1834,28 @@ func TestBashShellOptsCommandLevel(t *testing.T) { assert.NoError(t, err) assert.Equal(t, "globstar\ton\n", buff.String()) } + +func TestOverwriteEnvironment(t *testing.T) { + binary := buildTask(t) + + cmd := exec.Command(binary) + cmd.Dir = "testdata/env_override" + cmd.Env = []string{"PREDEFINED=initial"} + require.NoError(t, cmd.Run()) + + output, err := os.ReadFile("testdata/env_override/output.txt") + require.NoError(t, err) + require.Equal(t, "PREDEFINED='overwritten'", string(output)) +} + +func buildTask(t *testing.T) string { + temp := t.TempDir() + + binary := filepath.Join(temp, "task") + command := exec.Command("go", "build", "-o", binary, "cmd/task/task.go") + command.Stdout = os.Stdout + command.Stderr = os.Stderr + require.NoError(t, command.Run()) + + return binary +} diff --git a/testdata/env_override/.gitignore b/testdata/env_override/.gitignore new file mode 100644 index 0000000000..2211df63dd --- /dev/null +++ b/testdata/env_override/.gitignore @@ -0,0 +1 @@ +*.txt diff --git a/testdata/env_override/Taskfile.yaml b/testdata/env_override/Taskfile.yaml new file mode 100644 index 0000000000..3c481c67f3 --- /dev/null +++ b/testdata/env_override/Taskfile.yaml @@ -0,0 +1,10 @@ +version: '3' + +silent: true + +tasks: + default: + env: + PREDEFINED: 'overwritten' + cmds: + - echo "PREDEFINED='$PREDEFINED'" > output.txt From ea4e9fd4396469581869c6698508050771e21101 Mon Sep 17 00:00:00 2001 From: Dennis Jekubczyk Date: Sun, 12 Mar 2023 12:32:21 +0100 Subject: [PATCH 2/4] override environment if locally defined in task file --- internal/env/env.go | 4 ---- testdata/env_override/Taskfile.yaml | 2 +- 2 files changed, 1 insertion(+), 5 deletions(-) diff --git a/internal/env/env.go b/internal/env/env.go index b18279c599..153b0f0517 100644 --- a/internal/env/env.go +++ b/internal/env/env.go @@ -20,10 +20,6 @@ func Get(t *taskfile.Task) []string { continue } - if _, alreadySet := os.LookupEnv(k); alreadySet { - continue - } - environ = append(environ, fmt.Sprintf("%s=%s", k, str)) } diff --git a/testdata/env_override/Taskfile.yaml b/testdata/env_override/Taskfile.yaml index 3c481c67f3..b50275772a 100644 --- a/testdata/env_override/Taskfile.yaml +++ b/testdata/env_override/Taskfile.yaml @@ -7,4 +7,4 @@ tasks: env: PREDEFINED: 'overwritten' cmds: - - echo "PREDEFINED='$PREDEFINED'" > output.txt + - echo -n "PREDEFINED='$PREDEFINED'" > output.txt From b117af0bf5accfe7acb5014c1cd255081e1dad49 Mon Sep 17 00:00:00 2001 From: Dennis Jekubczyk Date: Sun, 12 Mar 2023 12:44:14 +0100 Subject: [PATCH 3/4] only output build output on compilation error --- task_test.go | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/task_test.go b/task_test.go index df493733fe..f2391a7ec9 100644 --- a/task_test.go +++ b/task_test.go @@ -1853,9 +1853,10 @@ func buildTask(t *testing.T) string { binary := filepath.Join(temp, "task") command := exec.Command("go", "build", "-o", binary, "cmd/task/task.go") - command.Stdout = os.Stdout - command.Stderr = os.Stderr - require.NoError(t, command.Run()) + var output bytes.Buffer + command.Stdout = &output + command.Stderr = &output + require.NoError(t, command.Run(), &output) return binary } From 75505e29e1ed591a4aa135a71773c31cb4d62c59 Mon Sep 17 00:00:00 2001 From: Dennis Jekubczyk Date: Sun, 12 Mar 2023 12:49:58 +0100 Subject: [PATCH 4/4] document that custom environment variables will take precedence --- docs/docs/usage.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/docs/docs/usage.md b/docs/docs/usage.md index cf8cb1f6f9..a54f282c13 100644 --- a/docs/docs/usage.md +++ b/docs/docs/usage.md @@ -119,6 +119,10 @@ tasks: ### Task +:::info +Custom environment variables will **overwrite** any predefined environment variables from your shell. +:::info + You can use `env` to set custom environment variables for a specific task: ```yaml