diff --git a/cli/cli.go b/cli/cli.go new file mode 100644 index 00000000..d20c2be3 --- /dev/null +++ b/cli/cli.go @@ -0,0 +1,28 @@ +package cli + +import ( + distributionCLI "github.com/jfrog/jfrog-cli-artifactory/distribution/cli" + evidenceCLI "github.com/jfrog/jfrog-cli-artifactory/evidence/cli" + "github.com/jfrog/jfrog-cli-core/v2/common/cliutils" + "github.com/jfrog/jfrog-cli-core/v2/plugins/components" +) + +func GetJfrogCliArtifactoryApp() components.App { + app := components.CreateEmbeddedApp( + "artifactory", + []components.Command{}, + ) + app.Subcommands = append(app.Subcommands, components.Namespace{ + Name: string(cliutils.Ds), + Description: "Distribution V1 commands.", + Commands: distributionCLI.GetCommands(), + Category: "Command Namespaces", + }) + app.Subcommands = append(app.Subcommands, components.Namespace{ + Name: "evd", + Description: "Evidence commands.", + Commands: evidenceCLI.GetCommands(), + Category: "Command Namespaces", + }) + return app +} diff --git a/distribution/cli/cli.go b/distribution/cli/cli.go new file mode 100644 index 00000000..d4bd5b25 --- /dev/null +++ b/distribution/cli/cli.go @@ -0,0 +1,313 @@ +package cli + +import ( + "errors" + distributionCommands "github.com/jfrog/jfrog-cli-artifactory/distribution/commands" + "github.com/jfrog/jfrog-cli-artifactory/distribution/docs/releasebundlecreate" + "github.com/jfrog/jfrog-cli-artifactory/distribution/docs/releasebundledelete" + "github.com/jfrog/jfrog-cli-artifactory/distribution/docs/releasebundledistribute" + "github.com/jfrog/jfrog-cli-artifactory/distribution/docs/releasebundlesign" + "github.com/jfrog/jfrog-cli-artifactory/distribution/docs/releasebundleupdate" + "github.com/jfrog/jfrog-cli-core/v2/common/cliutils" + buildInfoSummary "github.com/jfrog/jfrog-cli-core/v2/common/cliutils/summary" + "github.com/jfrog/jfrog-cli-core/v2/common/commands" + "github.com/jfrog/jfrog-cli-core/v2/common/spec" + pluginsCommon "github.com/jfrog/jfrog-cli-core/v2/plugins/common" + "github.com/jfrog/jfrog-cli-core/v2/plugins/components" + coreConfig "github.com/jfrog/jfrog-cli-core/v2/utils/config" + distributionServices "github.com/jfrog/jfrog-client-go/distribution/services" + distributionServicesUtils "github.com/jfrog/jfrog-client-go/distribution/services/utils" + "github.com/jfrog/jfrog-client-go/utils/errorutils" + "os" + "path/filepath" + "strings" +) + +const distributionCategory = "distribution" + +func GetCommands() []components.Command { + return []components.Command{ + { + Name: "release-bundle-create", + Flags: GetCommandFlags(ReleaseBundleV1Create), + Aliases: []string{"rbc"}, + Description: releasebundlecreate.GetDescription(), + Arguments: releasebundlecreate.GetArguments(), + Category: distributionCategory, + Action: releaseBundleCreateCmd, + }, + { + Name: "release-bundle-update", + Flags: GetCommandFlags(ReleaseBundleV1Update), + Aliases: []string{"rbu"}, + Description: releasebundleupdate.GetDescription(), + Arguments: releasebundleupdate.GetArguments(), + Category: distributionCategory, + Action: releaseBundleUpdateCmd, + }, + { + Name: "release-bundle-sign", + Flags: GetCommandFlags(ReleaseBundleV1Sign), + Aliases: []string{"rbs"}, + Description: releasebundlesign.GetDescription(), + Arguments: releasebundlesign.GetArguments(), + Category: distributionCategory, + Action: releaseBundleSignCmd, + }, + { + Name: "release-bundle-distribute", + Flags: GetCommandFlags(ReleaseBundleV1Distribute), + Aliases: []string{"rbd"}, + Description: releasebundledistribute.GetDescription(), + Arguments: releasebundledistribute.GetArguments(), + Category: distributionCategory, + Action: releaseBundleDistributeCmd, + }, + { + Name: "release-bundle-delete", + Flags: GetCommandFlags(ReleaseBundleV1Delete), + Aliases: []string{"rbdel"}, + Description: releasebundledelete.GetDescription(), + Arguments: releasebundledelete.GetArguments(), + Category: distributionCategory, + Action: releaseBundleDeleteCmd, + }, + } +} + +func releaseBundleCreateCmd(c *components.Context) error { + if !(len(c.Arguments) == 2 && c.IsFlagSet("spec") || (len(c.Arguments) == 3 && !c.IsFlagSet("spec"))) { + return pluginsCommon.WrongNumberOfArgumentsHandler(c) + } + if c.GetBoolFlagValue("detailed-summary") && !c.GetBoolFlagValue("sign") { + return pluginsCommon.PrintHelpAndReturnError("The --detailed-summary option can't be used without --sign", c) + } + var releaseBundleCreateSpec *spec.SpecFiles + var err error + if c.IsFlagSet("spec") { + releaseBundleCreateSpec, err = cliutils.GetSpec(c, true, true) + } else { + releaseBundleCreateSpec = createDefaultReleaseBundleSpec(c) + } + if err != nil { + return err + } + err = spec.ValidateSpec(releaseBundleCreateSpec.Files, false, true) + if err != nil { + return err + } + + params, err := createReleaseBundleCreateUpdateParams(c, c.Arguments[0], c.Arguments[1]) + if err != nil { + return err + } + releaseBundleCreateCmd := distributionCommands.NewReleaseBundleCreateCommand() + dsDetails, err := createDistributionDetailsByFlags(c) + if err != nil { + return err + } + releaseBundleCreateCmd.SetServerDetails(dsDetails).SetReleaseBundleCreateParams(params).SetSpec(releaseBundleCreateSpec).SetDryRun(c.GetBoolFlagValue("dry-run")).SetDetailedSummary(c.GetBoolFlagValue("detailed-summary")) + + err = commands.Exec(releaseBundleCreateCmd) + if releaseBundleCreateCmd.IsDetailedSummary() { + if summary := releaseBundleCreateCmd.GetSummary(); summary != nil { + return buildInfoSummary.PrintBuildInfoSummaryReport(summary.IsSucceeded(), summary.GetSha256(), err) + } + } + return err +} + +func releaseBundleUpdateCmd(c *components.Context) error { + if !(len(c.Arguments) == 2 && c.GetBoolFlagValue("spec") || (len(c.Arguments) == 3 && !c.GetBoolFlagValue("spec"))) { + return pluginsCommon.WrongNumberOfArgumentsHandler(c) + } + if c.GetBoolFlagValue("detailed-summary") && !c.GetBoolFlagValue("sign") { + return pluginsCommon.PrintHelpAndReturnError("The --detailed-summary option can't be used without --sign", c) + } + var releaseBundleUpdateSpec *spec.SpecFiles + var err error + if c.GetBoolFlagValue("spec") { + releaseBundleUpdateSpec, err = cliutils.GetSpec(c, true, true) + } else { + releaseBundleUpdateSpec = createDefaultReleaseBundleSpec(c) + } + if err != nil { + return err + } + err = spec.ValidateSpec(releaseBundleUpdateSpec.Files, false, true) + if err != nil { + return err + } + + params, err := createReleaseBundleCreateUpdateParams(c, c.Arguments[0], c.Arguments[1]) + if err != nil { + return err + } + releaseBundleUpdateCmd := distributionCommands.NewReleaseBundleUpdateCommand() + dsDetails, err := createDistributionDetailsByFlags(c) + if err != nil { + return err + } + releaseBundleUpdateCmd.SetServerDetails(dsDetails).SetReleaseBundleUpdateParams(params).SetSpec(releaseBundleUpdateSpec).SetDryRun(c.GetBoolFlagValue("dry-run")).SetDetailedSummary(c.GetBoolFlagValue("detailed-summary")) + + err = commands.Exec(releaseBundleUpdateCmd) + if releaseBundleUpdateCmd.IsDetailedSummary() { + if updateBundleCmdSummary := releaseBundleUpdateCmd.GetSummary(); updateBundleCmdSummary != nil { + return buildInfoSummary.PrintBuildInfoSummaryReport(updateBundleCmdSummary.IsSucceeded(), updateBundleCmdSummary.GetSha256(), err) + } + } + return err +} + +func releaseBundleSignCmd(c *components.Context) error { + if len(c.Arguments) != 2 { + return pluginsCommon.WrongNumberOfArgumentsHandler(c) + } + + params := distributionServices.NewSignBundleParams(c.Arguments[0], c.Arguments[1]) + params.StoringRepository = c.GetStringFlagValue("repo") + params.GpgPassphrase = c.GetStringFlagValue("passphrase") + releaseBundleSignCmd := distributionCommands.NewReleaseBundleSignCommand() + dsDetails, err := createDistributionDetailsByFlags(c) + if err != nil { + return err + } + releaseBundleSignCmd.SetServerDetails(dsDetails).SetReleaseBundleSignParams(params).SetDetailedSummary(c.GetBoolFlagValue("detailed-summary")) + err = commands.Exec(releaseBundleSignCmd) + if releaseBundleSignCmd.IsDetailedSummary() { + if summary := releaseBundleSignCmd.GetSummary(); summary != nil { + return buildInfoSummary.PrintBuildInfoSummaryReport(summary.IsSucceeded(), summary.GetSha256(), err) + } + } + return err +} + +func releaseBundleDistributeCmd(c *components.Context) error { + if err := ValidateReleaseBundleDistributeCmd(c); err != nil { + return err + } + + dsDetails, err := createDistributionDetailsByFlags(c) + if err != nil { + return err + } + distributionRules, maxWaitMinutes, params, err := InitReleaseBundleDistributeCmd(c) + if err != nil { + return err + } + + distributeCmd := distributionCommands.NewReleaseBundleDistributeV1Command() + distributeCmd.SetServerDetails(dsDetails). + SetDistributeBundleParams(params). + SetDistributionRules(distributionRules). + SetDryRun(c.GetBoolFlagValue("dry-run")). + SetSync(c.GetBoolFlagValue("sync")). + SetMaxWaitMinutes(maxWaitMinutes). + SetAutoCreateRepo(c.GetBoolFlagValue("create-repo")) + + return commands.Exec(distributeCmd) +} + +func releaseBundleDeleteCmd(c *components.Context) error { + if len(c.Arguments) != 2 { + return pluginsCommon.WrongNumberOfArgumentsHandler(c) + } + var distributionRules *spec.DistributionRules + if c.IsFlagSet("dist-rules") { + if c.IsFlagSet("site") || c.IsFlagSet("city") || c.IsFlagSet("country-code") { + return pluginsCommon.PrintHelpAndReturnError("flag --dist-rules can't be used with --site, --city or --country-code", c) + } + var err error + distributionRules, err = spec.CreateDistributionRulesFromFile(c.GetStringFlagValue("dist-rules")) + if err != nil { + return err + } + } else { + distributionRules = CreateDefaultDistributionRules(c) + } + + params := distributionServices.NewDeleteReleaseBundleParams(c.Arguments[0], c.Arguments[1]) + params.DeleteFromDistribution = c.GetBoolFlagValue("delete-from-dist") + params.Sync = c.GetBoolFlagValue("sync") + maxWaitMinutes, err := c.WithDefaultIntFlagValue("max-wait-minutes", 60) + if err != nil { + return err + } + params.MaxWaitMinutes = maxWaitMinutes + distributeBundleCmd := distributionCommands.NewReleaseBundleDeleteParams() + dsDetails, err := createDistributionDetailsByFlags(c) + if err != nil { + return err + } + distributeBundleCmd.SetQuiet(pluginsCommon.GetQuietValue(c)).SetServerDetails(dsDetails).SetDistributeBundleParams(params).SetDistributionRules(distributionRules).SetDryRun(c.GetBoolFlagValue("dry-run")) + + return commands.Exec(distributeBundleCmd) +} + +func createDefaultReleaseBundleSpec(c *components.Context) *spec.SpecFiles { + return spec.NewBuilder(). + Pattern(c.Arguments[2]). + Target(c.GetStringFlagValue("target")). + Props(c.GetStringFlagValue("props")). + Build(c.GetStringFlagValue("build")). + Bundle(c.GetStringFlagValue("bundle")). + Exclusions(pluginsCommon.GetStringsArrFlagValue(c, "exclusions")). + Regexp(c.GetBoolFlagValue("regexp")). + TargetProps(c.GetStringFlagValue("target-props")). + Ant(c.GetBoolFlagValue("ant")). + BuildSpec() +} + +func createReleaseBundleCreateUpdateParams(c *components.Context, bundleName, bundleVersion string) (distributionServicesUtils.ReleaseBundleParams, error) { + releaseBundleParams := distributionServicesUtils.NewReleaseBundleParams(bundleName, bundleVersion) + releaseBundleParams.SignImmediately = c.GetBoolFlagValue("sign") + releaseBundleParams.StoringRepository = c.GetStringFlagValue("repo") + releaseBundleParams.GpgPassphrase = c.GetStringFlagValue("passphrase") + releaseBundleParams.Description = c.GetStringFlagValue("desc") + if c.IsFlagSet("release-notes-path") { + bytes, err := os.ReadFile(c.GetStringFlagValue("release-notes-path")) + if err != nil { + return releaseBundleParams, errorutils.CheckError(err) + } + releaseBundleParams.ReleaseNotes = string(bytes) + releaseBundleParams.ReleaseNotesSyntax, err = populateReleaseNotesSyntax(c) + if err != nil { + return releaseBundleParams, err + } + } + return releaseBundleParams, nil +} + +func createDistributionDetailsByFlags(c *components.Context) (*coreConfig.ServerDetails, error) { + dsDetails, err := pluginsCommon.CreateServerDetailsWithConfigOffer(c, true, cliutils.Ds) + if err != nil { + return nil, err + } + if dsDetails.DistributionUrl == "" { + return nil, errors.New("no JFrog Distribution URL specified, either via the --url flag or as part of the server configuration") + } + return dsDetails, nil +} + +func populateReleaseNotesSyntax(c *components.Context) (distributionServicesUtils.ReleaseNotesSyntax, error) { + // If release notes syntax is set, use it + releaseNotesSyntax := c.GetStringFlagValue("release-notes-syntax") + if releaseNotesSyntax != "" { + switch releaseNotesSyntax { + case "markdown": + return distributionServicesUtils.Markdown, nil + case "asciidoc": + return distributionServicesUtils.Asciidoc, nil + case "plain_text": + return distributionServicesUtils.PlainText, nil + default: + return distributionServicesUtils.PlainText, errorutils.CheckErrorf("--release-notes-syntax must be one of: markdown, asciidoc or plain_text.") + } + } + // If the file extension is ".md" or ".markdown", use the Markdown syntax + extension := strings.ToLower(filepath.Ext(c.GetStringFlagValue("release-notes-path"))) + if extension == ".md" || extension == ".markdown" { + return distributionServicesUtils.Markdown, nil + } + return distributionServicesUtils.PlainText, nil +} diff --git a/distribution/cli/distribute.go b/distribution/cli/distribute.go new file mode 100644 index 00000000..1931982a --- /dev/null +++ b/distribution/cli/distribute.go @@ -0,0 +1,52 @@ +package cli + +import ( + "github.com/jfrog/jfrog-cli-core/v2/common/spec" + pluginsCommon "github.com/jfrog/jfrog-cli-core/v2/plugins/common" + "github.com/jfrog/jfrog-cli-core/v2/plugins/components" + distributionUtils "github.com/jfrog/jfrog-client-go/utils/distribution" +) + +func CreateDefaultDistributionRules(c *components.Context) *spec.DistributionRules { + return &spec.DistributionRules{ + DistributionRules: []spec.DistributionRule{{ + SiteName: c.GetStringFlagValue("site"), + CityName: c.GetStringFlagValue("city"), + CountryCodes: pluginsCommon.GetStringsArrFlagValue(c, "country-codes"), + }}, + } +} + +func ValidateReleaseBundleDistributeCmd(c *components.Context) error { + if len(c.Arguments) != 2 { + return pluginsCommon.WrongNumberOfArgumentsHandler(c) + } + if c.IsFlagSet("max-wait-minutes") && !c.IsFlagSet("sync") { + return pluginsCommon.PrintHelpAndReturnError("The --max-wait-minutes option can't be used without --sync", c) + } + + if c.IsFlagSet("dist-rules") && (c.IsFlagSet("site") || c.IsFlagSet("city") || c.IsFlagSet("country-code")) { + return pluginsCommon.PrintHelpAndReturnError("The --dist-rules option can't be used with --site, --city or --country-code", c) + } + + return nil +} + +func InitReleaseBundleDistributeCmd(c *components.Context) (distributionRules *spec.DistributionRules, maxWaitMinutes int, params distributionUtils.DistributionParams, err error) { + if c.IsFlagSet("dist-rules") { + distributionRules, err = spec.CreateDistributionRulesFromFile(c.GetStringFlagValue("dist-rules")) + if err != nil { + return + } + } else { + distributionRules = CreateDefaultDistributionRules(c) + } + + maxWaitMinutes, err = c.WithDefaultIntFlagValue("max-wait-minutes", 60) + if err != nil { + return + } + + params = distributionUtils.NewDistributeReleaseBundleParams(c.Arguments[0], c.Arguments[1]) + return +} diff --git a/distribution/cli/flags.go b/distribution/cli/flags.go new file mode 100644 index 00000000..367e4c42 --- /dev/null +++ b/distribution/cli/flags.go @@ -0,0 +1,122 @@ +package cli + +import ( + pluginsCommon "github.com/jfrog/jfrog-cli-core/v2/plugins/common" + "github.com/jfrog/jfrog-cli-core/v2/plugins/components" +) + +const ( + ReleaseBundleV1Create = "release-bundle-v1-create" + ReleaseBundleV1Update = "release-bundle-v1-update" + ReleaseBundleV1Sign = "release-bundle-v1-sign" + ReleaseBundleV1Distribute = "release-bundle-v1-distribute" + ReleaseBundleV1Delete = "release-bundle-v1-delete" + + distUrl = "dist-url" + + // Unique release-bundle-* v1 flags + releaseBundleV1Prefix = "rbv1-" + rbDryRun = releaseBundleV1Prefix + dryRun + rbRepo = releaseBundleV1Prefix + repo + rbPassphrase = releaseBundleV1Prefix + passphrase + distTarget = releaseBundleV1Prefix + target + rbDetailedSummary = releaseBundleV1Prefix + detailedSummary + sign = "sign" + desc = "desc" + releaseNotesPath = "release-notes-path" + releaseNotesSyntax = "release-notes-syntax" + deleteFromDist = "delete-from-dist" + + // Common release-bundle-* v1&v2 flags + DistRules = "dist-rules" + site = "site" + city = "city" + countryCodes = "country-codes" + sync = "sync" + maxWaitMinutes = "max-wait-minutes" + CreateRepo = "create-repo" + + user = "user" + password = "password" + accessToken = "access-token" + serverId = "server-id" + + // Client certification flags + InsecureTls = "insecure-tls" + + // Spec flags + specFlag = "spec" + specVars = "spec-vars" + + // Generic commands flags + exclusions = "exclusions" + dryRun = "dry-run" + targetProps = "target-props" + quiet = "quiet" + detailedSummary = "detailed-summary" + deletePrefix = "delete-" + deleteQuiet = deletePrefix + quiet + repo = "repo" + target = "target" + name = "name" + passphrase = "passphrase" + url = "url" +) + +var commandFlags = map[string][]string{ + ReleaseBundleV1Create: { + distUrl, user, password, accessToken, serverId, specFlag, specVars, targetProps, + rbDryRun, sign, desc, exclusions, releaseNotesPath, releaseNotesSyntax, rbPassphrase, rbRepo, InsecureTls, distTarget, rbDetailedSummary, + }, + ReleaseBundleV1Update: { + distUrl, user, password, accessToken, serverId, specFlag, specVars, targetProps, + rbDryRun, sign, desc, exclusions, releaseNotesPath, releaseNotesSyntax, rbPassphrase, rbRepo, InsecureTls, distTarget, rbDetailedSummary, + }, + ReleaseBundleV1Sign: { + distUrl, user, password, accessToken, serverId, rbPassphrase, rbRepo, + InsecureTls, rbDetailedSummary, + }, + ReleaseBundleV1Distribute: { + distUrl, user, password, accessToken, serverId, rbDryRun, DistRules, + site, city, countryCodes, sync, maxWaitMinutes, InsecureTls, CreateRepo, + }, + ReleaseBundleV1Delete: { + distUrl, user, password, accessToken, serverId, rbDryRun, DistRules, + site, city, countryCodes, sync, maxWaitMinutes, InsecureTls, deleteFromDist, deleteQuiet, + }, +} + +var flagsMap = map[string]components.Flag{ + distUrl: components.NewStringFlag(url, "JFrog Distribution URL. (example: https://acme.jfrog.io/distribution)", components.SetMandatoryFalse()), + user: components.NewStringFlag(user, "JFrog username.", components.SetMandatoryFalse()), + password: components.NewStringFlag(password, "JFrog password.", components.SetMandatoryFalse()), + accessToken: components.NewStringFlag(accessToken, "JFrog access token.", components.SetMandatoryFalse()), + serverId: components.NewStringFlag(serverId, "Server ID configured using the 'jf config' command.", components.SetMandatoryFalse()), + specFlag: components.NewStringFlag(specFlag, "Path to a File Spec.", components.SetMandatoryFalse()), + specVars: components.NewStringFlag(specVars, "List of semicolon-separated(;) variables in the form of \"key1=value1;key2=value2;...\" to be replaced in the File Spec.", components.SetMandatoryFalse()), + targetProps: components.NewStringFlag(targetProps, "List of semicolon-separated(;) properties, in the form of \"key1=value1;key2=value2;...\" to be added to the artifacts after distribution of the release bundle.", components.SetMandatoryFalse()), + rbDryRun: components.NewBoolFlag(dryRun, "Set to true to disable communication with JFrog Distribution.", components.WithBoolDefaultValueFalse()), + sign: components.NewBoolFlag(sign, "If set to true, automatically signs the release bundle version.", components.WithBoolDefaultValueFalse()), + desc: components.NewStringFlag(desc, "Description of the release bundle.", components.SetMandatoryFalse()), + exclusions: components.NewStringFlag(exclusions, "List of semicolon-separated(;) exclusions. Exclusions can include the * and the ? wildcards.", components.SetMandatoryFalse()), + releaseNotesPath: components.NewStringFlag(releaseNotesPath, "Path to a file describes the release notes for the release bundle version.", components.SetMandatoryFalse()), + releaseNotesSyntax: components.NewStringFlag(releaseNotesSyntax, "The syntax for the release notes. Can be one of 'markdown', 'asciidoc', or 'plain_text.", components.SetMandatoryFalse()), + rbPassphrase: components.NewStringFlag(passphrase, "The passphrase for the signing key.", components.SetMandatoryFalse()), + rbRepo: components.NewStringFlag(repo, "A repository name at source Artifactory to store release bundle artifacts in. If not provided, Artifactory will use the default one.", components.SetMandatoryFalse()), + InsecureTls: components.NewBoolFlag(InsecureTls, "Set to true to skip TLS certificates verification.", components.WithBoolDefaultValueFalse()), + distTarget: components.NewStringFlag(target, "The target path for distributed artifacts on the edge node.", components.SetMandatoryFalse()), + rbDetailedSummary: components.NewBoolFlag(detailedSummary, "Set to true to get a command summary with details about the release bundle artifact.", components.WithBoolDefaultValueFalse()), + DistRules: components.NewStringFlag(DistRules, "Path to distribution rules.", components.SetMandatoryFalse()), + site: components.NewStringFlag(site, "Wildcard filter for site name.", components.SetMandatoryFalse()), + city: components.NewStringFlag(city, "Wildcard filter for site city name.", components.SetMandatoryFalse()), + countryCodes: components.NewStringFlag(countryCodes, "List of semicolon-separated(;) wildcard filters for site country codes.", components.SetMandatoryFalse()), + sync: components.NewBoolFlag(sync, "Set to true to enable sync distribution (the command execution will end when the distribution process ends).", components.WithBoolDefaultValueFalse()), + maxWaitMinutes: components.NewStringFlag(maxWaitMinutes, "Max minutes to wait for sync distribution.", components.WithStrDefaultValue("60")), + deleteFromDist: components.NewBoolFlag(deleteFromDist, "Set to true to delete release bundle version in JFrog Distribution itself after deletion is complete.", components.WithBoolDefaultValueFalse()), + deleteQuiet: components.NewBoolFlag(quiet, "Set to true to skip the delete confirmation message.", components.WithBoolDefaultValueFalse()), + CreateRepo: components.NewBoolFlag(CreateRepo, "Set to true to create the repository on the edge if it does not exist.", components.WithBoolDefaultValueFalse()), +} + +func GetCommandFlags(cmdKey string) []components.Flag { + return pluginsCommon.GetCommandFlags(cmdKey, commandFlags, flagsMap) +} diff --git a/distribution/docs/releasebundlecreate/help.go b/distribution/docs/releasebundlecreate/help.go new file mode 100644 index 00000000..f3f3bb21 --- /dev/null +++ b/distribution/docs/releasebundlecreate/help.go @@ -0,0 +1,20 @@ +package releasebundlecreate + +import "github.com/jfrog/jfrog-cli-core/v2/plugins/components" + +var Usage = []string{"ds rbc [command options] ", + "ds rbc --spec= [command options] "} + +func GetDescription() string { + return "Create a release bundle v1." +} + +func GetArguments() []components.Argument { + return []components.Argument{ + {Name: "release bundle name", Description: "The name of the release bundle."}, + {Name: "release bundle version", Description: "The release bundle version."}, + {Name: "pattern", Description: `Specifies the source path in Artifactory, from which the artifacts should be + bundled,\n\t\tin the following format: /. You can use wildcards + to specify multiple artifacts.`}, + } +} diff --git a/distribution/docs/releasebundledelete/help.go b/distribution/docs/releasebundledelete/help.go new file mode 100644 index 00000000..a7b4cc0b --- /dev/null +++ b/distribution/docs/releasebundledelete/help.go @@ -0,0 +1,16 @@ +package releasebundledelete + +import "github.com/jfrog/jfrog-cli-core/v2/plugins/components" + +var Usage = []string{"ds rbdel [command options] "} + +func GetDescription() string { + return "Delete a release bundle v1." +} + +func GetArguments() []components.Argument { + return []components.Argument{ + {Name: "release bundle name", Description: "Release bundle name."}, + {Name: "release bundle version", Description: "Release bundle version."}, + } +} diff --git a/distribution/docs/releasebundledistribute/help.go b/distribution/docs/releasebundledistribute/help.go new file mode 100644 index 00000000..b0f01d8a --- /dev/null +++ b/distribution/docs/releasebundledistribute/help.go @@ -0,0 +1,16 @@ +package releasebundledistribute + +import "github.com/jfrog/jfrog-cli-core/v2/plugins/components" + +var Usage = []string{"ds rbd [command options] "} + +func GetDescription() string { + return "Distribute a release bundle v1." +} + +func GetArguments() []components.Argument { + return []components.Argument{ + {Name: "release bundle name", Description: "Release bundle name."}, + {Name: "release bundle version", Description: "Release bundle version."}, + } +} diff --git a/distribution/docs/releasebundlesign/help.go b/distribution/docs/releasebundlesign/help.go new file mode 100644 index 00000000..d8b56730 --- /dev/null +++ b/distribution/docs/releasebundlesign/help.go @@ -0,0 +1,16 @@ +package releasebundlesign + +import "github.com/jfrog/jfrog-cli-core/v2/plugins/components" + +var Usage = []string{"ds rbs [command options] "} + +func GetDescription() string { + return "Sign a release bundle v1." +} + +func GetArguments() []components.Argument { + return []components.Argument{ + {Name: "release bundle name", Description: "Release bundle name."}, + {Name: "release bundle version", Description: "Release bundle version."}, + } +} diff --git a/distribution/docs/releasebundleupdate/help.go b/distribution/docs/releasebundleupdate/help.go new file mode 100644 index 00000000..a344295a --- /dev/null +++ b/distribution/docs/releasebundleupdate/help.go @@ -0,0 +1,20 @@ +package releasebundleupdate + +import "github.com/jfrog/jfrog-cli-core/v2/plugins/components" + +var Usage = []string{"ds rbu [command options] ", + "ds rbu --spec= [command options] "} + +func GetDescription() string { + return "Updates an existing unsigned release bundle v1 version." +} + +func GetArguments() []components.Argument { + return []components.Argument{ + {Name: "release bundle name", Description: "The name of the release bundle."}, + {Name: "release bundle version", Description: "The release bundle version."}, + {Name: "pattern", Description: `Specifies the source path in Artifactory, from which the artifacts should be + bundled,\n\t\tin the following format: /. + You can use wildcards to specify multiple artifacts.`}, + } +} diff --git a/evidence/cli/cli.go b/evidence/cli/cli.go index 3a070158..1205a437 100644 --- a/evidence/cli/cli.go +++ b/evidence/cli/cli.go @@ -4,7 +4,7 @@ import ( "github.com/jfrog/jfrog-cli-core/v2/plugins/components" ) -func GetJfrogCliArtifactoryApp() components.App { +func GetJfrogCliEvidenceApp() components.App { app := components.CreateEmbeddedApp( "artifactory", []components.Command{}, diff --git a/go.mod b/go.mod index 155f9063..ae289b60 100644 --- a/go.mod +++ b/go.mod @@ -104,7 +104,6 @@ require ( golang.org/x/sys v0.30.0 // indirect golang.org/x/term v0.29.0 // indirect golang.org/x/text v0.21.0 // indirect - golang.org/x/tools v0.29.0 // indirect gopkg.in/inf.v0 v0.9.1 // indirect gopkg.in/ini.v1 v1.67.0 // indirect gopkg.in/warnings.v0 v0.1.2 // indirect @@ -123,7 +122,7 @@ require ( //replace github.com/jfrog/jfrog-cli-core/v2 => github.com/oshratZairi/jfrog-cli-core/v2 v2.56.9-0.20241127142944-b39d0cc8f1c1 //replace github.com/jfrog/jfrog-cli-core/v2 => github.com/oshratZairi/jfrog-cli-core/v2 v2.31.1-0.20241211104546-3e12a85de116 -// replace github.com/jfrog/jfrog-cli-core/v2 => github.com/jfrog/jfrog-cli-core/v2 v2.31.1-0.20250130104846-27e495de291e +replace github.com/jfrog/jfrog-cli-core/v2 => github.com/jfrog/jfrog-cli-core/v2 v2.31.1-0.20250212021126-e5223ab616af // replace github.com/jfrog/jfrog-client-go => github.com/jfrog/jfrog-client-go v1.28.1-0.20250126110945-81abbdde452f diff --git a/go.sum b/go.sum index 23f21b67..30880173 100644 --- a/go.sum +++ b/go.sum @@ -112,8 +112,8 @@ github.com/jfrog/build-info-go v1.10.9 h1:mdJ+wlLw2ReFsqC7rifJVlRYLEqYk38uXDYAOZ github.com/jfrog/build-info-go v1.10.9/go.mod h1:JcISnovFXKx3wWf3p1fcMmlPdt6adxScXvoJN4WXqIE= github.com/jfrog/gofrog v1.7.6 h1:QmfAiRzVyaI7JYGsB7cxfAJePAZTzFz0gRWZSE27c6s= github.com/jfrog/gofrog v1.7.6/go.mod h1:ntr1txqNOZtHplmaNd7rS4f8jpA5Apx8em70oYEe7+4= -github.com/jfrog/jfrog-cli-core/v2 v2.58.0 h1:tPjwJdWNv9PTz1ma5TjrMd9Uu0btcQg8eBCpc5h/rn4= -github.com/jfrog/jfrog-cli-core/v2 v2.58.0/go.mod h1:Hx2houXADsNv0eRh4w5XCS2uSsPNPn1OmiSDdwGFB7g= +github.com/jfrog/jfrog-cli-core/v2 v2.31.1-0.20250212021126-e5223ab616af h1:XnyhhyARP1YCzYGdhk8ovpyZV+hSchiTGVTuejrZXsI= +github.com/jfrog/jfrog-cli-core/v2 v2.31.1-0.20250212021126-e5223ab616af/go.mod h1:Hx2houXADsNv0eRh4w5XCS2uSsPNPn1OmiSDdwGFB7g= github.com/jfrog/jfrog-client-go v1.50.0 h1:t7v/zpLkPomHR6ZjVbPQ1WPQJd9IFKESK9Tt6phZz3k= github.com/jfrog/jfrog-client-go v1.50.0/go.mod h1:xHxwKBjPSUBd/FyCWgusfHmSWKUZTkfOZkTmntC2F5Y= github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM=