fix: deterministic ordering of required var prompts (#2871)

This commit is contained in:
Christian Provenzano
2026-06-07 10:36:58 -04:00
committed by GitHub
parent 81d621d8aa
commit b455286b63

View File

@@ -3,6 +3,8 @@ package task
import ( import (
"slices" "slices"
"github.com/elliotchance/orderedmap/v3"
"github.com/go-task/task/v3/errors" "github.com/go-task/task/v3/errors"
"github.com/go-task/task/v3/internal/input" "github.com/go-task/task/v3/internal/input"
"github.com/go-task/task/v3/internal/term" "github.com/go-task/task/v3/internal/term"
@@ -32,7 +34,7 @@ func (e *Executor) promptDepsVars(calls []*Call) error {
// Collect all missing vars from the dependency tree // Collect all missing vars from the dependency tree
visited := make(map[string]bool) visited := make(map[string]bool)
varsMap := make(map[string]*ast.VarsWithValidation) varsMap := orderedmap.NewOrderedMap[string, *ast.VarsWithValidation]()
var collect func(call *Call) error var collect func(call *Call) error
collect = func(call *Call) error { collect = func(call *Call) error {
@@ -42,8 +44,8 @@ func (e *Executor) promptDepsVars(calls []*Call) error {
} }
for _, v := range getMissingRequiredVars(compiledTask) { for _, v := range getMissingRequiredVars(compiledTask) {
if _, exists := varsMap[v.Name]; !exists { if !varsMap.Has(v.Name) {
varsMap[v.Name] = v varsMap.Set(v.Name, v)
} }
} }
@@ -73,14 +75,14 @@ func (e *Executor) promptDepsVars(calls []*Call) error {
} }
} }
if len(varsMap) == 0 { if varsMap.Len() == 0 {
return nil return nil
} }
prompter := e.newPrompter() prompter := e.newPrompter()
e.promptedVars = ast.NewVars() e.promptedVars = ast.NewVars()
for _, v := range varsMap { for v := range varsMap.Values() {
value, err := prompter.Prompt(v.Name, getEnumValues(v.Enum)) value, err := prompter.Prompt(v.Name, getEnumValues(v.Enum))
if err != nil { if err != nil {
if errors.Is(err, input.ErrCancelled) { if errors.Is(err, input.ErrCancelled) {