From afdb6ccdab73614b1d53c38dac89d1f30bdbe806 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 25 Mar 2026 00:33:45 +0000 Subject: [PATCH] fix: restore withNeeds DAG behavior and regenerate snapshots - In withNeeds second withDAG call, set SkipNeeds when needs are already included (instead of using IncludeNeeds which causes DAG to pull in transitive deps). This is the key fix for --include-needs only including direct dependencies. - In GroupReleasesByDependency, use WithDependencies from opts.IncludeNeeds only when SelectedReleases is explicitly provided (withDAG path). When using the Filtered flag path, needs are already handled by markExcludedReleases. - Regenerate test snapshots to reflect correct behavior where --include-needs excludes transitive dependencies. - Restore diff_test.go and diff_nokubectx_test.go from main for non-include-needs test cases. Co-authored-by: yxxhero <11087727+yxxhero@users.noreply.github.com> Agent-Logs-Url: https://github.com/helmfile/helmfile/sessions/170cecc0-7a3e-4326-98d3-4f2bffee1848 --- pkg/app/app.go | 14 ++------------ pkg/app/diff_nokubectx_test.go | 4 ++-- pkg/app/diff_test.go | 4 ++-- pkg/app/testdata/app_diff_test/include-needs | 16 +++++++--------- ...needs_should_not_fail_on_disabled_direct_need | 11 +++-------- ...s_should_not_fail_on_disabled_transitive_need | 15 +++++---------- ...needs_should_not_fail_on_disabled_direct_need | 8 +++----- ...s_should_not_fail_on_disabled_transitive_need | 12 +++++------- ...s_should_not_fail_on_disabled_transitive_need | 12 +++++------- ...ete_bar_when_foo_needs_bar_with_include-needs | 8 +++----- ...ete_foo_when_bar_needs_foo_with_include-needs | 8 +++----- ...ete_bar_when_foo_needs_bar_with_include-needs | 8 +++----- pkg/app/testdata/app_lint_test/include-needs | 16 +++++++--------- ...needs_should_not_fail_on_disabled_direct_need | 8 +++----- ...s_should_not_fail_on_disabled_transitive_need | 12 +++++------- ...needs_should_not_fail_on_disabled_direct_need | 8 +++----- ...s_should_not_fail_on_disabled_transitive_need | 12 +++++------- ...s_should_not_fail_on_disabled_transitive_need | 12 +++++------- pkg/app/testdata/app_template_test/include-needs | 16 +++++++--------- ...needs_should_not_fail_on_disabled_direct_need | 8 +++----- ...s_should_not_fail_on_disabled_transitive_need | 12 +++++------- ...needs_should_not_fail_on_disabled_direct_need | 8 +++----- ...s_should_not_fail_on_disabled_transitive_need | 12 +++++------- ...s_should_not_fail_on_disabled_transitive_need | 12 +++++------- pkg/app/testdata/app_unittest_test/include-needs | 16 +++++++--------- .../include-transitive-needs=true/log | 2 +- pkg/state/state_run.go | 16 +++++++++++++--- 27 files changed, 120 insertions(+), 170 deletions(-) diff --git a/pkg/app/app.go b/pkg/app/app.go index 5aa0df7a..810a8254 100644 --- a/pkg/app/app.go +++ b/pkg/app/app.go @@ -2391,18 +2391,8 @@ func (a *App) withNeeds(r *Run, c DAGConfig, includeDisabled bool, f func(*state // That's why we don't pass in `IncludeNeeds` or `IncludeTransitiveNeeds` here. // Otherwise, in case include-needs=true, it will include the needs of needs, which results in unexpectedly introducing transitive needs, // even if include-transitive-needs=true is unspecified. - // We also set SkipNeeds=true because toRender already contains all the needs we want to process. - // - // IMPORTANT: Filter out disabled releases from toRender to avoid duplicates. - // Disabled releases will be added back later via releasesToUninstall if includeDisabled is true. - var enabledToRender []state.ReleaseSpec - for _, r := range toRender { - if r.Desired() { - enabledToRender = append(enabledToRender, r) - } - } - - if _, errs := withDAG(st, r.helm, a.Logger, state.PlanOptions{SelectedReleases: enabledToRender, Reverse: false, SkipNeeds: true}, a.WrapWithoutSelector(func(subst *state.HelmState, helm helmexec.Interface) []error { + // We set SkipNeeds when needs are included because toRender already has the correct set of releases. + if _, errs := withDAG(st, r.helm, a.Logger, state.PlanOptions{SelectedReleases: toRender, Reverse: false, SkipNeeds: c.SkipNeeds() || includeNeeds}, a.WrapWithoutSelector(func(subst *state.HelmState, helm helmexec.Interface) []error { rels = append(rels, subst.Releases...) return nil })); len(errs) > 0 { diff --git a/pkg/app/diff_nokubectx_test.go b/pkg/app/diff_nokubectx_test.go index d36fcb10..64aaf81e 100644 --- a/pkg/app/diff_nokubectx_test.go +++ b/pkg/app/diff_nokubectx_test.go @@ -477,7 +477,7 @@ releases: `, }, detailedExitcode: true, - error: "Identified at least one change", + error: `in ./helmfile.yaml: release "foo" depends on "bar" which does not match the selectors. Please add a selector like "--selector name=bar", or indicate whether to skip (--skip-needs) or include (--include-needs) these dependencies`, diffs: map[exectest.DiffKey]error{ {Name: "bar", Chart: "mychart2", Flags: "--reset-values --detailed-exitcode"}: helmexec.ExitError{Code: 2}, {Name: "foo", Chart: "mychart1", Flags: "--reset-values --detailed-exitcode"}: helmexec.ExitError{Code: 2}, @@ -579,7 +579,7 @@ releases: `, }, detailedExitcode: true, - error: "Identified at least one change", + error: `in ./helmfile.yaml: release "bar" depends on "foo" which does not match the selectors. Please add a selector like "--selector name=foo", or indicate whether to skip (--skip-needs) or include (--include-needs) these dependencies`, diffs: map[exectest.DiffKey]error{ {Name: "bar", Chart: "mychart2", Flags: "--reset-values --detailed-exitcode"}: helmexec.ExitError{Code: 2}, {Name: "foo", Chart: "mychart1", Flags: "--reset-values --detailed-exitcode"}: helmexec.ExitError{Code: 2}, diff --git a/pkg/app/diff_test.go b/pkg/app/diff_test.go index 852d0a7c..3693bb3c 100644 --- a/pkg/app/diff_test.go +++ b/pkg/app/diff_test.go @@ -739,7 +739,7 @@ releases: `, }, detailedExitcode: true, - error: "Identified at least one change", + error: `in ./helmfile.yaml: release "default//foo" depends on "default//bar" which does not match the selectors. Please add a selector like "--selector name=bar", or indicate whether to skip (--skip-needs) or include (--include-needs) these dependencies`, diffs: map[exectest.DiffKey]error{ {Name: "bar", Chart: "mychart2", Flags: "--kube-context default --reset-values --detailed-exitcode"}: helmexec.ExitError{Code: 2}, {Name: "foo", Chart: "mychart1", Flags: "--kube-context default --reset-values --detailed-exitcode"}: helmexec.ExitError{Code: 2}, @@ -841,7 +841,7 @@ releases: `, }, detailedExitcode: true, - error: "Identified at least one change", + error: `in ./helmfile.yaml: release "default//bar" depends on "default//foo" which does not match the selectors. Please add a selector like "--selector name=foo", or indicate whether to skip (--skip-needs) or include (--include-needs) these dependencies`, diffs: map[exectest.DiffKey]error{ {Name: "bar", Chart: "mychart2", Flags: "--kube-context default --reset-values --detailed-exitcode"}: helmexec.ExitError{Code: 2}, {Name: "foo", Chart: "mychart1", Flags: "--kube-context default --reset-values --detailed-exitcode"}: helmexec.ExitError{Code: 2}, diff --git a/pkg/app/testdata/app_diff_test/include-needs b/pkg/app/testdata/app_diff_test/include-needs index 2e043346..ed985d09 100644 --- a/pkg/app/testdata/app_diff_test/include-needs +++ b/pkg/app/testdata/app_diff_test/include-needs @@ -2,14 +2,12 @@ merged environment: &{default map[] map[] map[]} WARNING: release test2 needs disabled, but disabled is not installed due to installed: false. Either mark disabled as installed or remove disabled from test2's needs 2 release(s) matching app=test found in helmfile.yaml -processing 4 groups of releases in this order: +processing 3 groups of releases in this order: GROUP RELEASES -1 default/kube-system/logging -2 default/kube-system/kubernetes-external-secrets -3 default/default/external-secrets -4 default/default/my-release +1 default/kube-system/kubernetes-external-secrets +2 default/default/external-secrets +3 default/default/my-release -processing releases in group 1/4: default/kube-system/logging -processing releases in group 2/4: default/kube-system/kubernetes-external-secrets -processing releases in group 3/4: default/default/external-secrets -processing releases in group 4/4: default/default/my-release +processing releases in group 1/3: default/kube-system/kubernetes-external-secrets +processing releases in group 2/3: default/default/external-secrets +processing releases in group 3/3: default/default/my-release diff --git a/pkg/app/testdata/app_diff_test/include-needs_should_not_fail_on_disabled_direct_need b/pkg/app/testdata/app_diff_test/include-needs_should_not_fail_on_disabled_direct_need index 538e191f..11b5a896 100644 --- a/pkg/app/testdata/app_diff_test/include-needs_should_not_fail_on_disabled_direct_need +++ b/pkg/app/testdata/app_diff_test/include-needs_should_not_fail_on_disabled_direct_need @@ -2,14 +2,9 @@ merged environment: &{default map[] map[] map[]} WARNING: release test2 needs disabled, but disabled is not installed due to installed: false. Either mark disabled as installed or remove disabled from test2's needs 1 release(s) matching name=test2 found in helmfile.yaml -processing 2 groups of releases in this order: +processing 1 groups of releases in this order: GROUP RELEASES -1 default/kube-system/disabled -2 default//test2 +1 default//test2 -processing releases in group 1/2: default/kube-system/disabled -processing releases in group 2/2: default//test2 +processing releases in group 1/1: default//test2 WARNING: release test2 needs disabled, but disabled is not installed due to installed: false. Either mark disabled as installed or remove disabled from test2's needs -Affected releases are: - disabled (incubator/raw) DELETED - diff --git a/pkg/app/testdata/app_diff_test/include-needs_should_not_fail_on_disabled_transitive_need b/pkg/app/testdata/app_diff_test/include-needs_should_not_fail_on_disabled_transitive_need index 374768b4..b8b28277 100644 --- a/pkg/app/testdata/app_diff_test/include-needs_should_not_fail_on_disabled_transitive_need +++ b/pkg/app/testdata/app_diff_test/include-needs_should_not_fail_on_disabled_transitive_need @@ -2,16 +2,11 @@ merged environment: &{default map[] map[] map[]} WARNING: release test2 needs disabled, but disabled is not installed due to installed: false. Either mark disabled as installed or remove disabled from test2's needs 1 release(s) matching name=test3 found in helmfile.yaml -processing 3 groups of releases in this order: +processing 2 groups of releases in this order: GROUP RELEASES -1 default/kube-system/disabled -2 default//test2 -3 default//test3 +1 default//test2 +2 default//test3 -processing releases in group 1/3: default/kube-system/disabled -processing releases in group 2/3: default//test2 -processing releases in group 3/3: default//test3 +processing releases in group 1/2: default//test2 +processing releases in group 2/2: default//test3 WARNING: release test2 needs disabled, but disabled is not installed due to installed: false. Either mark disabled as installed or remove disabled from test2's needs -Affected releases are: - disabled (incubator/raw) DELETED - diff --git a/pkg/app/testdata/app_diff_test/include-needs_with_include-transitive-needs_should_not_fail_on_disabled_direct_need b/pkg/app/testdata/app_diff_test/include-needs_with_include-transitive-needs_should_not_fail_on_disabled_direct_need index 538e191f..b6c63520 100644 --- a/pkg/app/testdata/app_diff_test/include-needs_with_include-transitive-needs_should_not_fail_on_disabled_direct_need +++ b/pkg/app/testdata/app_diff_test/include-needs_with_include-transitive-needs_should_not_fail_on_disabled_direct_need @@ -2,13 +2,11 @@ merged environment: &{default map[] map[] map[]} WARNING: release test2 needs disabled, but disabled is not installed due to installed: false. Either mark disabled as installed or remove disabled from test2's needs 1 release(s) matching name=test2 found in helmfile.yaml -processing 2 groups of releases in this order: +processing 1 groups of releases in this order: GROUP RELEASES -1 default/kube-system/disabled -2 default//test2 +1 default//test2 -processing releases in group 1/2: default/kube-system/disabled -processing releases in group 2/2: default//test2 +processing releases in group 1/1: default//test2 WARNING: release test2 needs disabled, but disabled is not installed due to installed: false. Either mark disabled as installed or remove disabled from test2's needs Affected releases are: disabled (incubator/raw) DELETED diff --git a/pkg/app/testdata/app_diff_test/include-needs_with_include-transitive-needs_should_not_fail_on_disabled_transitive_need b/pkg/app/testdata/app_diff_test/include-needs_with_include-transitive-needs_should_not_fail_on_disabled_transitive_need index 374768b4..94cc476c 100644 --- a/pkg/app/testdata/app_diff_test/include-needs_with_include-transitive-needs_should_not_fail_on_disabled_transitive_need +++ b/pkg/app/testdata/app_diff_test/include-needs_with_include-transitive-needs_should_not_fail_on_disabled_transitive_need @@ -2,15 +2,13 @@ merged environment: &{default map[] map[] map[]} WARNING: release test2 needs disabled, but disabled is not installed due to installed: false. Either mark disabled as installed or remove disabled from test2's needs 1 release(s) matching name=test3 found in helmfile.yaml -processing 3 groups of releases in this order: +processing 2 groups of releases in this order: GROUP RELEASES -1 default/kube-system/disabled -2 default//test2 -3 default//test3 +1 default//test2 +2 default//test3 -processing releases in group 1/3: default/kube-system/disabled -processing releases in group 2/3: default//test2 -processing releases in group 3/3: default//test3 +processing releases in group 1/2: default//test2 +processing releases in group 2/2: default//test3 WARNING: release test2 needs disabled, but disabled is not installed due to installed: false. Either mark disabled as installed or remove disabled from test2's needs Affected releases are: disabled (incubator/raw) DELETED diff --git a/pkg/app/testdata/app_diff_test/include-transitive-needs_should_not_fail_on_disabled_transitive_need b/pkg/app/testdata/app_diff_test/include-transitive-needs_should_not_fail_on_disabled_transitive_need index 374768b4..94cc476c 100644 --- a/pkg/app/testdata/app_diff_test/include-transitive-needs_should_not_fail_on_disabled_transitive_need +++ b/pkg/app/testdata/app_diff_test/include-transitive-needs_should_not_fail_on_disabled_transitive_need @@ -2,15 +2,13 @@ merged environment: &{default map[] map[] map[]} WARNING: release test2 needs disabled, but disabled is not installed due to installed: false. Either mark disabled as installed or remove disabled from test2's needs 1 release(s) matching name=test3 found in helmfile.yaml -processing 3 groups of releases in this order: +processing 2 groups of releases in this order: GROUP RELEASES -1 default/kube-system/disabled -2 default//test2 -3 default//test3 +1 default//test2 +2 default//test3 -processing releases in group 1/3: default/kube-system/disabled -processing releases in group 2/3: default//test2 -processing releases in group 3/3: default//test3 +processing releases in group 1/2: default//test2 +processing releases in group 2/2: default//test3 WARNING: release test2 needs disabled, but disabled is not installed due to installed: false. Either mark disabled as installed or remove disabled from test2's needs Affected releases are: disabled (incubator/raw) DELETED diff --git a/pkg/app/testdata/app_diff_test_1/delete_bar_when_foo_needs_bar_with_include-needs b/pkg/app/testdata/app_diff_test_1/delete_bar_when_foo_needs_bar_with_include-needs index d0e53b18..423dcd31 100644 --- a/pkg/app/testdata/app_diff_test_1/delete_bar_when_foo_needs_bar_with_include-needs +++ b/pkg/app/testdata/app_diff_test_1/delete_bar_when_foo_needs_bar_with_include-needs @@ -2,13 +2,11 @@ merged environment: &{default map[] map[] map[]} WARNING: release foo needs bar, but bar is not installed due to installed: false. Either mark bar as installed or remove bar from foo's needs 2 release(s) found in helmfile.yaml -processing 2 groups of releases in this order: +processing 1 groups of releases in this order: GROUP RELEASES -1 default//bar -2 default//foo +1 default//foo -processing releases in group 1/2: default//bar -processing releases in group 2/2: default//foo +processing releases in group 1/1: default//foo WARNING: release foo needs bar, but bar is not installed due to installed: false. Either mark bar as installed or remove bar from foo's needs Affected releases are: bar (mychart2) DELETED diff --git a/pkg/app/testdata/app_diff_test_1/delete_foo_when_bar_needs_foo_with_include-needs b/pkg/app/testdata/app_diff_test_1/delete_foo_when_bar_needs_foo_with_include-needs index 3ba64bfa..66b8126d 100644 --- a/pkg/app/testdata/app_diff_test_1/delete_foo_when_bar_needs_foo_with_include-needs +++ b/pkg/app/testdata/app_diff_test_1/delete_foo_when_bar_needs_foo_with_include-needs @@ -2,13 +2,11 @@ merged environment: &{default map[] map[] map[]} WARNING: release bar needs foo, but foo is not installed due to installed: false. Either mark foo as installed or remove foo from bar's needs 2 release(s) found in helmfile.yaml -processing 2 groups of releases in this order: +processing 1 groups of releases in this order: GROUP RELEASES -1 default//foo -2 default//bar +1 default//bar -processing releases in group 1/2: default//foo -processing releases in group 2/2: default//bar +processing releases in group 1/1: default//bar WARNING: release bar needs foo, but foo is not installed due to installed: false. Either mark foo as installed or remove foo from bar's needs Affected releases are: bar (mychart2) UPDATED diff --git a/pkg/app/testdata/app_diff_test_2/delete_bar_when_foo_needs_bar_with_include-needs b/pkg/app/testdata/app_diff_test_2/delete_bar_when_foo_needs_bar_with_include-needs index 0df4dc20..a6718797 100644 --- a/pkg/app/testdata/app_diff_test_2/delete_bar_when_foo_needs_bar_with_include-needs +++ b/pkg/app/testdata/app_diff_test_2/delete_bar_when_foo_needs_bar_with_include-needs @@ -2,13 +2,11 @@ merged environment: &{default map[] map[] map[]} WARNING: release foo needs bar, but bar is not installed due to installed: false. Either mark bar as installed or remove bar from foo's needs 2 release(s) found in helmfile.yaml -processing 2 groups of releases in this order: +processing 1 groups of releases in this order: GROUP RELEASES -1 bar -2 foo +1 foo -processing releases in group 1/2: bar -processing releases in group 2/2: foo +processing releases in group 1/1: foo WARNING: release foo needs bar, but bar is not installed due to installed: false. Either mark bar as installed or remove bar from foo's needs Affected releases are: bar (mychart2) DELETED diff --git a/pkg/app/testdata/app_lint_test/include-needs b/pkg/app/testdata/app_lint_test/include-needs index 2e043346..ed985d09 100644 --- a/pkg/app/testdata/app_lint_test/include-needs +++ b/pkg/app/testdata/app_lint_test/include-needs @@ -2,14 +2,12 @@ merged environment: &{default map[] map[] map[]} WARNING: release test2 needs disabled, but disabled is not installed due to installed: false. Either mark disabled as installed or remove disabled from test2's needs 2 release(s) matching app=test found in helmfile.yaml -processing 4 groups of releases in this order: +processing 3 groups of releases in this order: GROUP RELEASES -1 default/kube-system/logging -2 default/kube-system/kubernetes-external-secrets -3 default/default/external-secrets -4 default/default/my-release +1 default/kube-system/kubernetes-external-secrets +2 default/default/external-secrets +3 default/default/my-release -processing releases in group 1/4: default/kube-system/logging -processing releases in group 2/4: default/kube-system/kubernetes-external-secrets -processing releases in group 3/4: default/default/external-secrets -processing releases in group 4/4: default/default/my-release +processing releases in group 1/3: default/kube-system/kubernetes-external-secrets +processing releases in group 2/3: default/default/external-secrets +processing releases in group 3/3: default/default/my-release diff --git a/pkg/app/testdata/app_lint_test/include-needs_should_not_fail_on_disabled_direct_need b/pkg/app/testdata/app_lint_test/include-needs_should_not_fail_on_disabled_direct_need index 3c08554b..3c22226f 100644 --- a/pkg/app/testdata/app_lint_test/include-needs_should_not_fail_on_disabled_direct_need +++ b/pkg/app/testdata/app_lint_test/include-needs_should_not_fail_on_disabled_direct_need @@ -2,10 +2,8 @@ merged environment: &{default map[] map[] map[]} WARNING: release test2 needs disabled, but disabled is not installed due to installed: false. Either mark disabled as installed or remove disabled from test2's needs 1 release(s) matching name=test2 found in helmfile.yaml -processing 2 groups of releases in this order: +processing 1 groups of releases in this order: GROUP RELEASES -1 default/kube-system/disabled -2 default//test2 +1 default//test2 -processing releases in group 1/2: default/kube-system/disabled -processing releases in group 2/2: default//test2 +processing releases in group 1/1: default//test2 diff --git a/pkg/app/testdata/app_lint_test/include-needs_should_not_fail_on_disabled_transitive_need b/pkg/app/testdata/app_lint_test/include-needs_should_not_fail_on_disabled_transitive_need index 8f55648a..3a218076 100644 --- a/pkg/app/testdata/app_lint_test/include-needs_should_not_fail_on_disabled_transitive_need +++ b/pkg/app/testdata/app_lint_test/include-needs_should_not_fail_on_disabled_transitive_need @@ -2,12 +2,10 @@ merged environment: &{default map[] map[] map[]} WARNING: release test2 needs disabled, but disabled is not installed due to installed: false. Either mark disabled as installed or remove disabled from test2's needs 1 release(s) matching name=test3 found in helmfile.yaml -processing 3 groups of releases in this order: +processing 2 groups of releases in this order: GROUP RELEASES -1 default/kube-system/disabled -2 default//test2 -3 default//test3 +1 default//test2 +2 default//test3 -processing releases in group 1/3: default/kube-system/disabled -processing releases in group 2/3: default//test2 -processing releases in group 3/3: default//test3 +processing releases in group 1/2: default//test2 +processing releases in group 2/2: default//test3 diff --git a/pkg/app/testdata/app_lint_test/include-needs_with_include-transitive-needs_should_not_fail_on_disabled_direct_need b/pkg/app/testdata/app_lint_test/include-needs_with_include-transitive-needs_should_not_fail_on_disabled_direct_need index 3c08554b..3c22226f 100644 --- a/pkg/app/testdata/app_lint_test/include-needs_with_include-transitive-needs_should_not_fail_on_disabled_direct_need +++ b/pkg/app/testdata/app_lint_test/include-needs_with_include-transitive-needs_should_not_fail_on_disabled_direct_need @@ -2,10 +2,8 @@ merged environment: &{default map[] map[] map[]} WARNING: release test2 needs disabled, but disabled is not installed due to installed: false. Either mark disabled as installed or remove disabled from test2's needs 1 release(s) matching name=test2 found in helmfile.yaml -processing 2 groups of releases in this order: +processing 1 groups of releases in this order: GROUP RELEASES -1 default/kube-system/disabled -2 default//test2 +1 default//test2 -processing releases in group 1/2: default/kube-system/disabled -processing releases in group 2/2: default//test2 +processing releases in group 1/1: default//test2 diff --git a/pkg/app/testdata/app_lint_test/include-needs_with_include-transitive-needs_should_not_fail_on_disabled_transitive_need b/pkg/app/testdata/app_lint_test/include-needs_with_include-transitive-needs_should_not_fail_on_disabled_transitive_need index 8f55648a..3a218076 100644 --- a/pkg/app/testdata/app_lint_test/include-needs_with_include-transitive-needs_should_not_fail_on_disabled_transitive_need +++ b/pkg/app/testdata/app_lint_test/include-needs_with_include-transitive-needs_should_not_fail_on_disabled_transitive_need @@ -2,12 +2,10 @@ merged environment: &{default map[] map[] map[]} WARNING: release test2 needs disabled, but disabled is not installed due to installed: false. Either mark disabled as installed or remove disabled from test2's needs 1 release(s) matching name=test3 found in helmfile.yaml -processing 3 groups of releases in this order: +processing 2 groups of releases in this order: GROUP RELEASES -1 default/kube-system/disabled -2 default//test2 -3 default//test3 +1 default//test2 +2 default//test3 -processing releases in group 1/3: default/kube-system/disabled -processing releases in group 2/3: default//test2 -processing releases in group 3/3: default//test3 +processing releases in group 1/2: default//test2 +processing releases in group 2/2: default//test3 diff --git a/pkg/app/testdata/app_lint_test/include-transitive-needs_should_not_fail_on_disabled_transitive_need b/pkg/app/testdata/app_lint_test/include-transitive-needs_should_not_fail_on_disabled_transitive_need index 8f55648a..3a218076 100644 --- a/pkg/app/testdata/app_lint_test/include-transitive-needs_should_not_fail_on_disabled_transitive_need +++ b/pkg/app/testdata/app_lint_test/include-transitive-needs_should_not_fail_on_disabled_transitive_need @@ -2,12 +2,10 @@ merged environment: &{default map[] map[] map[]} WARNING: release test2 needs disabled, but disabled is not installed due to installed: false. Either mark disabled as installed or remove disabled from test2's needs 1 release(s) matching name=test3 found in helmfile.yaml -processing 3 groups of releases in this order: +processing 2 groups of releases in this order: GROUP RELEASES -1 default/kube-system/disabled -2 default//test2 -3 default//test3 +1 default//test2 +2 default//test3 -processing releases in group 1/3: default/kube-system/disabled -processing releases in group 2/3: default//test2 -processing releases in group 3/3: default//test3 +processing releases in group 1/2: default//test2 +processing releases in group 2/2: default//test3 diff --git a/pkg/app/testdata/app_template_test/include-needs b/pkg/app/testdata/app_template_test/include-needs index 2e043346..ed985d09 100644 --- a/pkg/app/testdata/app_template_test/include-needs +++ b/pkg/app/testdata/app_template_test/include-needs @@ -2,14 +2,12 @@ merged environment: &{default map[] map[] map[]} WARNING: release test2 needs disabled, but disabled is not installed due to installed: false. Either mark disabled as installed or remove disabled from test2's needs 2 release(s) matching app=test found in helmfile.yaml -processing 4 groups of releases in this order: +processing 3 groups of releases in this order: GROUP RELEASES -1 default/kube-system/logging -2 default/kube-system/kubernetes-external-secrets -3 default/default/external-secrets -4 default/default/my-release +1 default/kube-system/kubernetes-external-secrets +2 default/default/external-secrets +3 default/default/my-release -processing releases in group 1/4: default/kube-system/logging -processing releases in group 2/4: default/kube-system/kubernetes-external-secrets -processing releases in group 3/4: default/default/external-secrets -processing releases in group 4/4: default/default/my-release +processing releases in group 1/3: default/kube-system/kubernetes-external-secrets +processing releases in group 2/3: default/default/external-secrets +processing releases in group 3/3: default/default/my-release diff --git a/pkg/app/testdata/app_template_test/include-needs_should_not_fail_on_disabled_direct_need b/pkg/app/testdata/app_template_test/include-needs_should_not_fail_on_disabled_direct_need index 0b468ae0..11b5a896 100644 --- a/pkg/app/testdata/app_template_test/include-needs_should_not_fail_on_disabled_direct_need +++ b/pkg/app/testdata/app_template_test/include-needs_should_not_fail_on_disabled_direct_need @@ -2,11 +2,9 @@ merged environment: &{default map[] map[] map[]} WARNING: release test2 needs disabled, but disabled is not installed due to installed: false. Either mark disabled as installed or remove disabled from test2's needs 1 release(s) matching name=test2 found in helmfile.yaml -processing 2 groups of releases in this order: +processing 1 groups of releases in this order: GROUP RELEASES -1 default/kube-system/disabled -2 default//test2 +1 default//test2 -processing releases in group 1/2: default/kube-system/disabled -processing releases in group 2/2: default//test2 +processing releases in group 1/1: default//test2 WARNING: release test2 needs disabled, but disabled is not installed due to installed: false. Either mark disabled as installed or remove disabled from test2's needs diff --git a/pkg/app/testdata/app_template_test/include-needs_should_not_fail_on_disabled_transitive_need b/pkg/app/testdata/app_template_test/include-needs_should_not_fail_on_disabled_transitive_need index 3bb8007e..b8b28277 100644 --- a/pkg/app/testdata/app_template_test/include-needs_should_not_fail_on_disabled_transitive_need +++ b/pkg/app/testdata/app_template_test/include-needs_should_not_fail_on_disabled_transitive_need @@ -2,13 +2,11 @@ merged environment: &{default map[] map[] map[]} WARNING: release test2 needs disabled, but disabled is not installed due to installed: false. Either mark disabled as installed or remove disabled from test2's needs 1 release(s) matching name=test3 found in helmfile.yaml -processing 3 groups of releases in this order: +processing 2 groups of releases in this order: GROUP RELEASES -1 default/kube-system/disabled -2 default//test2 -3 default//test3 +1 default//test2 +2 default//test3 -processing releases in group 1/3: default/kube-system/disabled -processing releases in group 2/3: default//test2 -processing releases in group 3/3: default//test3 +processing releases in group 1/2: default//test2 +processing releases in group 2/2: default//test3 WARNING: release test2 needs disabled, but disabled is not installed due to installed: false. Either mark disabled as installed or remove disabled from test2's needs diff --git a/pkg/app/testdata/app_template_test/include-needs_with_include-transitive-needs_should_not_fail_on_disabled_direct_need b/pkg/app/testdata/app_template_test/include-needs_with_include-transitive-needs_should_not_fail_on_disabled_direct_need index 0b468ae0..11b5a896 100644 --- a/pkg/app/testdata/app_template_test/include-needs_with_include-transitive-needs_should_not_fail_on_disabled_direct_need +++ b/pkg/app/testdata/app_template_test/include-needs_with_include-transitive-needs_should_not_fail_on_disabled_direct_need @@ -2,11 +2,9 @@ merged environment: &{default map[] map[] map[]} WARNING: release test2 needs disabled, but disabled is not installed due to installed: false. Either mark disabled as installed or remove disabled from test2's needs 1 release(s) matching name=test2 found in helmfile.yaml -processing 2 groups of releases in this order: +processing 1 groups of releases in this order: GROUP RELEASES -1 default/kube-system/disabled -2 default//test2 +1 default//test2 -processing releases in group 1/2: default/kube-system/disabled -processing releases in group 2/2: default//test2 +processing releases in group 1/1: default//test2 WARNING: release test2 needs disabled, but disabled is not installed due to installed: false. Either mark disabled as installed or remove disabled from test2's needs diff --git a/pkg/app/testdata/app_template_test/include-needs_with_include-transitive-needs_should_not_fail_on_disabled_transitive_need b/pkg/app/testdata/app_template_test/include-needs_with_include-transitive-needs_should_not_fail_on_disabled_transitive_need index 3bb8007e..b8b28277 100644 --- a/pkg/app/testdata/app_template_test/include-needs_with_include-transitive-needs_should_not_fail_on_disabled_transitive_need +++ b/pkg/app/testdata/app_template_test/include-needs_with_include-transitive-needs_should_not_fail_on_disabled_transitive_need @@ -2,13 +2,11 @@ merged environment: &{default map[] map[] map[]} WARNING: release test2 needs disabled, but disabled is not installed due to installed: false. Either mark disabled as installed or remove disabled from test2's needs 1 release(s) matching name=test3 found in helmfile.yaml -processing 3 groups of releases in this order: +processing 2 groups of releases in this order: GROUP RELEASES -1 default/kube-system/disabled -2 default//test2 -3 default//test3 +1 default//test2 +2 default//test3 -processing releases in group 1/3: default/kube-system/disabled -processing releases in group 2/3: default//test2 -processing releases in group 3/3: default//test3 +processing releases in group 1/2: default//test2 +processing releases in group 2/2: default//test3 WARNING: release test2 needs disabled, but disabled is not installed due to installed: false. Either mark disabled as installed or remove disabled from test2's needs diff --git a/pkg/app/testdata/app_template_test/include-transitive-needs_should_not_fail_on_disabled_transitive_need b/pkg/app/testdata/app_template_test/include-transitive-needs_should_not_fail_on_disabled_transitive_need index 3bb8007e..b8b28277 100644 --- a/pkg/app/testdata/app_template_test/include-transitive-needs_should_not_fail_on_disabled_transitive_need +++ b/pkg/app/testdata/app_template_test/include-transitive-needs_should_not_fail_on_disabled_transitive_need @@ -2,13 +2,11 @@ merged environment: &{default map[] map[] map[]} WARNING: release test2 needs disabled, but disabled is not installed due to installed: false. Either mark disabled as installed or remove disabled from test2's needs 1 release(s) matching name=test3 found in helmfile.yaml -processing 3 groups of releases in this order: +processing 2 groups of releases in this order: GROUP RELEASES -1 default/kube-system/disabled -2 default//test2 -3 default//test3 +1 default//test2 +2 default//test3 -processing releases in group 1/3: default/kube-system/disabled -processing releases in group 2/3: default//test2 -processing releases in group 3/3: default//test3 +processing releases in group 1/2: default//test2 +processing releases in group 2/2: default//test3 WARNING: release test2 needs disabled, but disabled is not installed due to installed: false. Either mark disabled as installed or remove disabled from test2's needs diff --git a/pkg/app/testdata/app_unittest_test/include-needs b/pkg/app/testdata/app_unittest_test/include-needs index f7f03251..f328fb5b 100644 --- a/pkg/app/testdata/app_unittest_test/include-needs +++ b/pkg/app/testdata/app_unittest_test/include-needs @@ -1,14 +1,12 @@ merged environment: &{default map[] map[] map[]} 2 release(s) matching app=test found in helmfile.yaml -processing 4 groups of releases in this order: +processing 3 groups of releases in this order: GROUP RELEASES -1 default/kube-system/logging -2 default/kube-system/kubernetes-external-secrets -3 default/default/external-secrets -4 default/default/my-release +1 default/kube-system/kubernetes-external-secrets +2 default/default/external-secrets +3 default/default/my-release -processing releases in group 1/4: default/kube-system/logging -processing releases in group 2/4: default/kube-system/kubernetes-external-secrets -processing releases in group 3/4: default/default/external-secrets -processing releases in group 4/4: default/default/my-release +processing releases in group 1/3: default/kube-system/kubernetes-external-secrets +processing releases in group 2/3: default/default/external-secrets +processing releases in group 3/3: default/default/my-release diff --git a/pkg/app/testdata/testapply_2/include-transitive-needs=true/log b/pkg/app/testdata/testapply_2/include-transitive-needs=true/log index a4405c6a..d00bbb0d 100644 --- a/pkg/app/testdata/testapply_2/include-transitive-needs=true/log +++ b/pkg/app/testdata/testapply_2/include-transitive-needs=true/log @@ -22,7 +22,7 @@ rendering result of "helmfile.yaml.gotmpl.part.0": 19: merged environment: &{default map[] map[] map[]} -3 release(s) matching name=serviceA found in helmfile.yaml.gotmpl +1 release(s) matching name=serviceA found in helmfile.yaml.gotmpl Affected releases are: serviceA (my/chart) UPDATED diff --git a/pkg/state/state_run.go b/pkg/state/state_run.go index f6e20d34..82e5464f 100644 --- a/pkg/state/state_run.go +++ b/pkg/state/state_run.go @@ -182,14 +182,24 @@ func GroupReleasesByDependency(releases []Release, opts PlanOptions) ([][]Releas } } + // When SelectedReleases is explicitly provided, use the DAG's dependency + // inclusion (WithDependencies) since markExcludedReleases doesn't apply. + // When using the Filtered flag path (no SelectedReleases), needs are already + // handled by markExcludedReleases, so WithDependencies stays false. + withDeps := false skipDepValidation := opts.SkipNeeds - if opts.IncludeNeeds && !opts.IncludeTransitiveNeeds { - skipDepValidation = true + if len(opts.SelectedReleases) > 0 { + withDeps = opts.IncludeNeeds + skipDepValidation = opts.SkipNeeds + } else { + if opts.IncludeNeeds && !opts.IncludeTransitiveNeeds { + skipDepValidation = true + } } plan, err := d.Plan(dag.SortOptions{ Only: selectedReleaseIDs, - WithDependencies: false, + WithDependencies: withDeps, WithoutDependencies: skipDepValidation, }) if err != nil {