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-03-27 16:50:42 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/jfrog-cli (Old) and /work/SRC/openSUSE:Factory/.jfrog-cli.new.8177 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "jfrog-cli" Fri Mar 27 16:50:42 2026 rev:32 rq:1343107 version:2.97.0 Changes: -------- --- /work/SRC/openSUSE:Factory/jfrog-cli/jfrog-cli.changes 2026-03-12 22:26:57.633846311 +0100 +++ /work/SRC/openSUSE:Factory/.jfrog-cli.new.8177/jfrog-cli.changes 2026-03-27 16:53:23.433201320 +0100 @@ -1,0 +2,72 @@ +Fri Mar 27 05:57:25 UTC 2026 - Johannes Kastl <[email protected]> + +- Update to version 2.97.0: + * New Features + - [jfrog-cli-artifactory] XRAY-136990 - Added Dependency + Exlcusion Based on Scope #394 (@omerb-jfrog) + - [jfrog-cli-security] Add Force specific tech in static sca + #655 (@attiasas) + - [jfrog-cli-security] Add validation error if required package + not installed for the AM #604 (@attiasas) + - [jfrog-client-go] Add get evidence version api call #1325 + (@mnsboev) + * Bug Fixes + - [jfrog-cli-artifactory] fix conan recipe not in root dir + issue #397 (@reshmifrog) + - [jfrog-cli-artifactory] Added logic for checking release + bundle into release-bundles-v2-jfds #396 (@naveenku-jfrog) + - [jfrog-cli-artifactory] Reverting the changes done in PR396 + #399 (@naveenku-jfrog) + - [jfrog-cli-artifactory] Added logic for adding python script + by embed package #395 (@naveenku-jfrog) + - [jfrog-cli-artifactory] fx helm subdomain issue #400 + (@reshmifrog) + - [jfrog-cli-artifactory] Addressed bughunt bugs and + improvements #401 (@naveenku-jfrog) + - [jfrog-cli-security] Fix Secret violations parsing static-sca + #695 (@attiasas) + - [jfrog-cli-security] Display partial results on parsing error + #696 (@attiasas) + - [jfrog-cli-security] Fix diff cascade removal bug #697 + (@attiasas) + - [jfrog-cli-security] Fix use wrapper mvn #699 (@attiasas) + - [jfrog-cli-security] Fix "permission denied" issue with + gradlew and MavenW #700 (@eranturgeman) + - [jfrog-cli-security] Fix version remediation in CDX mapping + #698 (@eranturgeman) + - [jfrog-client-go] JA-19680 - Fixed flaky test - Roles should + match regardless of order #1323 (@ranjithkm-jfrog) + - [jfrog-client-go] Addressed bug for updating project key in + release bundle query #1322 (@naveenku-jfrog) + - [jfrog-client-go] Fix xray report api #1327 (@attiasas) + * Internal Changes + - [jfrog-cli] Update dependencies (except evidence) #3403 + (@RemiBou) + - [jfrog-cli-security] Update dependencies #703 (@attiasas) + * Other Changes + - [build-info-go] conan-recipe-not-in-root-dir #372 + (@reshmifrog) + - [jfrog-cli] respect args passed through cli conan cmds #3378 + (@reshmifrog) + - [jfrog-cli] Updated config in CLI e2e Pipeline for nodepool + and integration used #3391 (@neha-mishraa) + - [jfrog-cli] Updated nodepool for CLI e2e Pipeline #3392 + (@neha-mishraa) + - [jfrog-cli] Removed project key environment variable from the + pipeline config #3393 (@neha-mishraa) + - [jfrog-cli] Workflow to rewrite the release notes #3398 + (@itsmeleela) + - [jfrog-cli] Addressed bugs/improvements in huggingface + bughunts #3395 (@naveenku-jfrog) + - [jfrog-cli] Workflow hardening #3401 (@barakharyati) + - [jfrog-cli-artifactory] use conan upload json format #392 + (@reshmifrog) + - [jfrog-cli-artifactory] Skills commands improvements #405 + (@bhanurp) + - [jfrog-cli-core] Get deployment view #1533 (@attiasas) + - [jfrog-cli-security] Remove link to platform on audit cmd + #706 (@attiasas) + - [jfrog-client-go] Change pull_request_target to pull_request + in workflow #1330 (@barakharyati) + +------------------------------------------------------------------- Old: ---- jfrog-cli-2.96.0.obscpio New: ---- jfrog-cli-2.97.0.obscpio ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ jfrog-cli.spec ++++++ --- /var/tmp/diff_new_pack.6BrWdt/_old 2026-03-27 16:53:26.845344158 +0100 +++ /var/tmp/diff_new_pack.6BrWdt/_new 2026-03-27 16:53:26.845344158 +0100 @@ -19,7 +19,7 @@ %define executable_name jf Name: jfrog-cli -Version: 2.96.0 +Version: 2.97.0 Release: 0 Summary: A client that automates access to the JFrog products License: Apache-2.0 ++++++ _service ++++++ --- /var/tmp/diff_new_pack.6BrWdt/_old 2026-03-27 16:53:26.889346000 +0100 +++ /var/tmp/diff_new_pack.6BrWdt/_new 2026-03-27 16:53:26.893346167 +0100 @@ -3,7 +3,7 @@ <param name="url">https://github.com/jfrog/jfrog-cli.git</param> <param name="scm">git</param> <param name="exclude">.git</param> - <param name="revision">v2.96.0</param> + <param name="revision">v2.97.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.6BrWdt/_old 2026-03-27 16:53:26.917347172 +0100 +++ /var/tmp/diff_new_pack.6BrWdt/_new 2026-03-27 16:53:26.921347339 +0100 @@ -1,6 +1,6 @@ <servicedata> <service name="tar_scm"> <param name="url">https://github.com/jfrog/jfrog-cli.git</param> - <param name="changesrevision">98e042f987347358f01d7d9a991e576bc82aa119</param></service></servicedata> + <param name="changesrevision">f5cdf710b5ab0c6df30b1ba6fb719affb96d1e6d</param></service></servicedata> (No newline at EOF) ++++++ jfrog-cli-2.96.0.obscpio -> jfrog-cli-2.97.0.obscpio ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/jfrog-cli-2.96.0/.jfrog-pipelines/pipelines.yml new/jfrog-cli-2.97.0/.jfrog-pipelines/pipelines.yml --- old/jfrog-cli-2.96.0/.jfrog-pipelines/pipelines.yml 2026-03-11 10:17:35.000000000 +0100 +++ new/jfrog-cli-2.97.0/.jfrog-pipelines/pipelines.yml 2026-03-26 09:04:44.000000000 +0100 @@ -3,7 +3,7 @@ type: GitRepo configuration: path: jfrog/jfrog-cli - gitProvider: jfrog_cli_github + gitProvider: jfrog_cli_gh branches: include: master - name: cli_coreapps_env_details @@ -23,7 +23,6 @@ - name: jfrog_cli_tests environmentVariables: readOnly: - JFROG_CLI_BUILD_PROJECT: "" GRADLE_OPTS: "-Dorg.gradle.daemon=false" RT_VERSION: default: "${RT_VERSION}" @@ -50,7 +49,6 @@ - name: setup_cli_test type: Bash configuration: - nodePool: k8s_u20 integrations: - name: docker_jfrog_io_reader outputResources: @@ -136,7 +134,6 @@ - name: jfrog_oauth_token inputResources: - name: cli_coreapps_env_details - nodePool: k8s_u20 integrations: - name: docker_jfrog_io_reader execution: @@ -226,7 +223,6 @@ type: Matrix stepMode: Bash configuration: - nodePool: k8s_u20 multiNode: true integrations: - name: docker_jfrog_io_reader @@ -328,7 +324,6 @@ - name: docker_cli_tests type: Bash configuration: - nodePool: k8s_u20 integrations: - name: docker_jfrog_io_reader - name: jfrog_cli_tests @@ -524,7 +519,6 @@ - name: artifactory_cli_tests type: Bash configuration: - nodePool: k8s_u20 integrations: - name: docker_jfrog_io_reader inputResources: @@ -597,7 +591,6 @@ - name: go_cli_tests type: Bash configuration: - nodePool: k8s_u20 integrations: - name: docker_jfrog_io_reader inputResources: @@ -662,7 +655,6 @@ - name: maven_cli_tests type: Bash configuration: - nodePool: k8s_u20 integrations: - name: docker_jfrog_io_reader inputResources: @@ -750,7 +742,6 @@ - name: npm_cli_tests type: Bash configuration: - nodePool: k8s_u20 integrations: - name: docker_jfrog_io_reader inputResources: @@ -829,7 +820,6 @@ - name: nuget_cli_tests type: Bash configuration: - nodePool: k8s_u20 integrations: - name: docker_jfrog_io_reader inputResources: @@ -937,7 +927,6 @@ - name: podman_cli_tests type: Bash configuration: - nodePool: k8s_u20 integrations: - name: docker_jfrog_io_reader inputResources: @@ -1006,7 +995,6 @@ - name: pip_cli_tests type: Bash configuration: - nodePool: k8s_u20 integrations: - name: docker_jfrog_io_reader inputResources: @@ -1103,7 +1091,6 @@ - name: pipenv_cli_tests type: Bash configuration: - nodePool: k8s_u20 integrations: - name: docker_jfrog_io_reader inputResources: diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/jfrog-cli-2.96.0/build/npm/v2/package-lock.json new/jfrog-cli-2.97.0/build/npm/v2/package-lock.json --- old/jfrog-cli-2.96.0/build/npm/v2/package-lock.json 2026-03-11 10:17:35.000000000 +0100 +++ new/jfrog-cli-2.97.0/build/npm/v2/package-lock.json 2026-03-26 09:04:44.000000000 +0100 @@ -1,5 +1,5 @@ { "name": "jfrog-cli-v2", - "version": "2.96.0", + "version": "2.97.0", "lockfileVersion": 2 } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/jfrog-cli-2.96.0/build/npm/v2/package.json new/jfrog-cli-2.97.0/build/npm/v2/package.json --- old/jfrog-cli-2.96.0/build/npm/v2/package.json 2026-03-11 10:17:35.000000000 +0100 +++ new/jfrog-cli-2.97.0/build/npm/v2/package.json 2026-03-26 09:04:44.000000000 +0100 @@ -1,6 +1,6 @@ { "name": "jfrog-cli-v2", - "version": "2.96.0", + "version": "2.97.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.96.0/build/npm/v2-jf/package-lock.json new/jfrog-cli-2.97.0/build/npm/v2-jf/package-lock.json --- old/jfrog-cli-2.96.0/build/npm/v2-jf/package-lock.json 2026-03-11 10:17:35.000000000 +0100 +++ new/jfrog-cli-2.97.0/build/npm/v2-jf/package-lock.json 2026-03-26 09:04:44.000000000 +0100 @@ -1,5 +1,5 @@ { "name": "jfrog-cli-v2-jf", - "version": "2.96.0", + "version": "2.97.0", "lockfileVersion": 1 } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/jfrog-cli-2.96.0/build/npm/v2-jf/package.json new/jfrog-cli-2.97.0/build/npm/v2-jf/package.json --- old/jfrog-cli-2.96.0/build/npm/v2-jf/package.json 2026-03-11 10:17:35.000000000 +0100 +++ new/jfrog-cli-2.97.0/build/npm/v2-jf/package.json 2026-03-26 09:04:44.000000000 +0100 @@ -1,6 +1,6 @@ { "name": "jfrog-cli-v2-jf", - "version": "2.96.0", + "version": "2.97.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.96.0/buildtools/cli.go new/jfrog-cli-2.97.0/buildtools/cli.go --- old/jfrog-cli-2.96.0/buildtools/cli.go 2026-03-11 10:17:35.000000000 +0100 +++ new/jfrog-cli-2.97.0/buildtools/cli.go 2026-03-26 09:04:44.000000000 +0100 @@ -4,6 +4,7 @@ "errors" "fmt" conancommand "github.com/jfrog/jfrog-cli-artifactory/artifactory/commands/conan" + "io/fs" "os" "os/exec" "path/filepath" @@ -60,6 +61,8 @@ gradledoc "github.com/jfrog/jfrog-cli/docs/buildtools/gradle" "github.com/jfrog/jfrog-cli/docs/buildtools/gradleconfig" "github.com/jfrog/jfrog-cli/docs/buildtools/huggingface" + huggingfacedownloaddocs "github.com/jfrog/jfrog-cli/docs/buildtools/huggingfacedownload" + huggingfaceuploaddocs "github.com/jfrog/jfrog-cli/docs/buildtools/huggingfaceupload" mvndoc "github.com/jfrog/jfrog-cli/docs/buildtools/mvn" "github.com/jfrog/jfrog-cli/docs/buildtools/mvnconfig" "github.com/jfrog/jfrog-cli/docs/buildtools/npmcommand" @@ -84,10 +87,12 @@ ) const ( - buildToolsCategory = "Package Managers:" - huggingfaceAPI = "api/huggingfaceml" - HF_ENDPOINT = "HF_ENDPOINT" - HF_TOKEN = "HF_TOKEN" + buildToolsCategory = "Package Managers:" + huggingfaceAPI = "api/huggingfaceml" + HF_ENDPOINT = "HF_ENDPOINT" + HF_TOKEN = "HF_TOKEN" + HF_HUB_ETAG_TIMEOUT = "HF_HUB_ETAG_TIMEOUT" + HF_HUB_DOWNLOAD_TIMEOUT = "HF_HUB_DOWNLOAD_TIMEOUT" ) func GetCommands() []cli.Command { @@ -483,13 +488,36 @@ { Name: "hugging-face", Aliases: []string{"hf"}, - Flags: cliutils.GetCommandFlags(cliutils.HuggingFace), HelpName: corecommon.CreateUsage("hugging-face", huggingface.GetDescription(), huggingface.Usage), Description: huggingface.GetDescription(), - UsageText: huggingface.GetArguments(), Hidden: true, - Action: huggingFaceCmd, Category: buildToolsCategory, + Action: func(c *cli.Context) error { + if c.Args().Present() { + return fmt.Errorf("'%s %s' is not a valid subcommand. Run 'jf hf --help' for usage", c.App.Name, c.Args().First()) + } + return cli.ShowSubcommandHelp(c) + }, + Subcommands: []cli.Command{ + { + Name: "upload", + Aliases: []string{"u"}, + Flags: cliutils.GetCommandFlags(cliutils.HuggingFaceUpload), + HelpName: corecommon.CreateUsage("hf upload", huggingfaceuploaddocs.GetDescription(), huggingfaceuploaddocs.Usage), + Usage: huggingfaceuploaddocs.GetDescription(), + UsageText: huggingfaceuploaddocs.GetArguments(), + Action: huggingFaceUploadCmd, + }, + { + Name: "download", + Aliases: []string{"d"}, + Flags: cliutils.GetCommandFlags(cliutils.HuggingFaceDownload), + HelpName: corecommon.CreateUsage("hf download", huggingfacedownloaddocs.GetDescription(), huggingfacedownloaddocs.Usage), + Usage: huggingfacedownloaddocs.GetDescription(), + UsageText: huggingfacedownloaddocs.GetArguments(), + Action: huggingFaceDownloadCmd, + }, + }, }, }) return decorateWithFlagCapture(cmds) @@ -1131,39 +1159,27 @@ return nil } -func huggingFaceCmd(c *cli.Context) error { - if show, err := cliutils.ShowCmdHelpIfNeeded(c, c.Args()); show || err != nil { - return err - } - if c.NArg() < 1 { - return cliutils.WrongNumberOfArgumentsHandler(c) - } - args := cliutils.ExtractCommand(c) - cmdName, hfArgs := getCommandName(args) - switch cmdName { - case "u", "upload": - return huggingFaceUploadCmd(c, "upload", hfArgs) - case "d", "download": - return huggingFaceDownloadCmd(c, "download", hfArgs) - default: - return errorutils.CheckErrorf("unknown HuggingFace command: '%s'. Valid commands are: upload (u), download (d)", cmdName) - } -} - -func huggingFaceUploadCmd(c *cli.Context, cmdName string, hfArgs []string) error { - // Upload requires folderPath and repoID - if len(hfArgs) < 2 { +func huggingFaceUploadCmd(c *cli.Context) error { + if c.NArg() < 2 { return cliutils.PrintHelpAndReturnError("Folder path and repository ID are required.", c) } - folderPath := hfArgs[0] + folderPath := c.Args().Get(0) if folderPath == "" { return cliutils.PrintHelpAndReturnError("Folder path cannot be empty.", c) } - repoID := hfArgs[1] + absPath, err := filepath.Abs(folderPath) + if err != nil { + return fmt.Errorf("failed to resolve absolute path: %w", err) + } + folderPath = absPath + if err = validateFolderHasUploadableFiles(folderPath); err != nil { + return err + } + repoID := c.Args().Get(1) if repoID == "" { return cliutils.PrintHelpAndReturnError("Repository ID cannot be empty.", c) } - serverDetails, err := getHuggingFaceServerDetails(hfArgs) + serverDetails, err := getHuggingFaceServerDetails(c) if err != nil { return err } @@ -1183,28 +1199,30 @@ if repoType == "" { repoType = "model" } - huggingFaceUploadCmd := huggingfaceCommands.NewHuggingFaceUpload(). - SetCommandName(cmdName). + if repoType != "model" && repoType != "dataset" { + return fmt.Errorf("wrong repo type provided, allowed repo-type are : model and dataset") + } + cmd := huggingfaceCommands.NewHuggingFaceUpload(). + SetCommandName("upload"). SetFolderPath(folderPath). SetRepoId(repoID). SetRepoType(repoType). SetRevision(revision). SetServerDetails(serverDetails). SetBuildConfiguration(buildConfiguration) - return commands.Exec(huggingFaceUploadCmd) + return commands.Exec(cmd) } -func huggingFaceDownloadCmd(c *cli.Context, cmdName string, hfArgs []string) error { - // Download requires repoID - if len(hfArgs) < 1 { +func huggingFaceDownloadCmd(c *cli.Context) error { + if c.NArg() < 1 { return cliutils.PrintHelpAndReturnError("Model/Dataset name is required.", c) } const defaultETagTimeout = 86400 - repoID := hfArgs[0] + repoID := c.Args().Get(0) if repoID == "" { return cliutils.PrintHelpAndReturnError("Model/Dataset name cannot be empty.", c) } - serverDetails, err := getHuggingFaceServerDetails(hfArgs) + serverDetails, err := getHuggingFaceServerDetails(c) if err != nil { return err } @@ -1227,26 +1245,59 @@ if repoType == "" { repoType = "model" } + if repoType != "model" && repoType != "dataset" { + return fmt.Errorf("wrong repo type provided, allowed repo-type are : model and dataset") + } revision := c.String("revision") if revision == "" { revision = "main" } - huggingFaceDownloadCmd := huggingfaceCommands.NewHuggingFaceDownload(). - SetCommandName(cmdName). + cmd := huggingfaceCommands.NewHuggingFaceDownload(). + SetCommandName("download"). SetRepoId(repoID). SetRepoType(repoType). SetRevision(revision). SetEtagTimeout(etagTimeout). SetServerDetails(serverDetails). SetBuildConfiguration(buildConfiguration) - return commands.Exec(huggingFaceDownloadCmd) + return commands.Exec(cmd) } -func getHuggingFaceServerDetails(args []string) (*coreConfig.ServerDetails, error) { - _, serverID, err := coreutils.ExtractServerIdFromCommand(args) +// validateFolderHasUploadableFiles walks the folder recursively and returns an error +// if no visible (non-hidden) regular files are found. Hidden entries — anything whose +// name starts with '.' (e.g. .git, .DS_Store) — are skipped entirely. +func validateFolderHasUploadableFiles(folderPath string) error { + found := false + err := filepath.WalkDir(folderPath, func(path string, d fs.DirEntry, walkErr error) error { + if walkErr != nil { + return walkErr + } + name := d.Name() + // Skip hidden files and directories (e.g. .git, .DS_Store). + if len(name) > 0 && name[0] == '.' { + if d.IsDir() { + return filepath.SkipDir + } + return nil + } + // A visible regular file counts as uploadable content. + if !d.IsDir() { + found = true + return filepath.SkipAll + } + return nil + }) if err != nil { - return nil, fmt.Errorf("failed to extract server ID: %w", err) + return fmt.Errorf("failed to read folder '%s': %w", folderPath, err) + } + if !found { + return fmt.Errorf("folder '%s' contains no uploadable files (only hidden files or empty directories were found)", folderPath) } + return nil +} + +func getHuggingFaceServerDetails(c *cli.Context) (*coreConfig.ServerDetails, error) { + serverID := c.String("server-id") if serverID == "" { serverDetails, err := coreConfig.GetDefaultServerConf() if err != nil { @@ -1257,7 +1308,7 @@ } return serverDetails, nil } - serverDetails, err := coreConfig.GetSpecificConfig(serverID, true, true) + serverDetails, err := coreConfig.GetSpecificConfig(serverID, true, false) if err != nil { return nil, fmt.Errorf("failed to get server configuration for ID '%s': %w", serverID, err) } @@ -1265,26 +1316,37 @@ } func updateHuggingFaceEnv(c *cli.Context, serverDetails *coreConfig.ServerDetails) error { - if os.Getenv(HF_ENDPOINT) == "" { - repoKey := c.String("repo-key") - if repoKey == "" { - return cliutils.PrintHelpAndReturnError("Please specify a repository key.", c) - } + repoKey := c.String("repo-key") + if repoKey != "" { hfEndpoint := serverDetails.GetArtifactoryUrl() + huggingfaceAPI + "/" + repoKey err := os.Setenv(HF_ENDPOINT, hfEndpoint) if err != nil { return err } } - if os.Getenv(HF_TOKEN) == "" { - accessToken := serverDetails.GetAccessToken() - if accessToken == "" { - return cliutils.PrintHelpAndReturnError("You need to specify an access token.", c) - } - err := os.Setenv(HF_TOKEN, accessToken) - if err != nil { - return err - } + accessToken := serverDetails.GetAccessToken() + if accessToken == "" { + return cliutils.PrintHelpAndReturnError("Access token is expired or missing, please either use rt ping command or update access token.", c) + } + err := os.Setenv(HF_TOKEN, accessToken) + if err != nil { + return err + } + etagTimeout := c.Int("hf-hub-etag-timeout") + if etagTimeout == 0 { + etagTimeout = 86400 + } + err = os.Setenv(HF_HUB_ETAG_TIMEOUT, strconv.Itoa(etagTimeout)) + if err != nil { + return err + } + downloadTimeout := c.Int("hf-hub-download-timeout") + if downloadTimeout == 0 { + downloadTimeout = 86400 + } + err = os.Setenv(HF_HUB_DOWNLOAD_TIMEOUT, strconv.Itoa(downloadTimeout)) + if err != nil { + return err } return nil } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/jfrog-cli-2.96.0/conan_test.go new/jfrog-cli-2.97.0/conan_test.go --- old/jfrog-cli-2.96.0/conan_test.go 2026-03-11 10:17:35.000000000 +0100 +++ new/jfrog-cli-2.97.0/conan_test.go 2026-03-26 09:04:44.000000000 +0100 @@ -454,6 +454,30 @@ return projectPath } +func createConanProjectNoName(t *testing.T, outputFolder string) string { + projectSrc := filepath.Join(filepath.FromSlash(tests.GetTestResourcesPath()), "conan", "conanproject-noname") + tmpDir, cleanupCallback := coretests.CreateTempDirWithCallbackAndAssert(t) + + projectPath := filepath.Join(tmpDir, outputFolder) + require.NoError(t, biutils.CopyDir(projectSrc, projectPath, true, nil)) + + t.Cleanup(cleanupCallback) + + return projectPath +} + +func createConanProjectSubdir(t *testing.T, outputFolder string) string { + projectSrc := filepath.Join(filepath.FromSlash(tests.GetTestResourcesPath()), "conan", "conanproject-subdir") + tmpDir, cleanupCallback := coretests.CreateTempDirWithCallbackAndAssert(t) + + projectPath := filepath.Join(tmpDir, outputFolder) + require.NoError(t, biutils.CopyDir(projectSrc, projectPath, true, nil)) + + t.Cleanup(cleanupCallback) + + return projectPath +} + func configureConanRemote(t *testing.T) { // Remove existing remote if any _ = exec.Command("conan", "remote", "remove", tests.ConanVirtualRepo).Run() @@ -472,6 +496,209 @@ _ = exec.Command("conan", "remote", "remove", tests.ConanLocalRepo).Run() } +// TestConanInstallRequiresNoRecipe tests 'jf conan install --requires' without any conanfile. +func TestConanInstallRequiresNoRecipe(t *testing.T) { + initConanTest(t) + buildNumber := "1" + + // Create empty project dir (no conanfile) + tmpDir, cleanupCallback := coretests.CreateTempDirWithCallbackAndAssert(t) + t.Cleanup(cleanupCallback) + projectPath := filepath.Join(tmpDir, "no-recipe-test") + require.NoError(t, os.MkdirAll(projectPath, 0755)) + + wd, err := os.Getwd() + require.NoError(t, err) + chdirCallback := clientTestUtils.ChangeDirWithCallback(t, wd, projectPath) + defer chdirCallback() + + configureConanRemote(t) + defer cleanupConanRemote() + + jfrogCli := coretests.NewJfrogCli(execMain, "jfrog", "") + args := []string{ + "conan", "install", + "--requires", "zlib/1.3.1", + "--build", "missing", + "-r", tests.ConanVirtualRepo, + "--build-name=" + tests.ConanBuildName, + "--build-number=" + buildNumber, + } + require.NoError(t, jfrogCli.Exec(args...), "conan install --requires should succeed without a conanfile") + + require.NoError(t, artifactoryCli.Exec("bp", tests.ConanBuildName, buildNumber)) + defer inttestutils.DeleteBuild(serverDetails.ArtifactoryUrl, tests.ConanBuildName, artHttpDetails) + + publishedBuildInfo, found, err := tests.GetBuildInfo(serverDetails, tests.ConanBuildName, buildNumber) + require.NoError(t, err) + require.True(t, found, "build info was expected to be found") + + buildInfoModules := publishedBuildInfo.BuildInfo.Modules + require.Len(t, buildInfoModules, 1, "Expected 1 module") + assert.Equal(t, buildinfo.Conan, buildInfoModules[0].Type, "Module type should be conan") + assert.GreaterOrEqual(t, len(buildInfoModules[0].Dependencies), 1, "Expected at least 1 dependency (zlib)") +} + +// TestConanInstallWithNameVersionOverrides tests conan install with --name and --version overrides +// applied to a local conanfile.py. Conan 2.x does not allow --name/--version with --requires, +// so a conanfile is required. +func TestConanInstallWithNameVersionOverrides(t *testing.T) { + initConanTest(t) + buildNumber := "1" + + projectPath := createConanProjectNoName(t, "conan-name-version-override-test") + wd, err := os.Getwd() + require.NoError(t, err) + chdirCallback := clientTestUtils.ChangeDirWithCallback(t, wd, projectPath) + defer chdirCallback() + + configureConanRemote(t) + defer cleanupConanRemote() + + jfrogCli := coretests.NewJfrogCli(execMain, "jfrog", "") + args := []string{ + "conan", "install", ".", + "--build", "missing", + "--name", "my-custom-project", + "--version", "2.5.0", + "-r", tests.ConanVirtualRepo, + "--build-name=" + tests.ConanBuildName, + "--build-number=" + buildNumber, + } + require.NoError(t, jfrogCli.Exec(args...)) + + require.NoError(t, artifactoryCli.Exec("bp", tests.ConanBuildName, buildNumber)) + defer inttestutils.DeleteBuild(serverDetails.ArtifactoryUrl, tests.ConanBuildName, artHttpDetails) + + publishedBuildInfo, found, err := tests.GetBuildInfo(serverDetails, tests.ConanBuildName, buildNumber) + require.NoError(t, err) + require.True(t, found, "build info was expected to be found") + + buildInfoModules := publishedBuildInfo.BuildInfo.Modules + require.Len(t, buildInfoModules, 1) + assert.Equal(t, "my-custom-project:2.5.0", buildInfoModules[0].Id, + "Module ID should reflect --name and --version overrides") + assert.GreaterOrEqual(t, len(buildInfoModules[0].Dependencies), 1) +} + +// TestConanInstallRecipeInSubdir tests 'jf conan install <subdir>' where the recipe is not in cwd. +func TestConanInstallRecipeInSubdir(t *testing.T) { + initConanTest(t) + buildNumber := "1" + + projectPath := createConanProjectSubdir(t, "conan-subdir-install-test") + wd, err := os.Getwd() + require.NoError(t, err) + chdirCallback := clientTestUtils.ChangeDirWithCallback(t, wd, projectPath) + defer chdirCallback() + + configureConanRemote(t) + defer cleanupConanRemote() + + jfrogCli := coretests.NewJfrogCli(execMain, "jfrog", "") + args := []string{ + "conan", "install", "recipes/mylib", + "--build=missing", + "-r", tests.ConanVirtualRepo, + "--build-name=" + tests.ConanBuildName, + "--build-number=" + buildNumber, + } + require.NoError(t, jfrogCli.Exec(args...), "conan install with recipe in subdirectory should succeed") + + require.NoError(t, artifactoryCli.Exec("bp", tests.ConanBuildName, buildNumber)) + defer inttestutils.DeleteBuild(serverDetails.ArtifactoryUrl, tests.ConanBuildName, artHttpDetails) + + publishedBuildInfo, found, err := tests.GetBuildInfo(serverDetails, tests.ConanBuildName, buildNumber) + require.NoError(t, err) + require.True(t, found, "build info was expected to be found") + + buildInfoModules := publishedBuildInfo.BuildInfo.Modules + require.Len(t, buildInfoModules, 1) + assert.Equal(t, buildinfo.Conan, buildInfoModules[0].Type) + assert.Equal(t, "cli-test-subdir-package:1.0.0", buildInfoModules[0].Id, + "Module ID should come from the subdirectory's conanfile.py") + assert.GreaterOrEqual(t, len(buildInfoModules[0].Dependencies), 1) +} + +// TestConanCreateRecipeInSubdir tests 'jf conan create <subdir>' where the recipe is not in cwd. +func TestConanCreateRecipeInSubdir(t *testing.T) { + initConanTest(t) + buildNumber := "1" + + projectPath := createConanProjectSubdir(t, "conan-subdir-create-test") + wd, err := os.Getwd() + require.NoError(t, err) + chdirCallback := clientTestUtils.ChangeDirWithCallback(t, wd, projectPath) + defer chdirCallback() + + configureConanRemote(t) + defer cleanupConanRemote() + + jfrogCli := coretests.NewJfrogCli(execMain, "jfrog", "") + createArgs := []string{ + "conan", "create", "recipes/mylib", + "--build=missing", + "--build-name=" + tests.ConanBuildName, + "--build-number=" + buildNumber, + } + require.NoError(t, jfrogCli.Exec(createArgs...), "conan create with recipe in subdirectory should succeed") + + require.NoError(t, artifactoryCli.Exec("bp", tests.ConanBuildName, buildNumber)) + defer inttestutils.DeleteBuild(serverDetails.ArtifactoryUrl, tests.ConanBuildName, artHttpDetails) + + publishedBuildInfo, found, err := tests.GetBuildInfo(serverDetails, tests.ConanBuildName, buildNumber) + require.NoError(t, err) + require.True(t, found, "build info was expected to be found") + + buildInfoModules := publishedBuildInfo.BuildInfo.Modules + require.Len(t, buildInfoModules, 1) + assert.Equal(t, "cli-test-subdir-package:1.0.0", buildInfoModules[0].Id) + assert.GreaterOrEqual(t, len(buildInfoModules[0].Dependencies), 1) +} + +// TestConanInstallMultipleRequires tests --requires with multiple dependencies. +func TestConanInstallMultipleRequires(t *testing.T) { + initConanTest(t) + buildNumber := "1" + + tmpDir, cleanupCallback := coretests.CreateTempDirWithCallbackAndAssert(t) + t.Cleanup(cleanupCallback) + projectPath := filepath.Join(tmpDir, "multi-requires-test") + require.NoError(t, os.MkdirAll(projectPath, 0755)) + + wd, err := os.Getwd() + require.NoError(t, err) + chdirCallback := clientTestUtils.ChangeDirWithCallback(t, wd, projectPath) + defer chdirCallback() + + configureConanRemote(t) + defer cleanupConanRemote() + + jfrogCli := coretests.NewJfrogCli(execMain, "jfrog", "") + args := []string{ + "conan", "install", + "--requires", "zlib/1.3.1", + "--requires", "bzip2/1.0.8", + "--build", "missing", + "-r", tests.ConanVirtualRepo, + "--build-name=" + tests.ConanBuildName, + "--build-number=" + buildNumber, + } + require.NoError(t, jfrogCli.Exec(args...)) + + require.NoError(t, artifactoryCli.Exec("bp", tests.ConanBuildName, buildNumber)) + defer inttestutils.DeleteBuild(serverDetails.ArtifactoryUrl, tests.ConanBuildName, artHttpDetails) + + publishedBuildInfo, found, err := tests.GetBuildInfo(serverDetails, tests.ConanBuildName, buildNumber) + require.NoError(t, err) + require.True(t, found, "build info was expected to be found") + + buildInfoModules := publishedBuildInfo.BuildInfo.Modules + require.Len(t, buildInfoModules, 1) + assert.GreaterOrEqual(t, len(buildInfoModules[0].Dependencies), 2, + "Expected at least 2 dependencies (zlib + bzip2)") +} + // TestConanCreateWithProjectKey tests that 'jf conan create --project=<key>' stores build info // in the correct local build dir (SHA includes the project key). func TestConanCreateWithProjectKey(t *testing.T) { diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/jfrog-cli-2.96.0/docs/buildtools/huggingface/help.go new/jfrog-cli-2.97.0/docs/buildtools/huggingface/help.go --- old/jfrog-cli-2.96.0/docs/buildtools/huggingface/help.go 2026-03-11 10:17:35.000000000 +0100 +++ new/jfrog-cli-2.97.0/docs/buildtools/huggingface/help.go 2026-03-26 09:04:44.000000000 +0100 @@ -6,27 +6,3 @@ func GetDescription() string { return `Download or upload models/datasets from/to HuggingFace Hub.` } - -func GetArguments() string { - return ` download <model-name> - Download a model/dataset from HuggingFace Hub. - model-name - The HuggingFace model repository ID (e.g., 'bert-base-uncased' or 'username/model-name'). - - upload <folder-path> <repo-id> - Upload a model or dataset folder to HuggingFace Hub. - folder-path - Path to the folder to upload. - repo-id - The HuggingFace repository ID (e.g., 'username/model-name' or 'username/dataset-name'). - - Command options: - --revision - [Optional] The revision (commit hash, branch name, or tag) to download/upload. Defaults to main branch if not specified. - - --repo-type - [Optional] The repository type. Can be 'model' or 'dataset'. Default: 'model'. - - --etag-timeout - [Optional] [Download only] Timeout in seconds for ETag validation. Default: 86400 seconds (24 hours).` -} diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/jfrog-cli-2.96.0/docs/buildtools/huggingfacedownload/help.go new/jfrog-cli-2.97.0/docs/buildtools/huggingfacedownload/help.go --- old/jfrog-cli-2.96.0/docs/buildtools/huggingfacedownload/help.go 1970-01-01 01:00:00.000000000 +0100 +++ new/jfrog-cli-2.97.0/docs/buildtools/huggingfacedownload/help.go 2026-03-26 09:04:44.000000000 +0100 @@ -0,0 +1,28 @@ +package huggingfacedownload + +var Usage = []string{"hf download <model-name>"} + +func GetDescription() string { + return `Download a model or dataset from HuggingFace Hub.` +} + +func GetArguments() string { + return ` model-name + The HuggingFace model repository ID (e.g., 'bert-base-uncased' or 'username/model-name'). + + Command options: + --repo-key + [Mandatory] The Artifactory repository key to route the download through. + + --revision + [Optional] The revision (commit hash, branch name, or tag) to download. Default: 'main'. + + --repo-type + [Optional] The repository type. Can be 'model' or 'dataset'. Default: 'model'. + + --hf-hub-etag-timeout + [Optional] Timeout in seconds for ETag validation. Default: 86400 (24 hours). + + --hf-hub-download-timeout + [Optional] Timeout in seconds for Download. Default: 86400 (24 hours).` +} diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/jfrog-cli-2.96.0/docs/buildtools/huggingfaceupload/help.go new/jfrog-cli-2.97.0/docs/buildtools/huggingfaceupload/help.go --- old/jfrog-cli-2.96.0/docs/buildtools/huggingfaceupload/help.go 1970-01-01 01:00:00.000000000 +0100 +++ new/jfrog-cli-2.97.0/docs/buildtools/huggingfaceupload/help.go 2026-03-26 09:04:44.000000000 +0100 @@ -0,0 +1,31 @@ +package huggingfaceupload + +var Usage = []string{"hf upload <folder-path> <repo-id>"} + +func GetDescription() string { + return `Upload a model or dataset folder to HuggingFace Hub.` +} + +func GetArguments() string { + return ` folder-path + Path to the folder to upload. + + repo-id + The HuggingFace repository ID (e.g., 'username/model-name' or 'username/dataset-name'). + + Command options: + --repo-key + [Mandatory] The Artifactory repository key to route the upload through. + + --revision + [Optional] The revision (branch name, tag, or commit hash) to upload to. Default: 'main'. + + --repo-type + [Optional] The repository type. Can be 'model' or 'dataset'. Default: 'model'. + + --hf-hub-etag-timeout + [Optional] Timeout in seconds for ETag validation. Default: 86400 (24 hours). + + --hf-hub-download-timeout + [Optional] Timeout in seconds for Download. Default: 86400 (24 hours).` +} diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/jfrog-cli-2.96.0/go.mod new/jfrog-cli-2.97.0/go.mod --- old/jfrog-cli-2.96.0/go.mod 2026-03-11 10:17:35.000000000 +0100 +++ new/jfrog-cli-2.97.0/go.mod 2026-03-26 09:04:44.000000000 +0100 @@ -16,15 +16,15 @@ github.com/docker/docker v28.5.2+incompatible github.com/gocarina/gocsv v0.0.0-20240520201108-78e41c74b4b1 github.com/jfrog/archiver/v3 v3.6.3 - github.com/jfrog/build-info-go v1.13.1-0.20260216093441-40a4dc563294 + github.com/jfrog/build-info-go v1.13.1-0.20260313042712-238e6dca3dce github.com/jfrog/gofrog v1.7.6 - github.com/jfrog/jfrog-cli-application v1.0.2-0.20260216085810-1ade6c26b3df - github.com/jfrog/jfrog-cli-artifactory v0.8.1-0.20260310063831-ad6064f2f373 - github.com/jfrog/jfrog-cli-core/v2 v2.60.1-0.20260225195817-bc599cec3973 + github.com/jfrog/jfrog-cli-application v1.0.2-0.20260318084604-1c4533510620 + github.com/jfrog/jfrog-cli-artifactory v0.8.1-0.20260325060310-a7ee867a2090 + github.com/jfrog/jfrog-cli-core/v2 v2.60.1-0.20260324124720-40db37833f61 github.com/jfrog/jfrog-cli-evidence v0.8.3-0.20260202100913-d9ee9476845a github.com/jfrog/jfrog-cli-platform-services v1.10.1-0.20260306102152-984d60a80cec - github.com/jfrog/jfrog-cli-security v1.26.4 - github.com/jfrog/jfrog-client-go v1.55.1-0.20260310073256-b6a77f9c75e5 + github.com/jfrog/jfrog-cli-security v1.26.6 + github.com/jfrog/jfrog-client-go v1.55.1-0.20260325143056-bdd18b12bbca github.com/jszwec/csvutil v1.10.0 github.com/manifoldco/promptui v0.9.0 github.com/spf13/viper v1.21.0 @@ -246,12 +246,12 @@ //replace github.com/ktrysmt/go-bitbucket => github.com/ktrysmt/go-bitbucket v0.9.80 -//replace github.com/jfrog/jfrog-cli-core/v2 => ../jfrog-cli-core - -// replace github.com/jfrog/jfrog-cli-artifactory => github.com/fluxxBot/jfrog-cli-artifactory v0.0.0-20260130044429-464a5025d08a +// replace github.com/jfrog/jfrog-cli-artifactory => github.com/reshmifrog/jfrog-cli-artifactory v0.0.0-20260303084642-b208fbba798b //replace github.com/jfrog/build-info-go => github.com/fluxxBot/build-info-go v1.10.10-0.20260105070825-d3f36f619ba5 +// replace github.com/jfrog/build-info-go => github.com/reshmifrog/build-info-go v1.10.11-0.20260303032831-71878c7210bf + //replace github.com/jfrog/jfrog-cli-core/v2 => github.com/fluxxBot/jfrog-cli-core/v2 v2.58.1-0.20260105065921-c6488910f44c //replace github.com/jfrog/jfrog-client-go => github.com/jfrog/jfrog-client-go v1.54.2-0.20251007084958-5eeaa42c31a6 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/jfrog-cli-2.96.0/go.sum new/jfrog-cli-2.97.0/go.sum --- old/jfrog-cli-2.96.0/go.sum 2026-03-11 10:17:35.000000000 +0100 +++ new/jfrog-cli-2.97.0/go.sum 2026-03-26 09:04:44.000000000 +0100 @@ -407,8 +407,8 @@ github.com/jellydator/ttlcache/v3 v3.4.0/go.mod h1:Hw9EgjymziQD3yGsQdf1FqFdpp7YjFMd4Srg5EJlgD4= github.com/jfrog/archiver/v3 v3.6.3 h1:hkAmPjBw393tPmQ07JknLNWFNZjXdy2xFEnOW9wwOxI= github.com/jfrog/archiver/v3 v3.6.3/go.mod h1:5V9l+Fte30Y4qe9dUOAd3yNTf8lmtVNuhKNrvI8PMhg= -github.com/jfrog/build-info-go v1.13.1-0.20260216093441-40a4dc563294 h1:7aJGdrjibtWT1VPLH+GYyoZsAsoca8/fMrvGIvkZ8Fs= -github.com/jfrog/build-info-go v1.13.1-0.20260216093441-40a4dc563294/go.mod h1:+OCtMb22/D+u7Wne5lzkjJjaWr0LRZcHlDwTH86Mpwo= +github.com/jfrog/build-info-go v1.13.1-0.20260313042712-238e6dca3dce h1:Ozuq6iZEFbE8GNk5ROMa0w+v2kmeUdUj95gVN636Lus= +github.com/jfrog/build-info-go v1.13.1-0.20260313042712-238e6dca3dce/go.mod h1:+OCtMb22/D+u7Wne5lzkjJjaWr0LRZcHlDwTH86Mpwo= github.com/jfrog/froggit-go v1.21.1 h1:I/XUOO6GQ1d/rmBlM361F8T654C3ohIWrpw23xNL9JY= github.com/jfrog/froggit-go v1.21.1/go.mod h1:umBiakJB0CSPFfe0AHVaC3n9xsmUT7NGkDCny3bRchI= github.com/jfrog/go-mockhttp v0.3.1 h1:/wac8v4GMZx62viZmv4wazB5GNKs+GxawuS1u3maJH8= @@ -417,20 +417,20 @@ github.com/jfrog/gofrog v1.7.6/go.mod h1:ntr1txqNOZtHplmaNd7rS4f8jpA5Apx8em70oYEe7+4= github.com/jfrog/jfrog-apps-config v1.0.1 h1:mtv6k7g8A8BVhlHGlSveapqf4mJfonwvXYLipdsOFMY= github.com/jfrog/jfrog-apps-config v1.0.1/go.mod h1:8AIIr1oY9JuH5dylz2S6f8Ym2MaadPLR6noCBO4C22w= -github.com/jfrog/jfrog-cli-application v1.0.2-0.20260216085810-1ade6c26b3df h1:raSyae8/h1y8HtzFLf7vZZj91fP/qD94AX+biwBJiqs= -github.com/jfrog/jfrog-cli-application v1.0.2-0.20260216085810-1ade6c26b3df/go.mod h1:xum2HquWO5uExa/A7MQs3TgJJVEeoqTR+6Z4mfBr1Xw= -github.com/jfrog/jfrog-cli-artifactory v0.8.1-0.20260310063831-ad6064f2f373 h1:9rgBl0MuJfPX6khjwai0jqwOOCkytTH0DOEcmih1PRQ= -github.com/jfrog/jfrog-cli-artifactory v0.8.1-0.20260310063831-ad6064f2f373/go.mod h1:zjbDerW+Pin6VExtlgwRtpnvtI/ySJTnmqnOwXbsrmc= -github.com/jfrog/jfrog-cli-core/v2 v2.60.1-0.20260225195817-bc599cec3973 h1:awB01Y4m0cWzmXuR3waf5IQnoQxDlbUmqT+FMWOpjbs= -github.com/jfrog/jfrog-cli-core/v2 v2.60.1-0.20260225195817-bc599cec3973/go.mod h1:yhi+XpiEx18a3t8CZ6M2VpAf3EGqKpBhTzoPBTFe0dk= +github.com/jfrog/jfrog-cli-application v1.0.2-0.20260318084604-1c4533510620 h1:Y1oEM6cZGh0cLCkV2oBXGTIj9LdoRgR2yUR7zfpPXBg= +github.com/jfrog/jfrog-cli-application v1.0.2-0.20260318084604-1c4533510620/go.mod h1:xum2HquWO5uExa/A7MQs3TgJJVEeoqTR+6Z4mfBr1Xw= +github.com/jfrog/jfrog-cli-artifactory v0.8.1-0.20260325060310-a7ee867a2090 h1:8Bd8AfOZdVCBVsDf1cOxLIt9K26NpcNVypLC4b7i17w= +github.com/jfrog/jfrog-cli-artifactory v0.8.1-0.20260325060310-a7ee867a2090/go.mod h1:kgw6gIQvJx9bCcOdtAGSUEiCz7nNQmaFbFvNg6byZ6I= +github.com/jfrog/jfrog-cli-core/v2 v2.60.1-0.20260324124720-40db37833f61 h1:fPGsJPPFCBr9qE9n0+fobbRZOdN2m2Ovr//8K07jil4= +github.com/jfrog/jfrog-cli-core/v2 v2.60.1-0.20260324124720-40db37833f61/go.mod h1:yhi+XpiEx18a3t8CZ6M2VpAf3EGqKpBhTzoPBTFe0dk= github.com/jfrog/jfrog-cli-evidence v0.8.3-0.20260202100913-d9ee9476845a h1:lTOAhUjKcOmM/0Kbj4V+I/VHPlW7YNAhIEVpGnCM5mI= github.com/jfrog/jfrog-cli-evidence v0.8.3-0.20260202100913-d9ee9476845a/go.mod h1:+XrcuHeakfxzARpmIr/bagjtfiRewpCbiPm0PDuKSIQ= github.com/jfrog/jfrog-cli-platform-services v1.10.1-0.20260306102152-984d60a80cec h1:d8CJ/LUGjNwPDPfYLJkAQJNmu+GCWxFsjZrmTcuV5wY= github.com/jfrog/jfrog-cli-platform-services v1.10.1-0.20260306102152-984d60a80cec/go.mod h1:n18milUWaaWv6o0bWeEDuoweACoZHRTtQPZpyXBPjEs= -github.com/jfrog/jfrog-cli-security v1.26.4 h1:2kvJefd0zLmDyGzXgrzGQiFscB5qV6zYLmyqEvSKhd4= -github.com/jfrog/jfrog-cli-security v1.26.4/go.mod h1:FhNjY3JXnnqiniApkyU26dwlI8X9jnvjdXuVL9pUdIY= -github.com/jfrog/jfrog-client-go v1.55.1-0.20260310073256-b6a77f9c75e5 h1:BBo1kC74XgmFh4B5cNEhC/mhb70/ScLoDNw+P0d26rg= -github.com/jfrog/jfrog-client-go v1.55.1-0.20260310073256-b6a77f9c75e5/go.mod h1:sCE06+GngPoyrGO0c+vmhgMoVSP83UMNiZnIuNPzU8U= +github.com/jfrog/jfrog-cli-security v1.26.6 h1:flsz2hulbgIy99C8gPzXtmNCA57YkcioJvoHCo/Fi+s= +github.com/jfrog/jfrog-cli-security v1.26.6/go.mod h1:979Kb3ffhGuPFB6yG+Zr2aWM0J8y49vxlIgsV0A84m0= +github.com/jfrog/jfrog-client-go v1.55.1-0.20260325143056-bdd18b12bbca h1:31JlAee5cXgyTHPqgyZQfQtmlkuIZX7964V614NWJAo= +github.com/jfrog/jfrog-client-go v1.55.1-0.20260325143056-bdd18b12bbca/go.mod h1:sCE06+GngPoyrGO0c+vmhgMoVSP83UMNiZnIuNPzU8U= github.com/jhump/protoreflect v1.17.0 h1:qOEr613fac2lOuTgWN4tPAtLL7fUSbuJL5X5XumQh94= github.com/jhump/protoreflect v1.17.0/go.mod h1:h9+vUUL38jiBzck8ck+6G/aeMX8Z4QUY/NiJPwPNi+8= github.com/jmespath/go-jmespath v0.4.1-0.20220621161143-b0104c826a24 h1:liMMTbpW34dhU4az1GN0pTPADwNmvoRSeoZ6PItiqnY= diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/jfrog-cli-2.96.0/testdata/conan/conanproject-noname/conanfile.py new/jfrog-cli-2.97.0/testdata/conan/conanproject-noname/conanfile.py --- old/jfrog-cli-2.96.0/testdata/conan/conanproject-noname/conanfile.py 1970-01-01 01:00:00.000000000 +0100 +++ new/jfrog-cli-2.97.0/testdata/conan/conanproject-noname/conanfile.py 2026-03-26 09:04:44.000000000 +0100 @@ -0,0 +1,11 @@ +from conan import ConanFile + + +class TestConan(ConanFile): + requires = "zlib/1.3.1" + + def build(self): + self.output.info("Building test package") + + def package(self): + pass diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/jfrog-cli-2.96.0/testdata/conan/conanproject-subdir/recipes/mylib/conanfile.py new/jfrog-cli-2.97.0/testdata/conan/conanproject-subdir/recipes/mylib/conanfile.py --- old/jfrog-cli-2.96.0/testdata/conan/conanproject-subdir/recipes/mylib/conanfile.py 1970-01-01 01:00:00.000000000 +0100 +++ new/jfrog-cli-2.97.0/testdata/conan/conanproject-subdir/recipes/mylib/conanfile.py 2026-03-26 09:04:44.000000000 +0100 @@ -0,0 +1,13 @@ +from conan import ConanFile + + +class TestConan(ConanFile): + name = "cli-test-subdir-package" + version = "1.0.0" + requires = "zlib/1.3.1" + + def build(self): + self.output.info("Building test package from subdirectory") + + def package(self): + pass diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/jfrog-cli-2.96.0/utils/cliutils/cli_consts.go new/jfrog-cli-2.97.0/utils/cliutils/cli_consts.go --- old/jfrog-cli-2.96.0/utils/cliutils/cli_consts.go 2026-03-11 10:17:35.000000000 +0100 +++ new/jfrog-cli-2.97.0/utils/cliutils/cli_consts.go 2026-03-26 09:04:44.000000000 +0100 @@ -4,7 +4,7 @@ const ( // General CLI constants - CliVersion = "2.96.0" + CliVersion = "2.97.0" ClientAgent = "jfrog-cli-go" // CLI base commands constants: diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/jfrog-cli-2.96.0/utils/cliutils/commandsflags.go new/jfrog-cli-2.97.0/utils/cliutils/commandsflags.go --- old/jfrog-cli-2.96.0/utils/cliutils/commandsflags.go 2026-03-11 10:17:35.000000000 +0100 +++ new/jfrog-cli-2.97.0/utils/cliutils/commandsflags.go 2026-03-26 09:04:44.000000000 +0100 @@ -79,6 +79,8 @@ Poetry = "poetry" Helm = "helm" HuggingFace = "hugging-face" + HuggingFaceUpload = "hugging-face-upload" + HuggingFaceDownload = "hugging-face-download" RubyConfig = "ruby-config" Conan = "conan" Ping = "ping" @@ -596,10 +598,11 @@ Draft = "draft" // HuggingFace flags - Revision = "revision" - RepoType = "repo-type" - EtagTimeout = "etag-timeout" - RepoKey = "repo-key" + Revision = "revision" + RepoType = "repo-type" + HfHubEtagTimeout = "hf-hub-etag-timeout" + HfHubDownloadTimeout = "hf-hub-download-timeout" + RepoKey = "repo-key" ) var flagsMap = map[string]cli.Flag{ @@ -1760,17 +1763,21 @@ Name: Revision, Usage: "[Default: main] The specific revision, branch, or tag to download. Defaults to main branch if not specified.` `", }, - EtagTimeout: cli.StringFlag{ - Name: EtagTimeout, + HfHubEtagTimeout: cli.IntFlag{ + Name: HfHubEtagTimeout, Usage: "Timeout in seconds for ETag validation. Defaults to 86400 (24 hours).` `", }, + HfHubDownloadTimeout: cli.IntFlag{ + Name: HfHubDownloadTimeout, + Usage: "Timeout in seconds for Download. Defaults to 86400 (24 hours).` `", + }, RepoType: cli.StringFlag{ Name: RepoType, Usage: "[Default: model] Type of repository. Can be 'model', 'dataset'.` `", }, RepoKey: cli.StringFlag{ Name: RepoKey, - Usage: "Repository Key for uploading/downloading dataset/models.", + Usage: "[Optional] Repository Key for uploading/downloading dataset/models.` `", }, } @@ -2005,7 +2012,13 @@ BuildName, BuildNumber, module, Project, serverId, username, password, }, HuggingFace: { - BuildName, BuildNumber, module, Project, serverId, Revision, RepoType, EtagTimeout, RepoKey, + BuildName, BuildNumber, module, Project, serverId, Revision, RepoType, HfHubEtagTimeout, RepoKey, HfHubDownloadTimeout, + }, + HuggingFaceUpload: { + BuildName, BuildNumber, module, Project, serverId, Revision, RepoType, RepoKey, HfHubEtagTimeout, HfHubDownloadTimeout, + }, + HuggingFaceDownload: { + BuildName, BuildNumber, module, Project, serverId, Revision, RepoType, HfHubEtagTimeout, RepoKey, HfHubDownloadTimeout, }, RubyConfig: { global, serverIdResolve, serverIdDeploy, repoResolve, repoDeploy, diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/jfrog-cli-2.96.0/utils/cliutils/utils_test.go new/jfrog-cli-2.97.0/utils/cliutils/utils_test.go --- old/jfrog-cli-2.96.0/utils/cliutils/utils_test.go 2026-03-11 10:17:35.000000000 +0100 +++ new/jfrog-cli-2.97.0/utils/cliutils/utils_test.go 2026-03-26 09:04:44.000000000 +0100 @@ -130,6 +130,9 @@ assert.NoError(t, err) assert.False(t, shouldCheck) setEnvCallback() + // Explicitly unset the env var in case it was pre-set in the environment (e.g. in CI), + // so it does not interfere with the remaining assertions in this test. + assert.NoError(t, os.Unsetenv(JfrogCliAvoidNewVersionWarning)) // First run, should be true shouldCheck, err = shouldCheckLatestCliVersion() ++++++ jfrog-cli.obsinfo ++++++ --- /var/tmp/diff_new_pack.6BrWdt/_old 2026-03-27 16:53:28.737423363 +0100 +++ /var/tmp/diff_new_pack.6BrWdt/_new 2026-03-27 16:53:28.741423531 +0100 @@ -1,5 +1,5 @@ name: jfrog-cli -version: 2.96.0 -mtime: 1773220655 -commit: 98e042f987347358f01d7d9a991e576bc82aa119 +version: 2.97.0 +mtime: 1774512284 +commit: f5cdf710b5ab0c6df30b1ba6fb719affb96d1e6d ++++++ vendor.tar.gz ++++++ /work/SRC/openSUSE:Factory/jfrog-cli/vendor.tar.gz /work/SRC/openSUSE:Factory/.jfrog-cli.new.8177/vendor.tar.gz differ: char 147, line 1
