mirror of
				https://github.com/go-task/task.git
				synced 2025-10-30 23:58:01 +02:00 
			
		
		
		
	feat: better error handling for duplicate edges and fixed tests
This commit is contained in:
		| @@ -19,6 +19,7 @@ const ( | ||||
| 	CodeTaskfileCacheNotFound | ||||
| 	CodeTaskfileVersionCheckError | ||||
| 	CodeTaskfileNetworkTimeout | ||||
| 	CodeTaskfileDuplicateInclude | ||||
| ) | ||||
|  | ||||
| // Task related exit codes | ||||
|   | ||||
| @@ -3,6 +3,7 @@ package errors | ||||
| import ( | ||||
| 	"fmt" | ||||
| 	"net/http" | ||||
| 	"strings" | ||||
| 	"time" | ||||
|  | ||||
| 	"github.com/Masterminds/semver/v3" | ||||
| @@ -174,3 +175,19 @@ func (err *TaskfileNetworkTimeoutError) Error() string { | ||||
| func (err *TaskfileNetworkTimeoutError) Code() int { | ||||
| 	return CodeTaskfileNetworkTimeout | ||||
| } | ||||
|  | ||||
| type TaskfileDuplicateIncludeError struct { | ||||
| 	URI         string | ||||
| 	IncludedURI string | ||||
| 	Namespaces  []string | ||||
| } | ||||
|  | ||||
| func (err *TaskfileDuplicateIncludeError) Error() string { | ||||
| 	return fmt.Sprintf( | ||||
| 		`task: Taskfile %q attempted to include %q multiple times with namespaces: %s`, err.URI, err.IncludedURI, strings.Join(err.Namespaces, ", "), | ||||
| 	) | ||||
| } | ||||
|  | ||||
| func (err *TaskfileDuplicateIncludeError) Code() int { | ||||
| 	return CodeTaskfileDuplicateInclude | ||||
| } | ||||
|   | ||||
| @@ -981,8 +981,8 @@ func TestIncludes(t *testing.T) { | ||||
| 			"included_directory.txt":                    "included_directory", | ||||
| 			"included_directory_without_dir.txt":        "included_directory_without_dir", | ||||
| 			"included_taskfile_without_dir.txt":         "included_taskfile_without_dir", | ||||
| 			"./module2/included_directory_with_dir.txt": "included_directory_with_dir", | ||||
| 			"./module2/included_taskfile_with_dir.txt":  "included_taskfile_with_dir", | ||||
| 			"./module3/included_taskfile_with_dir.txt":  "included_taskfile_with_dir", | ||||
| 			"./module4/included_directory_with_dir.txt": "included_directory_with_dir", | ||||
| 			"os_include.txt":                            "os", | ||||
| 		}, | ||||
| 	} | ||||
|   | ||||
| @@ -141,7 +141,19 @@ func (r *Reader) include(node Node) error { | ||||
| 			} | ||||
|  | ||||
| 			// Create an edge between the Taskfiles | ||||
| 			return r.graph.AddEdge(node.Location(), includeNode.Location()) | ||||
| 			err = r.graph.AddEdge(node.Location(), includeNode.Location()) | ||||
| 			if errors.Is(err, graph.ErrEdgeAlreadyExists) { | ||||
| 				edge, err := r.graph.Edge(node.Location(), includeNode.Location()) | ||||
| 				if err != nil { | ||||
| 					return err | ||||
| 				} | ||||
| 				return &errors.TaskfileDuplicateIncludeError{ | ||||
| 					URI:         node.Location(), | ||||
| 					IncludedURI: includeNode.Location(), | ||||
| 					Namespaces:  []string{namespace, edge.Properties.Data.(*ast.Include).Namespace}, | ||||
| 				} | ||||
| 			} | ||||
| 			return err | ||||
| 		}) | ||||
| 		return nil | ||||
| 	}) | ||||
|   | ||||
							
								
								
									
										12
									
								
								testdata/includes/Taskfile.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										12
									
								
								testdata/includes/Taskfile.yml
									
									
									
									
										vendored
									
									
								
							| @@ -6,13 +6,13 @@ includes: | ||||
|   included_without_dir: | ||||
|     taskfile:  ./module1 | ||||
|   included_taskfile_without_dir: | ||||
|     taskfile:  ./module1/Taskfile.yml | ||||
|   included_with_dir: | ||||
|     taskfile:  ./module2 | ||||
|     dir:  ./module2 | ||||
|   included_taskfile_with_dir: | ||||
|     taskfile:  ./module2/Taskfile.yml | ||||
|     dir:  ./module2 | ||||
|   included_with_dir: | ||||
|     taskfile:  ./module3 | ||||
|     dir:  ./module3 | ||||
|   included_taskfile_with_dir: | ||||
|     taskfile:  ./module4/Taskfile.yml | ||||
|     dir:  ./module4 | ||||
|   included_os: ./Taskfile_{{OS}}.yml | ||||
|  | ||||
| tasks: | ||||
|   | ||||
							
								
								
									
										4
									
								
								testdata/includes/module1/Taskfile.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										4
									
								
								testdata/includes/module1/Taskfile.yml
									
									
									
									
										vendored
									
									
								
							| @@ -1,10 +1,6 @@ | ||||
| version: '3' | ||||
|  | ||||
| tasks: | ||||
|   gen_dir: | ||||
|     cmds: | ||||
|       - echo included_directory_without_dir > included_directory_without_dir.txt | ||||
|  | ||||
|   gen_file: | ||||
|     cmds: | ||||
|       - echo included_taskfile_without_dir > included_taskfile_without_dir.txt | ||||
|   | ||||
							
								
								
									
										6
									
								
								testdata/includes/module2/Taskfile.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										6
									
								
								testdata/includes/module2/Taskfile.yml
									
									
									
									
										vendored
									
									
								
							| @@ -3,8 +3,4 @@ version: '3' | ||||
| tasks: | ||||
|   gen_dir: | ||||
|     cmds: | ||||
|       - echo included_directory_with_dir > included_directory_with_dir.txt | ||||
|  | ||||
|   gen_file: | ||||
|     cmds: | ||||
|       - echo included_taskfile_with_dir > included_taskfile_with_dir.txt | ||||
|       - echo included_directory_without_dir > included_directory_without_dir.txt | ||||
|   | ||||
							
								
								
									
										6
									
								
								testdata/includes/module3/Taskfile.yml
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								testdata/includes/module3/Taskfile.yml
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,6 @@ | ||||
| version: '3' | ||||
|  | ||||
| tasks: | ||||
|   gen_file: | ||||
|     cmds: | ||||
|       - echo included_taskfile_with_dir > included_taskfile_with_dir.txt | ||||
							
								
								
									
										6
									
								
								testdata/includes/module4/Taskfile.yml
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								testdata/includes/module4/Taskfile.yml
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,6 @@ | ||||
| version: '3' | ||||
|  | ||||
| tasks: | ||||
|   gen_dir: | ||||
|     cmds: | ||||
|       - echo included_directory_with_dir > included_directory_with_dir.txt | ||||
		Reference in New Issue
	
	Block a user