From 63b16994242ab7c2b18866f53ead74dc7ce6079e Mon Sep 17 00:00:00 2001 From: Naveen Kumar Date: Thu, 19 Mar 2026 02:35:30 +0530 Subject: [PATCH 1/4] Addressed bugs/improvements in huggingface bughunts --- buildtools/cli.go | 168 +++++++++++++------- docs/buildtools/huggingface/help.go | 24 --- docs/buildtools/huggingfacedownload/help.go | 25 +++ docs/buildtools/huggingfaceupload/help.go | 25 +++ go.mod | 2 +- go.sum | 4 +- utils/cliutils/commandsflags.go | 10 +- 7 files changed, 173 insertions(+), 85 deletions(-) create mode 100644 docs/buildtools/huggingfacedownload/help.go create mode 100644 docs/buildtools/huggingfaceupload/help.go diff --git a/buildtools/cli.go b/buildtools/cli.go index 509defd9d..dc9de220a 100644 --- a/buildtools/cli.go +++ b/buildtools/cli.go @@ -4,6 +4,7 @@ import ( "errors" "fmt" conancommand "github.com/jfrog/jfrog-cli-artifactory/artifactory/commands/conan" + "io/fs" "os" "os/exec" "path/filepath" @@ -60,6 +61,8 @@ import ( 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" @@ -483,13 +486,30 @@ func GetCommands() []cli.Command { { 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, + 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 +1151,27 @@ func loginCmd(c *cli.Context) error { 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 +1191,30 @@ func huggingFaceUploadCmd(c *cli.Context, cmdName string, hfArgs []string) error 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 } @@ -1231,22 +1241,52 @@ func huggingFaceDownloadCmd(c *cli.Context, cmdName string, hfArgs []string) err 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 +1297,7 @@ func getHuggingFaceServerDetails(args []string) (*coreConfig.ServerDetails, erro } 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,30 +1305,44 @@ func getHuggingFaceServerDetails(args []string) (*coreConfig.ServerDetails, erro } 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 } return nil } +// getRepoKeyFromHFEndpoint extracts the repository key from HF_ENDPOINT environment variable +func getRepoKeyFromHFEndpoint() (string, error) { + endpoint := os.Getenv("HF_ENDPOINT") + if endpoint == "" { + return "", errorutils.CheckErrorf("HF_ENDPOINT environment variable is not set") + } + endpoint = strings.TrimSuffix(endpoint, "/") + parts := strings.Split(endpoint, "/") + if len(parts) == 0 { + return "", errorutils.CheckErrorf("invalid HF_ENDPOINT format: %s", endpoint) + } + repoKey := parts[len(parts)-1] + if repoKey == "" { + return "", errorutils.CheckErrorf("could not extract repo key from HF_ENDPOINT: %s", endpoint) + } + log.Debug("Extracted repo key from HF_ENDPOINT: ", repoKey) + return repoKey, nil +} + func dockerScanCmd(c *cli.Context, imageTag string) error { if show, err := cliutils.ShowGenericCmdHelpIfNeeded(c, c.Args(), securityCLI.DockerScanCmdHiddenName); show || err != nil { return err diff --git a/docs/buildtools/huggingface/help.go b/docs/buildtools/huggingface/help.go index 84cda70a0..8b790c8e1 100644 --- a/docs/buildtools/huggingface/help.go +++ b/docs/buildtools/huggingface/help.go @@ -6,27 +6,3 @@ var Usage = []string{"hf download ", func GetDescription() string { return `Download or upload models/datasets from/to HuggingFace Hub.` } - -func GetArguments() string { - return ` download - Download a model/dataset from HuggingFace Hub. - model-name - The HuggingFace model repository ID (e.g., 'bert-base-uncased' or 'username/model-name'). - - upload - 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 --git a/docs/buildtools/huggingfacedownload/help.go b/docs/buildtools/huggingfacedownload/help.go new file mode 100644 index 000000000..fe5db12da --- /dev/null +++ b/docs/buildtools/huggingfacedownload/help.go @@ -0,0 +1,25 @@ +package huggingfacedownload + +var Usage = []string{"hf download "} + +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'. + + --etag-timeout + [Optional] Timeout in seconds for ETag validation. Default: 86400 (24 hours).` +} diff --git a/docs/buildtools/huggingfaceupload/help.go b/docs/buildtools/huggingfaceupload/help.go new file mode 100644 index 000000000..bdfd83b96 --- /dev/null +++ b/docs/buildtools/huggingfaceupload/help.go @@ -0,0 +1,25 @@ +package huggingfaceupload + +var Usage = []string{"hf upload "} + +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'.` +} diff --git a/go.mod b/go.mod index 7366970be..97ae01094 100644 --- a/go.mod +++ b/go.mod @@ -248,7 +248,7 @@ require ( // replace github.com/jfrog/jfrog-cli-artifactory => github.com/reshmifrog/jfrog-cli-artifactory v0.0.0-20260303084642-b208fbba798b -// 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/naveenku-jfrog/jfrog-cli-artifactory v0.0.0-20260318205959-36253bfc8743 //replace github.com/jfrog/build-info-go => github.com/fluxxBot/build-info-go v1.10.10-0.20260105070825-d3f36f619ba5 diff --git a/go.sum b/go.sum index 643f26e7d..d4336482f 100644 --- a/go.sum +++ b/go.sum @@ -419,8 +419,6 @@ github.com/jfrog/jfrog-apps-config v1.0.1 h1:mtv6k7g8A8BVhlHGlSveapqf4mJfonwvXYL 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.20260313044645-ed6f0a05bb5b h1:XTlhwNidgPYk/91FblSENm5/P9kAUkHSLUc3I7FRBdg= -github.com/jfrog/jfrog-cli-artifactory v0.8.1-0.20260313044645-ed6f0a05bb5b/go.mod h1:kgw6gIQvJx9bCcOdtAGSUEiCz7nNQmaFbFvNg6byZ6I= 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-evidence v0.8.3-0.20260202100913-d9ee9476845a h1:lTOAhUjKcOmM/0Kbj4V+I/VHPlW7YNAhIEVpGnCM5mI= @@ -518,6 +516,8 @@ github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= github.com/natefinch/atomic v1.0.1 h1:ZPYKxkqQOx3KZ+RsbnP/YsgvxWQPGxjC0oBt2AhwV0A= github.com/natefinch/atomic v1.0.1/go.mod h1:N/D/ELrljoqDyT3rZrsUmtsuzvHkeB/wWjHV22AZRbM= +github.com/naveenku-jfrog/jfrog-cli-artifactory v0.0.0-20260318205959-36253bfc8743 h1:BmFZuMuz2KBt/UlcRusu+2WsDGOVA3AooqNZD527GGQ= +github.com/naveenku-jfrog/jfrog-cli-artifactory v0.0.0-20260318205959-36253bfc8743/go.mod h1:kgw6gIQvJx9bCcOdtAGSUEiCz7nNQmaFbFvNg6byZ6I= github.com/nwaples/rardecode/v2 v2.2.2 h1:/5oL8dzYivRM/tqX9VcTSWfbpwcbwKG1QtSJr3b3KcU= github.com/nwaples/rardecode/v2 v2.2.2/go.mod h1:7uz379lSxPe6j9nvzxUZ+n7mnJNgjsRNb6IbvGVHRmw= github.com/oklog/run v1.0.0 h1:Ru7dDtJNOyC66gQ5dQmaCa0qIsAUFY3sFpK1Xk8igrw= diff --git a/utils/cliutils/commandsflags.go b/utils/cliutils/commandsflags.go index c264c7c54..108b40044 100644 --- a/utils/cliutils/commandsflags.go +++ b/utils/cliutils/commandsflags.go @@ -79,6 +79,8 @@ const ( Poetry = "poetry" Helm = "helm" HuggingFace = "hugging-face" + HuggingFaceUpload = "hugging-face-upload" + HuggingFaceDownload = "hugging-face-download" RubyConfig = "ruby-config" Conan = "conan" Ping = "ping" @@ -1770,7 +1772,7 @@ var flagsMap = map[string]cli.Flag{ }, RepoKey: cli.StringFlag{ Name: RepoKey, - Usage: "Repository Key for uploading/downloading dataset/models.", + Usage: "[Optional] Repository Key for uploading/downloading dataset/models.` `", }, } @@ -2007,6 +2009,12 @@ var commandFlags = map[string][]string{ HuggingFace: { BuildName, BuildNumber, module, Project, serverId, Revision, RepoType, EtagTimeout, RepoKey, }, + HuggingFaceUpload: { + BuildName, BuildNumber, module, Project, serverId, Revision, RepoType, RepoKey, + }, + HuggingFaceDownload: { + BuildName, BuildNumber, module, Project, serverId, Revision, RepoType, EtagTimeout, RepoKey, + }, RubyConfig: { global, serverIdResolve, serverIdDeploy, repoResolve, repoDeploy, }, From 97eb8ea4deaea85acd5c7f49111168989db00bf2 Mon Sep 17 00:00:00 2001 From: Naveen Kumar Date: Thu, 19 Mar 2026 02:52:08 +0530 Subject: [PATCH 2/4] Addressed static failures and unused funcs --- buildtools/cli.go | 19 ------------------- go.mod | 2 +- go.sum | 4 ++-- 3 files changed, 3 insertions(+), 22 deletions(-) diff --git a/buildtools/cli.go b/buildtools/cli.go index dc9de220a..4542045d3 100644 --- a/buildtools/cli.go +++ b/buildtools/cli.go @@ -1324,25 +1324,6 @@ func updateHuggingFaceEnv(c *cli.Context, serverDetails *coreConfig.ServerDetail return nil } -// getRepoKeyFromHFEndpoint extracts the repository key from HF_ENDPOINT environment variable -func getRepoKeyFromHFEndpoint() (string, error) { - endpoint := os.Getenv("HF_ENDPOINT") - if endpoint == "" { - return "", errorutils.CheckErrorf("HF_ENDPOINT environment variable is not set") - } - endpoint = strings.TrimSuffix(endpoint, "/") - parts := strings.Split(endpoint, "/") - if len(parts) == 0 { - return "", errorutils.CheckErrorf("invalid HF_ENDPOINT format: %s", endpoint) - } - repoKey := parts[len(parts)-1] - if repoKey == "" { - return "", errorutils.CheckErrorf("could not extract repo key from HF_ENDPOINT: %s", endpoint) - } - log.Debug("Extracted repo key from HF_ENDPOINT: ", repoKey) - return repoKey, nil -} - func dockerScanCmd(c *cli.Context, imageTag string) error { if show, err := cliutils.ShowGenericCmdHelpIfNeeded(c, c.Args(), securityCLI.DockerScanCmdHiddenName); show || err != nil { return err diff --git a/go.mod b/go.mod index 97ae01094..21f2cf500 100644 --- a/go.mod +++ b/go.mod @@ -248,7 +248,7 @@ require ( // replace github.com/jfrog/jfrog-cli-artifactory => github.com/reshmifrog/jfrog-cli-artifactory v0.0.0-20260303084642-b208fbba798b -replace github.com/jfrog/jfrog-cli-artifactory => github.com/naveenku-jfrog/jfrog-cli-artifactory v0.0.0-20260318205959-36253bfc8743 +replace github.com/jfrog/jfrog-cli-artifactory => github.com/naveenku-jfrog/jfrog-cli-artifactory v0.0.0-20260318211548-92922cf62bea //replace github.com/jfrog/build-info-go => github.com/fluxxBot/build-info-go v1.10.10-0.20260105070825-d3f36f619ba5 diff --git a/go.sum b/go.sum index d4336482f..ebaa88d86 100644 --- a/go.sum +++ b/go.sum @@ -516,8 +516,8 @@ github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= github.com/natefinch/atomic v1.0.1 h1:ZPYKxkqQOx3KZ+RsbnP/YsgvxWQPGxjC0oBt2AhwV0A= github.com/natefinch/atomic v1.0.1/go.mod h1:N/D/ELrljoqDyT3rZrsUmtsuzvHkeB/wWjHV22AZRbM= -github.com/naveenku-jfrog/jfrog-cli-artifactory v0.0.0-20260318205959-36253bfc8743 h1:BmFZuMuz2KBt/UlcRusu+2WsDGOVA3AooqNZD527GGQ= -github.com/naveenku-jfrog/jfrog-cli-artifactory v0.0.0-20260318205959-36253bfc8743/go.mod h1:kgw6gIQvJx9bCcOdtAGSUEiCz7nNQmaFbFvNg6byZ6I= +github.com/naveenku-jfrog/jfrog-cli-artifactory v0.0.0-20260318211548-92922cf62bea h1:zM6Cb3pH8F5go5krk4Sr6+avhr+3aj7l92H74C1zVyE= +github.com/naveenku-jfrog/jfrog-cli-artifactory v0.0.0-20260318211548-92922cf62bea/go.mod h1:kgw6gIQvJx9bCcOdtAGSUEiCz7nNQmaFbFvNg6byZ6I= github.com/nwaples/rardecode/v2 v2.2.2 h1:/5oL8dzYivRM/tqX9VcTSWfbpwcbwKG1QtSJr3b3KcU= github.com/nwaples/rardecode/v2 v2.2.2/go.mod h1:7uz379lSxPe6j9nvzxUZ+n7mnJNgjsRNb6IbvGVHRmw= github.com/oklog/run v1.0.0 h1:Ru7dDtJNOyC66gQ5dQmaCa0qIsAUFY3sFpK1Xk8igrw= From f7b2a62c56a39c6015b559773d92d0adf51e9191 Mon Sep 17 00:00:00 2001 From: Naveen Kumar Date: Thu, 19 Mar 2026 03:16:17 +0530 Subject: [PATCH 3/4] Addressed typos --- buildtools/cli.go | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/buildtools/cli.go b/buildtools/cli.go index 4542045d3..0a6c7a60d 100644 --- a/buildtools/cli.go +++ b/buildtools/cli.go @@ -490,6 +490,12 @@ func GetCommands() []cli.Command { Description: huggingface.GetDescription(), Hidden: true, 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", From 42428129e6ea6b5b1270d3f35a866cc16fe66083 Mon Sep 17 00:00:00 2001 From: Naveen Kumar Date: Thu, 19 Mar 2026 13:40:54 +0530 Subject: [PATCH 4/4] Addressed typos --- buildtools/cli.go | 26 +++++++++++++++++---- docs/buildtools/huggingfacedownload/help.go | 7 ++++-- docs/buildtools/huggingfaceupload/help.go | 8 ++++++- go.mod | 2 +- go.sum | 4 ++-- utils/cliutils/commandsflags.go | 23 +++++++++++------- 6 files changed, 51 insertions(+), 19 deletions(-) diff --git a/buildtools/cli.go b/buildtools/cli.go index 0a6c7a60d..5311f7a71 100644 --- a/buildtools/cli.go +++ b/buildtools/cli.go @@ -87,10 +87,12 @@ import ( ) 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 { @@ -1327,6 +1329,22 @@ func updateHuggingFaceEnv(c *cli.Context, serverDetails *coreConfig.ServerDetail 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 --git a/docs/buildtools/huggingfacedownload/help.go b/docs/buildtools/huggingfacedownload/help.go index fe5db12da..8d6729e27 100644 --- a/docs/buildtools/huggingfacedownload/help.go +++ b/docs/buildtools/huggingfacedownload/help.go @@ -20,6 +20,9 @@ func GetArguments() string { --repo-type [Optional] The repository type. Can be 'model' or 'dataset'. Default: 'model'. - --etag-timeout - [Optional] Timeout in seconds for ETag validation. Default: 86400 (24 hours).` + --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 --git a/docs/buildtools/huggingfaceupload/help.go b/docs/buildtools/huggingfaceupload/help.go index bdfd83b96..0da06a58f 100644 --- a/docs/buildtools/huggingfaceupload/help.go +++ b/docs/buildtools/huggingfaceupload/help.go @@ -21,5 +21,11 @@ func GetArguments() string { [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'.` + [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 --git a/go.mod b/go.mod index 21f2cf500..505d12dd8 100644 --- a/go.mod +++ b/go.mod @@ -248,7 +248,7 @@ require ( // replace github.com/jfrog/jfrog-cli-artifactory => github.com/reshmifrog/jfrog-cli-artifactory v0.0.0-20260303084642-b208fbba798b -replace github.com/jfrog/jfrog-cli-artifactory => github.com/naveenku-jfrog/jfrog-cli-artifactory v0.0.0-20260318211548-92922cf62bea +replace github.com/jfrog/jfrog-cli-artifactory => github.com/naveenku-jfrog/jfrog-cli-artifactory v0.0.0-20260319080637-e2553d9a5a1a //replace github.com/jfrog/build-info-go => github.com/fluxxBot/build-info-go v1.10.10-0.20260105070825-d3f36f619ba5 diff --git a/go.sum b/go.sum index ebaa88d86..101a7cf56 100644 --- a/go.sum +++ b/go.sum @@ -516,8 +516,8 @@ github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= github.com/natefinch/atomic v1.0.1 h1:ZPYKxkqQOx3KZ+RsbnP/YsgvxWQPGxjC0oBt2AhwV0A= github.com/natefinch/atomic v1.0.1/go.mod h1:N/D/ELrljoqDyT3rZrsUmtsuzvHkeB/wWjHV22AZRbM= -github.com/naveenku-jfrog/jfrog-cli-artifactory v0.0.0-20260318211548-92922cf62bea h1:zM6Cb3pH8F5go5krk4Sr6+avhr+3aj7l92H74C1zVyE= -github.com/naveenku-jfrog/jfrog-cli-artifactory v0.0.0-20260318211548-92922cf62bea/go.mod h1:kgw6gIQvJx9bCcOdtAGSUEiCz7nNQmaFbFvNg6byZ6I= +github.com/naveenku-jfrog/jfrog-cli-artifactory v0.0.0-20260319080637-e2553d9a5a1a h1:pmbBzafFoFDzH+nx878fGD5CZ/lOJDBehs1QvGeLruY= +github.com/naveenku-jfrog/jfrog-cli-artifactory v0.0.0-20260319080637-e2553d9a5a1a/go.mod h1:kgw6gIQvJx9bCcOdtAGSUEiCz7nNQmaFbFvNg6byZ6I= github.com/nwaples/rardecode/v2 v2.2.2 h1:/5oL8dzYivRM/tqX9VcTSWfbpwcbwKG1QtSJr3b3KcU= github.com/nwaples/rardecode/v2 v2.2.2/go.mod h1:7uz379lSxPe6j9nvzxUZ+n7mnJNgjsRNb6IbvGVHRmw= github.com/oklog/run v1.0.0 h1:Ru7dDtJNOyC66gQ5dQmaCa0qIsAUFY3sFpK1Xk8igrw= diff --git a/utils/cliutils/commandsflags.go b/utils/cliutils/commandsflags.go index 108b40044..8c2e500e7 100644 --- a/utils/cliutils/commandsflags.go +++ b/utils/cliutils/commandsflags.go @@ -598,10 +598,11 @@ const ( 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{ @@ -1762,10 +1763,14 @@ var flagsMap = map[string]cli.Flag{ 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.StringFlag{ + 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'.` `", @@ -2007,13 +2012,13 @@ var commandFlags = map[string][]string{ 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, + BuildName, BuildNumber, module, Project, serverId, Revision, RepoType, RepoKey, HfHubEtagTimeout, HfHubDownloadTimeout, }, HuggingFaceDownload: { - BuildName, BuildNumber, module, Project, serverId, Revision, RepoType, EtagTimeout, RepoKey, + BuildName, BuildNumber, module, Project, serverId, Revision, RepoType, HfHubEtagTimeout, RepoKey, HfHubDownloadTimeout, }, RubyConfig: { global, serverIdResolve, serverIdDeploy, repoResolve, repoDeploy,