mirror of
				https://github.com/go-task/task.git
				synced 2025-10-30 23:58:01 +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:
		
							
								
								
									
										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]`.", | ||||
|   | ||||
		Reference in New Issue
	
	Block a user