Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package updatecli for openSUSE:Factory checked in at 2026-06-03 20:25:06 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/updatecli (Old) and /work/SRC/openSUSE:Factory/.updatecli.new.1937 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "updatecli" Wed Jun 3 20:25:06 2026 rev:42 rq:1356855 version:0.118.0 Changes: -------- --- /work/SRC/openSUSE:Factory/updatecli/updatecli.changes 2026-05-30 22:58:17.116642192 +0200 +++ /work/SRC/openSUSE:Factory/.updatecli.new.1937/updatecli.changes 2026-06-03 20:28:34.668529257 +0200 @@ -1,0 +2,29 @@ +Wed Jun 03 04:36:13 UTC 2026 - Johannes Kastl <[email protected]> + +- Update to version 0.118.0: + * Features + - feat: add disable changelog flag and env var @omer-cengel + (#8969) + * Bug Fixes + - fix: skip version check for generator commands @ambikeesshh + (#9064) + - chore: don't show version diff if newer @olblak (#9000) + * Maintenance + - deps(go): bump module github.com/fluxcd/helm-controller/api + to v1.5.5 @updateclibot[bot] (#9093) + - chore(ci): upgrade uv version @updateclibot[bot] (#9046) + - chore(dockerfile): upgrade node version @updateclibot[bot] + (#9009) + - deps(go): bump module github.com/drone/go-scm to v1.42.3 + @updateclibot[bot] (#8990) + - deps(go): bump module github.com/fluxcd/source-controller/api + to v1.8.5 @updateclibot[bot] (#8994) + - chore: add govulncheck GitHub Action workflow @olblak (#9007) + - deps(go): bump module github.com/google/go-containerregistry + to v0.21.6 @updateclibot[bot] (#8995) + - deps(go): bump module github.com/tetratelabs/wazero to + v1.12.0 @updateclibot[bot] (#9002) + - chore: updatecli docs handle different exit code @olblak + (#9001) + +------------------------------------------------------------------- Old: ---- updatecli-0.117.1.obscpio New: ---- updatecli-0.118.0.obscpio ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ updatecli.spec ++++++ --- /var/tmp/diff_new_pack.G6H5qM/_old 2026-06-03 20:28:38.252677690 +0200 +++ /var/tmp/diff_new_pack.G6H5qM/_new 2026-06-03 20:28:38.296679512 +0200 @@ -17,7 +17,7 @@ Name: updatecli -Version: 0.117.1 +Version: 0.118.0 Release: 0 Summary: A Declarative Dependency Management tool License: Apache-2.0 ++++++ _service ++++++ --- /var/tmp/diff_new_pack.G6H5qM/_old 2026-06-03 20:28:38.536689452 +0200 +++ /var/tmp/diff_new_pack.G6H5qM/_new 2026-06-03 20:28:38.568690777 +0200 @@ -3,7 +3,7 @@ <param name="url">https://github.com/updatecli/updatecli</param> <param name="scm">git</param> <param name="exclude">.git</param> - <param name="revision">v0.117.1</param> + <param name="revision">v0.118.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.G6H5qM/_old 2026-06-03 20:28:38.744698066 +0200 +++ /var/tmp/diff_new_pack.G6H5qM/_new 2026-06-03 20:28:38.780699557 +0200 @@ -1,6 +1,6 @@ <servicedata> <service name="tar_scm"> <param name="url">https://github.com/updatecli/updatecli</param> - <param name="changesrevision">cdcf7cca0ce55eff8bfcb7ab1108f2e34c7518a7</param></service></servicedata> + <param name="changesrevision">786ba9fbb8374d9c23e18b062f29ac1a95fd2b3c</param></service></servicedata> (No newline at EOF) ++++++ updatecli-0.117.1.obscpio -> updatecli-0.118.0.obscpio ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/updatecli-0.117.1/README.md new/updatecli-0.118.0/README.md --- old/updatecli-0.117.1/README.md 2026-05-29 09:14:42.000000000 +0200 +++ new/updatecli-0.118.0/README.md 2026-06-02 14:32:06.000000000 +0200 @@ -123,7 +123,7 @@ **Verify Container signature** ``` -cosign verify --certificate-identity-regexp "https://github.com/updatecli/updatecli" --certificate-oidc-issuer "https://token.actions.githubusercontent.com" ghcr.io/updatecli/updatecli:v0.117.0 +cosign verify --certificate-identity-regexp "https://github.com/updatecli/updatecli" --certificate-oidc-issuer "https://token.actions.githubusercontent.com" ghcr.io/updatecli/updatecli:v0.117.1 ``` ## Documentation diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/updatecli-0.117.1/cmd/apply.go new/updatecli-0.118.0/cmd/apply.go --- old/updatecli-0.117.1/cmd/apply.go 2026-05-29 09:14:42.000000000 +0200 +++ new/updatecli-0.118.0/cmd/apply.go 2026-06-02 14:32:06.000000000 +0200 @@ -48,6 +48,7 @@ e.Options.Pipeline.Target.DryRun = false e.Options.Pipeline.Target.CleanGitBranches = applyCleanGitBranches e.Options.Pipeline.Target.ExistingOnly = applyExistingOnly + e.Options.Pipeline.DisableChangelog = disableChangelog logrus.Warningln("Deprecated command, please instead use `updatecli pipeline apply`") @@ -74,4 +75,6 @@ applyCmd.Flags().BoolVar(&applyCleanGitBranches, "clean-git-branches", false, "Remove updatecli working git branches like '--clean-git-branches=true'") applyCmd.Flags().StringArrayVar(&pipelineIds, "pipeline-ids", []string{}, "Filter pipelines to apply by their pipeline IDs, accepted as comma separated list") applyCmd.Flags().StringArrayVar(&labels, "labels", []string{}, "Filter pipelines by their labels, accepted as a comma separated list (key:value)") + + addDisableChangelogFlag(applyCmd, &disableChangelog) } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/updatecli-0.117.1/cmd/compose_apply.go new/updatecli-0.118.0/cmd/compose_apply.go --- old/updatecli-0.117.1/cmd/compose_apply.go 2026-05-29 09:14:42.000000000 +0200 +++ new/updatecli-0.118.0/cmd/compose_apply.go 2026-06-02 14:32:06.000000000 +0200 @@ -53,6 +53,7 @@ e.Options.Pipeline.Target.DryRun = false e.Options.Pipeline.Target.CleanGitBranches = composeApplyCleanGitBranches e.Options.Pipeline.Target.ExistingOnly = composeApplyExistingOnly + e.Options.Pipeline.DisableChangelog = disableChangelog err = run("compose/apply") if err != nil { @@ -77,5 +78,7 @@ composeApplyCmd.Flags().StringArrayVar(&composeApplyOnlyPolicyIDs, "only-policy-ids", []string{}, "Filter policies to apply by their policy IDs, accepted as a comma separated list") composeApplyCmd.Flags().StringArrayVar(&composeApplyIgnoredPolicyIDs, "ignored-policy-ids", []string{}, "Filter policies to ignore by their policy IDs, accepted as a comma separated list") + addDisableChangelogFlag(composeApplyCmd, &disableChangelog) + composeCmd.AddCommand(composeApplyCmd) } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/updatecli-0.117.1/cmd/compose_diff.go new/updatecli-0.118.0/cmd/compose_diff.go --- old/updatecli-0.117.1/cmd/compose_diff.go 2026-05-29 09:14:42.000000000 +0200 +++ new/updatecli-0.118.0/cmd/compose_diff.go 2026-06-02 14:32:06.000000000 +0200 @@ -46,6 +46,7 @@ e.Options.Pipeline.Target.Push = false e.Options.Pipeline.Target.Clean = composeCmdClean e.Options.Pipeline.Target.DryRun = true + e.Options.Pipeline.DisableChangelog = disableChangelog err = run("compose/diff") if err != nil { @@ -65,5 +66,8 @@ composeDiffCmd.Flags().StringArrayVar(&labels, "labels", []string{}, "Filter pipelines to apply by their labels, accepted as a comma separated list (key:value)") composeDiffCmd.Flags().StringArrayVar(&composeDiffOnlyPolicyIDs, "only-policy-ids", []string{}, "Filter policies to apply by their policy IDs, accepted as a comma separated list") composeDiffCmd.Flags().StringArrayVar(&composeDiffIgnoredPolicyIDs, "ignored-policy-ids", []string{}, "Filter policies to ignore by their policy IDs, accepted as a comma separated list") + + addDisableChangelogFlag(composeDiffCmd, &disableChangelog) + composeCmd.AddCommand(composeDiffCmd) } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/updatecli-0.117.1/cmd/diff.go new/updatecli-0.118.0/cmd/diff.go --- old/updatecli-0.117.1/cmd/diff.go 2026-05-29 09:14:42.000000000 +0200 +++ new/updatecli-0.118.0/cmd/diff.go 2026-06-02 14:32:06.000000000 +0200 @@ -35,6 +35,7 @@ e.Options.Pipeline.Target.Push = false e.Options.Pipeline.Target.Clean = diffClean e.Options.Pipeline.Target.DryRun = true + e.Options.Pipeline.DisableChangelog = disableChangelog logrus.Warningln("Deprecated command, please instead use `updatecli pipeline diff`") @@ -57,4 +58,6 @@ diffCmd.Flags().BoolVar(&disableTLS, "disable-tls", false, "Disable TLS verification like '--disable-tls=true'") diffCmd.Flags().StringArrayVar(&pipelineIds, "pipeline-ids", []string{}, "Filter pipelines to apply by their pipeline IDs, accepted a comma separated list") diffCmd.Flags().StringArrayVar(&labels, "labels", []string{}, "Filter pipelines to apply by their labels, accepted as a comma separated list (key:value)") + + addDisableChangelogFlag(diffCmd, &disableChangelog) } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/updatecli-0.117.1/cmd/docs.go new/updatecli-0.118.0/cmd/docs.go --- old/updatecli-0.117.1/cmd/docs.go 2026-05-29 09:14:42.000000000 +0200 +++ new/updatecli-0.118.0/cmd/docs.go 2026-06-02 14:32:06.000000000 +0200 @@ -1,10 +1,14 @@ package cmd import ( + "crypto/sha256" "fmt" + "io" + "os" "path/filepath" "strings" + "github.com/sirupsen/logrus" "github.com/spf13/cobra" "github.com/spf13/cobra/doc" ) @@ -47,16 +51,32 @@ Use: "docs", Hidden: true, Short: "Generate updatecli documentation", - Run: func(cmd *cobra.Command, args []string) { + RunE: func(cmd *cobra.Command, args []string) error { rootCmd.DisableAutoGenTag = true - err := doc.GenMarkdownTreeCustom( - rootCmd, - docsDir, - docPrepender, - linkhandler) + + before, err := snapshotDir(docsDir) + if err != nil { + return err + } + + if err = doc.GenMarkdownTreeCustom(rootCmd, docsDir, docPrepender, linkhandler); err != nil { + return err + } + + after, err := snapshotDir(docsDir) if err != nil { - panic(err) + return err + } + + for path, hash := range after { + if prev, exists := before[path]; !exists || prev != hash { + logrus.Infof("Documentation files updated in %q", docsDir) + os.Exit(2) + } } + + logrus.Infof("Documentation files already up to date in %q", docsDir) + return nil }, } ) @@ -64,3 +84,43 @@ func init() { docsCmd.Flags().StringVarP(&docsDir, "docs", "d", "./docs", "Specify the directory where to generate documentation files") } + +// snapshotDir returns a map of file paths (relative to dir) to their SHA-256 hash. +// If the directory does not exist yet, an empty map is returned. +func snapshotDir(dir string) (map[string][sha256.Size]byte, error) { + hashes := make(map[string][sha256.Size]byte) + + if _, err := os.Stat(dir); os.IsNotExist(err) { + return hashes, nil + } + + err := filepath.WalkDir(dir, func(path string, d os.DirEntry, err error) error { + if err != nil { + return err + } + if d.IsDir() { + return nil + } + + f, err := os.Open(path) + if err != nil { + return err + } + defer f.Close() + + h := sha256.New() + if _, err = io.Copy(h, f); err != nil { + return err + } + + rel, err := filepath.Rel(dir, path) + if err != nil { + return err + } + + hashes[rel] = [sha256.Size]byte(h.Sum(nil)) + return nil + }) + + return hashes, err +} diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/updatecli-0.117.1/cmd/env.go new/updatecli-0.118.0/cmd/env.go --- old/updatecli-0.117.1/cmd/env.go 1970-01-01 01:00:00.000000000 +0100 +++ new/updatecli-0.118.0/cmd/env.go 2026-06-02 14:32:06.000000000 +0200 @@ -0,0 +1,35 @@ +package cmd + +import ( + "os" + "strconv" + "strings" + + "github.com/sirupsen/logrus" +) + +const DisableChangelogEnvVar = "UPDATECLI_DISABLE_CHANGELOG" + +const DisableVersionCheckEnvVar = "UPDATECLI_DISABLE_VERSION_CHECK" + +// getEnvBoolOrDefault reads a boolean environment variable. +// It returns defaultValue when the variable is unset or invalid. +func getEnvBoolOrDefault(envVar string, defaultValue bool) bool { + value, ok := os.LookupEnv(envVar) + if !ok { + return defaultValue + } + + parsed, err := strconv.ParseBool(strings.TrimSpace(value)) + if err != nil { + logrus.Debugf( + "invalid boolean value for environment variable %q: %q, defaulting to %t", + envVar, + value, + defaultValue, + ) + return defaultValue + } + + return parsed +} diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/updatecli-0.117.1/cmd/env_test.go new/updatecli-0.118.0/cmd/env_test.go --- old/updatecli-0.117.1/cmd/env_test.go 1970-01-01 01:00:00.000000000 +0100 +++ new/updatecli-0.118.0/cmd/env_test.go 2026-06-02 14:32:06.000000000 +0200 @@ -0,0 +1,99 @@ +package cmd + +import ( + "testing" +) + +func TestGetEnvBoolOrDefault(t *testing.T) { + tests := []struct { + name string + envVar string + envValue string + setEnv bool + defaultValue bool + expected bool + }{ + { + name: "not_set_returns_default_true", + envVar: "UNDEFINED_VAR_1", + defaultValue: true, + expected: true, + }, + { + name: "not_set_returns_default_false", + envVar: "UNDEFINED_VAR_2", + defaultValue: false, + expected: false, + }, + { + name: "set_to_true", + envVar: "TEST_VAR_TRUE", + envValue: "true", + setEnv: true, + defaultValue: false, + expected: true, + }, + { + name: "set_to_false", + envVar: "TEST_VAR_FALSE", + envValue: "false", + setEnv: true, + defaultValue: true, + expected: false, + }, + { + name: "set_to_1", + envVar: "TEST_VAR_1", + envValue: "1", + setEnv: true, + defaultValue: false, + expected: true, + }, + { + name: "set_to_0", + envVar: "TEST_VAR_0", + envValue: "0", + setEnv: true, + defaultValue: true, + expected: false, + }, + { + name: "whitespace_trimmed", + envVar: "TEST_VAR_SPACE", + envValue: " true ", + setEnv: true, + defaultValue: false, + expected: true, + }, + { + name: "invalid_returns_default_true", + envVar: "TEST_VAR_INVALID_1", + envValue: "invalid", + setEnv: true, + defaultValue: true, + expected: true, + }, + { + name: "invalid_returns_default_false", + envVar: "TEST_VAR_INVALID_2", + envValue: "maybe", + setEnv: true, + defaultValue: false, + expected: false, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if tt.setEnv { + t.Setenv(tt.envVar, tt.envValue) + } + + result := getEnvBoolOrDefault(tt.envVar, tt.defaultValue) + + if result != tt.expected { + t.Errorf("got %v, expected %v", result, tt.expected) + } + }) + } +} diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/updatecli-0.117.1/cmd/flags.go new/updatecli-0.118.0/cmd/flags.go --- old/updatecli-0.117.1/cmd/flags.go 1970-01-01 01:00:00.000000000 +0100 +++ new/updatecli-0.118.0/cmd/flags.go 2026-06-02 14:32:06.000000000 +0200 @@ -0,0 +1,15 @@ +package cmd + +import "github.com/spf13/cobra" + +// addDisableChangelogFlag registers the shared --disable-changelog flag on the +// provided command, using the value from UPDATECLI_DISABLE_CHANGELOG as the +// default when the flag is not explicitly passed. +func addDisableChangelogFlag(cmd *cobra.Command, dest *bool) { + cmd.Flags().BoolVar( + dest, + "disable-changelog", + getEnvBoolOrDefault(DisableChangelogEnvVar, false), + "Disable changelog retrieval to avoid unnecessary requests (env: "+DisableChangelogEnvVar+")", + ) +} diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/updatecli-0.117.1/cmd/flags_test.go new/updatecli-0.118.0/cmd/flags_test.go --- old/updatecli-0.117.1/cmd/flags_test.go 1970-01-01 01:00:00.000000000 +0100 +++ new/updatecli-0.118.0/cmd/flags_test.go 2026-06-02 14:32:06.000000000 +0200 @@ -0,0 +1,128 @@ +package cmd + +import ( + "strings" + "testing" + + "github.com/spf13/cobra" +) + +func TestAddDisableChangelogFlagRegistration(t *testing.T) { + t.Setenv(DisableChangelogEnvVar, "false") + + cmd := &cobra.Command{ + Use: "test", + } + + var disableChangelog bool + addDisableChangelogFlag(cmd, &disableChangelog) + + // Check that flag exists + flag := cmd.Flags().Lookup("disable-changelog") + if flag == nil { + t.Fatal("flag not registered") + } + + // Check flag has help text + if flag.Usage == "" { + t.Error("flag help text is empty") + } + + // Check that env var name appears in help text + if !strings.Contains(flag.Usage, DisableChangelogEnvVar) { + t.Errorf( + "flag help text does not mention env var %q: help text is %q", + DisableChangelogEnvVar, + flag.Usage, + ) + } + + // Check default value is "false" when env var not set + if flag.DefValue != "false" { + t.Errorf( + "flag default value when no env var: got %q, expected %q", + flag.DefValue, + "false", + ) + } +} + +func TestAddDisableChangelogFlagUsesEnvDefault(t *testing.T) { + tests := []struct { + name string + envValue string + expectedDef string + }{ + { + name: "env_var_true", + envValue: "true", + expectedDef: "true", + }, + { + name: "env_var_false", + envValue: "false", + expectedDef: "false", + }, + { + name: "env_var_1", + envValue: "1", + expectedDef: "true", + }, + { + name: "env_var_0", + envValue: "0", + expectedDef: "false", + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + t.Setenv(DisableChangelogEnvVar, tt.envValue) + + cmd := &cobra.Command{ + Use: "test", + } + + var disableChangelog bool + addDisableChangelogFlag(cmd, &disableChangelog) + + flag := cmd.Flags().Lookup("disable-changelog") + if flag == nil { + t.Fatal("flag not registered") + } + + if flag.DefValue != tt.expectedDef { + t.Errorf( + "flag default value: got %q, expected %q", + flag.DefValue, + tt.expectedDef, + ) + } + }) + } +} + +func TestDisableChangelogFlagOverridesEnv(t *testing.T) { + t.Setenv(DisableChangelogEnvVar, "true") + + cmd := &cobra.Command{ + Use: "test", + RunE: func(cmd *cobra.Command, args []string) error { + return nil + }, + } + + var disableChangelog bool + addDisableChangelogFlag(cmd, &disableChangelog) + + cmd.SetArgs([]string{"--disable-changelog=false"}) + + err := cmd.Execute() + if err != nil { + t.Fatalf("unexpected error: %v", err) + } + + if disableChangelog { + t.Error("expected flag to override env var") + } +} diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/updatecli-0.117.1/cmd/pipeline_apply.go new/updatecli-0.118.0/cmd/pipeline_apply.go --- old/updatecli-0.117.1/cmd/pipeline_apply.go 2026-05-29 09:14:42.000000000 +0200 +++ new/updatecli-0.118.0/cmd/pipeline_apply.go 2026-06-02 14:32:06.000000000 +0200 @@ -42,6 +42,7 @@ e.Options.Pipeline.Target.DryRun = false e.Options.Pipeline.Target.CleanGitBranches = applyCleanGitBranches e.Options.Pipeline.Target.ExistingOnly = applyExistingOnly + e.Options.Pipeline.DisableChangelog = disableChangelog err = run("pipeline/apply") if err != nil { @@ -67,5 +68,7 @@ pipelineApplyCmd.Flags().StringArrayVar(&pipelineIds, "pipeline-ids", []string{}, "Filter pipelines to apply by their IDs, accepted as a comma separated list") pipelineApplyCmd.Flags().StringArrayVar(&labels, "labels", []string{}, "Filter pipelines to apply by their labels, accepted as a comma separated list (key:value)") + addDisableChangelogFlag(pipelineApplyCmd, &disableChangelog) + pipelineCmd.AddCommand(pipelineApplyCmd) } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/updatecli-0.117.1/cmd/pipeline_diff.go new/updatecli-0.118.0/cmd/pipeline_diff.go --- old/updatecli-0.117.1/cmd/pipeline_diff.go 2026-05-29 09:14:42.000000000 +0200 +++ new/updatecli-0.118.0/cmd/pipeline_diff.go 2026-06-02 14:32:06.000000000 +0200 @@ -33,6 +33,7 @@ e.Options.Pipeline.Target.Push = false e.Options.Pipeline.Target.Clean = diffClean e.Options.Pipeline.Target.DryRun = true + e.Options.Pipeline.DisableChangelog = disableChangelog err = run("pipeline/diff") if err != nil { @@ -54,5 +55,7 @@ pipelineDiffCmd.Flags().StringArrayVar(&pipelineIds, "pipeline-ids", []string{}, "Filter pipelines to apply by their pipeline IDs, accepted a comma separated list") pipelineDiffCmd.Flags().StringArrayVar(&labels, "labels", []string{}, "Filter pipelines to apply by their labels, accepted as a comma separated list (key:value)") + addDisableChangelogFlag(pipelineDiffCmd, &disableChangelog) + pipelineCmd.AddCommand(pipelineDiffCmd) } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/updatecli-0.117.1/cmd/root.go new/updatecli-0.118.0/cmd/root.go --- old/updatecli-0.117.1/cmd/root.go 2026-05-29 09:14:42.000000000 +0200 +++ new/updatecli-0.118.0/cmd/root.go 2026-06-02 14:32:06.000000000 +0200 @@ -27,18 +27,20 @@ ) var ( - pipelineIds []string - labels []string - manifestFiles []string - valuesFiles []string - valuesInline []string - secretsFiles []string - policyReferences []string - e engine.Engine - verbose bool - experimental bool - disableTLS bool - uniqueTmpDir bool + pipelineIds []string + labels []string + manifestFiles []string + valuesFiles []string + valuesInline []string + secretsFiles []string + policyReferences []string + e engine.Engine + verbose bool + experimental bool + disableTLS bool + disableChangelog bool + uniqueTmpDir bool + disableVersionCheck bool rootCmd = &cobra.Command{ Use: "updatecli", @@ -65,11 +67,31 @@ } } +// skipVersionCheckCommands lists commands where the version check is skipped +// to avoid unnecessary network requests and prevent banner output from +// corrupting generated content. +var skipVersionCheckCommands = []string{ + "completion", + "__complete", + "__completeNoDesc", + "docs", + "man", + "jsonschema", +} + func init() { logrus.SetOutput(os.Stdout) rootCmd.PersistentPostRun = func(cmd *cobra.Command, args []string) { + if disableVersionCheck { + return + } + for c := cmd; c != nil; c = c.Parent() { + if slices.Contains(skipVersionCheckCommands, c.Name()) { + return + } + } err := engine.CheckLatestPublishedVersion() if err != nil { logrus.Debugf("Unable to check for the latest version of updatecli: %v", err) @@ -79,6 +101,7 @@ rootCmd.PersistentFlags().BoolVarP(&verbose, "debug", "", false, "Debug Output") rootCmd.PersistentFlags().BoolVarP(&experimental, "experimental", "", false, "Enable Experimental mode") rootCmd.PersistentFlags().BoolVar(&uniqueTmpDir, "unique-tmp-dir", false, "Use a unique temporary directory to allow running multiple Updatecli instances in parallel") + rootCmd.PersistentFlags().BoolVar(&disableVersionCheck, "disable-version-check", getEnvBoolOrDefault(DisableVersionCheckEnvVar, false), "Disable version check (env: "+DisableVersionCheckEnvVar+")") rootCmd.PersistentPreRun = func(cmd *cobra.Command, args []string) { if verbose { logrus.SetLevel(logrus.DebugLevel) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/updatecli-0.117.1/cmd/root_test.go new/updatecli-0.118.0/cmd/root_test.go --- old/updatecli-0.117.1/cmd/root_test.go 1970-01-01 01:00:00.000000000 +0100 +++ new/updatecli-0.118.0/cmd/root_test.go 2026-06-02 14:32:06.000000000 +0200 @@ -0,0 +1,132 @@ +package cmd + +import ( + "strings" + "testing" + + "github.com/spf13/cobra" +) + +func TestDisableVersionCheckFlagRegistration(t *testing.T) { + t.Setenv(DisableVersionCheckEnvVar, "false") + + flag := rootCmd.PersistentFlags().Lookup("disable-version-check") + if flag == nil { + t.Fatal("flag not registered") + } + + if flag.Usage == "" { + t.Error("flag help text is empty") + } + + if !strings.Contains(flag.Usage, DisableVersionCheckEnvVar) { + t.Errorf( + "flag help text does not mention env var %q: help text is %q", + DisableVersionCheckEnvVar, + flag.Usage, + ) + } +} + +func TestDisableVersionCheckFlagUsesEnvDefault(t *testing.T) { + tests := []struct { + name string + envValue string + expectedDef string + }{ + { + name: "env_var_true", + envValue: "true", + expectedDef: "true", + }, + { + name: "env_var_false", + envValue: "false", + expectedDef: "false", + }, + { + name: "env_var_1", + envValue: "1", + expectedDef: "true", + }, + { + name: "env_var_0", + envValue: "0", + expectedDef: "false", + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + t.Setenv(DisableVersionCheckEnvVar, tt.envValue) + + cmd := &cobra.Command{Use: "test"} + var val bool + cmd.PersistentFlags().BoolVar( + &val, + "disable-version-check", + getEnvBoolOrDefault(DisableVersionCheckEnvVar, false), + "Disable version check", + ) + + flag := cmd.PersistentFlags().Lookup("disable-version-check") + if flag == nil { + t.Fatal("flag not registered") + } + + if flag.DefValue != tt.expectedDef { + t.Errorf( + "flag default value: got %q, expected %q", + flag.DefValue, + tt.expectedDef, + ) + } + }) + } +} + +func TestDisableVersionCheckFlagOverridesEnv(t *testing.T) { + t.Setenv(DisableVersionCheckEnvVar, "true") + + cmd := &cobra.Command{ + Use: "test", + RunE: func(cmd *cobra.Command, args []string) error { + return nil + }, + } + + var val bool + cmd.PersistentFlags().BoolVar( + &val, + "disable-version-check", + getEnvBoolOrDefault(DisableVersionCheckEnvVar, false), + "Disable version check", + ) + + cmd.SetArgs([]string{"--disable-version-check=false"}) + + err := cmd.Execute() + if err != nil { + t.Fatalf("unexpected error: %v", err) + } + + if val { + t.Error("expected flag to override env var") + } +} + +func TestSkipVersionCheckCommandsContainsExpectedCommands(t *testing.T) { + expected := []string{"completion", "__complete", "__completeNoDesc", "docs", "man", "jsonschema"} + for _, name := range expected { + found := false + for _, s := range skipVersionCheckCommands { + if s == name { + found = true + break + } + } + if !found { + t.Errorf("skipVersionCheckCommands missing %q", name) + } + } +} diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/updatecli-0.117.1/go.mod new/updatecli-0.118.0/go.mod --- old/updatecli-0.117.1/go.mod 2026-05-29 09:14:42.000000000 +0200 +++ new/updatecli-0.118.0/go.mod 2026-06-02 14:32:06.000000000 +0200 @@ -42,13 +42,13 @@ github.com/aws/aws-sdk-go-v2/service/ec2 v1.302.0 github.com/aws/smithy-go v1.25.1 github.com/beevik/etree v1.6.0 - github.com/drone/go-scm v1.42.2 + github.com/drone/go-scm v1.42.3 github.com/extism/go-sdk v1.7.1 - github.com/fluxcd/helm-controller/api v1.5.4 - github.com/fluxcd/source-controller/api v1.8.4 + github.com/fluxcd/helm-controller/api v1.5.5 + github.com/fluxcd/source-controller/api v1.8.5 github.com/go-viper/mapstructure/v2 v2.5.0 github.com/goccy/go-yaml v1.19.2 - github.com/google/go-containerregistry v0.21.5 + github.com/google/go-containerregistry v0.21.6 github.com/google/go-github/v69 v69.2.0 github.com/goware/urlx v0.3.2 github.com/hashicorp/hcl/v2 v2.24.0 @@ -65,7 +65,7 @@ github.com/skratchdot/open-golang v0.0.0-20200116055534-eef842397966 github.com/spf13/afero v1.15.0 github.com/testcontainers/testcontainers-go v0.42.0 - github.com/tetratelabs/wazero v1.11.0 + github.com/tetratelabs/wazero v1.12.0 github.com/tomwright/dasel v1.27.3 github.com/tomwright/dasel/v2 v2.8.1 github.com/vmware-labs/yaml-jsonpath v0.3.2 @@ -142,7 +142,6 @@ github.com/containerd/errdefs/pkg v0.3.0 // indirect github.com/containerd/log v0.1.0 // indirect github.com/containerd/platforms v1.0.0-rc.2 // indirect - github.com/containerd/stargz-snapshotter/estargz v0.18.2 // indirect github.com/containerd/typeurl/v2 v2.2.3 // indirect github.com/cpuguy83/dockercfg v0.3.2 // indirect github.com/davidmz/go-pageant v1.0.2 // indirect @@ -210,7 +209,6 @@ github.com/tklauser/go-sysconf v0.3.16 // indirect github.com/tklauser/numcpus v0.11.0 // indirect github.com/urfave/cli v1.22.17 // indirect - github.com/vbatts/tar-split v0.12.2 // indirect github.com/x448/float16 v0.8.4 // indirect github.com/yusufpapurcu/wmi v1.2.4 // indirect go.mongodb.org/mongo-driver v1.17.9 // indirect @@ -341,7 +339,7 @@ golang.org/x/sync v0.20.0 // indirect golang.org/x/sys v0.44.0 // indirect golang.org/x/term v0.43.0 // indirect - golang.org/x/tools v0.44.0 // indirect + golang.org/x/tools v0.45.0 // indirect google.golang.org/api v0.278.0 // indirect google.golang.org/grpc v1.81.0 // indirect google.golang.org/protobuf v1.36.11 // indirect diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/updatecli-0.117.1/go.sum new/updatecli-0.118.0/go.sum --- old/updatecli-0.117.1/go.sum 2026-05-29 09:14:42.000000000 +0200 +++ new/updatecli-0.118.0/go.sum 2026-06-02 14:32:06.000000000 +0200 @@ -213,8 +213,6 @@ github.com/containerd/log v0.1.0/go.mod h1:VRRf09a7mHDIRezVKTRCrOq78v577GXq3bSa3EhrzVo= github.com/containerd/platforms v1.0.0-rc.2 h1:0SPgaNZPVWGEi4grZdV8VRYQn78y+nm6acgLGv/QzE4= github.com/containerd/platforms v1.0.0-rc.2/go.mod h1:J71L7B+aiM5SdIEqmd9wp6THLVRzJGXfNuWCZCllLA4= -github.com/containerd/stargz-snapshotter/estargz v0.18.2 h1:yXkZFYIzz3eoLwlTUZKz2iQ4MrckBxJjkmD16ynUTrw= -github.com/containerd/stargz-snapshotter/estargz v0.18.2/go.mod h1:XyVU5tcJ3PRpkA9XS2T5us6Eg35yM0214Y+wvrZTBrY= github.com/containerd/typeurl/v2 v2.2.3 h1:yNA/94zxWdvYACdYO8zofhrTVuQY73fFU1y++dYSw40= github.com/containerd/typeurl/v2 v2.2.3/go.mod h1:95ljDnPfD3bAbDJRugOiShd/DlAAsxGtUBhJxIn7SCk= github.com/coreos/go-systemd/v22 v22.7.0 h1:LAEzFkke61DFROc7zNLX/WA2i5J8gYqe0rSj9KI28KA= @@ -257,8 +255,8 @@ github.com/docker/go-metrics v0.0.1/go.mod h1:cG1hvH2utMXtqgqqYE9plW6lDxS3/5ayHzueweSI3Vw= github.com/docker/go-units v0.5.0 h1:69rxXcBk27SvSaaxTtLh/8llcHD8vYHT7WSdRZ/jvr4= github.com/docker/go-units v0.5.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= -github.com/drone/go-scm v1.42.2 h1:BG25sI9L4Dw8QDxdSEfDaEho2upy4jULDXLFCbAIrOM= -github.com/drone/go-scm v1.42.2/go.mod h1:DFIJJjhMj0TSXPz+0ni4nyZ9gtTtC40Vh/TGRugtyWw= +github.com/drone/go-scm v1.42.3 h1:i16M9yKKjXSWz2pVCxxmJ9yvew1WbT/uM6bSOAWm47M= +github.com/drone/go-scm v1.42.3/go.mod h1:DFIJJjhMj0TSXPz+0ni4nyZ9gtTtC40Vh/TGRugtyWw= github.com/dylibso/observe-sdk/go v0.0.0-20240819160327-2d926c5d788a h1:UwSIFv5g5lIvbGgtf3tVwC7Ky9rmMFBp0RMs+6f6YqE= github.com/dylibso/observe-sdk/go v0.0.0-20240819160327-2d926c5d788a/go.mod h1:C8DzXehI4zAbrdlbtOByKX6pfivJTBiV9Jjqv56Yd9Q= github.com/ebitengine/purego v0.10.0 h1:QIw4xfpWT6GWTzaW5XEKy3HXoqrJGx1ijYHzTF0/ISU= @@ -293,16 +291,16 @@ github.com/fatih/color v1.19.0/go.mod h1:zNk67I0ZUT1bEGsSGyCZYZNrHuTkJJB+r6Q9VuMi0LE= github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= -github.com/fluxcd/helm-controller/api v1.5.4 h1:wbAwD+cSGBZEhT3qq1naBKkitdNbqRtWQUFNA3XTXOc= -github.com/fluxcd/helm-controller/api v1.5.4/go.mod h1:lTgeUmtVYExMKp7mRDncsr4JwHTz3LFtLjRJZeR98lI= +github.com/fluxcd/helm-controller/api v1.5.5 h1:xQA/9gbifMvZPGhSNKHsrkq829dI/yTBASVdYp9/s4Y= +github.com/fluxcd/helm-controller/api v1.5.5/go.mod h1:lTgeUmtVYExMKp7mRDncsr4JwHTz3LFtLjRJZeR98lI= github.com/fluxcd/pkg/apis/acl v0.9.0 h1:wBpgsKT+jcyZEcM//OmZr9RiF8klL3ebrDp2u2ThsnA= github.com/fluxcd/pkg/apis/acl v0.9.0/go.mod h1:TttNS+gocsGLwnvmgVi3/Yscwqrjc17+vhgYfqkfrV4= github.com/fluxcd/pkg/apis/kustomize v1.15.1 h1:t9QZh+3ZS8EKmlxrnnbcKZcGTrg8FDvMF1T8BHMCuqI= github.com/fluxcd/pkg/apis/kustomize v1.15.1/go.mod h1:IZOy4CCtR/hxMGb7erK1RfbGnczVv4/dRBoVD37AywI= github.com/fluxcd/pkg/apis/meta v1.25.1 h1:WG1GIC/SOz0GjxT0uVuO6AMicQ3yFsk6bDozCnq+fto= github.com/fluxcd/pkg/apis/meta v1.25.1/go.mod h1:c7o6mJGLCMvNrfdinGZehkrdZuFT9vZdZNrn66DtVD0= -github.com/fluxcd/source-controller/api v1.8.4 h1:ZJIh7OFhjxZgsD81ahxxbu3ggA7qySIjKWbK5+PKmOI= -github.com/fluxcd/source-controller/api v1.8.4/go.mod h1:sio4t49RDx+S1etHRFAEEw8qfVuw0KKlOg8bRVlEYPM= +github.com/fluxcd/source-controller/api v1.8.5 h1:mLKc9YVMk46JCt1BQbkG6irkrpBZp95kiXh2+GYB6KQ= +github.com/fluxcd/source-controller/api v1.8.5/go.mod h1:sio4t49RDx+S1etHRFAEEw8qfVuw0KKlOg8bRVlEYPM= github.com/foxcpp/go-mockdns v1.2.0 h1:omK3OrHRD1IWJz1FuFBCFquhXslXoF17OvBS6JPzZF0= github.com/foxcpp/go-mockdns v1.2.0/go.mod h1:IhLeSFGed3mJIAXPH2aiRQB+kqz7oqu8ld2qVbOu7Wk= github.com/frankban/quicktest v1.14.6 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHkI4W8= @@ -425,8 +423,8 @@ github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= -github.com/google/go-containerregistry v0.21.5 h1:KTJG9Pn/jC0VdZR6ctV3/jcN+q6/Iqlx0sTVz3ywZlM= -github.com/google/go-containerregistry v0.21.5/go.mod h1:ySvMuiWg+dOsRW0Hw8GYwfMwBlNRTmpYBFJPlkco5zU= +github.com/google/go-containerregistry v0.21.6 h1:T+yqQIlJXKrM98Om4DlW3GoWQAmhZuLMwoDOvVrtiUM= +github.com/google/go-containerregistry v0.21.6/go.mod h1:U7MMSBIJynke2MVQrQk19NP9k/uQsGz/h0amIFSHMbo= github.com/google/go-github/v69 v69.2.0 h1:wR+Wi/fN2zdUx9YxSmYE0ktiX9IAR/BeePzeaUUbEHE= github.com/google/go-github/v69 v69.2.0/go.mod h1:xne4jymxLR6Uj9b7J7PyTpkMYstEMMwGZa0Aehh1azM= github.com/google/go-querystring v1.2.0 h1:yhqkPbu2/OH+V9BfpCVPZkNmUXhb2gBxJArfhIxNtP0= @@ -762,8 +760,8 @@ github.com/testcontainers/testcontainers-go v0.42.0/go.mod h1:vZjdY1YmUA1qEForxOIOazfsrdyORJAbhi0bp8plN30= github.com/tetratelabs/wabin v0.0.0-20230304001439-f6f874872834 h1:ZF+QBjOI+tILZjBaFj3HgFonKXUcwgJ4djLb6i42S3Q= github.com/tetratelabs/wabin v0.0.0-20230304001439-f6f874872834/go.mod h1:m9ymHTgNSEjuxvw8E7WWe4Pl4hZQHXONY8wE6dMLaRk= -github.com/tetratelabs/wazero v1.11.0 h1:+gKemEuKCTevU4d7ZTzlsvgd1uaToIDtlQlmNbwqYhA= -github.com/tetratelabs/wazero v1.11.0/go.mod h1:eV28rsN8Q+xwjogd7f4/Pp4xFxO7uOGbLcD/LzB1wiU= +github.com/tetratelabs/wazero v1.12.0 h1:DuWcpNu/FzgEXgGBDp8J1Spc+CWOvvtvVyjKlaZopYU= +github.com/tetratelabs/wazero v1.12.0/go.mod h1:LvKtzl2RqO4gyF27BiXU+nKAjcV8f38U+kP/q2vgxh0= github.com/tjfoc/gmsm v1.4.1 h1:aMe1GlZb+0bLjn+cKTPEvvn9oUEBlJitaZiiBwsbgho= github.com/tjfoc/gmsm v1.4.1/go.mod h1:j4INPkHWMrhJb38G+J6W4Tw0AbuN8Thu3PbdVYhVcTE= github.com/tklauser/go-sysconf v0.3.16 h1:frioLaCQSsF5Cy1jgRBrzr6t502KIIwQ0MArYICU0nA= @@ -776,8 +774,6 @@ github.com/tomwright/dasel/v2 v2.8.1/go.mod h1:6bNDNAnmGEtGpuIvksuQwiNcAgQ87pmzndynsqTNglc= github.com/urfave/cli v1.22.17 h1:SYzXoiPfQjHBbkYxbew5prZHS1TOLT3ierW8SYLqtVQ= github.com/urfave/cli v1.22.17/go.mod h1:b0ht0aqgH/6pBYzzxURyrM4xXNgsoT/n2ZzwQiEhNVo= -github.com/vbatts/tar-split v0.12.2 h1:w/Y6tjxpeiFMR47yzZPlPj/FcPLpXbTUi/9H7d3CPa4= -github.com/vbatts/tar-split v0.12.2/go.mod h1:eF6B6i6ftWQcDqEn3/iGFRFRo8cBIMSJVOpnNdfTMFA= github.com/x448/float16 v0.8.4 h1:qLwI1I70+NjRFUR3zs1JPUCgaCXSh3SW62uAKT1mSBM= github.com/x448/float16 v0.8.4/go.mod h1:14CWIYCyZA/cWjXOioeEpHeN/83MdbZDRQHoFcYsOfg= github.com/xanzy/ssh-agent v0.3.3 h1:+/15pJfg/RsTxqYcX6fHqOXZwwMP+2VyYWJeWM2qQFM= @@ -987,8 +983,8 @@ golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= -golang.org/x/tools v0.44.0 h1:UP4ajHPIcuMjT1GqzDWRlalUEoY+uzoZKnhOjbIPD2c= -golang.org/x/tools v0.44.0/go.mod h1:KA0AfVErSdxRZIsOVipbv3rQhVXTnlU6UhKxHd1seDI= +golang.org/x/tools v0.45.0 h1:18qN3FAooORvApf5XjCXgsuayZOEtXf6JK18I3+ONa8= +golang.org/x/tools v0.45.0/go.mod h1:LuUGqqaXcXMEFEruIVJVm5mgDD8vww/z/SR1gQ4uE/0= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/updatecli-0.117.1/pkg/core/engine/version.go new/updatecli-0.118.0/pkg/core/engine/version.go --- old/updatecli-0.117.1/pkg/core/engine/version.go 2026-05-29 09:14:42.000000000 +0200 +++ new/updatecli-0.118.0/pkg/core/engine/version.go 2026-06-02 14:32:06.000000000 +0200 @@ -4,9 +4,9 @@ "encoding/json" "fmt" "io" - "strings" "time" + "github.com/Masterminds/semver/v3" "github.com/sirupsen/logrus" "github.com/updatecli/updatecli/pkg/core/httpclient" "github.com/updatecli/updatecli/pkg/core/version" @@ -52,23 +52,28 @@ return fmt.Errorf("unable to parse the latest version of updatecli: %v", err) } - sanitizeVersion := func(v string) string { - s := strings.TrimSpace(v) - s = strings.TrimPrefix(s, "v") + // Mean that we are using a development version of updatecli, so we can't compare it with the latest version available + if version.Version == "" { + return nil + } - return s + currentVersion, err := semver.NewVersion(version.Version) + if err != nil { + logrus.Warnf("unable to parse the current version of updatecli: %v", err) + return nil } - if sanitizeVersion(data.Latest.Tag) == sanitizeVersion(version.Version) { + latestVersion, err := semver.NewVersion(data.Latest.Tag) + if err != nil { + logrus.Warnf("unable to parse the latest version of updatecli: %v", err) return nil } - currentVersion := version.Version - if currentVersion == "" { - currentVersion = "unknown" + if currentVersion.GreaterThanEqual(latestVersion) { + return nil } - logrus.Infof("| A new release is available: %q -> %q", currentVersion, data.Latest.Tag) + logrus.Infof("| A new release is available: %q -> %q", currentVersion.String(), latestVersion.String()) logrus.Infof("| More information on https://www.updatecli.io/changelogs/updatecli/changelogs/%s/", data.Latest.Tag) return nil diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/updatecli-0.117.1/pkg/core/pipeline/options.go new/updatecli-0.118.0/pkg/core/pipeline/options.go --- old/updatecli-0.117.1/pkg/core/pipeline/options.go 2026-05-29 09:14:42.000000000 +0200 +++ new/updatecli-0.118.0/pkg/core/pipeline/options.go 2026-06-02 14:32:06.000000000 +0200 @@ -8,4 +8,6 @@ type Options struct { Target target.Options + // DisableChangelog disables changelog retrieval for targets. + DisableChangelog bool } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/updatecli-0.117.1/pkg/core/pipeline/targets.go new/updatecli-0.118.0/pkg/core/pipeline/targets.go --- old/updatecli-0.117.1/pkg/core/pipeline/targets.go 2026-05-29 09:14:42.000000000 +0200 +++ new/updatecli-0.118.0/pkg/core/pipeline/targets.go 2026-06-02 14:32:06.000000000 +0200 @@ -36,36 +36,38 @@ err = fmt.Errorf("%s", err) } - changelogSourceID := target.Config.SourceID - if changelogSourceID == "" { - switch len(sourceIds) { - case 1: - changelogSourceID = sourceIds[0] - case 0: - // If we have more than one sourceID then we can't define in a reliable way which one to use - // as the order of the sourceIDs is not guaranteed. - default: - logrus.Debugf("Target depends on a too many sources that we can't determine which one to use for the changelog") + if !p.Options.DisableChangelog { + changelogSourceID := target.Config.SourceID + if changelogSourceID == "" { + switch len(sourceIds) { + case 1: + changelogSourceID = sourceIds[0] + case 0: + // If we have more than one sourceID then we can't define in a reliable way which one to use + // as the order of the sourceIDs is not guaranteed. + default: + logrus.Debugf("Target depends on a too many sources that we can't determine which one to use for the changelog") + } } - } - if changelogSourceID != "" { - // Once the source is executed, then it can retrieve its changelog - // Any error means an empty changelog - if source, found := p.Sources[changelogSourceID]; found { - c, err := resource.New(source.Config.ResourceConfig) + if changelogSourceID != "" { + // Once the source is executed, then it can retrieve its changelog + // Any error means an empty changelog + if source, found := p.Sources[changelogSourceID]; found { + c, err := resource.New(source.Config.ResourceConfig) - if err == nil { + if err == nil { - changelogs := c.Changelog(target.Result.Information, source.OriginalOutput) + changelogs := c.Changelog(target.Result.Information, source.OriginalOutput) - if changelogs != nil { - target.Result.Changelogs = *changelogs + if changelogs != nil { + target.Result.Changelogs = *changelogs - logrus.Debugf("%s", changelogs.String()) + logrus.Debugf("%s", changelogs.String()) - } else { - logrus.Debugln("no changelog detected") + } else { + logrus.Debugln("no changelog detected") + } } } } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/updatecli-0.117.1/pkg/core/pipeline/targets_test.go new/updatecli-0.118.0/pkg/core/pipeline/targets_test.go --- old/updatecli-0.117.1/pkg/core/pipeline/targets_test.go 2026-05-29 09:14:42.000000000 +0200 +++ new/updatecli-0.118.0/pkg/core/pipeline/targets_test.go 2026-06-02 14:32:06.000000000 +0200 @@ -8,9 +8,12 @@ "github.com/updatecli/updatecli/pkg/core/config" "github.com/updatecli/updatecli/pkg/core/pipeline/condition" "github.com/updatecli/updatecli/pkg/core/pipeline/resource" + "github.com/updatecli/updatecli/pkg/core/pipeline/source" "github.com/updatecli/updatecli/pkg/core/pipeline/target" + "github.com/updatecli/updatecli/pkg/core/result" "github.com/updatecli/updatecli/pkg/plugins/resources/shell" "github.com/updatecli/updatecli/pkg/plugins/resources/shell/success/exitcode" + updateclihttp "github.com/updatecli/updatecli/pkg/plugins/resources/updateclihttp" ) func TestRunTarget(t *testing.T) { @@ -473,3 +476,53 @@ } } + +func TestRunTarget_DisableChangelogSkipsChangelog(t *testing.T) { + p := Pipeline{ + Config: &config.Config{ + Spec: config.Spec{ + Targets: map[string]target.Config{ + "test": { + ResourceConfig: resource.ResourceConfig{ + Kind: "shell", + Name: "test", + Spec: shell.Spec{ + Command: "true", + ChangedIf: shell.SpecChangedIf{ + Kind: "exitcode", + Spec: exitcode.Spec{Warning: 1, Success: 0, Failure: 2}, + }, + }, + }, + SourceID: "source1", + }, + }, + }, + }, + Sources: map[string]source.Source{ + "source1": { + Config: source.Config{ + ResourceConfig: resource.ResourceConfig{ + Kind: "http", + Name: "source1", + Spec: updateclihttp.Spec{Url: "https://example.com"}, + }, + }, + Output: "old-value", + OriginalOutput: "old-value", + Result: &result.Source{Information: "old-value", Result: result.SUCCESS}, + }, + }, + Targets: map[string]target.Target{ + "test": { + Result: &result.Target{}, + }, + }, + } + + p.Options.DisableChangelog = true + + _, _, err := p.RunTarget(context.Background(), "test", []string{"source1"}) + require.NoError(t, err) + require.Empty(t, p.Targets["test"].Result.Changelogs) +} ++++++ updatecli.obsinfo ++++++ --- /var/tmp/diff_new_pack.G6H5qM/_old 2026-06-03 20:28:40.888786861 +0200 +++ /var/tmp/diff_new_pack.G6H5qM/_new 2026-06-03 20:28:40.920788186 +0200 @@ -1,5 +1,5 @@ name: updatecli -version: 0.117.1 -mtime: 1780038882 -commit: cdcf7cca0ce55eff8bfcb7ab1108f2e34c7518a7 +version: 0.118.0 +mtime: 1780403526 +commit: 786ba9fbb8374d9c23e18b062f29ac1a95fd2b3c ++++++ vendor.tar.gz ++++++ /work/SRC/openSUSE:Factory/updatecli/vendor.tar.gz /work/SRC/openSUSE:Factory/.updatecli.new.1937/vendor.tar.gz differ: char 13, line 1
