Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package jfrog-cli for openSUSE:Factory checked in at 2026-11-13 18:34:49 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/jfrog-cli (Old) and /work/SRC/openSUSE:Factory/.jfrog-cli.new.1251 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "jfrog-cli" Fri Nov 13 18:34:49 2026 rev:59 rq:1397244 version:2.132.0 Changes: -------- --- /work/SRC/openSUSE:Factory/jfrog-cli/jfrog-cli.changes 2026-11-05 18:22:35.744401480 +0100 +++ /work/SRC/openSUSE:Factory/.jfrog-cli.new.1251/jfrog-cli.changes 2026-11-13 18:38:49.194159342 +0100 @@ -1,0 +2,55 @@ +Fri Nov 13 05:49:46 UTC 2026 - Johannes Kastl <[email protected]> + +- Update to version 2.132.0: + No changes in: gofrog, jfrog-client-go + * New Features + - [jfrog-cli] feat: create package alias for helm and updated + integration tests #3591 + * Bug Fixes + - [build-info-go] RTECO-2245 - Fail on a failed yarn info and + add entries for missing Yarn dependencies #432 + - [jfrog-cli] RTECO-0000 - Move macOS test runners from retired + macos-14 to macos-latest #3761 + - [jfrog-cli-artifactory] [Frogbot] Update version of + github.com/go-openapi/swag/jsonutils to 0.27.1 #588 + - [jfrog-cli-artifactory] [Frogbot] Update version of + github.com/klauspost/compress to 1.18.7 #590 + - [jfrog-cli-artifactory] [Frogbot] Update version of + github.com/grpc-ecosystem/grpc-gateway/v2 to 2.29.0 #591 + - [jfrog-cli-artifactory] [Frogbot] Update version of + github.com/pelletier/go-toml/v2 to 2.4.3 #593 + - [jfrog-cli-artifactory] [Frogbot] Update version of + github.com/in-toto/in-toto-golang to 0.11.0 #594 + - [jfrog-cli-artifactory] [Frogbot] Update version of + oras.land/oras-go/v2 to 2.6.4 #598 + - [jfrog-cli-artifactory] [Frogbot] Update version of + github.com/beevik/etree to 1.7.1 #600 + - [jfrog-cli-artifactory] jf helm package fails to collect + build-info when Chart.yaml and packaged chart archive are in + different directories. #501 + - [jfrog-cli-security] XRAY-159762 - Excludes patterns for + Static-SCA generating SBOM #931 + - [jfrog-cli-security] XRAY-167698 - jf ca + include-cached-packages fail fixed #935 + - [jfrog-cli-security] Fix: preserve dependencies across + repeated SBOM node occurrences #932 + - [jfrog-cli-security] XRAY-167150 - Update Xspecter to 1.9.0 + to resolve imported Maven BOMs #939 + - [jfrog-cli-security] Fix release repo path construction #940 + - [jfrog-cli-security] XRAY-163629 - Check .npmrc host matches + jf c server before sending credentials #943 + - [jfrog-cli-security] XRAY-167694 - Keep scan results paths + valid on Windows when the Git URL has a port #942 + * Internal Changes + - [jfrog-cli] RTECO-0000 - Upgrade Alpine packages in slim + image (zlib CVE-2026-4738) #3763 + - [jfrog-cli-security] Update dependencies #944 + * Other Changes + - [jfrog-cli] JFMIG-82 - Remove data-transfer plugin dependency + from transfer-files; deprecate transfer-plugin-install #3747 + - [jfrog-cli-core] JFMIG-88 - Replace data-transfer plugin with + GET/PUT streaming in transfer-files #1629 + - [jfrog-cli-core] JFMIG-145 - Batch Docker dir-content AQL in + transfer-files Files Diff phase #1630 + +------------------------------------------------------------------- Old: ---- jfrog-cli-2.131.0.obscpio New: ---- jfrog-cli-2.132.0.obscpio ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ jfrog-cli.spec ++++++ --- /var/tmp/diff_new_pack.egadad/_old 2026-11-13 18:38:53.325334129 +0100 +++ /var/tmp/diff_new_pack.egadad/_new 2026-11-13 18:38:53.327334214 +0100 @@ -19,7 +19,7 @@ %define executable_name jf Name: jfrog-cli -Version: 2.131.0 +Version: 2.132.0 Release: 0 Summary: A client that automates access to JFrog products License: Apache-2.0 ++++++ _service ++++++ --- /var/tmp/diff_new_pack.egadad/_old 2026-11-13 18:38:53.363335737 +0100 +++ /var/tmp/diff_new_pack.egadad/_new 2026-11-13 18:38:53.366335864 +0100 @@ -4,7 +4,7 @@ <param name="scm">git</param> <param name="submodules">disable</param> <param name="exclude">.git</param> - <param name="revision">refs/tags/v2.131.0</param> + <param name="revision">refs/tags/v2.132.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.egadad/_old 2026-11-13 18:38:53.393337006 +0100 +++ /var/tmp/diff_new_pack.egadad/_new 2026-11-13 18:38:53.396337133 +0100 @@ -1,6 +1,6 @@ <servicedata> <service name="tar_scm"> <param name="url">https://github.com/jfrog/jfrog-cli.git</param> - <param name="changesrevision">7cd517216cfb29dd957b6888b9082c1b1865acd3</param></service></servicedata> + <param name="changesrevision">14688e5950be88ca67c4a17a865e12dafab69ef0</param></service></servicedata> (No newline at EOF) ++++++ jfrog-cli-2.131.0.obscpio -> jfrog-cli-2.132.0.obscpio ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/jfrog-cli-2.131.0/CONTRIBUTING.md new/jfrog-cli-2.132.0/CONTRIBUTING.md --- old/jfrog-cli-2.131.0/CONTRIBUTING.md 2026-11-03 12:10:32.000000000 +0100 +++ new/jfrog-cli-2.132.0/CONTRIBUTING.md 2026-11-11 13:25:02.000000000 +0100 @@ -189,7 +189,7 @@ ##### Requirements - Make sure the `RTLIC` environment variable is configured with a valid license. -- You can start an Artifactory container by running the `startArtifactory.sh` script located in the `testdata/docker/artifactory` directory. Before running the tests, wait for Artifactory to finish booting up in the container. +- You can start an Artifactory container by running the `start.sh` script located in the `testdata/docker/artifactory` directory. Before running the tests, wait for Artifactory to finish booting up in the container. | Flag | Description | | ------------------------- | ----------------------------------- | @@ -279,7 +279,6 @@ | `-jfrog.targetUrl` | JFrog target platform URL. | | `-jfrog.targetAdminToken` | JFrog target platform admin token. | | `-jfrog.jfrogHome` | The JFrog home directory of the local Artifactory installation. | -| `-jfrog.installDataTransferPlugin` | Set this flag to `true` if you want the test to automatically install the data-transfer plugin in the source Artifactory server. | To run Transfer tests, execute the following command: diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/jfrog-cli-2.131.0/artifactory/cli.go new/jfrog-cli-2.132.0/artifactory/cli.go --- old/jfrog-cli-2.131.0/artifactory/cli.go 2026-11-03 12:10:32.000000000 +0100 +++ new/jfrog-cli-2.132.0/artifactory/cli.go 2026-11-11 13:25:02.000000000 +0100 @@ -15,8 +15,6 @@ "github.com/jfrog/jfrog-cli/utils/accesstoken" - "github.com/jfrog/gofrog/version" - "github.com/jfrog/jfrog-cli-core/v2/artifactory/commands/transferinstall" "github.com/jfrog/jfrog-cli/docs/artifactory/transferplugininstall" "github.com/jfrog/jfrog-cli-artifactory/artifactory/commands/generic" @@ -557,6 +555,7 @@ BashComplete: corecommon.CreateBashCompletionFunc(), Action: dataTransferPluginInstallCmd, Category: transferCategory, + Hidden: true, }, }) } @@ -1245,38 +1244,10 @@ } } -func dataTransferPluginInstallCmd(c *cli.Context) error { - // Get the Artifactory serverID from the argument or use default if not exists - serverID := "" - if c.NArg() > 1 { - return cliutils.WrongNumberOfArgumentsHandler(c) - } else if c.NArg() == 1 { - serverID = c.Args()[0] - } - serverDetails, err := coreConfig.GetSpecificConfig(serverID, true, true) - if err != nil { - return err - } - installCmd := transferinstall.NewInstallDataTransferCommand(serverDetails) - // Optional flags - versionToInstall := c.String(cliutils.Version) - if versionToInstall != "" { - installCmd.SetInstallVersion(version.NewVersion(versionToInstall)) - } - sourceFilesPath := c.String(cliutils.InstallPluginSrcDir) - if sourceFilesPath != "" { - installCmd.SetLocalPluginFiles(sourceFilesPath) - } - - if versionToInstall != "" && sourceFilesPath != "" { - return cliutils.PrintHelpAndReturnError("Only version or dir is allowed, not both.", c) - } - - homePath := c.String(cliutils.InstallPluginHomeDir) - if homePath != "" { - installCmd.SetJFrogHomePath(homePath) - } - return commands.Exec(installCmd) +func dataTransferPluginInstallCmd(_ *cli.Context) error { + log.Warn("The 'transfer-plugin-install' command is deprecated and no longer installs the data-transfer user plugin. " + + "'jf rt transfer-files' does not require the plugin on the source Artifactory. This command will be removed in a future release.") + return nil } func transferFilesCmd(c *cli.Context) error { diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/jfrog-cli-2.131.0/artifactory/cli_test.go new/jfrog-cli-2.132.0/artifactory/cli_test.go --- old/jfrog-cli-2.131.0/artifactory/cli_test.go 2026-11-03 12:10:32.000000000 +0100 +++ new/jfrog-cli-2.132.0/artifactory/cli_test.go 2026-11-11 13:25:02.000000000 +0100 @@ -222,6 +222,28 @@ return cli.NewContext(app, fs, nil) } +func TestTransferPluginInstallIsHiddenAndDeprecated(t *testing.T) { + var found bool + for _, cmd := range GetCommands() { + if cmd.Name != "transfer-plugin-install" { + continue + } + found = true + assert.True(t, cmd.Hidden) + assert.Contains(t, cmd.Usage, "[DEPRECATED]") + } + assert.True(t, found, "transfer-plugin-install command should remain registered to inform users that the plugin is no longer required") +} + +func TestTransferPluginInstallOnlyWarns(t *testing.T) { + // A non-existent server ID and conflicting flags would fail if the command still attempted an installation. + set := flag.NewFlagSet("transfer-plugin-install", flag.ContinueOnError) + set.String(cliutils.Version, "", "") + set.String(cliutils.InstallPluginSrcDir, "", "") + require.NoError(t, set.Parse([]string{"--version=1.0.0", "--dir=/non/existent", "no-such-server-id", "extra-arg"})) + assert.NoError(t, dataTransferPluginInstallCmd(cli.NewContext(nil, set, nil))) +} + // --------------------------------------------------------------------------- // GetOutputFormat (transfer-files) tests // --------------------------------------------------------------------------- diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/jfrog-cli-2.131.0/build/docker/slim/Dockerfile new/jfrog-cli-2.132.0/build/docker/slim/Dockerfile --- old/jfrog-cli-2.131.0/build/docker/slim/Dockerfile 2026-11-03 12:10:32.000000000 +0100 +++ new/jfrog-cli-2.132.0/build/docker/slim/Dockerfile 2026-11-11 13:25:02.000000000 +0100 @@ -11,6 +11,8 @@ ARG image_name=jfrog-cli ARG cli_executable_name ENV CI true -RUN apk add --no-cache bash tzdata ca-certificates curl jq +# Upgrade base packages first, so fixed versions (for example zlib 1.4-r0 for CVE-2026-4738) +# replace the versions frozen in the base image snapshot. +RUN apk upgrade --no-cache && apk add --no-cache bash tzdata ca-certificates curl jq COPY --from=builder /${image_name}/${cli_executable_name} /usr/local/bin/${cli_executable_name} RUN chmod +x /usr/local/bin/${cli_executable_name} diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/jfrog-cli-2.131.0/build/npm/v2/package-lock.json new/jfrog-cli-2.132.0/build/npm/v2/package-lock.json --- old/jfrog-cli-2.131.0/build/npm/v2/package-lock.json 2026-11-03 12:10:32.000000000 +0100 +++ new/jfrog-cli-2.132.0/build/npm/v2/package-lock.json 2026-11-11 13:25:02.000000000 +0100 @@ -1,5 +1,5 @@ { "name": "jfrog-cli-v2", - "version": "2.131.0", + "version": "2.132.0", "lockfileVersion": 2 } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/jfrog-cli-2.131.0/build/npm/v2/package.json new/jfrog-cli-2.132.0/build/npm/v2/package.json --- old/jfrog-cli-2.131.0/build/npm/v2/package.json 2026-11-03 12:10:32.000000000 +0100 +++ new/jfrog-cli-2.132.0/build/npm/v2/package.json 2026-11-11 13:25:02.000000000 +0100 @@ -1,6 +1,6 @@ { "name": "jfrog-cli-v2", - "version": "2.131.0", + "version": "2.132.0", "description": "🐸 Command-line interface for JFrog Artifactory, Xray, Distribution, Pipelines and Mission Control 🐸", "homepage": "https://github.com/jfrog/jfrog-cli", "preferGlobal": true, diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/jfrog-cli-2.131.0/build/npm/v2-jf/package-lock.json new/jfrog-cli-2.132.0/build/npm/v2-jf/package-lock.json --- old/jfrog-cli-2.131.0/build/npm/v2-jf/package-lock.json 2026-11-03 12:10:32.000000000 +0100 +++ new/jfrog-cli-2.132.0/build/npm/v2-jf/package-lock.json 2026-11-11 13:25:02.000000000 +0100 @@ -1,5 +1,5 @@ { "name": "jfrog-cli-v2-jf", - "version": "2.131.0", + "version": "2.132.0", "lockfileVersion": 1 } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/jfrog-cli-2.131.0/build/npm/v2-jf/package.json new/jfrog-cli-2.132.0/build/npm/v2-jf/package.json --- old/jfrog-cli-2.131.0/build/npm/v2-jf/package.json 2026-11-03 12:10:32.000000000 +0100 +++ new/jfrog-cli-2.132.0/build/npm/v2-jf/package.json 2026-11-11 13:25:02.000000000 +0100 @@ -1,6 +1,6 @@ { "name": "jfrog-cli-v2-jf", - "version": "2.131.0", + "version": "2.132.0", "description": "🐸 Command-line interface for JFrog Artifactory, Xray, Distribution, Pipelines and Mission Control 🐸", "homepage": "https://github.com/jfrog/jfrog-cli", "preferGlobal": true, diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/jfrog-cli-2.131.0/docs/artifactory/transferfiles/help.go new/jfrog-cli-2.132.0/docs/artifactory/transferfiles/help.go --- old/jfrog-cli-2.131.0/docs/artifactory/transferfiles/help.go 2026-11-03 12:10:32.000000000 +0100 +++ new/jfrog-cli-2.132.0/docs/artifactory/transferfiles/help.go 2026-11-11 13:25:02.000000000 +0100 @@ -24,7 +24,6 @@ Prerequisites: - Both source and target server IDs configured with admin tokens. - 'jf rt transfer-config' (or transfer-config-merge) already run so repos exist on the target. -- 'jf rt transfer-plugin-install' installed on the source server's primary node. - 'jf rt transfer-settings' tuned for throughput. Common patterns: @@ -33,12 +32,12 @@ $ jf rt transfer-files source-prod target-cloud --status # check progress Gotchas: -- Requires the data-transfer plugin on the source (install via 'jf rt transfer-plugin-install'). +- Does not require the data-transfer user plugin on the source; 'jf rt transfer-plugin-install' is deprecated. - Long-running; expect hours-to-days for large stores. Run inside a long-lived session (nohup, tmux, screen). - Throughput is governed by 'jf rt transfer-settings'; defaults are conservative. - Idempotent on file content but not on repo property changes; re-running after a target-side delete causes redelivery. -Related: jf rt transfer-config, jf rt transfer-settings, jf rt transfer-plugin-install +Related: jf rt transfer-config, jf rt transfer-settings QA: Q: What's the JFrog CLI command to transfer the configuration from my artifactory to the target artifactory? diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/jfrog-cli-2.131.0/docs/artifactory/transferplugininstall/help.go new/jfrog-cli-2.132.0/docs/artifactory/transferplugininstall/help.go --- old/jfrog-cli-2.131.0/docs/artifactory/transferplugininstall/help.go 2026-11-03 12:10:32.000000000 +0100 +++ new/jfrog-cli-2.132.0/docs/artifactory/transferplugininstall/help.go 2026-11-11 13:25:02.000000000 +0100 @@ -3,38 +3,27 @@ var Usage = []string{"rt transfer-plugin-install <server-id> [command options]"} func GetDescription() string { - return "Download and install the data-transfer user plugin on the primary node of Artifactory, which is running on this local machine." + return "[DEPRECATED] This command no longer installs the data-transfer user plugin and only prints a deprecation warning. 'jf rt transfer-files' does not require the plugin." } func GetArguments() string { return ` server-id - The ID of the source server, on which the plugin should be installed.` + Ignored.` } func GetAIDescription() string { - return `Download the data-transfer Artifactory user plugin and install it on the primary node of the source Artifactory. Required as a one-time prep before 'jf rt transfer-files'. The plugin handles the actual byte streaming on the server side. + return `[DEPRECATED] Informational command only. It no longer downloads or installs the data-transfer Artifactory user plugin; it only prints a deprecation warning and exits successfully. 'jf rt transfer-files' does not require the plugin on the source server. The command will be removed in a future release. When to use: -- One-time setup on the source server before starting a self-hosted-to-cloud migration. - -Prerequisites: -- Must be run on the same host as the source Artifactory's primary node (or with filesystem access to its etc/artifactory/plugins/ directory). -- Admin privileges on the source server. -- The source server ID is configured locally. - -Common patterns: - $ jf rt transfer-plugin-install source-prod - $ jf rt transfer-plugin-install source-prod --dir=/opt/jfrog/artifactory/var/etc/artifactory/plugins +- Do not use. Run 'jf rt transfer-files' directly. Gotchas: -- Must run as the user that owns the Artifactory installation; otherwise the file write fails. -- The plugin requires a Groovy plugins admin restart (or wait for the scheduled reload). -- This command only targets self-hosted instances; cloud-hosted sources need a different transfer mechanism. +- All arguments and flags (--version, --dir, --home-dir) are accepted but ignored. Related: jf rt transfer-files, jf rt transfer-settings QA: -Q: What's the JFrog CLI command to install the data-transfer user plugin in the primary node of the source instance? -A: jf rt transfer-plugin-install source-server +Q: Do I need to install the data-transfer user plugin before running 'jf rt transfer-files'? +A: No. The plugin is no longer required, and 'jf rt transfer-plugin-install' is deprecated and does nothing. ` } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/jfrog-cli-2.131.0/ghostfrog_test.go new/jfrog-cli-2.132.0/ghostfrog_test.go --- old/jfrog-cli-2.131.0/ghostfrog_test.go 2026-11-03 12:10:32.000000000 +0100 +++ new/jfrog-cli-2.132.0/ghostfrog_test.go 2026-11-11 13:25:02.000000000 +0100 @@ -468,10 +468,11 @@ // E2E-030: setup-jfrog-cli native integration func TestGhostFrogSetupJFrogCLINativeIntegration(t *testing.T) { homeDir := initGhostFrogTest(t) - installAliases(t, "npm,mvn,go,pip") + tools := []string{"npm", "mvn", "go", "pip", "helm"} + installAliases(t, strings.Join(tools, ",")) binDir := aliasBinDir(homeDir) - for _, tool := range []string{"npm", "mvn", "go", "pip"} { + for _, tool := range tools { _, err := os.Stat(aliasToolPath(homeDir, tool)) require.NoError(t, err, "alias for %s should exist", tool) } @@ -484,7 +485,7 @@ // Verify alias dir is populated entries, err := os.ReadDir(binDir) require.NoError(t, err) - assert.GreaterOrEqual(t, len(entries), 4, "should have at least 4 alias entries") + assert.GreaterOrEqual(t, len(entries), len(tools), fmt.Sprintf("should have at least %d alias entries", len(tools))) } // E2E-031: Auto build-info publish (requires Artifactory) @@ -1156,9 +1157,115 @@ } // --------------------------------------------------------------------------- +// Section 15.10 - Helm Alias (E2E-070 to E2E-073) +// --------------------------------------------------------------------------- + +// E2E-070: helm package through the alias runs jf helm and collects build info +func TestGhostFrogHelmAliasPackageCollectsBuildInfo(t *testing.T) { + homeDir := initGhostFrogHelmTest(t) + chartDir := createGhostFrogHelmChart(t) + destination := t.TempDir() + + out, err := runAliasedHelm(t, homeDir, nil, + "package", chartDir, "-d", destination, + "--build-name=ghostfrog-helm-package", "--build-number=1") + + require.NoError(t, err, "aliased helm package should succeed: %s", out) + assert.Contains(t, out, "Transforming 'helm' to 'jf helm'", + "helm package should be routed through jf helm") + assert.FileExists(t, filepath.Join(destination, "ghostfrog-chart-0.1.0.tgz"), + "chart archive should be written to the --destination directory") + assert.Contains(t, out, "Build info saved locally", + "build info should be collected for the aliased helm package command") +} + +// E2E-071: global flags before the subcommand reach native helm unchanged +func TestGhostFrogHelmAliasGlobalFlagBeforeSubcommand(t *testing.T) { + homeDir := initGhostFrogHelmTest(t) + chartDir := createGhostFrogHelmChart(t) + + out, err := runAliasedHelm(t, homeDir, nil, + "--namespace", "ghostfrog-ns", "template", "ghostfrog-release", chartDir) + + require.NoError(t, err, "aliased helm with a global flag before the subcommand should succeed: %s", out) + assert.Contains(t, out, "namespace: ghostfrog-ns", + "--namespace placed before the subcommand should be passed to helm template") +} + +// E2E-072: helm registry logout through the alias logs out instead of logging in +func TestGhostFrogHelmAliasRegistryLogoutIsNotLogin(t *testing.T) { + homeDir := initGhostFrogHelmTest(t) + + out, _ := runAliasedHelm(t, homeDir, nil, "registry", "logout", "ghostfrog.invalid") + + assert.NotContains(t, out, "Performing helm registry login", + "helm registry logout must not be replaced by a login with the configured JFrog credentials") +} + +// E2E-073: HELM_REPOSITORY_CACHE set in the environment is preserved through the alias +func TestGhostFrogHelmAliasPreservesRepositoryCacheEnv(t *testing.T) { + homeDir := initGhostFrogHelmTest(t) + cacheDir := t.TempDir() + + out, err := runAliasedHelm(t, homeDir, []string{"HELM_REPOSITORY_CACHE=" + cacheDir}, "env") + + require.NoError(t, err, "aliased helm env should succeed: %s", out) + assert.Contains(t, out, cacheDir, + "HELM_REPOSITORY_CACHE from the environment should be used by helm") +} + +// --------------------------------------------------------------------------- // Test helpers // --------------------------------------------------------------------------- +// initGhostFrogHelmTest installs the helm alias and configures an offline default server, +// which jf helm requires even for commands that never contact Artifactory. +func initGhostFrogHelmTest(t *testing.T) string { + t.Helper() + homeDir := initGhostFrogTest(t) + if _, err := exec.LookPath("helm"); err != nil { + t.Skip("helm not found in PATH, skipping Ghost Frog helm test") + } + installAliases(t, "helm") + out, err := runJfCommand(t, "config", "add", "ghostfrog-helm", + "--url=http://127.0.0.1:1", "--user=ghostfrog", "--password=ghostfrog", + "--enc-password=false", "--interactive=false") + require.NoError(t, err, "config add failed: %s", out) + return homeDir +} + +func runAliasedHelm(t *testing.T, homeDir string, extraEnv []string, args ...string) (string, error) { + t.Helper() + binDir := aliasBinDir(homeDir) + cmd := exec.Command(aliasToolPath(homeDir, "helm"), args...) + cmd.Env = append(os.Environ(), + "PATH="+binDir+string(os.PathListSeparator)+os.Getenv("PATH"), + "JFROG_CLI_LOG_LEVEL=DEBUG", + ) + cmd.Env = append(cmd.Env, extraEnv...) + out, err := cmd.CombinedOutput() + return string(out), err +} + +// createGhostFrogHelmChart writes a dependency-free chart whose template renders the release namespace. +func createGhostFrogHelmChart(t *testing.T) string { + t.Helper() + chartDir := filepath.Join(t.TempDir(), "ghostfrog-chart") + require.NoError(t, os.MkdirAll(filepath.Join(chartDir, "templates"), 0755)) + files := map[string]string{ + "Chart.yaml": "apiVersion: v2\nname: ghostfrog-chart\nversion: 0.1.0\n", + // Helm FlexPack requires a Chart.lock even when the chart has no dependencies. + "Chart.lock": "dependencies: []\n", + "values.yaml": "replicaCount: 1\n", + filepath.Join("templates", "configmap.yaml"): "apiVersion: v1\nkind: ConfigMap\nmetadata:\n" + + " name: {{ .Release.Name }}\n namespace: {{ .Release.Namespace }}\n", + } + for name, content := range files { + require.NoError(t, os.WriteFile(filepath.Join(chartDir, name), []byte(content), 0644)) + } + return chartDir +} + func timeAfter(t *testing.T, seconds int) <-chan struct{} { t.Helper() ch := make(chan struct{}) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/jfrog-cli-2.131.0/go.mod new/jfrog-cli-2.132.0/go.mod --- old/jfrog-cli-2.131.0/go.mod 2026-11-03 12:10:32.000000000 +0100 +++ new/jfrog-cli-2.132.0/go.mod 2026-11-11 13:25:02.000000000 +0100 @@ -19,14 +19,14 @@ github.com/buger/jsonparser v1.3.0 github.com/gocarina/gocsv v0.0.0-20260607070740-0735908c6461 github.com/jfrog/archiver/v3 v3.6.5 - github.com/jfrog/build-info-go v1.13.1-0.20261028123549-f0cd26bfc2de + github.com/jfrog/build-info-go v1.13.1-0.20261104104131-29db5a20af18 github.com/jfrog/gofrog v1.7.7 github.com/jfrog/jfrog-cli-application v1.0.2-0.20260917110731-d7783acedd8c - github.com/jfrog/jfrog-cli-artifactory v0.8.1-0.20261103060251-30c80a7deec4 - github.com/jfrog/jfrog-cli-core/v2 v2.60.1-0.20261102064148-e4c77ed13cc6 + github.com/jfrog/jfrog-cli-artifactory v0.8.1-0.20261111060712-4b23175bf2f5 + github.com/jfrog/jfrog-cli-core/v2 v2.60.1-0.20261110101257-1f307dd84e3f github.com/jfrog/jfrog-cli-evidence v0.11.1-0.20261102090321-5b0bce39abfe - github.com/jfrog/jfrog-cli-platform-services v1.10.1-0.20261030162302-b4948e3a2cb1 - github.com/jfrog/jfrog-cli-security v1.41.2 + github.com/jfrog/jfrog-cli-platform-services v1.10.1-0.20261104164219-1e5e778e49e0 + github.com/jfrog/jfrog-cli-security v1.41.3 github.com/jfrog/jfrog-client-go v1.55.1-0.20261102081622-45c51cfca4f7 github.com/jszwec/csvutil v1.10.0 github.com/moby/moby/api v1.55.0 @@ -51,7 +51,7 @@ github.com/acarl005/stripansi v0.0.0-20180116102854-5a71ef0e047d // indirect github.com/andybalholm/brotli v1.2.7 // indirect github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2 // indirect - github.com/beevik/etree v1.7.0 // indirect + github.com/beevik/etree v1.7.1 // indirect github.com/blang/semver v3.5.1+incompatible // indirect github.com/c-bata/go-prompt v0.2.6 // indirect github.com/cenkalti/backoff/v4 v4.3.0 // indirect @@ -214,9 +214,10 @@ github.com/yusufpapurcu/wmi v1.2.4 // indirect go.opentelemetry.io/auto/sdk v1.2.1 // indirect go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.70.0 // indirect - go.opentelemetry.io/otel v1.45.0 // indirect - go.opentelemetry.io/otel/metric v1.45.0 // indirect - go.opentelemetry.io/otel/trace v1.45.0 // indirect + go.opentelemetry.io/otel v1.47.0 // indirect + go.opentelemetry.io/otel/log v1.47.0 // indirect + go.opentelemetry.io/otel/metric v1.47.0 // indirect + go.opentelemetry.io/otel/trace v1.47.0 // indirect go.yaml.in/yaml/v2 v2.4.4 // indirect go.yaml.in/yaml/v3 v3.0.5 // indirect golang.org/x/crypto v0.58.0 // indirect @@ -230,14 +231,14 @@ golang.org/x/time v0.15.0 // indirect google.golang.org/genproto/googleapis/api v0.0.0-20260803160001-6ac0973c030d // indirect google.golang.org/genproto/googleapis/rpc v0.0.0-20260803160001-6ac0973c030d // indirect - google.golang.org/grpc v1.83.1 // indirect + google.golang.org/grpc v1.83.2 // indirect google.golang.org/protobuf v1.36.12-0.20260120151049-f2248ac996af // indirect gopkg.in/ini.v1 v1.67.3 // indirect gopkg.in/warnings.v0 v0.1.2 // indirect helm.sh/helm/v3 v3.21.3 // indirect k8s.io/client-go v0.36.3 // indirect k8s.io/klog/v2 v2.140.0 // indirect - oras.land/oras-go/v2 v2.6.2 // indirect + oras.land/oras-go/v2 v2.6.4 // indirect sigs.k8s.io/yaml v1.6.0 // indirect ) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/jfrog-cli-2.131.0/go.sum new/jfrog-cli-2.132.0/go.sum --- old/jfrog-cli-2.131.0/go.sum 2026-11-03 12:10:32.000000000 +0100 +++ new/jfrog-cli-2.132.0/go.sum 2026-11-11 13:25:02.000000000 +0100 @@ -97,8 +97,8 @@ github.com/aws/aws-sdk-go-v2/service/sts v1.42.3/go.mod h1:ULe4HCzfKPiR6R3HEurE3b1upEkuk8AkMrOKtaOxKO8= github.com/aws/smithy-go v1.26.0 h1:9ouqbi+NyKP7fV3Te7UElCwdAb6Y8uk7LGwPE5tVe/s= github.com/aws/smithy-go v1.26.0/go.mod h1:YE2RhdIuDbA5E5bTdciG9KrW3+TiEONeUWCqxX9i1Fc= -github.com/beevik/etree v1.7.0 h1:xjBk9O4p4x7D1YajePjfLzdaFC4/uYUENA7P0pv6gXA= -github.com/beevik/etree v1.7.0/go.mod h1:bh4zJxiIr62SOf9pRzN7UUYaEDa9HEKafK25+sLc0Gc= +github.com/beevik/etree v1.7.1 h1:xBlSFAjlMfZkrCNKCEdZ2MSN9pfQYeRBaISDnAVi4Ek= +github.com/beevik/etree v1.7.1/go.mod h1:bh4zJxiIr62SOf9pRzN7UUYaEDa9HEKafK25+sLc0Gc= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= github.com/blang/semver v3.5.1+incompatible h1:cQNTCjp13qL8KC3Nbxr/y2Bqb63oX6wdnnjpJbkM4JQ= @@ -390,8 +390,8 @@ github.com/jellydator/ttlcache/v3 v3.4.0/go.mod h1:Hw9EgjymziQD3yGsQdf1FqFdpp7YjFMd4Srg5EJlgD4= github.com/jfrog/archiver/v3 v3.6.5 h1:AiNXJoe8jYDOtyykfVuwh26aM4rk/ei+YzBpfBukdzU= github.com/jfrog/archiver/v3 v3.6.5/go.mod h1:5V9l+Fte30Y4qe9dUOAd3yNTf8lmtVNuhKNrvI8PMhg= -github.com/jfrog/build-info-go v1.13.1-0.20261028123549-f0cd26bfc2de h1:ycdUCYyOZ5TCcRIVT0EfjG/oRMk+QtY3u2XOUcjgt0s= -github.com/jfrog/build-info-go v1.13.1-0.20261028123549-f0cd26bfc2de/go.mod h1:3sv87ey6WTxUckYkj0Iqu9aUaiygQMZKoXNmvT9lK5g= +github.com/jfrog/build-info-go v1.13.1-0.20261104104131-29db5a20af18 h1:W6pIW2CY72KWswE/q6N9xbqnESOzQfydUB1nLbe6qp0= +github.com/jfrog/build-info-go v1.13.1-0.20261104104131-29db5a20af18/go.mod h1:3sv87ey6WTxUckYkj0Iqu9aUaiygQMZKoXNmvT9lK5g= github.com/jfrog/froggit-go v1.24.0 h1:qSAywpxlPdQfIFIJPprFzfAkbNfKb/OXMo7YD3dVKrE= github.com/jfrog/froggit-go v1.24.0/go.mod h1:wRDryqyp3oe+eHgME2mpnEQmO8XBECIPagFwj0nHmdI= github.com/jfrog/go-mockhttp v0.3.1 h1:/wac8v4GMZx62viZmv4wazB5GNKs+GxawuS1u3maJH8= @@ -402,16 +402,16 @@ github.com/jfrog/jfrog-apps-config v1.0.1/go.mod h1:8AIIr1oY9JuH5dylz2S6f8Ym2MaadPLR6noCBO4C22w= github.com/jfrog/jfrog-cli-application v1.0.2-0.20260917110731-d7783acedd8c h1:B/svbJcwCMHjeC+HqpzH9yEC7GEvOj3HPotYpG4Ga7A= github.com/jfrog/jfrog-cli-application v1.0.2-0.20260917110731-d7783acedd8c/go.mod h1:RHjDVsgfIE+6N49R1t1nBjbK2Je4VTN7CQm9OlwtFnQ= -github.com/jfrog/jfrog-cli-artifactory v0.8.1-0.20261103060251-30c80a7deec4 h1:Z4WqOlZZe3NA02ekqFrbSNlO8hkdGPHn/PuWq1sb+CA= -github.com/jfrog/jfrog-cli-artifactory v0.8.1-0.20261103060251-30c80a7deec4/go.mod h1:94/aLloMSK6avu4umcJS3DJ6IuGM5K10PwZ6kDqgzSo= -github.com/jfrog/jfrog-cli-core/v2 v2.60.1-0.20261102064148-e4c77ed13cc6 h1:7Jdj+FiaMN5jiQ94+Xlehf9OSLqSbAqAvO44XB9d7E4= -github.com/jfrog/jfrog-cli-core/v2 v2.60.1-0.20261102064148-e4c77ed13cc6/go.mod h1:dxy3GflCOX9kGxcdEkCXWhV+EMUAGBWO+CY5fGjWcCQ= +github.com/jfrog/jfrog-cli-artifactory v0.8.1-0.20261111060712-4b23175bf2f5 h1:anpTUP2adzjBrT1EoCObwwvq3b0ykYmGdh4vZUy69WU= +github.com/jfrog/jfrog-cli-artifactory v0.8.1-0.20261111060712-4b23175bf2f5/go.mod h1:0lDv8UDB8gZwddMYexT3QzcAbYt20KNyv3Is7xBQKfc= +github.com/jfrog/jfrog-cli-core/v2 v2.60.1-0.20261110101257-1f307dd84e3f h1:MFlfjDXgUXknvY2u1KUyPdzgkn6dgb39EbgmxV3Aulg= +github.com/jfrog/jfrog-cli-core/v2 v2.60.1-0.20261110101257-1f307dd84e3f/go.mod h1:dxy3GflCOX9kGxcdEkCXWhV+EMUAGBWO+CY5fGjWcCQ= github.com/jfrog/jfrog-cli-evidence v0.11.1-0.20261102090321-5b0bce39abfe h1:BRaNdb6JIdGqGa79XwxIsZHDmZ26pQ5V1cPJ7zYLJoM= github.com/jfrog/jfrog-cli-evidence v0.11.1-0.20261102090321-5b0bce39abfe/go.mod h1:4OGLCLQjdHg9PpjFkxvn8bGflOZGEJsoBHAGys7gUio= -github.com/jfrog/jfrog-cli-platform-services v1.10.1-0.20261030162302-b4948e3a2cb1 h1:1NA6meQs1Nbe7B1AKcvLdX+hKpxyWVe+cNpTDJznZcs= -github.com/jfrog/jfrog-cli-platform-services v1.10.1-0.20261030162302-b4948e3a2cb1/go.mod h1:aepFLIsqYJy1rFGkpY5CYwMRNViwjHtJcUaNzrWCCUo= -github.com/jfrog/jfrog-cli-security v1.41.2 h1:yLGCrg8T54y2HatjXSSawMVU8c03+dv2Tl8Y9Gz2G54= -github.com/jfrog/jfrog-cli-security v1.41.2/go.mod h1:2LD9S9gqEGSvxUhVC+/DLIPzXFIg6jdCaw5pMdfnS7Y= +github.com/jfrog/jfrog-cli-platform-services v1.10.1-0.20261104164219-1e5e778e49e0 h1:V5+dkr1p9vl1XYbvVwmFG35tN+1xuwPCE01dZvIbkjs= +github.com/jfrog/jfrog-cli-platform-services v1.10.1-0.20261104164219-1e5e778e49e0/go.mod h1:aepFLIsqYJy1rFGkpY5CYwMRNViwjHtJcUaNzrWCCUo= +github.com/jfrog/jfrog-cli-security v1.41.3 h1:+B4/SO9LWT5er0a5pqAnHeoEcI4KQnrqqoZznJqXrFM= +github.com/jfrog/jfrog-cli-security v1.41.3/go.mod h1:k478V9VOvW3mwgmAJ0P/nIycqNullCse4dc967PJ7Is= github.com/jfrog/jfrog-client-go v1.55.1-0.20261102081622-45c51cfca4f7 h1:gd1jzPoUxEsfL0N2qebHyemEHKqvob6d9Q8yOl0D5zE= github.com/jfrog/jfrog-client-go v1.55.1-0.20261102081622-45c51cfca4f7/go.mod h1:+WGudVz1kZofy4hfEidGdTXqF/E51IC65z4yTtt0TwE= github.com/jhump/protoreflect v1.17.0 h1:qOEr613fac2lOuTgWN4tPAtLL7fUSbuJL5X5XumQh94= @@ -700,8 +700,8 @@ go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.70.0/go.mod h1:DqEFwLumhzMBDQv9PcWbyoDxHI/4lAk6CM4nJBH39sc= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.70.0 h1:LMuyCAyfalSjDyjdC65nK6N0zoTT63+E/u95X0JovZI= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.70.0/go.mod h1:085m8qbm4hgc8rZWGDEa4vmyyo2c3nPxUslYUKUIU04= -go.opentelemetry.io/otel v1.45.0 h1:pdrWmLHofpubmArBv1LgFSv1Z0Ie/ppdZzu+kUN5EeU= -go.opentelemetry.io/otel v1.45.0/go.mod h1:XZxIqPapzEYnhNSScF5DIqXhm/rYi0FzCe2XddAwZfQ= +go.opentelemetry.io/otel v1.47.0 h1:j7ALJ/zgkS7Z6aeJW09p8VC9804bC+PpeTfCD4XPnOM= +go.opentelemetry.io/otel v1.47.0/go.mod h1:8wS9O2qfXrYrzp6hIF/HOYJJf/wIhFPhR2xLuP+iXQU= go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.19.0 h1:Dn8rkudDzY6KV9dr/D/bTUuWgqDf9xe0rr4G2elrn0Y= go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.19.0/go.mod h1:gMk9F0xDgyN9M/3Ed5Y1wKcx/9mlU91NXY2SNq7RQuU= go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.19.0 h1:HIBTQ3VO5aupLKjC90JgMqpezVXwFuq6Ryjn0/izoag= @@ -724,18 +724,18 @@ go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.43.0/go.mod h1:J/ZyF4vfPwsSr9xJSPyQ4LqtcTPULFR64KwTikGLe+A= go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.45.0 h1:lsA/S1bxgdbyFGkTj+3meEdJ6ADVU7QoFstV6MXgE68= go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.45.0/go.mod h1:L7u+MirGoB1bjeLH66+xDykF4RC8C3RN7lIFpBiewUo= -go.opentelemetry.io/otel/log v0.19.0 h1:KUZs/GOsw79TBBMfDWsXS+KZ4g2Ckzksd1ymzsIEbo4= -go.opentelemetry.io/otel/log v0.19.0/go.mod h1:5DQYeGmxVIr4n0/BcJvF4upsraHjg6vudJJpnkL6Ipk= -go.opentelemetry.io/otel/metric v1.45.0 h1:7Eg1uH7CJ5cXv9is6tnBe1FI6rj1nwUdbFypRm3br/M= -go.opentelemetry.io/otel/metric v1.45.0/go.mod h1:HAPbm1nd3p1PmFH7v2dR+6BjXxw+Lq4a2+pndMAm08s= +go.opentelemetry.io/otel/log v1.47.0 h1:cOTS1CcLbSQeZKanGJ+0JpF/+t4PELi3O3bbl2lqCcI= +go.opentelemetry.io/otel/log v1.47.0/go.mod h1:9byitSQ5pLC6PpqwGXjqdMKya6ZTswHRZh2vvXT33nw= +go.opentelemetry.io/otel/metric v1.47.0 h1:4PptaldXx3Eat1XjMZ68pPJEs5wrhlemctZE9a3UdWY= +go.opentelemetry.io/otel/metric v1.47.0/go.mod h1:ADGSXxRrXM6bjbvLo535EstVFlPpPYZm4LBKixjDHwU= go.opentelemetry.io/otel/sdk v1.45.0 h1:4VVSMgQ83dUgW2aoX5f6JgLvHwIvzcuLnF9lUdCSpCw= go.opentelemetry.io/otel/sdk v1.45.0/go.mod h1:Sr40LgXV7DsKMMJMKOhUWOgMWTfAaqvm2kF0g7ilwuA= go.opentelemetry.io/otel/sdk/log v0.19.0 h1:scYVLqT22D2gqXItnWiocLUKGH9yvkkeql5dBDiXyko= go.opentelemetry.io/otel/sdk/log v0.19.0/go.mod h1:vFBowwXGLlW9AvpuF7bMgnNI95LiW10szrOdvzBHlAg= go.opentelemetry.io/otel/sdk/metric v1.45.0 h1:oVFszMfyj1Am6s24Vtc7wBb8BKLcwepJjNEYILuiE3o= go.opentelemetry.io/otel/sdk/metric v1.45.0/go.mod h1:vUWUxDZvu1WVRj8JA8S0AdhsPrZoDpA2DdZauIh4mDA= -go.opentelemetry.io/otel/trace v1.45.0 h1:l/mP6Uv7oNO7/TblbhpbgMidxhq1uO/rPsikOyVhxag= -go.opentelemetry.io/otel/trace v1.45.0/go.mod h1:qoJJA2xNMnxRrdISU/kLtfUH2wNeQbiv+jhs/CxI8bc= +go.opentelemetry.io/otel/trace v1.47.0 h1:JOjX/Oci8K94QHddo+bbfya/Ai/nf6/dt9ZfrFNWSrM= +go.opentelemetry.io/otel/trace v1.47.0/go.mod h1:jNaSLa2PZEYFG6fRjJABAu+bw4FS08uDmPg28lTghu0= go.opentelemetry.io/proto/otlp v1.10.0 h1:IQRWgT5srOCYfiWnpqUYz9CVmbO8bFmKcwYxpuCSL2g= go.opentelemetry.io/proto/otlp v1.10.0/go.mod h1:/CV4QoCR/S9yaPj8utp3lvQPoqMtxXdzn7ozvvozVqk= go.step.sm/crypto v0.77.7 h1:6azC+pD678Vjju8yXnMDHCZJ+HzFaEmL3sCryiezTIA= @@ -858,8 +858,8 @@ google.golang.org/genproto/googleapis/api v0.0.0-20260803160001-6ac0973c030d/go.mod h1:K/+WGbmBY7aNW1HDw1fJnKYo10i0DkAX6pows00dLig= google.golang.org/genproto/googleapis/rpc v0.0.0-20260803160001-6ac0973c030d h1:IL4hdHzcUv2l/gcg98/Rj3FbtE6axwqslOW8SW0C+S0= google.golang.org/genproto/googleapis/rpc v0.0.0-20260803160001-6ac0973c030d/go.mod h1:4Hqkh8ycfw05ld/3BWL7rJOSfebL2Q+DVDeRgYgxUU8= -google.golang.org/grpc v1.83.1 h1:HIO0+BEtBP6soyqvqC8sNUjZ7bTs+0hFQuFF+RAy++Y= -google.golang.org/grpc v1.83.1/go.mod h1:kDyl6SKsiHKt0uylY5gtn5cEjkrIOhQOGDgIc4JGwzQ= +google.golang.org/grpc v1.83.2 h1:EManeRomTObA0BU7I8vXgg/78uE5MJ9M8B39EX2WscU= +google.golang.org/grpc v1.83.2/go.mod h1:YPI1hK3kDked6iHvgX3tR0y+nX/qpMFKhPgFsokw1S8= google.golang.org/protobuf v1.36.12-0.20260120151049-f2248ac996af h1:+5/Sw3GsDNlEmu7TfklWKPdQ0Ykja5VEmq2i817+jbI= google.golang.org/protobuf v1.36.12-0.20260120151049-f2248ac996af/go.mod h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= @@ -884,8 +884,8 @@ k8s.io/client-go v0.36.3/go.mod h1:gcPwr0c87vjjG6HB6pWEqOeuYVoXSsREjzux2j6GF30= k8s.io/klog/v2 v2.140.0 h1:Tf+J3AH7xnUzZyVVXhTgGhEKnFqye14aadWv7bzXdzc= k8s.io/klog/v2 v2.140.0/go.mod h1:o+/RWfJ6PwpnFn7OyAG3QnO47BFsymfEfrz6XyYSSp0= -oras.land/oras-go/v2 v2.6.2 h1:N04RXngAp1LJKTG6ifz3xHPipasEkWr+hFmInja5YKo= -oras.land/oras-go/v2 v2.6.2/go.mod h1:PlTtg4JTDJkDe8yVHpM2wz7/YDc00GVas+i4jAW2TZ4= +oras.land/oras-go/v2 v2.6.4 h1:l4uv+UT7QK4Hju+KOEZ/c8iOjq3iZH7cULoRpUnSDAU= +oras.land/oras-go/v2 v2.6.4/go.mod h1:imXEFiYkTZUVVYkfv/r5GVmWeiLkGtNQA8FU4F/sjKs= pgregory.net/rapid v1.2.0 h1:keKAYRcjm+e1F0oAuU5F5+YPAWcyxNNRK2wud503Gnk= pgregory.net/rapid v1.2.0/go.mod h1:PY5XlDGj0+V1FCq0o192FdRhpKHGTRIWBgqjDBTrq04= sigs.k8s.io/yaml v1.6.0 h1:G8fkbMSAFqgEFgh4b1wmtzDnioxFCUgTZhlbj5P9QYs= diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/jfrog-cli-2.131.0/helm_test.go new/jfrog-cli-2.132.0/helm_test.go --- old/jfrog-cli-2.131.0/helm_test.go 2026-11-03 12:10:32.000000000 +0100 +++ new/jfrog-cli-2.132.0/helm_test.go 2026-11-11 13:25:02.000000000 +0100 @@ -218,9 +218,14 @@ err = helmCmd.Run() require.NoError(t, err, "helm dependency update should succeed") + chartArchiveDestinationDir := filepath.Join(chartDir, "target") + err = os.MkdirAll(chartArchiveDestinationDir, 0o755) + require.NoError(t, err, "Unable to create target directory for chart archive") + jfrogCli := coreTests.NewJfrogCli(execMain, "jfrog", "") args := []string{ "helm", "package", ".", + "--destination", chartArchiveDestinationDir, "--build-name=" + buildName, "--build-number=" + buildNumber, } @@ -236,6 +241,51 @@ validateHelmBuildInfo(t, publishedBuildInfo.BuildInfo, buildName, false, true) } +func TestHelmPackageMultipleChartsWithBuildInfo(t *testing.T) { + initHelmTest(t) + defer cleanHelmTest(t) + + buildName := tests.HelmBuildName + "-package-multi" + buildNumber := "1" + + var chartDirs []string + for _, name := range []string{"test-chart-a", "test-chart-b"} { + chartDir := createTestHelmChartWithDependencies(t, name, "0.1.0") + defer func() { + if err := os.RemoveAll(filepath.Dir(chartDir)); err != nil { + t.Logf("Warning: Failed to remove test chart directory %s: %v", chartDir, err) + } + }() + helmCmd := exec.Command("helm", "dependency", "update") + helmCmd.Dir = chartDir + require.NoError(t, helmCmd.Run(), "helm dependency update should succeed for %s", name) + chartDirs = append(chartDirs, chartDir) + } + + jfrogCli := coreTests.NewJfrogCli(execMain, "jfrog", "") + args := append([]string{"helm", "package"}, chartDirs...) + args = append(args, + "-d", t.TempDir(), + "--build-name="+buildName, + "--build-number="+buildNumber, + ) + require.NoError(t, jfrogCli.Exec(args...), "helm package should succeed") + + assert.NoError(t, artifactoryCli.Exec("bp", buildName, buildNumber)) + + publishedBuildInfo, found, err := tests.GetBuildInfo(serverDetails, buildName, buildNumber) + require.NoError(t, err, "Failed to get build info") + require.True(t, found, "build info should be found") + + validateHelmBuildInfo(t, publishedBuildInfo.BuildInfo, buildName, false, true) + moduleIds := make([]string, 0, len(publishedBuildInfo.BuildInfo.Modules)) + for _, module := range publishedBuildInfo.BuildInfo.Modules { + moduleIds = append(moduleIds, module.Id) + } + assert.ElementsMatch(t, []string{"test-chart-a:0.1.0", "test-chart-b:0.1.0"}, moduleIds, + "build info should have one module per packaged chart") +} + func TestHelmDependencyUpdateWithBuildInfo(t *testing.T) { initHelmTest(t) defer cleanHelmTest(t) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/jfrog-cli-2.131.0/packagealias/config_utils.go new/jfrog-cli-2.132.0/packagealias/config_utils.go --- old/jfrog-cli-2.131.0/packagealias/config_utils.go 2026-11-03 12:10:32.000000000 +0100 +++ new/jfrog-cli-2.132.0/packagealias/config_utils.go 2026-11-11 13:25:02.000000000 +0100 @@ -31,6 +31,34 @@ "bundle": {}, } +// helmBuildInfoSubcommands lists the helm subcommands jf helm collects build info for. +// Other helm subcommands always run natively, so commands like 'helm registry' keep their own behavior. +var helmBuildInfoSubcommands = map[string]struct{}{ + "package": {}, + "push": {}, + "dependency": {}, +} + +// helmGlobalFlagsWithValue lists helm global flags whose value can follow as a separate argument. +var helmGlobalFlagsWithValue = map[string]struct{}{ + "-n": {}, + "--namespace": {}, + "--kube-context": {}, + "--kubeconfig": {}, + "--kube-apiserver": {}, + "--kube-as-user": {}, + "--kube-as-group": {}, + "--kube-ca-file": {}, + "--kube-token": {}, + "--kube-tls-server-name": {}, + "--registry-config": {}, + "--repository-cache": {}, + "--repository-config": {}, + "--content-cache": {}, + "--burst-limit": {}, + "--qps": {}, +} + func newDefaultConfig() *Config { return &Config{ Enabled: true, @@ -267,6 +295,20 @@ return keys } +// getHelmSubcommand returns the first argument that is neither a flag nor the value of a global flag. +func getHelmSubcommand(args []string) string { + for index := 0; index < len(args); index++ { + arg := args[index] + if !strings.HasPrefix(arg, "-") { + return strings.ToLower(arg) + } + if _, takesValue := helmGlobalFlagsWithValue[arg]; takesValue { + index++ + } + } + return "" +} + func getModeForTool(config *Config, tool string, args []string) AliasMode { config = normalizeConfig(config) if tool == "go" { @@ -290,6 +332,12 @@ return ModeJF } + if tool == "helm" { + if _, collectsBuildInfo := helmBuildInfoSubcommands[getHelmSubcommand(args)]; !collectsBuildInfo { + return ModePass + } + } + mode, found := config.ToolModes[tool] if !found { if _, isDefaultPass := defaultPassTools[tool]; isDefaultPass { diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/jfrog-cli-2.131.0/packagealias/config_utils_test.go new/jfrog-cli-2.132.0/packagealias/config_utils_test.go --- old/jfrog-cli-2.131.0/packagealias/config_utils_test.go 2026-11-03 12:10:32.000000000 +0100 +++ new/jfrog-cli-2.132.0/packagealias/config_utils_test.go 2026-11-11 13:25:02.000000000 +0100 @@ -60,6 +60,49 @@ require.Equal(t, ModeJF, mode) } +func TestGetHelmSubcommand(t *testing.T) { + tests := []struct { + args []string + expected string + }{ + {[]string{"package", "./chart", "-d", "out"}, "package"}, + {[]string{"-n", "prod", "upgrade", "release", "./chart"}, "upgrade"}, + {[]string{"--kube-context", "ctx", "--debug", "push", "chart.tgz", "oci://repo"}, "push"}, + {[]string{"--namespace=prod", "template", "release", "./chart"}, "template"}, + {[]string{"--debug"}, ""}, + {nil, ""}, + } + for _, test := range tests { + require.Equal(t, test.expected, getHelmSubcommand(test.args), "args: %v", test.args) + } +} + +func TestGetModeForToolRoutesOnlyHelmBuildInfoCommandsToJf(t *testing.T) { + config := &Config{} + for _, args := range [][]string{ + {"package", "./chart"}, + {"push", "chart.tgz", "oci://repo"}, + {"dependency", "update"}, + {"-n", "prod", "package", "./chart"}, + } { + require.Equal(t, ModeJF, getModeForTool(config, "helm", args), "args: %v", args) + } + for _, args := range [][]string{ + {"registry", "login", "ghcr.io"}, + {"registry", "logout", "ghcr.io"}, + {"-n", "prod", "template", "release", "./chart"}, + {"env"}, + {"version"}, + {}, + } { + require.Equal(t, ModePass, getModeForTool(config, "helm", args), "args: %v", args) + } + + config.ToolModes = map[string]AliasMode{"helm": ModePass} + require.Equal(t, ModePass, getModeForTool(config, "helm", []string{"package", "./chart"}), + "a configured pass mode should still apply to build-info commands") +} + func TestGetModeForToolFallsBackForInvalidModes(t *testing.T) { config := &Config{ ToolModes: map[string]AliasMode{ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/jfrog-cli-2.131.0/packagealias/packagealias.go new/jfrog-cli-2.132.0/packagealias/packagealias.go --- old/jfrog-cli-2.131.0/packagealias/packagealias.go 2026-11-03 12:10:32.000000000 +0100 +++ new/jfrog-cli-2.132.0/packagealias/packagealias.go 2026-11-11 13:25:02.000000000 +0100 @@ -34,6 +34,7 @@ "gem", "bundle", "apk", + "helm", } // AliasMode represents how a tool should be handled diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/jfrog-cli-2.131.0/transfer_test.go new/jfrog-cli-2.132.0/transfer_test.go --- old/jfrog-cli-2.131.0/transfer_test.go 2026-11-03 12:10:32.000000000 +0100 +++ new/jfrog-cli-2.132.0/transfer_test.go 2026-11-11 13:25:02.000000000 +0100 @@ -65,13 +65,6 @@ t.Skip("Skipping transfer test. To run transfer test add the '-test.transfer=true' option.") } oldHomeDir, newHomeDir := prepareHomeDir(t) - if *tests.InstallDataTransferPlugin { - if *tests.JfrogHome != "" { - coreutils.ExitOnErr(artifactoryCli.WithoutCredentials().Exec("transfer-plugin-install", inttestutils.SourceServerId, "--home-dir="+*tests.JfrogHome)) - } else { - coreutils.ExitOnErr(artifactoryCli.WithoutCredentials().Exec("transfer-plugin-install", inttestutils.SourceServerId)) - } - } // Delete the target server if exist targetConfig, err := commands.GetConfig(inttestutils.TargetServerId, false) @@ -83,9 +76,6 @@ err = coretests.NewJfrogCli(execMain, "jfrog config", "--access-token="+*tests.JfrogTargetAccessToken).Exec("add", inttestutils.TargetServerId, "--interactive=false", "--url="+*tests.JfrogTargetUrl) assert.NoError(t, err) - if *tests.InstallDataTransferPlugin { - assert.NoError(t, artifactoryCli.WithoutCredentials().Exec("curl", "-XPOST", "/api/plugins/reload")) - } return func() { cleanArtifactory() inttestutils.CleanTargetRepos(targetArtifactoryCli) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/jfrog-cli-2.131.0/utils/cliutils/cli_consts.go new/jfrog-cli-2.132.0/utils/cliutils/cli_consts.go --- old/jfrog-cli-2.131.0/utils/cliutils/cli_consts.go 2026-11-03 12:10:32.000000000 +0100 +++ new/jfrog-cli-2.132.0/utils/cliutils/cli_consts.go 2026-11-11 13:25:02.000000000 +0100 @@ -4,7 +4,7 @@ const ( // General CLI constants - CliVersion = "2.131.0" + CliVersion = "2.132.0" ClientAgent = "jfrog-cli-go" // CLI base commands constants: diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/jfrog-cli-2.131.0/utils/cliutils/commandsflags.go new/jfrog-cli-2.132.0/utils/cliutils/commandsflags.go --- old/jfrog-cli-2.131.0/utils/cliutils/commandsflags.go 2026-11-03 12:10:32.000000000 +0100 +++ new/jfrog-cli-2.132.0/utils/cliutils/commandsflags.go 2026-11-11 13:25:02.000000000 +0100 @@ -1969,15 +1969,15 @@ }, installPluginVersion: cli.StringFlag{ Name: Version, - Usage: "[Default: latest] The plugin version to download and install.` `", + Usage: "[DEPRECATED] Ignored.` `", }, InstallPluginSrcDir: cli.StringFlag{ Name: InstallPluginSrcDir, - Usage: "[Optional] The local directory that contains the plugin files to install.` `", + Usage: "[DEPRECATED] Ignored.` `", }, InstallPluginHomeDir: cli.StringFlag{ Name: InstallPluginHomeDir, - Usage: "[Default: /opt/jfrog] The local JFrog home directory to install the plugin in.` `", + Usage: "[DEPRECATED] Ignored.` `", }, PreChecks: cli.BoolFlag{ Name: PreChecks, diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/jfrog-cli-2.131.0/utils/tests/utils.go new/jfrog-cli-2.132.0/utils/tests/utils.go --- old/jfrog-cli-2.131.0/utils/tests/utils.go 2026-11-03 12:10:32.000000000 +0100 +++ new/jfrog-cli-2.132.0/utils/tests/utils.go 2026-11-11 13:25:02.000000000 +0100 @@ -43,59 +43,58 @@ ) var ( - JfrogUrl *string - JfrogUser *string - JfrogPassword *string - JfrogSshKeyPath *string - JfrogSshPassphrase *string - JfrogAccessToken *string - JfrogTargetUrl *string - JfrogTargetAccessToken *string - JfrogHome *string - TestArtifactoryProject *bool - TestArtifactory *bool - TestArtifactoryProxy *bool - TestDistribution *bool - TestDocker *bool - TestPodman *bool - TestDockerScan *bool - ContainerRegistry *string - TestGo *bool - TestNpm *bool - TestPnpm *bool - TestGradle *bool - TestMaven *bool - TestNuget *bool - TestChoco *bool - TestPSResource *bool - TestPip *bool - TestPipenv *bool - TestPoetry *bool - TestUv *bool - TestNix *bool - TestCargo *bool - TestAlpine *bool - TestRuby *bool - TestApt *bool - TestAgentPlugins *bool - TestAgentSkills *bool - TestApm *bool - TestConan *bool - TestHelm *bool - TestHuggingFace *bool - TestPlugins *bool - TestXray *bool - TestAccess *bool - TestTransfer *bool - TestLifecycle *bool - TestEvidence *bool - TestApi *bool - TestGhostFrog *bool - TestIde *bool - HideUnitTestLog *bool - ciRunId *string - InstallDataTransferPlugin *bool - timestampAdded bool + JfrogUrl *string + JfrogUser *string + JfrogPassword *string + JfrogSshKeyPath *string + JfrogSshPassphrase *string + JfrogAccessToken *string + JfrogTargetUrl *string + JfrogTargetAccessToken *string + JfrogHome *string + TestArtifactoryProject *bool + TestArtifactory *bool + TestArtifactoryProxy *bool + TestDistribution *bool + TestDocker *bool + TestPodman *bool + TestDockerScan *bool + ContainerRegistry *string + TestGo *bool + TestNpm *bool + TestPnpm *bool + TestGradle *bool + TestMaven *bool + TestNuget *bool + TestChoco *bool + TestPSResource *bool + TestPip *bool + TestPipenv *bool + TestPoetry *bool + TestUv *bool + TestNix *bool + TestCargo *bool + TestAlpine *bool + TestRuby *bool + TestApt *bool + TestAgentPlugins *bool + TestAgentSkills *bool + TestApm *bool + TestConan *bool + TestHelm *bool + TestHuggingFace *bool + TestPlugins *bool + TestXray *bool + TestAccess *bool + TestTransfer *bool + TestLifecycle *bool + TestEvidence *bool + TestApi *bool + TestGhostFrog *bool + TestIde *bool + HideUnitTestLog *bool + ciRunId *string + timestampAdded bool ) // nonProjectKeyCharsRegex matches any character that isn't allowed in an Artifactory @@ -171,8 +170,9 @@ TestIde = flag.Bool("test.ide", false, "Test IDE (VS Code / Cursor / Windsurf / Kiro / JetBrains) setup commands") ContainerRegistry = flag.String("test.containerRegistry", "localhost:8082", "Container registry") HideUnitTestLog = flag.Bool("test.hideUnitTestLog", false, "Hide unit tests logs and print it in a file") - InstallDataTransferPlugin = flag.Bool("test.installDataTransferPlugin", false, "Install data-transfer plugin on the source Artifactory server") ciRunId = flag.String("ci.runId", "", "A unique identifier used as a suffix to create repositories and builds in the tests") + // Deprecated: ignored, kept so existing pipelines don't fail on an unknown flag. + _ = flag.Bool("test.installDataTransferPlugin", false, "[DEPRECATED] Ignored") } func CleanFileSystem() { ++++++ jfrog-cli.obsinfo ++++++ --- /var/tmp/diff_new_pack.egadad/_old 2026-11-13 18:38:54.276374367 +0100 +++ /var/tmp/diff_new_pack.egadad/_new 2026-11-13 18:38:54.279374494 +0100 @@ -1,5 +1,5 @@ name: jfrog-cli -version: 2.131.0 -mtime: 1793704232 -commit: 7cd517216cfb29dd957b6888b9082c1b1865acd3 +version: 2.132.0 +mtime: 1794399902 +commit: 14688e5950be88ca67c4a17a865e12dafab69ef0 ++++++ vendor.tar.gz ++++++ /work/SRC/openSUSE:Factory/jfrog-cli/vendor.tar.gz /work/SRC/openSUSE:Factory/.jfrog-cli.new.1251/vendor.tar.gz differ: char 150, line 1
