From 9b95e758f4f1fb2021721a939da4af738835e3a8 Mon Sep 17 00:00:00 2001 From: Valentin Maerten Date: Thu, 18 Dec 2025 21:50:00 +0100 Subject: [PATCH] fix: cli variables should take priority over aaskfile defaults (#2589) When using `task FOO=bar` with a Taskfile containing `FOO: '{{.FOO | default "foo"}}'`, the CLI value was being overwritten by the Taskfile default. Split the variable merging into two steps: 1. Merge CLI variables (FOO=bar) first so they override Taskfile vars 2. ReverseMerge special variables (CLI_ARGS, CLI_FORCE, etc.) so they're available for templating in Taskfile vars Fixes regression introduced in #2403. Co-authored-by: Timothy Rule --- cmd/task/task.go | 21 ++++++++++++------- executor_test.go | 17 +++++++++++++++ testdata/vars/Taskfile.yml | 7 +++++++ .../TestVars-cli-var-priority-default.golden | 1 + .../TestVars-cli-var-priority-override.golden | 1 + 5 files changed, 39 insertions(+), 8 deletions(-) create mode 100644 testdata/vars/testdata/TestVars-cli-var-priority-default.golden create mode 100644 testdata/vars/testdata/TestVars-cli-var-priority-override.golden diff --git a/cmd/task/task.go b/cmd/task/task.go index 766eac56..b81e23dd 100644 --- a/cmd/task/task.go +++ b/cmd/task/task.go @@ -172,18 +172,23 @@ func run() error { calls = append(calls, &task.Call{Task: "default"}) } + // Merge CLI variables first (e.g. FOO=bar) so they take priority over Taskfile defaults + e.Taskfile.Vars.Merge(globals, nil) + + // Then ReverseMerge special variables so they're available for templating cliArgsPostDashQuoted, err := args.ToQuotedString(cliArgsPostDash) if err != nil { return err } - globals.Set("CLI_ARGS", ast.Var{Value: cliArgsPostDashQuoted}) - globals.Set("CLI_ARGS_LIST", ast.Var{Value: cliArgsPostDash}) - globals.Set("CLI_FORCE", ast.Var{Value: flags.Force || flags.ForceAll}) - globals.Set("CLI_SILENT", ast.Var{Value: flags.Silent}) - globals.Set("CLI_VERBOSE", ast.Var{Value: flags.Verbose}) - globals.Set("CLI_OFFLINE", ast.Var{Value: flags.Offline}) - globals.Set("CLI_ASSUME_YES", ast.Var{Value: flags.AssumeYes}) - e.Taskfile.Vars.ReverseMerge(globals, nil) + specialVars := ast.NewVars() + specialVars.Set("CLI_ARGS", ast.Var{Value: cliArgsPostDashQuoted}) + specialVars.Set("CLI_ARGS_LIST", ast.Var{Value: cliArgsPostDash}) + specialVars.Set("CLI_FORCE", ast.Var{Value: flags.Force || flags.ForceAll}) + specialVars.Set("CLI_SILENT", ast.Var{Value: flags.Silent}) + specialVars.Set("CLI_VERBOSE", ast.Var{Value: flags.Verbose}) + specialVars.Set("CLI_OFFLINE", ast.Var{Value: flags.Offline}) + specialVars.Set("CLI_ASSUME_YES", ast.Var{Value: flags.AssumeYes}) + e.Taskfile.Vars.ReverseMerge(specialVars, nil) if !flags.Watch { e.InterceptInterruptSignals() } diff --git a/executor_test.go b/executor_test.go index 48a18807..8649ebdc 100644 --- a/executor_test.go +++ b/executor_test.go @@ -263,6 +263,23 @@ func TestVars(t *testing.T) { task.WithSilent(true), ), ) + NewExecutorTest(t, + WithName("cli-var-priority-default"), + WithExecutorOptions( + task.WithDir("testdata/vars"), + task.WithSilent(true), + ), + WithTask("cli-var-priority"), + ) + NewExecutorTest(t, + WithName("cli-var-priority-override"), + WithExecutorOptions( + task.WithDir("testdata/vars"), + task.WithSilent(true), + ), + WithTask("cli-var-priority"), + WithVar("CLI_VAR", "from_cli"), + ) } func TestRequires(t *testing.T) { diff --git a/testdata/vars/Taskfile.yml b/testdata/vars/Taskfile.yml index 621a7afb..80db9034 100644 --- a/testdata/vars/Taskfile.yml +++ b/testdata/vars/Taskfile.yml @@ -49,3 +49,10 @@ tasks: - echo "{{.MESSAGE}}" from-dot-env: echo '{{.DOT_ENV_VAR}}' + + # Test that CLI variables take priority over Taskfile defaults + cli-var-priority: + vars: + CLI_VAR: '{{.CLI_VAR | default "default_value"}}' + cmds: + - echo '{{.CLI_VAR}}' diff --git a/testdata/vars/testdata/TestVars-cli-var-priority-default.golden b/testdata/vars/testdata/TestVars-cli-var-priority-default.golden new file mode 100644 index 00000000..c7f94014 --- /dev/null +++ b/testdata/vars/testdata/TestVars-cli-var-priority-default.golden @@ -0,0 +1 @@ +default_value diff --git a/testdata/vars/testdata/TestVars-cli-var-priority-override.golden b/testdata/vars/testdata/TestVars-cli-var-priority-override.golden new file mode 100644 index 00000000..874da498 --- /dev/null +++ b/testdata/vars/testdata/TestVars-cli-var-priority-override.golden @@ -0,0 +1 @@ +from_cli