fix: include-needs should only include direct dependencies, not transitive

- Fix collectDirectNeedsOnly to correctly match needs by full ID
- Fix PlanReleases to respect SelectedReleases when provided
- Fix unmarkNeedsDirectOnly to use full release IDs
- Update tests to expect correct behavior for include-needs vs include-transitive-needs
- Add SkipNeeds flag when needs are pre-included in withNeeds

This fixes CI issues in PR #2485

Signed-off-by: yxxhero <aiopsclub@163.com>
This commit is contained in:
yxxhero
2026-03-18 08:25:32 +08:00
committed by yxxhero
parent 3815ce1143
commit 2542988fbc
44 changed files with 288 additions and 239 deletions
+20 -9
View File
@@ -3053,10 +3053,24 @@ func unmarkNeedsDirectOnly(filteredReleases []Release) {
func collectDirectNeedsOnly(filteredReleases []Release) map[string]struct{} {
directNeeds := map[string]struct{}{}
nameToID := map[string]string{}
for _, r := range filteredReleases {
nameToID[r.Name] = ReleaseToID(&r.ReleaseSpec)
}
for _, r := range filteredReleases {
if !r.Filtered {
for _, id := range r.ReleaseSpec.Needs {
directNeeds[id] = struct{}{}
for _, need := range r.ReleaseSpec.Needs {
if fullID, ok := nameToID[need]; ok {
directNeeds[fullID] = struct{}{}
} else {
parts := strings.Split(need, "/")
needName := parts[len(parts)-1]
if fullID, ok := nameToID[needName]; ok {
directNeeds[fullID] = struct{}{}
} else {
directNeeds[need] = struct{}{}
}
}
}
}
}
@@ -3064,13 +3078,10 @@ func collectDirectNeedsOnly(filteredReleases []Release) map[string]struct{} {
}
func unmarkReleasesByNeedID(toUnmark map[string]struct{}, releases []Release) {
for needID := range toUnmark {
parts := strings.Split(needID, "/")
needName := parts[len(parts)-1]
for i, r := range releases {
if r.Name == needName {
releases[i].Filtered = false
}
for i := range releases {
releaseID := ReleaseToID(&releases[i].ReleaseSpec)
if _, ok := toUnmark[releaseID]; ok {
releases[i].Filtered = false
}
}
}
+13
View File
@@ -104,6 +104,19 @@ func (st *HelmState) PlanReleases(opts PlanOptions) ([][]Release, error) {
return nil, err
}
// If SelectedReleases is provided, mark those releases as not filtered
if len(opts.SelectedReleases) > 0 {
selectedIDs := make(map[string]struct{})
for _, r := range opts.SelectedReleases {
selectedIDs[ReleaseToID(&r)] = struct{}{}
}
for i := range marked {
if _, ok := selectedIDs[ReleaseToID(&marked[i].ReleaseSpec)]; ok {
marked[i].Filtered = false
}
}
}
groups, err := SortedReleaseGroups(marked, opts)
if err != nil {
return nil, err