diff --git a/cli/internal/context/context.go b/cli/internal/context/context.go index 028293bee1346..144b86dc4aa0a 100644 --- a/cli/internal/context/context.go +++ b/cli/internal/context/context.go @@ -64,7 +64,7 @@ type Context struct { Lockfile *fs.YarnLockfile SCC [][]dag.Vertex PendingTaskNodes dag.Set - Targets util.Set + Targets []string Backend *api.LanguageBackend // Used to arbitrate access to the graph. We parallelise most build operations // and Go maps aren't natively threadsafe so this is needed. @@ -355,7 +355,9 @@ func (c *Context) ResolveWorkspaceRootDeps() (*fs.PackageJSON, error) { return pkg, nil } -func GetTargetsFromArguments(arguments []string, configJson *fs.TurboConfigJSON) (util.Set, error) { +// GetTargetsFromArguments returns a list of targets from the arguments and Turbo config. +// Return targets are always unique sorted alphabetically. +func GetTargetsFromArguments(arguments []string, configJson *fs.TurboConfigJSON) ([]string, error) { targets := make(util.Set) for _, arg := range arguments { if arg == "--" { @@ -370,11 +372,13 @@ func GetTargetsFromArguments(arguments []string, configJson *fs.TurboConfigJSON) } } if !found { - return nil, fmt.Errorf("Task `%v` not found in turbo pipeline in package.json. Are you sure you added it?", arg) + return nil, fmt.Errorf("task `%v` not found in turbo pipeline in package.json. Are you sure you added it?", arg) } } } - return targets, nil + stringTargets := targets.UnsafeListOfStrings() + sort.Strings(stringTargets) + return stringTargets, nil } func (c *Context) populateTopologicGraphForPackageJson(pkg *fs.PackageJSON) error { diff --git a/cli/internal/context/context_test.go b/cli/internal/context/context_test.go index 979af4bdd72cc..d4c3843c5b776 100644 --- a/cli/internal/context/context_test.go +++ b/cli/internal/context/context_test.go @@ -86,8 +86,9 @@ func TestGetTargetsFromArguments(t *testing.T) { t.Errorf("GetTargetsFromArguments() error = %v, wantErr %v", err, tt.wantErr) return } - if !reflect.DeepEqual(got.UnsafeListOfStrings(), tt.want) { - t.Errorf("GetTargetsFromArguments() = %v, want %v", got.UnsafeListOfStrings(), tt.want) + + if !reflect.DeepEqual(got, tt.want) { + t.Errorf("GetTargetsFromArguments() = %v, want %v", got, tt.want) } }) } diff --git a/cli/internal/run/run.go b/cli/internal/run/run.go index 3b886897a90a8..b3cef7ff0042d 100644 --- a/cli/internal/run/run.go +++ b/cli/internal/run/run.go @@ -332,11 +332,7 @@ func (c *RunCommand) Run(args []string) int { } if runOptions.stream { - targetList := make([]string, ctx.Targets.Len()) - for i, v := range ctx.Targets.List() { - targetList[i] = v.(string) - } - c.Ui.Output(fmt.Sprintf("%s %s %s", ui.Dim("• Running"), ui.Dim(ui.Bold(strings.Join(targetList, ", "))), ui.Dim(fmt.Sprintf("in %v packages", filteredPkgs.Len())))) + c.Ui.Output(fmt.Sprintf("%s %s %s", ui.Dim("• Running"), ui.Dim(ui.Bold(strings.Join(ctx.Targets, ", "))), ui.Dim(fmt.Sprintf("in %v packages", filteredPkgs.Len())))) } runState := NewRunState(runOptions) runState.Listen(c.Ui, time.Now()) @@ -598,7 +594,7 @@ func (c *RunCommand) Run(args []string) int { if err := engine.Prepare(&core.SchedulerExecutionOptions{ Packages: filteredPkgs.UnsafeListOfStrings(), - TaskNames: ctx.Targets.UnsafeListOfStrings(), + TaskNames: ctx.Targets, Concurrency: runOptions.concurrency, Parallel: runOptions.parallel, TasksOnly: runOptions.only,