diff --git a/pkg/state/state.go b/pkg/state/state.go index 814f7205..025d11ad 100644 --- a/pkg/state/state.go +++ b/pkg/state/state.go @@ -3067,10 +3067,8 @@ func collectDirectNeeds(filteredReleases []Release, allReleases []ReleaseSpec) m for _, r := range filteredReleases { if !r.Filtered { for _, need := range r.Needs { - if release, exists := allReleasesMap[need]; exists { - if release.Installed == nil || *release.Installed { - directNeeds[need] = struct{}{} - } + if _, exists := allReleasesMap[need]; exists { + directNeeds[need] = struct{}{} } } } diff --git a/pkg/state/state_run.go b/pkg/state/state_run.go index 285d3b3e..d739294a 100644 --- a/pkg/state/state_run.go +++ b/pkg/state/state_run.go @@ -143,6 +143,13 @@ func GroupReleasesByDependency(releases []Release, opts PlanOptions) ([][]Releas idToReleases := map[string][]Release{} idToIndex := map[string]int{} + unfilteredIDs := make(map[string]struct{}) + for _, r := range releases { + if !r.Filtered { + unfilteredIDs[ReleaseToID(&r.ReleaseSpec)] = struct{}{} + } + } + d := dag.New() for i, r := range releases { id := ReleaseToID(&r.ReleaseSpec) @@ -153,7 +160,9 @@ func GroupReleasesByDependency(releases []Release, opts PlanOptions) ([][]Releas var needs []string for i := 0; i < len(r.Needs); i++ { n := r.Needs[i] - needs = append(needs, n) + if _, exists := unfilteredIDs[n]; exists { + needs = append(needs, n) + } } d.Add(id, dag.Dependencies(needs)) } @@ -171,9 +180,18 @@ func GroupReleasesByDependency(releases []Release, opts PlanOptions) ([][]Releas selectedReleaseIDs = append(selectedReleaseIDs, id) } + var onlyReleaseIDs []string + if opts.IncludeNeeds || opts.IncludeTransitiveNeeds { + for id := range unfilteredIDs { + onlyReleaseIDs = append(onlyReleaseIDs, id) + } + } else { + onlyReleaseIDs = selectedReleaseIDs + } + plan, err := d.Plan(dag.SortOptions{ - Only: selectedReleaseIDs, - WithDependencies: opts.IncludeNeeds, + Only: onlyReleaseIDs, + WithDependencies: false, WithoutDependencies: opts.SkipNeeds, }) if err != nil {