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-02-20 17:46:31 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/nelm (Old) and /work/SRC/openSUSE:Factory/.nelm.new.1977 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "nelm" Fri Feb 20 17:46:31 2026 rev:23 rq:1334179 version:1.20.0 Changes: -------- --- /work/SRC/openSUSE:Factory/nelm/nelm.changes 2026-02-05 18:02:12.048139083 +0100 +++ /work/SRC/openSUSE:Factory/.nelm.new.1977/nelm.changes 2026-02-20 17:54:19.824824234 +0100 @@ -1,0 +2,11 @@ +Fri Feb 20 11:33:12 UTC 2026 - Johannes Kastl <[email protected]> + +- Update to version 1.20.0: + * Features + - NELM_FEAT_MORE_DETAILED_EXIT_CODE_FOR_PLAN=true to return + exit code 3 on "no resource changes, but must install + release" if --exit-code (#515) (d24f926) + * Bug Fixes + - panic in pre/post-delete hooks tracking (#518) (f01de36) + +------------------------------------------------------------------- Old: ---- nelm-1.19.1.obscpio New: ---- nelm-1.20.0.obscpio ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ nelm.spec ++++++ --- /var/tmp/diff_new_pack.48qLRh/_old 2026-02-20 17:54:23.268968513 +0100 +++ /var/tmp/diff_new_pack.48qLRh/_new 2026-02-20 17:54:23.284969183 +0100 @@ -17,7 +17,7 @@ Name: nelm -Version: 1.19.1 +Version: 1.20.0 Release: 0 Summary: Helm 3 alternative License: Apache-2.0 ++++++ _service ++++++ --- /var/tmp/diff_new_pack.48qLRh/_old 2026-02-20 17:54:23.612982923 +0100 +++ /var/tmp/diff_new_pack.48qLRh/_new 2026-02-20 17:54:23.644984264 +0100 @@ -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.19.1</param> + <param name="revision">v1.20.0</param> <param name="versionformat">@PARENT_TAG@</param> <param name="versionrewrite-pattern">v(.*)</param> <param name="changesgenerate">enable</param> ++++++ _servicedata ++++++ --- /var/tmp/diff_new_pack.48qLRh/_old 2026-02-20 17:54:23.896994821 +0100 +++ /var/tmp/diff_new_pack.48qLRh/_new 2026-02-20 17:54:23.952997167 +0100 @@ -1,6 +1,6 @@ <servicedata> <service name="tar_scm"> <param name="url">https://github.com/werf/nelm</param> - <param name="changesrevision">0b2816ba60ef9b7492a05aeec97aa71670cba19b</param></service></servicedata> + <param name="changesrevision">8de8880a68c18113efc41a636a30513aaea8a02d</param></service></servicedata> (No newline at EOF) ++++++ nelm-1.19.1.obscpio -> nelm-1.20.0.obscpio ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/nelm-1.19.1/ARCHITECTURE.md new/nelm-1.20.0/ARCHITECTURE.md --- old/nelm-1.19.1/ARCHITECTURE.md 1970-01-01 01:00:00.000000000 +0100 +++ new/nelm-1.20.0/ARCHITECTURE.md 2025-12-23 12:44:35.000000000 +0100 @@ -0,0 +1,26 @@ +<!-- START doctoc generated TOC please keep comment here to allow auto update --> +<!-- DON'T EDIT THIS SECTION, INSTEAD RE-RUN doctoc TO UPDATE --> + +- [Overview](#overview) +- [Dependencies](#dependencies) +- [Architecture](#architecture) + +<!-- END doctoc generated TOC please keep comment here to allow auto update --> + +## Overview + +Nelm originally was just a werf deployment engine, but eventually got its own repo and CLI. Nelm is reusing parts of the Helm codebase, but most of its codebase is written from scratch. + +## Dependencies + +Nelm depends on the following projects from the "werf" organization: + +* https://github.com/werf/3p-helm is a fork of Helm with some modifications. We use some parts of this fork in Nelm. +* https://github.com/werf/kubedog is a library for tracking Kubernetes resource statuses, collecting logs and events during Nelm deployments. +* https://github.com/werf/common-go is a library with some common code shared between various werf projects. + +Nelm is pretty straightforward: no frameworks, no CGO, no code generation, and libraries we use are very common (e.g. Cobra for CLI). For the full list of dependencies look into the `go.mod` file. + +## Architecture + +TODO diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/nelm-1.19.1/CHANGELOG.md new/nelm-1.20.0/CHANGELOG.md --- old/nelm-1.19.1/CHANGELOG.md 2025-12-10 13:58:40.000000000 +0100 +++ new/nelm-1.20.0/CHANGELOG.md 2025-12-23 12:44:35.000000000 +0100 @@ -1,5 +1,17 @@ # Changelog +## [1.20.0](https://github.com/werf/nelm/compare/v1.19.1...v1.20.0) (2025-12-23) + + +### Features + +* `NELM_FEAT_MORE_DETAILED_EXIT_CODE_FOR_PLAN=true` to return exit code 3 on "no resource changes, but must install release" if `--exit-code` ([#515](https://github.com/werf/nelm/issues/515)) ([d24f926](https://github.com/werf/nelm/commit/d24f9262926b5a8fa39162bbd145b53034988f16)) + + +### Bug Fixes + +* panic in pre/post-delete hooks tracking ([#518](https://github.com/werf/nelm/issues/518)) ([f01de36](https://github.com/werf/nelm/commit/f01de366eaa93a92c556b1bb18350e25c7ba3976)) + ## [1.19.1](https://github.com/werf/nelm/compare/v1.19.0...v1.19.1) (2025-12-10) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/nelm-1.19.1/README.md new/nelm-1.20.0/README.md --- old/nelm-1.19.1/README.md 2025-12-10 13:58:40.000000000 +0100 +++ new/nelm-1.20.0/README.md 2025-12-23 12:44:35.000000000 +0100 @@ -78,9 +78,13 @@ - [`NELM_FEAT_PERIODIC_STACK_TRACES` environment variable](#nelm_feat_periodic_stack_traces-environment-variable) - [`NELM_FEAT_FIELD_SENSITIVE` environment variable](#nelm_feat_field_sensitive-environment-variable) - [`NELM_FEAT_CLEAN_NULL_FIELDS` environment variable](#nelm_feat_clean_null_fields-environment-variable) + - [`NELM_FEAT_MORE_DETAILED_EXIT_CODE_FOR_PLAN` environment variable](#nelm_feat_more_detailed_exit_code_for_plan-environment-variable) - [More documentation](#more-documentation) -- [Future plans](#future-plans) - [Limitations](#limitations) +- [Contributing](#contributing) +- [Development](#development) +- [Architecture](#architecture) +- [Future plans](#future-plans) <!-- END doctoc generated TOC please keep comment here to allow auto update --> @@ -840,10 +844,48 @@ nelm release install -n myproject -r myproject ``` +### `NELM_FEAT_MORE_DETAILED_EXIT_CODE_FOR_PLAN` environment variable + +When the `--exit-code` flag is specified for `nelm release plan install`, return exit code 3, if no resource changes planned, but release still must be installed. Previously, exit code 2 was returned in this case. + +Will be the default in the next major release. + +Example: +```shell +export NELM_FEAT_MORE_DETAILED_EXIT_CODE_FOR_PLAN=true +nelm release plan install -n myproject -r myproject --exit-code +``` + ## More documentation For documentation on regular Helm features, see [Helm docs](https://helm.sh/docs/). A lot of useful documentation can be found in [werf docs](https://werf.io/docs/v2/usage/deploy/overview.html). +## Limitations + +* Nelm requires Server-Side Apply enabled in Kubernetes. It is enabled by default since Kubernetes 1.16. In Kubernetes 1.14-1.15 it can be enabled, but disabled by default. Kubernetes 1.13 and older doesn't have Server-Side Apply, thus Nelm won't work with it. +* *Helm sometimes uses Values from the previous Helm release to deploy a new release*. This is to make Helm easier to use without a proper CI/CD process. This is dangerous, goes against IaC and this is not what users expect. Nelm will never do this: what you explicitly pass via `--values` and `--set` options will be merged with chart values files, then applied to the cluster, as expected. + +## Contributing + +For any significant change, open the issue first (or comment on an existing one) to discuss with the maintainers on what to do and how. When the solution is agreed upon, you can proceed with implementation and open a pull request. + +For small changes, such as few lines bugfixes or documentation improvements, feel free to open a pull request directly. + +For easy first issues, check the [good first issue](https://github.com/werf/nelm/issues?q=is%3Aissue%20state%3Aopen%20label%3A%22good%20first%20issue%22) tag. + +## Development + +1. Install Go: https://go.dev/doc/install +1. Install Task: https://taskfile.dev/docs/installation +1. Run `task build` to build the `bin/nelm` binary. +1. Run `task -l` to see all available tasks. + +It is recommended to run `task` with no arguments regularly, especially before committing. This will run all essential checks, i.e. build, lint, format, quick tests, and others. + +## Architecture + +For architectural overview, see [ARCHITECTURE.md](ARCHITECTURE.md). + ## Future plans - [x] Nelm CLI. @@ -859,8 +901,3 @@ - [ ] Downloading charts directly from Git. - [ ] Migrate the built-in secrets management to Mozilla SOPS ([#62](https://github.com/werf/nelm/issues/62)). - [ ] Nelmfile. - -## Limitations - -* Nelm requires Server-Side Apply enabled in Kubernetes. It is enabled by default since Kubernetes 1.16. In Kubernetes 1.14-1.15 it can be enabled, but disabled by default. Kubernetes 1.13 and older doesn't have Server-Side Apply, thus Nelm won't work with it. -* *Helm sometimes uses Values from the previous Helm release to deploy a new release*. This is to make Helm easier to use without a proper CI/CD process. This is dangerous, goes against IaC and this is not what users expect. Nelm will never do this: what you explicitly pass via `--values` and `--set` options will be merged with chart values files, then applied to the cluster, as expected. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/nelm-1.19.1/cmd/nelm/chart_upload.go new/nelm-1.20.0/cmd/nelm/chart_upload.go --- old/nelm-1.19.1/cmd/nelm/chart_upload.go 2025-12-10 13:58:40.000000000 +0100 +++ new/nelm-1.20.0/cmd/nelm/chart_upload.go 2025-12-23 12:44:35.000000000 +0100 @@ -19,8 +19,8 @@ })) cmd.LocalFlags().AddFlagSet(cmd.InheritedFlags()) - cmd.Use = "upload [chart] [remote]" - cmd.Short = "Upload a chart to a repository." + cmd.Use = "upload [archive] [remote]" + cmd.Short = "Upload a chart archive to a repository." cmd.Aliases = []string{} cli.SetSubCommandAnnotations(cmd, 40, chartCmdGroup) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/nelm-1.19.1/cmd/nelm/main.go new/nelm-1.20.0/cmd/nelm/main.go --- old/nelm-1.19.1/cmd/nelm/main.go 2025-12-10 13:58:40.000000000 +0100 +++ new/nelm-1.20.0/cmd/nelm/main.go 2025-12-23 12:44:35.000000000 +0100 @@ -58,8 +58,10 @@ if err := rootCmd.ExecuteContext(ctx); err != nil { var exitCode int - if errors.Is(err, action.ErrChangesPlanned) { + if errors.Is(err, action.ErrChangesPlanned) || errors.Is(err, action.ErrResourceChangesPlanned) { exitCode = 2 + } else if errors.Is(err, action.ErrReleaseInstallPlanned) { + exitCode = 3 } else { exitCode = 1 } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/nelm-1.19.1/cmd/nelm/release_plan_install.go new/nelm-1.20.0/cmd/nelm/release_plan_install.go --- old/nelm-1.19.1/cmd/nelm/release_plan_install.go 2025-12-10 13:58:40.000000000 +0100 +++ new/nelm-1.20.0/cmd/nelm/release_plan_install.go 2025-12-23 12:44:35.000000000 +0100 @@ -138,7 +138,14 @@ return fmt.Errorf("add flag: %w", err) } - if err := cli.AddFlag(cmd, &cfg.ErrorIfChangesPlanned, "exit-code", false, "Return exit code 0 if no changes, 1 if error, 2 if any changes planned and no error", cli.AddFlagOptions{ + var desc string + if featgate.FeatGateMoreDetailedExitCodeForPlan.Enabled() || featgate.FeatGatePreviewV2.Enabled() { + desc = "Return exit code 0 if no changes, 1 if error, 2 if resource changes planned, 3 if no resource changes planned, but release still should be installed" + } else { + desc = "Return exit code 0 if no changes, 1 if error, 2 if any changes planned" + } + + if err := cli.AddFlag(cmd, &cfg.ErrorIfChangesPlanned, "exit-code", false, desc, cli.AddFlagOptions{ Group: mainFlagGroup, }); err != nil { return fmt.Errorf("add flag: %w", err) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/nelm-1.19.1/go.mod new/nelm-1.20.0/go.mod --- old/nelm-1.19.1/go.mod 2025-12-10 13:58:40.000000000 +0100 +++ new/nelm-1.20.0/go.mod 2025-12-23 12:44:35.000000000 +0100 @@ -38,7 +38,7 @@ github.com/stretchr/testify v1.10.0 github.com/tidwall/sjson v1.2.5 github.com/wI2L/jsondiff v0.5.0 - github.com/werf/3p-helm v0.0.0-20251113141050-17dd24e6c20b + github.com/werf/3p-helm v0.0.0-20251223091030-77130d200f5c github.com/werf/common-go v0.0.0-20251113140850-a1a98e909e9b github.com/werf/kubedog v0.13.1-0.20251210123541-25b3a13e42fe github.com/werf/lockgate v0.1.1 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/nelm-1.19.1/go.sum new/nelm-1.20.0/go.sum --- old/nelm-1.19.1/go.sum 2025-12-10 13:58:40.000000000 +0100 +++ new/nelm-1.20.0/go.sum 2025-12-23 12:44:35.000000000 +0100 @@ -407,8 +407,8 @@ github.com/tidwall/sjson v1.2.5/go.mod h1:Fvgq9kS/6ociJEDnK0Fk1cpYF4FIW6ZF7LAe+6jwd28= github.com/wI2L/jsondiff v0.5.0 h1:RRMTi/mH+R2aXcPe1VYyvGINJqQfC3R+KSEakuU1Ikw= github.com/wI2L/jsondiff v0.5.0/go.mod h1:qqG6hnK0Lsrz2BpIVCxWiK9ItsBCpIZQiv0izJjOZ9s= -github.com/werf/3p-helm v0.0.0-20251113141050-17dd24e6c20b h1:O6CamSLgJSG70OLoNettCHqiJYV7/prRXHJSq4sqB3I= -github.com/werf/3p-helm v0.0.0-20251113141050-17dd24e6c20b/go.mod h1:UAmQvGZhiUULXQpigm1yqcp57s097kpAHz2EvFtKCSk= +github.com/werf/3p-helm v0.0.0-20251223091030-77130d200f5c h1:1oQ+geCG75FgIBbn7IxQT+WOD+y+qlM29DNpU7MSdMY= +github.com/werf/3p-helm v0.0.0-20251223091030-77130d200f5c/go.mod h1:UAmQvGZhiUULXQpigm1yqcp57s097kpAHz2EvFtKCSk= github.com/werf/common-go v0.0.0-20251113140850-a1a98e909e9b h1:58850oFrnw5Jy5YaB8QifXz75qpGotfx6qqZ9Q2my1A= github.com/werf/common-go v0.0.0-20251113140850-a1a98e909e9b/go.mod h1:MXS0JR9zut+oR9oEM8PEkdXXoEbKDILTmWopt0z1eZs= github.com/werf/kubedog v0.13.1-0.20251210123541-25b3a13e42fe h1:fQDk19dTi6CEue5tYR+lroJCFwFrt+zh1kO1b2pjXQo= diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/nelm-1.19.1/internal/resource/spec/resource_spec.go new/nelm-1.20.0/internal/resource/spec/resource_spec.go --- old/nelm-1.19.1/internal/resource/spec/resource_spec.go 2025-12-10 13:58:40.000000000 +0100 +++ new/nelm-1.20.0/internal/resource/spec/resource_spec.go 2025-12-23 12:44:35.000000000 +0100 @@ -28,7 +28,7 @@ func NewResourceSpec(unstruct *unstructured.Unstructured, releaseNamespace string, opts ResourceSpecOptions) *ResourceSpec { unstruct = CleanUnstruct(unstruct, CleanUnstructOptions{ - CleanNullFields: (featgate.FeatGatePreviewV2.Enabled() || featgate.FeatCleanNullFields.Enabled()) && !opts.LegacyNoCleanNullFields, + CleanNullFields: (featgate.FeatGatePreviewV2.Enabled() || featgate.FeatGateCleanNullFields.Enabled()) && !opts.LegacyNoCleanNullFields, }) if opts.StoreAs == "" { diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/nelm-1.19.1/pkg/action/release_plan_install.go new/nelm-1.20.0/pkg/action/release_plan_install.go --- old/nelm-1.19.1/pkg/action/release_plan_install.go 2025-12-10 13:58:40.000000000 +0100 +++ new/nelm-1.20.0/pkg/action/release_plan_install.go 2025-12-23 12:44:35.000000000 +0100 @@ -24,6 +24,7 @@ "github.com/werf/nelm/internal/resource/spec" "github.com/werf/nelm/internal/util" "github.com/werf/nelm/pkg/common" + "github.com/werf/nelm/pkg/featgate" "github.com/werf/nelm/pkg/log" ) @@ -31,7 +32,12 @@ DefaultReleasePlanInstallLogLevel = log.InfoLevel ) -var ErrChangesPlanned = errors.New("changes planned") +// TODO(v2): get rid +var ( + ErrChangesPlanned = errors.New("changes planned") + ErrResourceChangesPlanned = errors.New("resource changes planned") + ErrReleaseInstallPlanned = errors.New("no resource changes planned, but still must install release") +) type ReleasePlanInstallOptions struct { // Embedded option groups for connection, values, and secrets @@ -455,8 +461,20 @@ logPlannedChanges(ctx, releaseName, releaseNamespace, changes) - if opts.ErrorIfChangesPlanned && (!releaseIsUpToDate || !installPlanIsUseless) { - return ErrChangesPlanned + if opts.ErrorIfChangesPlanned { + if featgate.FeatGateMoreDetailedExitCodeForPlan.Enabled() || featgate.FeatGatePreviewV2.Enabled() { + if releaseIsUpToDate && installPlanIsUseless { + return nil + } else if installPlanIsUseless || len(changes) == 0 { + return ErrReleaseInstallPlanned + } else { + return ErrResourceChangesPlanned + } + } else { + if !releaseIsUpToDate || !installPlanIsUseless { + return ErrChangesPlanned + } + } } return nil diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/nelm-1.19.1/pkg/featgate/feat.go new/nelm-1.20.0/pkg/featgate/feat.go --- old/nelm-1.19.1/pkg/featgate/feat.go 2025-12-10 13:58:40.000000000 +0100 +++ new/nelm-1.20.0/pkg/featgate/feat.go 2025-12-23 12:44:35.000000000 +0100 @@ -43,10 +43,15 @@ `Activate all feature gates that will be enabled by default in Nelm v2`, ) - FeatCleanNullFields = NewFeatGate( + FeatGateCleanNullFields = NewFeatGate( "clean-null-fields", `Enable cleaning of null fields from resource manifests for better Helm chart compatibility`, ) + + FeatGateMoreDetailedExitCodeForPlan = NewFeatGate( + "more-detailed-exit-code-for-plan", + `Make the "plan" command with the flag "--exit-code" return an exit code 3 instead of 2 when no resource changes, but still must install the release`, + ) ) type FeatGate struct { diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/nelm-1.19.1/trdl_channels.yaml new/nelm-1.20.0/trdl_channels.yaml --- old/nelm-1.19.1/trdl_channels.yaml 2025-12-10 13:58:40.000000000 +0100 +++ new/nelm-1.20.0/trdl_channels.yaml 2025-12-23 12:44:35.000000000 +0100 @@ -2,7 +2,7 @@ - name: "1" channels: - name: alpha - version: 1.19.0 + version: 1.19.1 - name: beta version: 1.18.1 - name: ea ++++++ nelm.obsinfo ++++++ --- /var/tmp/diff_new_pack.48qLRh/_old 2026-02-20 17:54:25.673069223 +0100 +++ /var/tmp/diff_new_pack.48qLRh/_new 2026-02-20 17:54:25.697070228 +0100 @@ -1,5 +1,5 @@ name: nelm -version: 1.19.1 -mtime: 1765371520 -commit: 0b2816ba60ef9b7492a05aeec97aa71670cba19b +version: 1.20.0 +mtime: 1766490275 +commit: 8de8880a68c18113efc41a636a30513aaea8a02d ++++++ vendor.tar.gz ++++++ /work/SRC/openSUSE:Factory/nelm/vendor.tar.gz /work/SRC/openSUSE:Factory/.nelm.new.1977/vendor.tar.gz differ: char 130, line 2
