mirror of
https://github.com/go-task/task.git
synced 2024-12-04 10:24:45 +02:00
feat: allow providing single or multi prompts (#1866)
* Add new type to handle single or multi prompts * update docs * apply review
This commit is contained in:
parent
c4f708b222
commit
5581954fb1
16
task.go
16
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
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
29
taskfile/ast/prompt.go
Normal file
29
taskfile/ast/prompt.go
Normal file
@ -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")
|
||||
}
|
@ -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
|
||||
|
7
testdata/prompt/Taskfile.yml
vendored
7
testdata/prompt/Taskfile.yml
vendored
@ -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'
|
||||
|
@ -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. |
|
||||
|
@ -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.
|
||||
|
@ -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]`.",
|
||||
|
Loading…
Reference in New Issue
Block a user