diff --git a/task.go b/task.go index 8d54a065..40f7661a 100644 --- a/task.go +++ b/task.go @@ -412,7 +412,6 @@ func (e *Executor) FindMatchingTasks(call *Call) []*MatchingTask { return matchingTasks } // Attempt a wildcard match - // For now, we can just nil check the task before each loop for _, value := range e.Taskfile.Tasks.All(nil) { if match, wildcards := value.WildcardMatch(call.Task); match { matchingTasks = append(matchingTasks, &MatchingTask{ @@ -430,23 +429,12 @@ func (e *Executor) FindMatchingTasks(call *Call) []*MatchingTask { func (e *Executor) GetTask(call *Call) (*ast.Task, error) { // Search for a matching task matchingTasks := e.FindMatchingTasks(call) - switch len(matchingTasks) { - case 0: // Carry on - case 1: + if len(matchingTasks) > 0 { if call.Vars == nil { call.Vars = ast.NewVars() } call.Vars.Set("MATCH", ast.Var{Value: matchingTasks[0].Wildcards}) return matchingTasks[0].Task, nil - default: - taskNames := make([]string, len(matchingTasks)) - for i, matchingTask := range matchingTasks { - taskNames[i] = matchingTask.Task.Task - } - return nil, &errors.TaskNameConflictError{ - Call: call.Task, - TaskNames: taskNames, - } } // If didn't find one, search for a task with a matching alias diff --git a/task_test.go b/task_test.go index 0a2c9821..94109c32 100644 --- a/task_test.go +++ b/task_test.go @@ -3196,9 +3196,9 @@ func TestWildcard(t *testing.T) { wantErr: true, }, { - name: "multiple matches", - call: "wildcard-foo-bar", - wantErr: true, + name: "multiple matches", + call: "wildcard-foo-bar", + expectedOutput: "Hello foo-bar\n", }, } diff --git a/website/docs/usage.mdx b/website/docs/usage.mdx index a894df42..6c480902 100644 --- a/website/docs/usage.mdx +++ b/website/docs/usage.mdx @@ -1682,36 +1682,45 @@ clear what they contain: version: '3' tasks: - echo-*: + start:*:*: vars: - TEXT: '{{index .MATCH 0}}' + SERVICE: "{{index .MATCH 0}}" + REPLICAS: "{{index .MATCH 1}}" cmds: - - echo {{.TEXT}} + - echo "Starting {{.SERVICE}} with {{.REPLICAS}} replicas" - run-*-*: + start:*: vars: - ARG_1: '{{index .MATCH 0}}' - ARG_2: '{{index .MATCH 1}}' + SERVICE: "{{index .MATCH 0}}" cmds: - - echo {{.ARG_1}} {{.ARG_2}} + - echo "Starting {{.SERVICE}}" ``` +This call matches the `start:*` task and the string "foo" is captured by the +wildcard and stored in the `.MATCH` variable. We then index the `.MATCH` array +and store the result in the `.SERVICE` variable which is then echoed out in the +cmds: + ```shell -# This call matches the "echo-*" task and the string "hello" is captured by the -# wildcard and stored in the .MATCH variable. We then index the .MATCH array and -# store the result in the .TEXT variable which is then echoed out in the cmds. -$ task echo-hello -hello -# You can use whitespace in your arguments as long as you quote the task name -$ task "echo-hello world" -hello world -# And you can pass multiple arguments -$ task run-foo-bar -foo bar +$ task start:foo +Starting foo ``` -If multiple matching tasks are found, an error occurs. If you are using included -Taskfiles, tasks in parent files will be considered first. +You can use whitespace in your arguments as long as you quote the task name: + +```shell +$ task "start:foo bar" +Starting foo bar +``` + +If multiple matching tasks are found, the first one listed in the Taskfile will +be used. If you are using included Taskfiles, tasks in parent files will be +considered first. + +```shell +$ task start:foo:3 +Starting foo with 3 replicas +``` ## Doing task cleanup with `defer`