From d54789a036e1557dde5097492fa9bc3122cec597 Mon Sep 17 00:00:00 2001 From: yxxhero Date: Fri, 13 Mar 2026 13:19:10 +0800 Subject: [PATCH] fix: --include-needs should only include direct dependencies The DAG's WithDependencies option was incorrectly including transitive dependencies when only direct dependencies were requested. This fix: 1. Builds the DAG with only unfiltered releases and their dependencies 2. Uses the unfiltered release IDs as the Only parameter when IncludeNeeds is true 3. Sets WithDependencies to false since all needed releases are already in the DAG This ensures that --include-needs only includes direct dependencies of selected releases, while --include-transitive-needs continues to include all transitive dependencies. Fixes #1003 Signed-off-by: yxxhero --- pkg/state/state.go | 6 ++---- pkg/state/state_run.go | 24 +++++++++++++++++++++--- 2 files changed, 23 insertions(+), 7 deletions(-) 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 {