diff --git a/task.go b/task.go index 5c63de34..b1830142 100644 --- a/task.go +++ b/task.go @@ -235,13 +235,15 @@ func (e *Executor) RunTask(ctx context.Context, call *ast.Call) error { } } - if t.Prompt != "" && !e.Dry { - if err := e.Logger.Prompt(logger.Yellow, t.Prompt, "n", "y", "yes"); errors.Is(err, logger.ErrNoTerminal) { - return &errors.TaskCancelledNoTerminalError{TaskName: call.Task} - } else if errors.Is(err, logger.ErrPromptCancelled) { - return &errors.TaskCancelledByUserError{TaskName: call.Task} - } else if err != nil { - return err + for _, p := range t.Prompt { + if p != "" && !e.Dry { + if err := e.Logger.Prompt(logger.Yellow, p, "n", "y", "yes"); errors.Is(err, logger.ErrNoTerminal) { + return &errors.TaskCancelledNoTerminalError{TaskName: call.Task} + } else if errors.Is(err, logger.ErrPromptCancelled) { + return &errors.TaskCancelledByUserError{TaskName: call.Task} + } else if err != nil { + return err + } } } diff --git a/taskfile/ast/prompt.go b/taskfile/ast/prompt.go new file mode 100644 index 00000000..073ec05e --- /dev/null +++ b/taskfile/ast/prompt.go @@ -0,0 +1,29 @@ +package ast + +import ( + "gopkg.in/yaml.v3" + + "github.com/go-task/task/v3/errors" +) + +type Prompt []string + +func (p *Prompt) UnmarshalYAML(node *yaml.Node) error { + switch node.Kind { + case yaml.ScalarNode: + var str string + if err := node.Decode(&str); err != nil { + return errors.NewTaskfileDecodeError(err, node) + } + *p = []string{str} + return nil + case yaml.SequenceNode: + var list []string + if err := node.Decode(&list); err != nil { + return errors.NewTaskfileDecodeError(err, node) + } + *p = list + return nil + } + return errors.NewTaskfileDecodeError(nil, node).WithTypeMessage("prompt") +} diff --git a/taskfile/ast/task.go b/taskfile/ast/task.go index de6986c6..17fa976a 100644 --- a/taskfile/ast/task.go +++ b/taskfile/ast/task.go @@ -18,7 +18,7 @@ type Task struct { Deps []*Dep Label string Desc string - Prompt string + Prompt Prompt Summary string Requires *Requires Aliases []string @@ -115,7 +115,7 @@ func (t *Task) UnmarshalYAML(node *yaml.Node) error { Deps []*Dep Label string Desc string - Prompt string + Prompt Prompt Summary string Aliases []string Sources []*Glob diff --git a/testdata/prompt/Taskfile.yml b/testdata/prompt/Taskfile.yml index 4fdd4dde..806e1233 100644 --- a/testdata/prompt/Taskfile.yml +++ b/testdata/prompt/Taskfile.yml @@ -14,3 +14,10 @@ tasks: prompt: Do you want to continue? cmds: - echo 'show-prompt' + + multi-prompt: + prompt: + - Do you want to continue? + - Are you sure? + cmds: + - echo 'multi-prompt' diff --git a/website/docs/reference/schema.mdx b/website/docs/reference/schema.mdx index e67a033c..7066f545 100644 --- a/website/docs/reference/schema.mdx +++ b/website/docs/reference/schema.mdx @@ -88,7 +88,7 @@ vars: | `deps` | [`[]Dependency`](#dependency) | | A list of dependencies of this task. Tasks defined here will run in parallel before this task. | | `label` | `string` | | Overrides the name of the task in the output when a task is run. Supports variables. | | `desc` | `string` | | A short description of the task. This is displayed when calling `task --list`. | -| `prompt` | `string` | | A prompt that will be presented before a task is run. Declining will cancel running the current and any subsequent tasks. | +| `prompt` | `[]string` | | One or more prompts that will be presented before a task is run. Declining will cancel running the current and any subsequent tasks. | | `summary` | `string` | | A longer description of the task. This is displayed when calling `task --summary [task]`. | | `aliases` | `[]string` | | A list of alternative names by which the task can be called. | | `sources` | `[]string` | | A list of sources to check before running this task. Relevant for `checksum` and `timestamp` methods. Can be file paths or star globs. | diff --git a/website/docs/usage.mdx b/website/docs/usage.mdx index 0cb12c24..da9d99c5 100644 --- a/website/docs/usage.mdx +++ b/website/docs/usage.mdx @@ -1878,6 +1878,24 @@ tasks: task: "This is a dangerous command... Do you want to continue?" [y/N] ``` +Prompts can be a single value or a list of prompts, like below: + +```yaml +version: '3' + +tasks: + example: + cmds: + - task: dangerous + + dangerous: + prompt: + - This is a dangerous command... Do you want to continue? + - Are you sure? + cmds: + - echo 'dangerous command' +``` + Warning prompts are called before executing a task. If a prompt is denied Task will exit with [exit code](/api#exit-codes) 205. If approved, Task will continue as normal. diff --git a/website/static/schema.json b/website/static/schema.json index b2b2d875..913e0368 100644 --- a/website/static/schema.json +++ b/website/static/schema.json @@ -59,8 +59,18 @@ "type": "string" }, "prompt": { - "description": "A prompt that will be presented before a task is run. Declining will cancel running the current and any subsequent tasks.", - "type": "string" + "description": "One or more prompts that will be presented before a task is run. Declining will cancel running the current and any subsequent tasks.", + "oneOf": [ + { + "type": "string" + }, + { + "type": "array", + "items": { + "type": "string" + } + } + ] }, "summary": { "description": "A longer description of the task. This is displayed when calling `task --summary [task]`.",