diff --git a/src/core/state.go b/src/core/state.go index 025a5518ee..1d5cbd0fff 100644 --- a/src/core/state.go +++ b/src/core/state.go @@ -286,11 +286,20 @@ func (state *BuildState) NumDone() int { // from the set of original targets. func (state *BuildState) ExpandOriginalTargets() BuildLabels { ret := BuildLabels{} + addPackage := func(pkg *Package) { + for _, target := range pkg.Targets { + if target.ShouldInclude(state.Include, state.Exclude) && (!state.NeedTests || target.IsTest) { + ret = append(ret, target.Label) + } + } + } for _, label := range state.OriginalTargets { if label.IsAllTargets() { - for _, target := range state.Graph.PackageOrDie(label.PackageName).Targets { - if target.ShouldInclude(state.Include, state.Exclude) && (!state.NeedTests || target.IsTest) { - ret = append(ret, target.Label) + addPackage(state.Graph.PackageOrDie(label.PackageName)) + } else if label.IsAllSubpackages() { + for name, pkg := range state.Graph.PackageMap() { + if label.Includes(BuildLabel{PackageName: name}) { + addPackage(pkg) } } } else { diff --git a/src/core/state_test.go b/src/core/state_test.go index aaa904e909..6d69a2ae30 100644 --- a/src/core/state_test.go +++ b/src/core/state_test.go @@ -58,6 +58,19 @@ func TestExpandVisibleOriginalTargets(t *testing.T) { assert.Equal(t, state.ExpandVisibleOriginalTargets(), BuildLabels{{"src/core", "target1"}}) } +func TestExpandOriginalSubTargets(t *testing.T) { + state := NewBuildState(1, nil, 4, DefaultConfiguration()) + state.OriginalTargets = []BuildLabel{{"src/core", "..."}} + state.Include = []string{"go"} + state.Exclude = []string{"py"} + addTarget(state, "//src/core:target1", "go") + addTarget(state, "//src/core:target2", "py") + addTarget(state, "//src/core/tests:target3", "go") + // Only the one target comes out here; it must be a test and otherwise follows + // the same include / exclude logic as the previous test. + assert.Equal(t, state.ExpandOriginalTargets(), BuildLabels{{"src/core", "target1"}, {"src/core/tests", "target3"}}) +} + func TestComparePendingTasks(t *testing.T) { p := func(taskType TaskType) pendingTask { return pendingTask{Type: taskType} } // NB. "Higher priority" means the task comes first, does not refer to numeric values.