@@ -325,6 +325,21 @@ func decodeDeletePolicy(releaseMap map[string]any) (deletePolicyInput, error) {
325325}
326326
327327func resolveReleaseLifecycle (input releasePolicyInput , operation string , emitMigrationWarning bool ) (releaseLifecycleResolution , error ) {
328+ resolution , err := resolveReleaseLifecycleBase (input , operation , emitMigrationWarning )
329+ if err != nil {
330+ return releaseLifecycleResolution {}, err
331+ }
332+ if err := validateAndDeriveLifecycle (& resolution ); err != nil {
333+ return releaseLifecycleResolution {}, err
334+ }
335+ return resolution , nil
336+ }
337+
338+ // resolveReleaseLifecycleBase applies configuration precedence without deriving
339+ // cross-field values. Callers that overlay CLI flags must do so before the
340+ // single validateAndDeriveLifecycle pass, otherwise a derived watcher strategy
341+ // loses both its source hookOnly value and the explanation for the promotion.
342+ func resolveReleaseLifecycleBase (input releasePolicyInput , operation string , emitMigrationWarning bool ) (releaseLifecycleResolution , error ) {
328343 resolution := releaseLifecycleResolution {
329344 Policy : defaultReleasePolicy (operation ),
330345 TimeoutField : "built-in default" ,
@@ -359,9 +374,6 @@ func resolveReleaseLifecycle(input releasePolicyInput, operation string, emitMig
359374 Message : "helm release timeout is omitted; this release preserves 0s, but the default will become 5m in the next minor release" ,
360375 })
361376 }
362- if err := validateAndDeriveLifecycle (& resolution ); err != nil {
363- return releaseLifecycleResolution {}, err
364- }
365377 return resolution , nil
366378}
367379
@@ -448,7 +460,7 @@ func validateAndDeriveLifecycle(resolution *releaseLifecycleResolution) error {
448460// resolveReleaseLifecycleWithFlags resolves configuration for the selected
449461// action, then overlays only explicitly supplied CLI values at highest priority.
450462func resolveReleaseLifecycleWithFlags (input releasePolicyInput , operation string , flags map [string ]any ) (releaseLifecycleResolution , error ) {
451- resolution , err := resolveReleaseLifecycle (input , operation , true )
463+ resolution , err := resolveReleaseLifecycleBase (input , operation , true )
452464 if err != nil {
453465 return releaseLifecycleResolution {}, err
454466 }
@@ -502,7 +514,6 @@ func resolveReleaseLifecycleWithFlags(input releasePolicyInput, operation string
502514 resolution .Policy .CleanupOnFailure = value
503515 }
504516
505- resolution .Warnings = removeLifecycleWarning (resolution .Warnings , warningWaitDerived )
506517 if err := validateAndDeriveLifecycle (& resolution ); err != nil {
507518 return releaseLifecycleResolution {}, err
508519 }
0 commit comments