Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package nelm for openSUSE:Factory checked in at 2026-06-28 21:07:51 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/nelm (Old) and /work/SRC/openSUSE:Factory/.nelm.new.11887 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "nelm" Sun Jun 28 21:07:51 2026 rev:28 rq:1362083 version:1.24.1 Changes: -------- --- /work/SRC/openSUSE:Factory/nelm/nelm.changes 2026-06-23 17:45:39.740330253 +0200 +++ /work/SRC/openSUSE:Factory/.nelm.new.11887/nelm.changes 2026-06-28 21:09:00.291071219 +0200 @@ -1,0 +2,8 @@ +Sun Jun 28 06:13:18 UTC 2026 - Johannes Kastl <[email protected]> + +- Update to version 1.24.1: + * Bug Fixes + - don't hard-fail on unsupported env vars (7bc4769) + - retry on webhooks unavailable error (#600) (ccde5a1) + +------------------------------------------------------------------- Old: ---- nelm-1.24.0.obscpio New: ---- nelm-1.24.1.obscpio ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ nelm.spec ++++++ --- /var/tmp/diff_new_pack.y0os5F/_old 2026-06-28 21:09:02.263137816 +0200 +++ /var/tmp/diff_new_pack.y0os5F/_new 2026-06-28 21:09:02.263137816 +0200 @@ -17,7 +17,7 @@ Name: nelm -Version: 1.24.0 +Version: 1.24.1 Release: 0 Summary: Helm 3 alternative License: Apache-2.0 ++++++ _service ++++++ --- /var/tmp/diff_new_pack.y0os5F/_old 2026-06-28 21:09:02.367141329 +0200 +++ /var/tmp/diff_new_pack.y0os5F/_new 2026-06-28 21:09:02.371141464 +0200 @@ -3,7 +3,7 @@ <param name="url">https://github.com/werf/nelm</param> <param name="scm">git</param> <param name="exclude">.git</param> - <param name="revision">v1.24.0</param> + <param name="revision">v1.24.1</param> <param name="versionformat">@PARENT_TAG@</param> <param name="versionrewrite-pattern">v(.*)</param> <param name="changesgenerate">enable</param> ++++++ _servicedata ++++++ --- /var/tmp/diff_new_pack.y0os5F/_old 2026-06-28 21:09:02.387142004 +0200 +++ /var/tmp/diff_new_pack.y0os5F/_new 2026-06-28 21:09:02.391142139 +0200 @@ -1,6 +1,6 @@ <servicedata> <service name="tar_scm"> <param name="url">https://github.com/werf/nelm</param> - <param name="changesrevision">d46813af382f8c1c7d3e653c44ab25e6fb481220</param></service></servicedata> + <param name="changesrevision">9366af9135202b7d705c71fef6c7dbe0231c0345</param></service></servicedata> (No newline at EOF) ++++++ nelm-1.24.0.obscpio -> nelm-1.24.1.obscpio ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/nelm-1.24.0/.pp/.gitignore new/nelm-1.24.1/.pp/.gitignore --- old/nelm-1.24.0/.pp/.gitignore 1970-01-01 01:00:00.000000000 +0100 +++ new/nelm-1.24.1/.pp/.gitignore 2026-05-12 15:56:02.000000000 +0200 @@ -0,0 +1,2 @@ +state/ +config.json diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/nelm-1.24.0/CHANGELOG.md new/nelm-1.24.1/CHANGELOG.md --- old/nelm-1.24.0/CHANGELOG.md 2026-04-21 18:08:35.000000000 +0200 +++ new/nelm-1.24.1/CHANGELOG.md 2026-05-12 15:56:02.000000000 +0200 @@ -1,5 +1,13 @@ # Changelog +## [1.24.1](https://github.com/werf/nelm/compare/v1.24.0...v1.24.1) (2026-04-29) + + +### Bug Fixes + +* don't hard-fail on unsupported env vars ([7bc4769](https://github.com/werf/nelm/commit/7bc47694c107205e8519a82f21b65a4e88cc6e33)) +* retry on webhooks unavailable error ([#600](https://github.com/werf/nelm/issues/600)) ([ccde5a1](https://github.com/werf/nelm/commit/ccde5a15521e33010f4aebcc7059b7ca2c2dcc35)) + ## [1.24.0](https://github.com/werf/nelm/compare/v1.23.2...v1.24.0) (2026-04-21) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/nelm-1.24.0/README.md new/nelm-1.24.1/README.md --- old/nelm-1.24.0/README.md 2026-04-21 18:08:35.000000000 +0200 +++ new/nelm-1.24.1/README.md 2026-05-12 15:56:02.000000000 +0200 @@ -5,7 +5,7 @@ **Nelm** is a Helm 4 alternative. It is a Kubernetes deployment tool that manages Helm Charts and deploys them to Kubernetes. It is also the deployment engine of [werf](https://github.com/werf/werf). Nelm does everything that Helm does, but better, and even quite some on top of it. Nelm is based on an improved and partially rewritten Helm codebase, to introduce: -* `terraform plan`-like capabilities; +* `terraform plan`-like capabilities with two-stage deployment support; * improved CRD management; * out-of-the-box secrets management; * advanced resource ordering capabilities; @@ -35,7 +35,7 @@ - [Advanced resource lifecycle capabilities](#advanced-resource-lifecycle-capabilities) - [Resource state tracking](#resource-state-tracking) - [Printing logs and events during deploy](#printing-logs-and-events-during-deploy) - - [Release planning](#release-planning) + - [Release planning and two-stage deployment workflow support](#release-planning-and-two-stage-deployment-workflow-support) - [Encrypted values and encrypted files](#encrypted-values-and-encrypted-files) - [Improved CRD management](#improved-crd-management) - [Usage](#usage) @@ -244,12 +244,23 @@ During the deployment, Nelm finds Pods of deploying resources and periodically prints their container logs. With annotation `werf.io/show-service-messages: "true"`, resource events are also printed. Can be configured with CLI flags and annotations. -### Release planning +### Release planning and two-stage deployment workflow support -`nelm release plan install` shows exactly what's going to happen in the cluster on the next release. It shows 100% accurate diffs between current and to-be resource versions, utilizing robust dry-run Server-Side Apply instead of client-side trickery. +`nelm release plan install` shows exactly what's going to happen in the cluster on the next release. It shows diffs between the current and to-be resource versions, utilizing robust dry-run Kubernetes Server-Side Apply capabilities.  +To ensure that these exact changes will be applied during the release install, you can utilize a two-stage deployment workflow: + +1. **Plan:** Generate, review, and save a plan artifact using the `--save-plan` flag: +``` +nelm release plan install --save-plan=plan.gz +``` +2. **Apply:** Perform the release install rapidly using the pre-generated reviewed plan: +``` +nelm release install --use-plan=plan.gz +``` + ### Encrypted values and encrypted files `nelm chart secret` commands manage encrypted values files such as `secret-values.yaml` or encrypted arbitrary files like `secret/mysecret.txt`. These files are decrypted in-memory during templating and can be used in templates as `.Values.my.secret.value` and `{{ werf_secret_file "mysecret.txt" }}`, respectively. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/nelm-1.24.0/cmd/nelm/main.go new/nelm-1.24.1/cmd/nelm/main.go --- old/nelm-1.24.0/cmd/nelm/main.go 2026-04-21 18:08:35.000000000 +0200 +++ new/nelm-1.24.1/cmd/nelm/main.go 2026-05-12 15:56:02.000000000 +0200 @@ -71,7 +71,7 @@ }) if unsupportedEnvVars := lo.Without(cli.FindUndefinedFlagEnvVarsInEnviron(), featGatesEnvVars...); len(unsupportedEnvVars) > 0 { - abort(ctx, fmt.Errorf("unsupported environment variable(s): %s", strings.Join(unsupportedEnvVars, ",")), 1) + log.Default.Warn(ctx, "Unsupported environment variable(s): %s", strings.Join(unsupportedEnvVars, ",")) } if err := rootCmd.ExecuteContext(ctx); err != nil { diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/nelm-1.24.0/pkg/action/chart_lint.go new/nelm-1.24.1/pkg/action/chart_lint.go --- old/nelm-1.24.0/pkg/action/chart_lint.go 2026-04-21 18:08:35.000000000 +0200 +++ new/nelm-1.24.1/pkg/action/chart_lint.go 2026-05-12 15:56:02.000000000 +0200 @@ -384,7 +384,7 @@ if _, err := plan.BuildPlan(instResInfos, delResInfos, relInfos, plan.BuildPlanOptions{ NoFinalTracking: opts.NoFinalTracking, }); err != nil { - return fmt.Errorf("build install plan: %w", err) + return fmt.Errorf("%w: install: %w", ErrBuildPlan, err) } return nil diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/nelm-1.24.0/pkg/action/error.go new/nelm-1.24.1/pkg/action/error.go --- old/nelm-1.24.0/pkg/action/error.go 2026-04-21 18:08:35.000000000 +0200 +++ new/nelm-1.24.1/pkg/action/error.go 2026-05-12 15:56:02.000000000 +0200 @@ -1,6 +1,11 @@ package action -import "fmt" +import ( + "errors" + "fmt" +) + +var ErrBuildPlan = errors.New("build plan") type ReleaseNotFoundError struct { ReleaseName string diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/nelm-1.24.0/pkg/action/release_install.go new/nelm-1.24.1/pkg/action/release_install.go --- old/nelm-1.24.0/pkg/action/release_install.go 2026-04-21 18:08:35.000000000 +0200 +++ new/nelm-1.24.1/pkg/action/release_install.go 2026-05-12 15:56:02.000000000 +0200 @@ -487,7 +487,7 @@ if err != nil { handleBuildPlanErr(ctx, installPlan, err, opts.InstallGraphPath, opts.TempDirPath, "release-install-graph.dot") - return fmt.Errorf("build install plan: %w", err) + return fmt.Errorf("%w: install: %w", ErrBuildPlan, err) } } @@ -896,7 +896,7 @@ NoFinalTracking: opts.NoFinalTracking, }) if err != nil { - return nil, nonCritErrs, critErrs.Add(fmt.Errorf("build rollback plan: %w", err)) + return nil, nonCritErrs, critErrs.Add(fmt.Errorf("%w: rollback: %w", ErrBuildPlan, err)) } if opts.RollbackGraphPath != "" { diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/nelm-1.24.0/pkg/action/release_plan_install.go new/nelm-1.24.1/pkg/action/release_plan_install.go --- old/nelm-1.24.0/pkg/action/release_plan_install.go 2026-04-21 18:08:35.000000000 +0200 +++ new/nelm-1.24.1/pkg/action/release_plan_install.go 2026-05-12 15:56:02.000000000 +0200 @@ -394,7 +394,7 @@ if err != nil { handleBuildPlanErr(ctx, installPlan, err, opts.InstallGraphPath, opts.TempDirPath, "release-install-graph.dot") - return fmt.Errorf("build install plan: %w", err) + return fmt.Errorf("%w: install: %w", ErrBuildPlan, err) } if opts.InstallGraphPath != "" { diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/nelm-1.24.0/pkg/action/release_rollback.go new/nelm-1.24.1/pkg/action/release_rollback.go --- old/nelm-1.24.0/pkg/action/release_rollback.go 2026-04-21 18:08:35.000000000 +0200 +++ new/nelm-1.24.1/pkg/action/release_rollback.go 2026-05-12 15:56:02.000000000 +0200 @@ -327,7 +327,7 @@ if err != nil { handleBuildPlanErr(ctx, installPlan, err, opts.RollbackGraphPath, opts.TempDirPath, "release-rollback-graph.dot") - return fmt.Errorf("build install plan: %w", err) + return fmt.Errorf("%w: install: %w", ErrBuildPlan, err) } if opts.RollbackGraphPath != "" { diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/nelm-1.24.0/pkg/action/release_uninstall.go new/nelm-1.24.1/pkg/action/release_uninstall.go --- old/nelm-1.24.0/pkg/action/release_uninstall.go 2026-04-21 18:08:35.000000000 +0200 +++ new/nelm-1.24.1/pkg/action/release_uninstall.go 2026-05-12 15:56:02.000000000 +0200 @@ -258,7 +258,7 @@ if err != nil { handleBuildPlanErr(ctx, deletePlan, err, opts.UninstallGraphPath, opts.TempDirPath, "release-uninstall-graph.dot") - return fmt.Errorf("build delete plan: %w", err) + return fmt.Errorf("%w: delete: %w", ErrBuildPlan, err) } if opts.UninstallGraphPath != "" { diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/nelm-1.24.0/pkg/kube/client_kube.go new/nelm-1.24.1/pkg/kube/client_kube.go --- old/nelm-1.24.0/pkg/kube/client_kube.go 2026-04-21 18:08:35.000000000 +0200 +++ new/nelm-1.24.1/pkg/kube/client_kube.go 2026-05-12 15:56:02.000000000 +0200 @@ -4,6 +4,7 @@ "context" "fmt" "sync" + "time" "github.com/jellydator/ttlcache/v3" "github.com/samber/lo" @@ -12,6 +13,7 @@ "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" "k8s.io/apimachinery/pkg/runtime/schema" "k8s.io/apimachinery/pkg/types" + kvwait "k8s.io/apimachinery/pkg/util/wait" "k8s.io/client-go/discovery" "k8s.io/client-go/dynamic" "k8s.io/client-go/kubernetes" @@ -78,11 +80,29 @@ log.Default.Debug(ctx, "Server-side %sapplying resource %q", lo.Ternary(opts.DryRun, "dry-run ", ""), resSpec.IDHuman()) - resultObj, err := clientResource.Apply(ctx, resSpec.Name, resSpec.Unstruct, metav1.ApplyOptions{ - DryRun: dryRun, - Force: true, - FieldManager: common.DefaultFieldManager, - }) + var resultObj *unstructured.Unstructured + + applyFn := func() error { + var applyErr error + + resultObj, applyErr = clientResource.Apply(ctx, resSpec.Name, resSpec.Unstruct, metav1.ApplyOptions{ + DryRun: dryRun, + Force: true, + FieldManager: common.DefaultFieldManager, + }) + if applyErr != nil { + return fmt.Errorf("server-side apply: %w", applyErr) + } + + return nil + } + + if opts.RetryOnWebhookError { + err = retryOnWebhookErr(ctx, applyFn) + } else { + err = applyFn() + } + if err != nil { if !opts.DryRun { c.clusterCache.Set(resSpec.IDWithVersion(), &clusterCacheEntry{err: err}, 0) @@ -125,10 +145,28 @@ log.Default.Debug(ctx, "Server-side applying resource %q", resSpec.IDHuman()) - resultObj, err := clientResource.Apply(ctx, resSpec.Name, resSpec.Unstruct, metav1.ApplyOptions{ - Force: true, - FieldManager: common.DefaultFieldManager, - }) + var resultObj *unstructured.Unstructured + + createFn := func() error { + var createErr error + + resultObj, createErr = clientResource.Apply(ctx, resSpec.Name, resSpec.Unstruct, metav1.ApplyOptions{ + Force: true, + FieldManager: common.DefaultFieldManager, + }) + if createErr != nil { + return fmt.Errorf("server-side apply: %w", createErr) + } + + return nil + } + + if opts.RetryOnWebhookError { + err = retryOnWebhookErr(ctx, createFn) + } else { + err = createFn() + } + if err != nil { c.clusterCache.Set(resSpec.IDWithVersion(), &clusterCacheEntry{err: err}, 0) @@ -285,13 +323,15 @@ } type KubeClientCreateOptions struct { - DefaultNamespace string - ForceReplicas *int + DefaultNamespace string + ForceReplicas *int + RetryOnWebhookError bool } type KubeClientApplyOptions struct { - DefaultNamespace string - DryRun bool + DefaultNamespace string + DryRun bool + RetryOnWebhookError bool } type KubeClientMergePatchOptions struct { @@ -307,3 +347,26 @@ err error obj *unstructured.Unstructured } + +func retryOnWebhookErr(ctx context.Context, fn func() error) error { + retryCtx, cancel := context.WithTimeout(ctx, 2*time.Minute) + defer cancel() + + if err := kvwait.PollUntilContextCancel(retryCtx, 2*time.Second, true, func(ctx context.Context) (bool, error) { + if err := fn(); err != nil { + if IsWebhookErr(err) { + log.Default.Debug(ctx, "Retrying due to webhook error: %s", err) + + return false, nil + } + + return false, err + } + + return true, nil + }); err != nil { + return fmt.Errorf("retry on webhook error: %w", err) + } + + return nil +} diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/nelm-1.24.0/pkg/kube/error.go new/nelm-1.24.1/pkg/kube/error.go --- old/nelm-1.24.0/pkg/kube/error.go 2026-04-21 18:08:35.000000000 +0200 +++ new/nelm-1.24.1/pkg/kube/error.go 2026-05-12 15:56:02.000000000 +0200 @@ -19,3 +19,7 @@ func IsNotFoundErr(err error) bool { return err != nil && errors.IsNotFound(err) } + +func IsWebhookErr(err error) bool { + return err != nil && strings.Contains(err.Error(), "failed calling webhook") +} diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/nelm-1.24.0/pkg/plan/plan_execute.go new/nelm-1.24.1/pkg/plan/plan_execute.go --- old/nelm-1.24.0/pkg/plan/plan_execute.go 2026-04-21 18:08:35.000000000 +0200 +++ new/nelm-1.24.1/pkg/plan/plan_execute.go 2026-05-12 15:56:02.000000000 +0200 @@ -186,8 +186,9 @@ } if _, err := clientFactory.KubeClient().Create(ctx, opConfig.ResourceSpec, kube.KubeClientCreateOptions{ - DefaultNamespace: releaseNamespace, - ForceReplicas: opConfig.ForceReplicas, + DefaultNamespace: releaseNamespace, + ForceReplicas: opConfig.ForceReplicas, + RetryOnWebhookError: true, }); err != nil { return fmt.Errorf("create resource: %w", err) } @@ -297,7 +298,8 @@ opConfig := op.Config.(*OperationConfigApply) if _, err := clientFactory.KubeClient().Apply(ctx, opConfig.ResourceSpec, kube.KubeClientApplyOptions{ - DefaultNamespace: releaseNamespace, + DefaultNamespace: releaseNamespace, + RetryOnWebhookError: true, }); err != nil { return fmt.Errorf("apply resource: %w", err) } @@ -309,8 +311,9 @@ opConfig := op.Config.(*OperationConfigCreate) if _, err := clientFactory.KubeClient().Create(ctx, opConfig.ResourceSpec, kube.KubeClientCreateOptions{ - DefaultNamespace: releaseNamespace, - ForceReplicas: opConfig.ForceReplicas, + DefaultNamespace: releaseNamespace, + ForceReplicas: opConfig.ForceReplicas, + RetryOnWebhookError: true, }); err != nil { return fmt.Errorf("create resource: %w", err) } @@ -355,7 +358,8 @@ opConfig := op.Config.(*OperationConfigUpdate) if _, err := clientFactory.KubeClient().Apply(ctx, opConfig.ResourceSpec, kube.KubeClientApplyOptions{ - DefaultNamespace: releaseNamespace, + DefaultNamespace: releaseNamespace, + RetryOnWebhookError: true, }); err != nil { return fmt.Errorf("apply resource: %w", err) } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/nelm-1.24.0/pkg/plan/resource_info.go new/nelm-1.24.1/pkg/plan/resource_info.go --- old/nelm-1.24.0/pkg/plan/resource_info.go 2026-04-21 18:08:35.000000000 +0200 +++ new/nelm-1.24.1/pkg/plan/resource_info.go 2026-05-12 15:56:02.000000000 +0200 @@ -258,7 +258,9 @@ DefaultNamespace: releaseNamespace, }) if err != nil { - if kube.IsNotFoundErr(err) { + if kube.IsNotFoundErr(err) || kube.IsWebhookErr(err) { + log.Default.Debug(ctx, "Skipping managed fields fix for resource %q due to transient error: %s", localRes.IDHuman(), err) + return getObj, nil } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/nelm-1.24.0/pkg/resource/metadata.go new/nelm-1.24.1/pkg/resource/metadata.go --- old/nelm-1.24.0/pkg/resource/metadata.go 2026-04-21 18:08:35.000000000 +0200 +++ new/nelm-1.24.1/pkg/resource/metadata.go 2026-05-12 15:56:02.000000000 +0200 @@ -73,10 +73,6 @@ for on := range conditions { conditions[on] = []common.Stage{common.StagePrePreInstall} } - } else if spec.IsWebhook(meta.GroupVersionKind.GroupKind()) && !hasManualInternalDeps { - for on := range conditions { - conditions[on] = []common.Stage{common.StagePostPostInstall} - } } return conditions @@ -88,10 +84,6 @@ for on := range conditions { conditions[on] = []common.Stage{common.StagePrePreInstall} } - } else if spec.IsWebhook(meta.GroupVersionKind.GroupKind()) && !hasManualInternalDeps { - for on := range conditions { - conditions[on] = []common.Stage{common.StagePostPostInstall} - } } return conditions @@ -104,12 +96,6 @@ common.InstallOnUpgrade: {common.StagePrePreInstall}, common.InstallOnRollback: {common.StagePrePreInstall}, } - } else if spec.IsWebhook(meta.GroupVersionKind.GroupKind()) && !hasManualInternalDeps { - return map[common.On][]common.Stage{ - common.InstallOnInstall: {common.StagePostPostInstall}, - common.InstallOnUpgrade: {common.StagePostPostInstall}, - common.InstallOnRollback: {common.StagePostPostInstall}, - } } return map[common.On][]common.Stage{ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/nelm-1.24.0/pkg/resource/validate.go new/nelm-1.24.1/pkg/resource/validate.go --- old/nelm-1.24.0/pkg/resource/validate.go 2026-04-21 18:08:35.000000000 +0200 +++ new/nelm-1.24.1/pkg/resource/validate.go 2026-05-12 15:56:02.000000000 +0200 @@ -17,12 +17,16 @@ "github.com/werf/nelm/pkg/util" ) -var errDecode = errors.New("decode") +var ( + ErrResourceDuplicatesFound = errors.New("validate for no duplicated resources") + + errDecode = errors.New("decode") +) // Can be called even without cluster access. func ValidateLocal(ctx context.Context, releaseNamespace string, transformedResources []*InstallableResource, opts common.ResourceValidationOptions) error { if err := validateNoDuplicates(releaseNamespace, transformedResources); err != nil { - return fmt.Errorf("validate for no duplicated resources: %w", err) + return fmt.Errorf("%w: %w", ErrResourceDuplicatesFound, err) } if featgate.FeatGateResourceValidation.Enabled() && !opts.NoResourceValidation { diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/nelm-1.24.0/trdl_channels.yaml new/nelm-1.24.1/trdl_channels.yaml --- old/nelm-1.24.0/trdl_channels.yaml 2026-04-21 18:08:35.000000000 +0200 +++ new/nelm-1.24.1/trdl_channels.yaml 2026-05-12 15:56:02.000000000 +0200 @@ -2,12 +2,12 @@ - name: "1" channels: - name: alpha - version: 1.23.2 + version: 1.24.0 - name: beta - version: 1.22.0 + version: 1.23.2 - name: ea version: 1.22.0 - name: stable - version: 1.21.0 + version: 1.22.0 - name: rock-solid - version: 1.20.1 + version: 1.21.0 ++++++ nelm.obsinfo ++++++ --- /var/tmp/diff_new_pack.y0os5F/_old 2026-06-28 21:09:03.919193751 +0200 +++ /var/tmp/diff_new_pack.y0os5F/_new 2026-06-28 21:09:03.923193887 +0200 @@ -1,5 +1,5 @@ name: nelm -version: 1.24.0 -mtime: 1776787715 -commit: d46813af382f8c1c7d3e653c44ab25e6fb481220 +version: 1.24.1 +mtime: 1778594162 +commit: 9366af9135202b7d705c71fef6c7dbe0231c0345 ++++++ vendor.tar.gz ++++++ /work/SRC/openSUSE:Factory/nelm/vendor.tar.gz /work/SRC/openSUSE:Factory/.nelm.new.11887/vendor.tar.gz differ: char 13, line 1
