From 1ef5cf71d0814c3be9ad0b67cdd1e6726880e751 Mon Sep 17 00:00:00 2001 From: Pete Davison Date: Fri, 26 Jan 2024 14:34:18 +0000 Subject: [PATCH] feat: pass ast.Call by reference --- args/args.go | 6 +- args/args_test.go | 16 +-- cmd/task/task.go | 4 +- internal/compiler/compiler.go | 8 +- internal/summary/summary.go | 4 +- internal/summary/summary_test.go | 2 +- requires.go | 2 +- status.go | 2 +- task.go | 20 ++-- task_test.go | 186 +++++++++++++++---------------- taskfile/ast/tasks.go | 7 +- variables.go | 6 +- watch.go | 12 +- 13 files changed, 138 insertions(+), 137 deletions(-) diff --git a/args/args.go b/args/args.go index 7de0a813..4499b28e 100644 --- a/args/args.go +++ b/args/args.go @@ -7,13 +7,13 @@ import ( ) // Parse parses command line argument: tasks and global variables -func Parse(args ...string) ([]ast.Call, *ast.Vars) { - calls := []ast.Call{} +func Parse(args ...string) ([]*ast.Call, *ast.Vars) { + calls := []*ast.Call{} globals := &ast.Vars{} for _, arg := range args { if !strings.Contains(arg, "=") { - calls = append(calls, ast.Call{Task: arg}) + calls = append(calls, &ast.Call{Task: arg}) continue } diff --git a/args/args_test.go b/args/args_test.go index 9839ebff..dd69c3b3 100644 --- a/args/args_test.go +++ b/args/args_test.go @@ -14,12 +14,12 @@ import ( func TestArgs(t *testing.T) { tests := []struct { Args []string - ExpectedCalls []ast.Call + ExpectedCalls []*ast.Call ExpectedGlobals *ast.Vars }{ { Args: []string{"task-a", "task-b", "task-c"}, - ExpectedCalls: []ast.Call{ + ExpectedCalls: []*ast.Call{ {Task: "task-a"}, {Task: "task-b"}, {Task: "task-c"}, @@ -27,7 +27,7 @@ func TestArgs(t *testing.T) { }, { Args: []string{"task-a", "FOO=bar", "task-b", "task-c", "BAR=baz", "BAZ=foo"}, - ExpectedCalls: []ast.Call{ + ExpectedCalls: []*ast.Call{ {Task: "task-a"}, {Task: "task-b"}, {Task: "task-c"}, @@ -45,7 +45,7 @@ func TestArgs(t *testing.T) { }, { Args: []string{"task-a", "CONTENT=with some spaces"}, - ExpectedCalls: []ast.Call{ + ExpectedCalls: []*ast.Call{ {Task: "task-a"}, }, ExpectedGlobals: &ast.Vars{ @@ -59,7 +59,7 @@ func TestArgs(t *testing.T) { }, { Args: []string{"FOO=bar", "task-a", "task-b"}, - ExpectedCalls: []ast.Call{ + ExpectedCalls: []*ast.Call{ {Task: "task-a"}, {Task: "task-b"}, }, @@ -74,15 +74,15 @@ func TestArgs(t *testing.T) { }, { Args: nil, - ExpectedCalls: []ast.Call{}, + ExpectedCalls: []*ast.Call{}, }, { Args: []string{}, - ExpectedCalls: []ast.Call{}, + ExpectedCalls: []*ast.Call{}, }, { Args: []string{"FOO=bar", "BAR=baz"}, - ExpectedCalls: []ast.Call{}, + ExpectedCalls: []*ast.Call{}, ExpectedGlobals: &ast.Vars{ OrderedMap: omap.FromMapWithOrder( map[string]ast.Var{ diff --git a/cmd/task/task.go b/cmd/task/task.go index e9284427..7f9910e0 100644 --- a/cmd/task/task.go +++ b/cmd/task/task.go @@ -290,7 +290,7 @@ func run() error { } var ( - calls []ast.Call + calls []*ast.Call globals *ast.Vars ) @@ -303,7 +303,7 @@ func run() error { // If there are no calls, run the default task instead if len(calls) == 0 { - calls = append(calls, ast.Call{Task: "default"}) + calls = append(calls, &ast.Call{Task: "default"}) } globals.Set("CLI_ARGS", ast.Var{Value: cliArgs}) diff --git a/internal/compiler/compiler.go b/internal/compiler/compiler.go index bc57e8a4..376495f1 100644 --- a/internal/compiler/compiler.go +++ b/internal/compiler/compiler.go @@ -36,12 +36,12 @@ func (c *Compiler) GetTaskfileVariables() (*ast.Vars, error) { return c.getVariables(nil, nil, true) } -func (c *Compiler) GetVariables(t *ast.Task, call ast.Call) (*ast.Vars, error) { - return c.getVariables(t, &call, true) +func (c *Compiler) GetVariables(t *ast.Task, call *ast.Call) (*ast.Vars, error) { + return c.getVariables(t, call, true) } -func (c *Compiler) FastGetVariables(t *ast.Task, call ast.Call) (*ast.Vars, error) { - return c.getVariables(t, &call, false) +func (c *Compiler) FastGetVariables(t *ast.Task, call *ast.Call) (*ast.Vars, error) { + return c.getVariables(t, call, false) } func (c *Compiler) getVariables(t *ast.Task, call *ast.Call, evaluateShVars bool) (*ast.Vars, error) { diff --git a/internal/summary/summary.go b/internal/summary/summary.go index e8d337a1..edf4d677 100644 --- a/internal/summary/summary.go +++ b/internal/summary/summary.go @@ -7,10 +7,10 @@ import ( "github.com/go-task/task/v3/taskfile/ast" ) -func PrintTasks(l *logger.Logger, t *ast.Taskfile, c []ast.Call) { +func PrintTasks(l *logger.Logger, t *ast.Taskfile, c []*ast.Call) { for i, call := range c { PrintSpaceBetweenSummaries(l, i) - PrintTask(l, t.Tasks.Get(call.Task)) + PrintTask(l, t.Tasks.Get(call)) } } diff --git a/internal/summary/summary_test.go b/internal/summary/summary_test.go index e321855d..a478b1a2 100644 --- a/internal/summary/summary_test.go +++ b/internal/summary/summary_test.go @@ -163,7 +163,7 @@ func TestPrintAllWithSpaces(t *testing.T) { summary.PrintTasks(&l, &ast.Taskfile{Tasks: tasks}, - []ast.Call{{Task: "t1"}, {Task: "t2"}, {Task: "t3"}}) + []*ast.Call{{Task: "t1"}, {Task: "t2"}, {Task: "t3"}}) assert.True(t, strings.HasPrefix(buffer.String(), "task: t1")) assert.Contains(t, buffer.String(), "\n(task does not have description or summary)\n\n\ntask: t2") diff --git a/requires.go b/requires.go index 833ad9e6..5462f900 100644 --- a/requires.go +++ b/requires.go @@ -7,7 +7,7 @@ import ( "github.com/go-task/task/v3/taskfile/ast" ) -func (e *Executor) areTaskRequiredVarsSet(ctx context.Context, t *ast.Task, call ast.Call) error { +func (e *Executor) areTaskRequiredVarsSet(ctx context.Context, t *ast.Task, call *ast.Call) error { if t.Requires == nil || len(t.Requires.Vars) == 0 { return nil } diff --git a/status.go b/status.go index c76713f2..a2dcf901 100644 --- a/status.go +++ b/status.go @@ -9,7 +9,7 @@ import ( ) // Status returns an error if any the of given tasks is not up-to-date -func (e *Executor) Status(ctx context.Context, calls ...ast.Call) error { +func (e *Executor) Status(ctx context.Context, calls ...*ast.Call) error { for _, call := range calls { // Compile the task diff --git a/task.go b/task.go index 41609c5f..6bc98a8a 100644 --- a/task.go +++ b/task.go @@ -80,7 +80,7 @@ type Executor struct { } // Run runs Task -func (e *Executor) Run(ctx context.Context, calls ...ast.Call) error { +func (e *Executor) Run(ctx context.Context, calls ...*ast.Call) error { // check if given tasks exist for _, call := range calls { task, err := e.GetTask(call) @@ -142,7 +142,7 @@ func (e *Executor) Run(ctx context.Context, calls ...ast.Call) error { return nil } -func (e *Executor) splitRegularAndWatchCalls(calls ...ast.Call) (regularCalls []ast.Call, watchCalls []ast.Call, err error) { +func (e *Executor) splitRegularAndWatchCalls(calls ...*ast.Call) (regularCalls []*ast.Call, watchCalls []*ast.Call, err error) { for _, c := range calls { t, err := e.GetTask(c) if err != nil { @@ -159,7 +159,7 @@ func (e *Executor) splitRegularAndWatchCalls(calls ...ast.Call) (regularCalls [] } // RunTask runs a task by its name -func (e *Executor) RunTask(ctx context.Context, call ast.Call) error { +func (e *Executor) RunTask(ctx context.Context, call *ast.Call) error { t, err := e.FastCompiledTask(call) if err != nil { return err @@ -296,7 +296,7 @@ func (e *Executor) runDeps(ctx context.Context, t *ast.Task) error { for _, d := range t.Deps { d := d g.Go(func() error { - err := e.RunTask(ctx, ast.Call{Task: d.Task, Vars: d.Vars, Silent: d.Silent, Indirect: true}) + err := e.RunTask(ctx, &ast.Call{Task: d.Task, Vars: d.Vars, Silent: d.Silent, Indirect: true}) if err != nil { return err } @@ -307,7 +307,7 @@ func (e *Executor) runDeps(ctx context.Context, t *ast.Task) error { return g.Wait() } -func (e *Executor) runDeferred(t *ast.Task, call ast.Call, i int) { +func (e *Executor) runDeferred(t *ast.Task, call *ast.Call, i int) { ctx, cancel := context.WithCancel(context.Background()) defer cancel() @@ -316,7 +316,7 @@ func (e *Executor) runDeferred(t *ast.Task, call ast.Call, i int) { } } -func (e *Executor) runCommand(ctx context.Context, t *ast.Task, call ast.Call, i int) error { +func (e *Executor) runCommand(ctx context.Context, t *ast.Task, call *ast.Call, i int) error { cmd := t.Cmds[i] switch { @@ -324,7 +324,7 @@ func (e *Executor) runCommand(ctx context.Context, t *ast.Task, call ast.Call, i reacquire := e.releaseConcurrencyLimit() defer reacquire() - err := e.RunTask(ctx, ast.Call{Task: cmd.Task, Vars: cmd.Vars, Silent: cmd.Silent, Indirect: true}) + err := e.RunTask(ctx, &ast.Call{Task: cmd.Task, Vars: cmd.Vars, Silent: cmd.Silent, Indirect: true}) if err != nil { return err } @@ -413,9 +413,9 @@ func (e *Executor) startExecution(ctx context.Context, t *ast.Task, execute func // GetTask will return the task with the name matching the given call from the taskfile. // If no task is found, it will search for tasks with a matching alias. // If multiple tasks contain the same alias or no matches are found an error is returned. -func (e *Executor) GetTask(call ast.Call) (*ast.Task, error) { +func (e *Executor) GetTask(call *ast.Call) (*ast.Task, error) { // Search for a matching task - matchingTask := e.Taskfile.Tasks.Get(call.Task) + matchingTask := e.Taskfile.Tasks.Get(call) if matchingTask != nil { return matchingTask, nil } @@ -476,7 +476,7 @@ func (e *Executor) GetTaskList(filters ...FilterFunc) ([]*ast.Task, error) { idx := i task := tasks[idx] g.Go(func() error { - compiledTask, err := e.FastCompiledTask(ast.Call{Task: task.Task}) + compiledTask, err := e.FastCompiledTask(&ast.Call{Task: task.Task}) if err != nil { return err } diff --git a/task_test.go b/task_test.go index a8114965..31d52b8e 100644 --- a/task_test.go +++ b/task_test.go @@ -53,7 +53,7 @@ func (fct fileContentTest) Run(t *testing.T) { Stderr: io.Discard, } require.NoError(t, e.Setup(), "e.Setup()") - require.NoError(t, e.Run(context.Background(), ast.Call{Task: fct.Target}), "e.Run(target)") + require.NoError(t, e.Run(context.Background(), &ast.Call{Task: fct.Target}), "e.Run(target)") for name, expectContent := range fct.Files { t.Run(fct.name(name), func(t *testing.T) { @@ -76,7 +76,7 @@ func TestEmptyTask(t *testing.T) { Stderr: io.Discard, } require.NoError(t, e.Setup(), "e.Setup()") - require.NoError(t, e.Run(context.Background(), ast.Call{Task: "default"})) + require.NoError(t, e.Run(context.Background(), &ast.Call{Task: "default"})) } func TestEnv(t *testing.T) { @@ -141,7 +141,7 @@ func TestSpecialVars(t *testing.T) { Silent: true, } require.NoError(t, e.Setup()) - require.NoError(t, e.Run(context.Background(), ast.Call{Task: test.target})) + require.NoError(t, e.Run(context.Background(), &ast.Call{Task: test.target})) assert.Equal(t, test.expected+"\n", buff.String()) }) } @@ -160,7 +160,7 @@ func TestConcurrency(t *testing.T) { Concurrency: 1, } require.NoError(t, e.Setup(), "e.Setup()") - require.NoError(t, e.Run(context.Background(), ast.Call{Task: target}), "e.Run(target)") + require.NoError(t, e.Run(context.Background(), &ast.Call{Task: target}), "e.Run(target)") } func TestParams(t *testing.T) { @@ -212,7 +212,7 @@ func TestDeps(t *testing.T) { Stderr: io.Discard, } require.NoError(t, e.Setup()) - require.NoError(t, e.Run(context.Background(), ast.Call{Task: "default"})) + require.NoError(t, e.Run(context.Background(), &ast.Call{Task: "default"})) for _, f := range files { f = filepathext.SmartJoin(dir, f) @@ -249,15 +249,15 @@ func TestStatus(t *testing.T) { } require.NoError(t, e.Setup()) // gen-foo creates foo.txt, and will always fail it's status check. - require.NoError(t, e.Run(context.Background(), ast.Call{Task: "gen-foo"})) + require.NoError(t, e.Run(context.Background(), &ast.Call{Task: "gen-foo"})) // gen-foo creates bar.txt, and will pass its status-check the 3. time it // is run. It creates bar.txt, but also lists it as its source. So, the checksum // for the file won't match before after the second run as we the file // only exists after the first run. - require.NoError(t, e.Run(context.Background(), ast.Call{Task: "gen-bar"})) + require.NoError(t, e.Run(context.Background(), &ast.Call{Task: "gen-bar"})) // gen-silent-baz is marked as being silent, and should only produce output // if e.Verbose is set to true. - require.NoError(t, e.Run(context.Background(), ast.Call{Task: "gen-silent-baz"})) + require.NoError(t, e.Run(context.Background(), &ast.Call{Task: "gen-silent-baz"})) for _, f := range files { if _, err := os.Stat(filepathext.SmartJoin(dir, f)); err != nil { @@ -266,10 +266,10 @@ func TestStatus(t *testing.T) { } // Run gen-bar a second time to produce a checksum file that matches bar.txt - require.NoError(t, e.Run(context.Background(), ast.Call{Task: "gen-bar"})) + require.NoError(t, e.Run(context.Background(), &ast.Call{Task: "gen-bar"})) // Run gen-bar a third time, to make sure we've triggered the status check. - require.NoError(t, e.Run(context.Background(), ast.Call{Task: "gen-bar"})) + require.NoError(t, e.Run(context.Background(), &ast.Call{Task: "gen-bar"})) // We're silent, so no output should have been produced. assert.Empty(t, buff.String()) @@ -278,7 +278,7 @@ func TestStatus(t *testing.T) { // for the next test. err := os.Remove(filepathext.SmartJoin(dir, "bar.txt")) require.NoError(t, err) - require.NoError(t, e.Run(context.Background(), ast.Call{Task: "gen-bar"})) + require.NoError(t, e.Run(context.Background(), &ast.Call{Task: "gen-bar"})) buff.Reset() // Global silence switched of, so we should see output unless the task itself @@ -286,34 +286,34 @@ func TestStatus(t *testing.T) { e.Silent = false // all: not up-to-date - require.NoError(t, e.Run(context.Background(), ast.Call{Task: "gen-foo"})) + require.NoError(t, e.Run(context.Background(), &ast.Call{Task: "gen-foo"})) assert.Equal(t, "task: [gen-foo] touch foo.txt", strings.TrimSpace(buff.String())) buff.Reset() // status: not up-to-date - require.NoError(t, e.Run(context.Background(), ast.Call{Task: "gen-foo"})) + require.NoError(t, e.Run(context.Background(), &ast.Call{Task: "gen-foo"})) assert.Equal(t, "task: [gen-foo] touch foo.txt", strings.TrimSpace(buff.String())) buff.Reset() // sources: not up-to-date - require.NoError(t, e.Run(context.Background(), ast.Call{Task: "gen-bar"})) + require.NoError(t, e.Run(context.Background(), &ast.Call{Task: "gen-bar"})) assert.Equal(t, "task: [gen-bar] touch bar.txt", strings.TrimSpace(buff.String())) buff.Reset() // all: up-to-date - require.NoError(t, e.Run(context.Background(), ast.Call{Task: "gen-bar"})) + require.NoError(t, e.Run(context.Background(), &ast.Call{Task: "gen-bar"})) assert.Equal(t, `task: Task "gen-bar" is up to date`, strings.TrimSpace(buff.String())) buff.Reset() // sources: not up-to-date, no output produced. - require.NoError(t, e.Run(context.Background(), ast.Call{Task: "gen-silent-baz"})) + require.NoError(t, e.Run(context.Background(), &ast.Call{Task: "gen-silent-baz"})) assert.Empty(t, buff.String()) // up-to-date, no output produced - require.NoError(t, e.Run(context.Background(), ast.Call{Task: "gen-silent-baz"})) + require.NoError(t, e.Run(context.Background(), &ast.Call{Task: "gen-silent-baz"})) assert.Empty(t, buff.String()) e.Verbose = true // up-to-date, output produced due to Verbose mode. - require.NoError(t, e.Run(context.Background(), ast.Call{Task: "gen-silent-baz"})) + require.NoError(t, e.Run(context.Background(), &ast.Call{Task: "gen-silent-baz"})) assert.Equal(t, `task: Task "gen-silent-baz" is up to date`, strings.TrimSpace(buff.String())) buff.Reset() } @@ -330,13 +330,13 @@ func TestPrecondition(t *testing.T) { // A precondition that has been met require.NoError(t, e.Setup()) - require.NoError(t, e.Run(context.Background(), ast.Call{Task: "foo"})) + require.NoError(t, e.Run(context.Background(), &ast.Call{Task: "foo"})) if buff.String() != "" { t.Errorf("Got Output when none was expected: %s", buff.String()) } // A precondition that was not met - require.Error(t, e.Run(context.Background(), ast.Call{Task: "impossible"})) + require.Error(t, e.Run(context.Background(), &ast.Call{Task: "impossible"})) if buff.String() != "task: 1 != 0 obviously!\n" { t.Errorf("Wrong output message: %s", buff.String()) @@ -344,7 +344,7 @@ func TestPrecondition(t *testing.T) { buff.Reset() // Calling a task with a precondition in a dependency fails the task - require.Error(t, e.Run(context.Background(), ast.Call{Task: "depends_on_impossible"})) + require.Error(t, e.Run(context.Background(), &ast.Call{Task: "depends_on_impossible"})) if buff.String() != "task: 1 != 0 obviously!\n" { t.Errorf("Wrong output message: %s", buff.String()) @@ -352,7 +352,7 @@ func TestPrecondition(t *testing.T) { buff.Reset() // Calling a task with a precondition in a cmd fails the task - require.Error(t, e.Run(context.Background(), ast.Call{Task: "executes_failing_task_as_cmd"})) + require.Error(t, e.Run(context.Background(), &ast.Call{Task: "executes_failing_task_as_cmd"})) if buff.String() != "task: 1 != 0 obviously!\n" { t.Errorf("Wrong output message: %s", buff.String()) } @@ -393,7 +393,7 @@ func TestGenerates(t *testing.T) { fmt.Sprintf("task: Task \"%s\" is up to date\n", theTask) // Run task for the first time. - require.NoError(t, e.Run(context.Background(), ast.Call{Task: theTask})) + require.NoError(t, e.Run(context.Background(), &ast.Call{Task: theTask})) if _, err := os.Stat(srcFile); err != nil { t.Errorf("File should exist: %v", err) @@ -408,7 +408,7 @@ func TestGenerates(t *testing.T) { buff.Reset() // Re-run task to ensure it's now found to be up-to-date. - require.NoError(t, e.Run(context.Background(), ast.Call{Task: theTask})) + require.NoError(t, e.Run(context.Background(), &ast.Call{Task: theTask})) if buff.String() != upToDate { t.Errorf("Wrong output message: %s", buff.String()) } @@ -446,7 +446,7 @@ func TestStatusChecksum(t *testing.T) { } require.NoError(t, e.Setup()) - require.NoError(t, e.Run(context.Background(), ast.Call{Task: test.task})) + require.NoError(t, e.Run(context.Background(), &ast.Call{Task: test.task})) for _, f := range test.files { _, err := os.Stat(filepathext.SmartJoin(dir, f)) require.NoError(t, err) @@ -459,7 +459,7 @@ func TestStatusChecksum(t *testing.T) { time := s.ModTime() buff.Reset() - require.NoError(t, e.Run(context.Background(), ast.Call{Task: test.task})) + require.NoError(t, e.Run(context.Background(), &ast.Call{Task: test.task})) assert.Equal(t, `task: Task "`+test.task+`" is up to date`+"\n", buff.String()) s, err = os.Stat(filepathext.SmartJoin(tempdir, "checksum/"+test.task)) @@ -482,7 +482,7 @@ func TestAlias(t *testing.T) { Stderr: &buff, } require.NoError(t, e.Setup()) - require.NoError(t, e.Run(context.Background(), ast.Call{Task: "f"})) + require.NoError(t, e.Run(context.Background(), &ast.Call{Task: "f"})) assert.Equal(t, string(data), buff.String()) } @@ -496,7 +496,7 @@ func TestDuplicateAlias(t *testing.T) { Stderr: &buff, } require.NoError(t, e.Setup()) - require.Error(t, e.Run(context.Background(), ast.Call{Task: "x"})) + require.Error(t, e.Run(context.Background(), &ast.Call{Task: "x"})) assert.Equal(t, "", buff.String()) } @@ -514,7 +514,7 @@ func TestAliasSummary(t *testing.T) { Stderr: &buff, } require.NoError(t, e.Setup()) - require.NoError(t, e.Run(context.Background(), ast.Call{Task: "f"})) + require.NoError(t, e.Run(context.Background(), &ast.Call{Task: "f"})) assert.Equal(t, string(data), buff.String()) } @@ -528,7 +528,7 @@ func TestLabelUpToDate(t *testing.T) { Stderr: &buff, } require.NoError(t, e.Setup()) - require.NoError(t, e.Run(context.Background(), ast.Call{Task: "foo"})) + require.NoError(t, e.Run(context.Background(), &ast.Call{Task: "foo"})) assert.Contains(t, buff.String(), "foobar") } @@ -543,7 +543,7 @@ func TestLabelSummary(t *testing.T) { Stderr: &buff, } require.NoError(t, e.Setup()) - require.NoError(t, e.Run(context.Background(), ast.Call{Task: "foo"})) + require.NoError(t, e.Run(context.Background(), &ast.Call{Task: "foo"})) assert.Contains(t, buff.String(), "foobar") } @@ -554,7 +554,7 @@ func TestLabelInStatus(t *testing.T) { Dir: dir, } require.NoError(t, e.Setup()) - err := e.Status(context.Background(), ast.Call{Task: "foo"}) + err := e.Status(context.Background(), &ast.Call{Task: "foo"}) assert.ErrorContains(t, err, "foobar") } @@ -568,7 +568,7 @@ func TestLabelWithVariableExpansion(t *testing.T) { Stderr: &buff, } require.NoError(t, e.Setup()) - require.NoError(t, e.Run(context.Background(), ast.Call{Task: "foo"})) + require.NoError(t, e.Run(context.Background(), &ast.Call{Task: "foo"})) assert.Contains(t, buff.String(), "foobaz") } @@ -582,7 +582,7 @@ func TestLabelInSummary(t *testing.T) { Stderr: &buff, } require.NoError(t, e.Setup()) - require.NoError(t, e.Run(context.Background(), ast.Call{Task: "foo"})) + require.NoError(t, e.Run(context.Background(), &ast.Call{Task: "foo"})) assert.Contains(t, buff.String(), "foobar") } @@ -618,7 +618,7 @@ func TestPromptInSummary(t *testing.T) { } require.NoError(t, e.Setup()) - err := e.Run(context.Background(), ast.Call{Task: "foo"}) + err := e.Run(context.Background(), &ast.Call{Task: "foo"}) if test.wantError { require.Error(t, err) @@ -646,7 +646,7 @@ func TestPromptWithIndirectTask(t *testing.T) { } require.NoError(t, e.Setup()) - err := e.Run(context.Background(), ast.Call{Task: "bar"}) + err := e.Run(context.Background(), &ast.Call{Task: "bar"}) assert.Contains(t, outBuff.String(), "show-prompt") require.NoError(t, err) } @@ -679,7 +679,7 @@ func TestPromptAssumeYes(t *testing.T) { } require.NoError(t, e.Setup()) - err := e.Run(context.Background(), ast.Call{Task: "foo"}) + err := e.Run(context.Background(), &ast.Call{Task: "foo"}) if !test.assumeYes { require.Error(t, err) @@ -791,7 +791,7 @@ func TestStatusVariables(t *testing.T) { Verbose: true, } require.NoError(t, e.Setup()) - require.NoError(t, e.Run(context.Background(), ast.Call{Task: "build"})) + require.NoError(t, e.Run(context.Background(), &ast.Call{Task: "build"})) assert.Contains(t, buff.String(), "3e464c4b03f4b65d740e1e130d4d108a") @@ -832,7 +832,7 @@ func TestCyclicDep(t *testing.T) { Stderr: io.Discard, } require.NoError(t, e.Setup()) - assert.IsType(t, &errors.TaskCalledTooManyTimesError{}, e.Run(context.Background(), ast.Call{Task: "task-1"})) + assert.IsType(t, &errors.TaskCalledTooManyTimesError{}, e.Run(context.Background(), &ast.Call{Task: "task-1"})) } func TestTaskVersion(t *testing.T) { @@ -875,10 +875,10 @@ func TestTaskIgnoreErrors(t *testing.T) { } require.NoError(t, e.Setup()) - require.NoError(t, e.Run(context.Background(), ast.Call{Task: "task-should-pass"})) - require.Error(t, e.Run(context.Background(), ast.Call{Task: "task-should-fail"})) - require.NoError(t, e.Run(context.Background(), ast.Call{Task: "cmd-should-pass"})) - require.Error(t, e.Run(context.Background(), ast.Call{Task: "cmd-should-fail"})) + require.NoError(t, e.Run(context.Background(), &ast.Call{Task: "task-should-pass"})) + require.Error(t, e.Run(context.Background(), &ast.Call{Task: "task-should-fail"})) + require.NoError(t, e.Run(context.Background(), &ast.Call{Task: "cmd-should-pass"})) + require.Error(t, e.Run(context.Background(), &ast.Call{Task: "cmd-should-fail"})) } func TestExpand(t *testing.T) { @@ -896,7 +896,7 @@ func TestExpand(t *testing.T) { Stderr: &buff, } require.NoError(t, e.Setup()) - require.NoError(t, e.Run(context.Background(), ast.Call{Task: "pwd"})) + require.NoError(t, e.Run(context.Background(), &ast.Call{Task: "pwd"})) assert.Equal(t, home, strings.TrimSpace(buff.String())) } @@ -915,7 +915,7 @@ func TestDry(t *testing.T) { Dry: true, } require.NoError(t, e.Setup()) - require.NoError(t, e.Run(context.Background(), ast.Call{Task: "build"})) + require.NoError(t, e.Run(context.Background(), &ast.Call{Task: "build"})) assert.Equal(t, "task: [build] touch file.txt", strings.TrimSpace(buff.String())) if _, err := os.Stat(file); err == nil { @@ -939,13 +939,13 @@ func TestDryChecksum(t *testing.T) { Dry: true, } require.NoError(t, e.Setup()) - require.NoError(t, e.Run(context.Background(), ast.Call{Task: "default"})) + require.NoError(t, e.Run(context.Background(), &ast.Call{Task: "default"})) _, err := os.Stat(checksumFile) require.Error(t, err, "checksum file should not exist") e.Dry = false - require.NoError(t, e.Run(context.Background(), ast.Call{Task: "default"})) + require.NoError(t, e.Run(context.Background(), &ast.Call{Task: "default"})) _, err = os.Stat(checksumFile) require.NoError(t, err, "checksum file should exist") } @@ -1127,11 +1127,11 @@ func TestIncludesRelativePath(t *testing.T) { require.NoError(t, e.Setup()) - require.NoError(t, e.Run(context.Background(), ast.Call{Task: "common:pwd"})) + require.NoError(t, e.Run(context.Background(), &ast.Call{Task: "common:pwd"})) assert.Contains(t, buff.String(), "testdata/includes_rel_path/common") buff.Reset() - require.NoError(t, e.Run(context.Background(), ast.Call{Task: "included:common:pwd"})) + require.NoError(t, e.Run(context.Background(), &ast.Call{Task: "included:common:pwd"})) assert.Contains(t, buff.String(), "testdata/includes_rel_path/common") } @@ -1159,7 +1159,7 @@ func TestIncludesInternal(t *testing.T) { } require.NoError(t, e.Setup()) - err := e.Run(context.Background(), ast.Call{Task: test.task}) + err := e.Run(context.Background(), &ast.Call{Task: test.task}) if test.expectedErr { require.Error(t, err) } else { @@ -1193,7 +1193,7 @@ func TestIncludesInterpolation(t *testing.T) { } require.NoError(t, e.Setup()) - err := e.Run(context.Background(), ast.Call{Task: test.task}) + err := e.Run(context.Background(), &ast.Call{Task: test.task}) if test.expectedErr { require.Error(t, err) } else { @@ -1228,7 +1228,7 @@ func TestInternalTask(t *testing.T) { } require.NoError(t, e.Setup()) - err := e.Run(context.Background(), ast.Call{Task: test.task}) + err := e.Run(context.Background(), &ast.Call{Task: test.task}) if test.expectedErr { require.Error(t, err) } else { @@ -1297,7 +1297,7 @@ func TestSummary(t *testing.T) { Silent: true, } require.NoError(t, e.Setup()) - require.NoError(t, e.Run(context.Background(), ast.Call{Task: "task-with-summary"}, ast.Call{Task: "other-task-with-summary"})) + require.NoError(t, e.Run(context.Background(), &ast.Call{Task: "task-with-summary"}, &ast.Call{Task: "other-task-with-summary"})) data, err := os.ReadFile(filepathext.SmartJoin(dir, "task-with-summary.txt")) require.NoError(t, err) @@ -1321,7 +1321,7 @@ func TestWhenNoDirAttributeItRunsInSameDirAsTaskfile(t *testing.T) { } require.NoError(t, e.Setup()) - require.NoError(t, e.Run(context.Background(), ast.Call{Task: "whereami"})) + require.NoError(t, e.Run(context.Background(), &ast.Call{Task: "whereami"})) // got should be the "dir" part of "testdata/dir" got := strings.TrimSuffix(filepath.Base(out.String()), "\n") @@ -1339,7 +1339,7 @@ func TestWhenDirAttributeAndDirExistsItRunsInThatDir(t *testing.T) { } require.NoError(t, e.Setup()) - require.NoError(t, e.Run(context.Background(), ast.Call{Task: "whereami"})) + require.NoError(t, e.Run(context.Background(), &ast.Call{Task: "whereami"})) got := strings.TrimSuffix(filepath.Base(out.String()), "\n") assert.Equal(t, expected, got, "Mismatch in the working directory") @@ -1363,7 +1363,7 @@ func TestWhenDirAttributeItCreatesMissingAndRunsInThatDir(t *testing.T) { t.Errorf("Directory should not exist: %v", err) } require.NoError(t, e.Setup()) - require.NoError(t, e.Run(context.Background(), ast.Call{Task: target})) + require.NoError(t, e.Run(context.Background(), &ast.Call{Task: target})) got := strings.TrimSuffix(filepath.Base(out.String()), "\n") assert.Equal(t, expected, got, "Mismatch in the working directory") @@ -1390,7 +1390,7 @@ func TestDynamicVariablesRunOnTheNewCreatedDir(t *testing.T) { t.Errorf("Directory should not exist: %v", err) } require.NoError(t, e.Setup()) - require.NoError(t, e.Run(context.Background(), ast.Call{Task: target})) + require.NoError(t, e.Run(context.Background(), &ast.Call{Task: target})) got := strings.TrimSuffix(filepath.Base(out.String()), "\n") assert.Equal(t, expected, got, "Mismatch in the working directory") @@ -1448,7 +1448,7 @@ func TestShortTaskNotation(t *testing.T) { Silent: true, } require.NoError(t, e.Setup()) - require.NoError(t, e.Run(context.Background(), ast.Call{Task: "default"})) + require.NoError(t, e.Run(context.Background(), &ast.Call{Task: "default"})) assert.Equal(t, "string-slice-1\nstring-slice-2\nstring\n", buff.String()) } @@ -1592,7 +1592,7 @@ func TestExitImmediately(t *testing.T) { } require.NoError(t, e.Setup()) - require.Error(t, e.Run(context.Background(), ast.Call{Task: "default"})) + require.Error(t, e.Run(context.Background(), &ast.Call{Task: "default"})) assert.Contains(t, buff.String(), `"this_should_fail": executable file not found in $PATH`) } @@ -1628,7 +1628,7 @@ echo ran task: [task-1] echo 'task-1 ran successfully' task-1 ran successfully `) - require.Error(t, e.Run(context.Background(), ast.Call{Task: "task-2"})) + require.Error(t, e.Run(context.Background(), &ast.Call{Task: "task-2"})) assert.Contains(t, buff.String(), expectedOutputOrder) } @@ -1653,7 +1653,7 @@ func TestIgnoreNilElements(t *testing.T) { Silent: true, } require.NoError(t, e.Setup()) - require.NoError(t, e.Run(context.Background(), ast.Call{Task: "default"})) + require.NoError(t, e.Run(context.Background(), &ast.Call{Task: "default"})) assert.Equal(t, "string-slice-1\n", buff.String()) }) } @@ -1679,7 +1679,7 @@ task: [bye] echo 'Bye!' Bye! ::endgroup:: `) - require.NoError(t, e.Run(context.Background(), ast.Call{Task: "bye"})) + require.NoError(t, e.Run(context.Background(), &ast.Call{Task: "bye"})) t.Log(buff.String()) assert.Equal(t, strings.TrimSpace(buff.String()), expectedOutputOrder) } @@ -1694,7 +1694,7 @@ func TestOutputGroupErrorOnlySwallowsOutputOnSuccess(t *testing.T) { } require.NoError(t, e.Setup()) - require.NoError(t, e.Run(context.Background(), ast.Call{Task: "passing"})) + require.NoError(t, e.Run(context.Background(), &ast.Call{Task: "passing"})) t.Log(buff.String()) assert.Empty(t, buff.String()) } @@ -1709,7 +1709,7 @@ func TestOutputGroupErrorOnlyShowsOutputOnFailure(t *testing.T) { } require.NoError(t, e.Setup()) - require.Error(t, e.Run(context.Background(), ast.Call{Task: "failing"})) + require.Error(t, e.Run(context.Background(), &ast.Call{Task: "failing"})) t.Log(buff.String()) assert.Contains(t, "failing-output", strings.TrimSpace(buff.String())) assert.NotContains(t, "passing", strings.TrimSpace(buff.String())) @@ -1739,7 +1739,7 @@ VAR_1 is included-default-var1 task: [included3:task1] echo "VAR_2 is included-default-var2" VAR_2 is included-default-var2 `) - require.NoError(t, e.Run(context.Background(), ast.Call{Task: "task1"})) + require.NoError(t, e.Run(context.Background(), &ast.Call{Task: "task1"})) t.Log(buff.String()) assert.Equal(t, strings.TrimSpace(buff.String()), expectedOutputOrder) } @@ -1762,7 +1762,7 @@ Hello foo task: [bar:lib:greet] echo 'Hello bar' Hello bar `) - require.NoError(t, e.Run(context.Background(), ast.Call{Task: "default"})) + require.NoError(t, e.Run(context.Background(), &ast.Call{Task: "default"})) t.Log(buff.String()) assert.Equal(t, strings.TrimSpace(buff.String()), expectedOutputOrder) } @@ -1795,7 +1795,7 @@ func TestErrorCode(t *testing.T) { } require.NoError(t, e.Setup()) - err := e.Run(context.Background(), ast.Call{Task: test.task}) + err := e.Run(context.Background(), &ast.Call{Task: test.task}) require.Error(t, err) taskRunErr, ok := err.(*errors.TaskRunError) assert.True(t, ok, "cannot cast returned error to *task.TaskRunError") @@ -1847,7 +1847,7 @@ func TestEvaluateSymlinksInPaths(t *testing.T) { for _, test := range tests { t.Run(test.name, func(t *testing.T) { require.NoError(t, e.Setup()) - err := e.Run(context.Background(), ast.Call{Task: test.task}) + err := e.Run(context.Background(), &ast.Call{Task: test.task}) require.NoError(t, err) assert.Equal(t, test.expected, strings.TrimSpace(buff.String())) buff.Reset() @@ -1886,7 +1886,7 @@ func TestTaskfileWalk(t *testing.T) { Stderr: &buff, } require.NoError(t, e.Setup()) - require.NoError(t, e.Run(context.Background(), ast.Call{Task: "default"})) + require.NoError(t, e.Run(context.Background(), &ast.Call{Task: "default"})) assert.Equal(t, test.expected, buff.String()) }) } @@ -1902,7 +1902,7 @@ func TestUserWorkingDirectory(t *testing.T) { wd, err := os.Getwd() require.NoError(t, err) require.NoError(t, e.Setup()) - require.NoError(t, e.Run(context.Background(), ast.Call{Task: "default"})) + require.NoError(t, e.Run(context.Background(), &ast.Call{Task: "default"})) assert.Equal(t, fmt.Sprintf("%s\n", wd), buff.String()) } @@ -1922,7 +1922,7 @@ func TestUserWorkingDirectoryWithIncluded(t *testing.T) { require.NoError(t, err) require.NoError(t, e.Setup()) - require.NoError(t, e.Run(context.Background(), ast.Call{Task: "included:echo"})) + require.NoError(t, e.Run(context.Background(), &ast.Call{Task: "included:echo"})) assert.Equal(t, fmt.Sprintf("%s\n", wd), buff.String()) } @@ -1934,7 +1934,7 @@ func TestPlatforms(t *testing.T) { Stderr: &buff, } require.NoError(t, e.Setup()) - require.NoError(t, e.Run(context.Background(), ast.Call{Task: "build-" + runtime.GOOS})) + require.NoError(t, e.Run(context.Background(), &ast.Call{Task: "build-" + runtime.GOOS})) assert.Equal(t, fmt.Sprintf("task: [build-%s] echo 'Running task on %s'\nRunning task on %s\n", runtime.GOOS, runtime.GOOS, runtime.GOOS), buff.String()) } @@ -1947,7 +1947,7 @@ func TestPOSIXShellOptsGlobalLevel(t *testing.T) { } require.NoError(t, e.Setup()) - err := e.Run(context.Background(), ast.Call{Task: "pipefail"}) + err := e.Run(context.Background(), &ast.Call{Task: "pipefail"}) require.NoError(t, err) assert.Equal(t, "pipefail\ton\n", buff.String()) } @@ -1961,7 +1961,7 @@ func TestPOSIXShellOptsTaskLevel(t *testing.T) { } require.NoError(t, e.Setup()) - err := e.Run(context.Background(), ast.Call{Task: "pipefail"}) + err := e.Run(context.Background(), &ast.Call{Task: "pipefail"}) require.NoError(t, err) assert.Equal(t, "pipefail\ton\n", buff.String()) } @@ -1975,7 +1975,7 @@ func TestPOSIXShellOptsCommandLevel(t *testing.T) { } require.NoError(t, e.Setup()) - err := e.Run(context.Background(), ast.Call{Task: "pipefail"}) + err := e.Run(context.Background(), &ast.Call{Task: "pipefail"}) require.NoError(t, err) assert.Equal(t, "pipefail\ton\n", buff.String()) } @@ -1989,7 +1989,7 @@ func TestBashShellOptsGlobalLevel(t *testing.T) { } require.NoError(t, e.Setup()) - err := e.Run(context.Background(), ast.Call{Task: "globstar"}) + err := e.Run(context.Background(), &ast.Call{Task: "globstar"}) require.NoError(t, err) assert.Equal(t, "globstar\ton\n", buff.String()) } @@ -2003,7 +2003,7 @@ func TestBashShellOptsTaskLevel(t *testing.T) { } require.NoError(t, e.Setup()) - err := e.Run(context.Background(), ast.Call{Task: "globstar"}) + err := e.Run(context.Background(), &ast.Call{Task: "globstar"}) require.NoError(t, err) assert.Equal(t, "globstar\ton\n", buff.String()) } @@ -2017,7 +2017,7 @@ func TestBashShellOptsCommandLevel(t *testing.T) { } require.NoError(t, e.Setup()) - err := e.Run(context.Background(), ast.Call{Task: "globstar"}) + err := e.Run(context.Background(), &ast.Call{Task: "globstar"}) require.NoError(t, err) assert.Equal(t, "globstar\ton\n", buff.String()) } @@ -2035,7 +2035,7 @@ func TestSplitArgs(t *testing.T) { vars := &ast.Vars{} vars.Set("CLI_ARGS", ast.Var{Value: "foo bar 'foo bar baz'"}) - err := e.Run(context.Background(), ast.Call{Task: "default", Vars: vars}) + err := e.Run(context.Background(), &ast.Call{Task: "default", Vars: vars}) require.NoError(t, err) assert.Equal(t, "3\n", buff.String()) } @@ -2063,20 +2063,20 @@ func TestSilence(t *testing.T) { require.NoError(t, e.Setup()) // First verify that the silent flag is in place. - task, err := e.GetTask(ast.Call{Task: "task-test-silent-calls-chatty-silenced"}) + task, err := e.GetTask(&ast.Call{Task: "task-test-silent-calls-chatty-silenced"}) require.NoError(t, err, "Unable to look up task task-test-silent-calls-chatty-silenced") require.True(t, task.Cmds[0].Silent, "The task task-test-silent-calls-chatty-silenced should have a silent call to chatty") // Then test the two basic cases where the task is silent or not. // A silenced task. - err = e.Run(context.Background(), ast.Call{Task: "silent"}) + err = e.Run(context.Background(), &ast.Call{Task: "silent"}) require.NoError(t, err) require.Empty(t, buff.String(), "siWhile running lent: Expected not see output, because the task is silent") buff.Reset() // A chatty (not silent) task. - err = e.Run(context.Background(), ast.Call{Task: "chatty"}) + err = e.Run(context.Background(), &ast.Call{Task: "chatty"}) require.NoError(t, err) require.NotEmpty(t, buff.String(), "chWhile running atty: Expected to see output, because the task is not silent") @@ -2084,42 +2084,42 @@ func TestSilence(t *testing.T) { // Then test invoking the two task from other tasks. // A silenced task that calls a chatty task. - err = e.Run(context.Background(), ast.Call{Task: "task-test-silent-calls-chatty-non-silenced"}) + err = e.Run(context.Background(), &ast.Call{Task: "task-test-silent-calls-chatty-non-silenced"}) require.NoError(t, err) require.NotEmpty(t, buff.String(), "While running task-test-silent-calls-chatty-non-silenced: Expected to see output. The task is silenced, but the called task is not. Silence does not propagate to called tasks.") buff.Reset() // A silent task that does a silent call to a chatty task. - err = e.Run(context.Background(), ast.Call{Task: "task-test-silent-calls-chatty-silenced"}) + err = e.Run(context.Background(), &ast.Call{Task: "task-test-silent-calls-chatty-silenced"}) require.NoError(t, err) require.Empty(t, buff.String(), "While running task-test-silent-calls-chatty-silenced: Expected not to see output. The task calls chatty task, but the call is silenced.") buff.Reset() // A chatty task that does a call to a chatty task. - err = e.Run(context.Background(), ast.Call{Task: "task-test-chatty-calls-chatty-non-silenced"}) + err = e.Run(context.Background(), &ast.Call{Task: "task-test-chatty-calls-chatty-non-silenced"}) require.NoError(t, err) require.NotEmpty(t, buff.String(), "While running task-test-chatty-calls-chatty-non-silenced: Expected to see output. Both caller and callee are chatty and not silenced.") buff.Reset() // A chatty task that does a silenced call to a chatty task. - err = e.Run(context.Background(), ast.Call{Task: "task-test-chatty-calls-chatty-silenced"}) + err = e.Run(context.Background(), &ast.Call{Task: "task-test-chatty-calls-chatty-silenced"}) require.NoError(t, err) require.NotEmpty(t, buff.String(), "While running task-test-chatty-calls-chatty-silenced: Expected to see output. Call to a chatty task is silenced, but the parent task is not.") buff.Reset() // A chatty task with no cmd's of its own that does a silenced call to a chatty task. - err = e.Run(context.Background(), ast.Call{Task: "task-test-no-cmds-calls-chatty-silenced"}) + err = e.Run(context.Background(), &ast.Call{Task: "task-test-no-cmds-calls-chatty-silenced"}) require.NoError(t, err) require.Empty(t, buff.String(), "While running task-test-no-cmds-calls-chatty-silenced: Expected not to see output. While the task itself is not silenced, it does not have any cmds and only does an invocation of a silenced task.") buff.Reset() // A chatty task that does a silenced invocation of a task. - err = e.Run(context.Background(), ast.Call{Task: "task-test-chatty-calls-silenced-cmd"}) + err = e.Run(context.Background(), &ast.Call{Task: "task-test-chatty-calls-silenced-cmd"}) require.NoError(t, err) require.Empty(t, buff.String(), "While running task-test-chatty-calls-silenced-cmd: Expected not to see output. While the task itself is not silenced, its call to the chatty task is silent.") @@ -2127,21 +2127,21 @@ func TestSilence(t *testing.T) { // Then test calls via dependencies. // A silent task that depends on a chatty task. - err = e.Run(context.Background(), ast.Call{Task: "task-test-is-silent-depends-on-chatty-non-silenced"}) + err = e.Run(context.Background(), &ast.Call{Task: "task-test-is-silent-depends-on-chatty-non-silenced"}) require.NoError(t, err) require.NotEmpty(t, buff.String(), "While running task-test-is-silent-depends-on-chatty-non-silenced: Expected to see output. The task is silent and depends on a chatty task. Dependencies does not inherit silence.") buff.Reset() // A silent task that depends on a silenced chatty task. - err = e.Run(context.Background(), ast.Call{Task: "task-test-is-silent-depends-on-chatty-silenced"}) + err = e.Run(context.Background(), &ast.Call{Task: "task-test-is-silent-depends-on-chatty-silenced"}) require.NoError(t, err) require.Empty(t, buff.String(), "While running task-test-is-silent-depends-on-chatty-silenced: Expected not to see output. The task is silent and has a silenced dependency on a chatty task.") buff.Reset() // A chatty task that, depends on a silenced chatty task. - err = e.Run(context.Background(), ast.Call{Task: "task-test-is-chatty-depends-on-chatty-silenced"}) + err = e.Run(context.Background(), &ast.Call{Task: "task-test-is-chatty-depends-on-chatty-silenced"}) require.NoError(t, err) require.Empty(t, buff.String(), "While running task-test-is-chatty-depends-on-chatty-silenced: Expected not to see output. The task is chatty but does not have commands and has a silenced dependency on a chatty task.") @@ -2189,7 +2189,7 @@ func TestForce(t *testing.T) { ForceAll: tt.forceAll, } require.NoError(t, e.Setup()) - require.NoError(t, e.Run(context.Background(), ast.Call{Task: "task-with-dep"})) + require.NoError(t, e.Run(context.Background(), &ast.Call{Task: "task-with-dep"})) }) } } @@ -2244,7 +2244,7 @@ func TestFor(t *testing.T) { Force: true, } require.NoError(t, e.Setup()) - require.NoError(t, e.Run(context.Background(), ast.Call{Task: test.name})) + require.NoError(t, e.Run(context.Background(), &ast.Call{Task: test.name})) assert.Equal(t, test.expectedOutput, buff.String()) }) } diff --git a/taskfile/ast/tasks.go b/taskfile/ast/tasks.go index 40834669..0bce50b4 100644 --- a/taskfile/ast/tasks.go +++ b/taskfile/ast/tasks.go @@ -61,10 +61,11 @@ func (t1 *Tasks) Merge(t2 Tasks, include *Include) { // run the included Taskfile's default task without specifying its full // name. If the parent namespace has aliases, we add another alias for each // of them. - if t2.Get("default") != nil && t1.Get(include.Namespace) == nil { + if t2.Get(&Call{Task: "default"}) != nil && t1.Get(&Call{Task: include.Namespace}) == nil { defaultTaskName := fmt.Sprintf("%s:default", include.Namespace) - t1.Get(defaultTaskName).Aliases = append(t1.Get(defaultTaskName).Aliases, include.Namespace) - t1.Get(defaultTaskName).Aliases = append(t1.Get(defaultTaskName).Aliases, include.Aliases...) + defaultTaskCall := &Call{Task: defaultTaskName} + t1.Get(defaultTaskCall).Aliases = append(t1.Get(defaultTaskCall).Aliases, include.Namespace) + t1.Get(defaultTaskCall).Aliases = append(t1.Get(defaultTaskCall).Aliases, include.Aliases...) } } diff --git a/variables.go b/variables.go index 86bdecb9..1322d5c9 100644 --- a/variables.go +++ b/variables.go @@ -17,16 +17,16 @@ import ( // CompiledTask returns a copy of a task, but replacing variables in almost all // properties using the Go template package. -func (e *Executor) CompiledTask(call ast.Call) (*ast.Task, error) { +func (e *Executor) CompiledTask(call *ast.Call) (*ast.Task, error) { return e.compiledTask(call, true) } // FastCompiledTask is like CompiledTask, but it skippes dynamic variables. -func (e *Executor) FastCompiledTask(call ast.Call) (*ast.Task, error) { +func (e *Executor) FastCompiledTask(call *ast.Call) (*ast.Task, error) { return e.compiledTask(call, false) } -func (e *Executor) compiledTask(call ast.Call, evaluateShVars bool) (*ast.Task, error) { +func (e *Executor) compiledTask(call *ast.Call, evaluateShVars bool) (*ast.Task, error) { origTask, err := e.GetTask(call) if err != nil { return nil, err diff --git a/watch.go b/watch.go index 3bab8735..8b841293 100644 --- a/watch.go +++ b/watch.go @@ -21,7 +21,7 @@ import ( const defaultWatchInterval = 5 * time.Second // watchTasks start watching the given tasks -func (e *Executor) watchTasks(calls ...ast.Call) error { +func (e *Executor) watchTasks(calls ...*ast.Call) error { tasks := make([]string, len(calls)) for i, c := range calls { tasks[i] = c.Task @@ -119,24 +119,24 @@ func closeOnInterrupt(w *watcher.Watcher) { }() } -func (e *Executor) registerWatchedFiles(w *watcher.Watcher, calls ...ast.Call) error { +func (e *Executor) registerWatchedFiles(w *watcher.Watcher, calls ...*ast.Call) error { watchedFiles := w.WatchedFiles() - var registerTaskFiles func(ast.Call) error - registerTaskFiles = func(c ast.Call) error { + var registerTaskFiles func(*ast.Call) error + registerTaskFiles = func(c *ast.Call) error { task, err := e.CompiledTask(c) if err != nil { return err } for _, d := range task.Deps { - if err := registerTaskFiles(ast.Call{Task: d.Task, Vars: d.Vars}); err != nil { + if err := registerTaskFiles(&ast.Call{Task: d.Task, Vars: d.Vars}); err != nil { return err } } for _, c := range task.Cmds { if c.Task != "" { - if err := registerTaskFiles(ast.Call{Task: c.Task, Vars: c.Vars}); err != nil { + if err := registerTaskFiles(&ast.Call{Task: c.Task, Vars: c.Vars}); err != nil { return err } }