From 5ff0833fbbe150858b5841b73a911bf33090037f Mon Sep 17 00:00:00 2001 From: Reshmi Date: Thu, 11 Dec 2025 10:56:05 +0530 Subject: [PATCH 01/10] add conan support --- artifactory/commands/conan/artifacts.go | 258 +++++++++++++++++++++ artifactory/commands/conan/command.go | 258 +++++++++++++++++++++ artifactory/commands/conan/login.go | 269 ++++++++++++++++++++++ artifactory/commands/conan/upload.go | 286 ++++++++++++++++++++++++ 4 files changed, 1071 insertions(+) create mode 100644 artifactory/commands/conan/artifacts.go create mode 100644 artifactory/commands/conan/command.go create mode 100644 artifactory/commands/conan/login.go create mode 100644 artifactory/commands/conan/upload.go diff --git a/artifactory/commands/conan/artifacts.go b/artifactory/commands/conan/artifacts.go new file mode 100644 index 00000000..d00ba92c --- /dev/null +++ b/artifactory/commands/conan/artifacts.go @@ -0,0 +1,258 @@ +package conan + +import ( + "fmt" + "strconv" + "strings" + "time" + + "github.com/jfrog/build-info-go/entities" + "github.com/jfrog/jfrog-cli-core/v2/artifactory/utils" + "github.com/jfrog/jfrog-cli-core/v2/utils/config" + "github.com/jfrog/jfrog-client-go/artifactory" + "github.com/jfrog/jfrog-client-go/artifactory/services" + specutils "github.com/jfrog/jfrog-client-go/artifactory/services/utils" + "github.com/jfrog/jfrog-client-go/utils/io/content" + "github.com/jfrog/jfrog-client-go/utils/log" +) + +// ConanPackageInfo holds parsed Conan package reference information. +type ConanPackageInfo struct { + Name string + Version string + User string + Channel string +} + +// ArtifactCollector collects Conan artifacts from Artifactory. +type ArtifactCollector struct { + serverDetails *config.ServerDetails + targetRepo string +} + +// NewArtifactCollector creates a new artifact collector. +func NewArtifactCollector(serverDetails *config.ServerDetails, targetRepo string) *ArtifactCollector { + return &ArtifactCollector{ + serverDetails: serverDetails, + targetRepo: targetRepo, + } +} + +// CollectArtifacts searches Artifactory for Conan artifacts matching the package reference. +func (ac *ArtifactCollector) CollectArtifacts(packageRef string) ([]entities.Artifact, error) { + if ac.serverDetails == nil { + return nil, fmt.Errorf("server details not initialized") + } + + pkgInfo, err := ParsePackageReference(packageRef) + if err != nil { + return nil, err + } + + servicesManager, err := utils.CreateServiceManager(ac.serverDetails, -1, 0, false) + if err != nil { + return nil, fmt.Errorf("create services manager: %w", err) + } + + return ac.searchArtifacts(servicesManager, pkgInfo) +} + +// searchArtifacts searches for Conan artifacts in Artifactory. +func (ac *ArtifactCollector) searchArtifacts(manager artifactory.ArtifactoryServicesManager, pkgInfo *ConanPackageInfo) ([]entities.Artifact, error) { + searchQuery := buildArtifactQuery(ac.targetRepo, pkgInfo) + searchParams := services.SearchParams{ + CommonParams: &specutils.CommonParams{ + Aql: specutils.Aql{ItemsFind: searchQuery}, + }, + } + + reader, err := manager.SearchFiles(searchParams) + if err != nil { + return nil, fmt.Errorf("search files: %w", err) + } + defer closeReader(reader) + + return parseSearchResults(reader) +} + +// parseSearchResults converts AQL search results to artifacts. +func parseSearchResults(reader *content.ContentReader) ([]entities.Artifact, error) { + var artifacts []entities.Artifact + + for item := new(specutils.ResultItem); reader.NextRecord(item) == nil; item = new(specutils.ResultItem) { + artifact := entities.Artifact{ + Name: item.Name, + Path: item.Path, + Type: classifyArtifactType(item.Name), + Checksum: entities.Checksum{ + Sha1: item.Actual_Sha1, + Sha256: item.Sha256, + Md5: item.Actual_Md5, + }, + } + artifacts = append(artifacts, artifact) + } + + return artifacts, nil +} + +// classifyArtifactType determines the artifact type based on filename. +func classifyArtifactType(name string) string { + switch { + case name == "conanfile.py": + return "conan-recipe" + case name == "conanmanifest.txt": + return "conan-manifest" + case name == "conaninfo.txt": + return "conan-info" + case strings.HasSuffix(name, ".tgz"): + return "conan-package" + default: + return "conan-artifact" + } +} + +// ParsePackageReference parses a Conan package reference string. +// Supports both formats: name/version and name/version@user/channel +func ParsePackageReference(ref string) (*ConanPackageInfo, error) { + // Remove any trailing whitespace or package ID + ref = strings.TrimSpace(ref) + + // Check for @user/channel format + if idx := strings.Index(ref, "@"); idx != -1 { + nameVersion := ref[:idx] + userChannel := ref[idx+1:] + + nameParts := strings.SplitN(nameVersion, "/", 2) + channelParts := strings.SplitN(userChannel, "/", 2) + + if len(nameParts) != 2 || len(channelParts) != 2 { + return nil, fmt.Errorf("invalid package reference: %s", ref) + } + + return &ConanPackageInfo{ + Name: nameParts[0], + Version: nameParts[1], + User: channelParts[0], + Channel: channelParts[1], + }, nil + } + + // Simple name/version format (Conan 2.x style) + parts := strings.SplitN(ref, "/", 2) + if len(parts) != 2 { + return nil, fmt.Errorf("invalid package reference: %s", ref) + } + + return &ConanPackageInfo{ + Name: parts[0], + Version: parts[1], + User: "_", + Channel: "_", + }, nil +} + +// buildArtifactQuery creates an AQL query for Conan artifacts. +func buildArtifactQuery(repo string, pkg *ConanPackageInfo) string { + // Conan 2.x uses _/name/version/_ path format + if pkg.User == "_" && pkg.Channel == "_" { + return fmt.Sprintf(`{"repo": "%s", "path": {"$match": "_/%s/%s/_/*"}}`, + repo, pkg.Name, pkg.Version) + } + // Conan 1.x uses user/name/version/channel path format + return fmt.Sprintf(`{"repo": "%s", "path": {"$match": "%s/%s/%s/%s/*"}}`, + repo, pkg.User, pkg.Name, pkg.Version, pkg.Channel) +} + +// BuildPropertySetter sets build properties on Conan artifacts. +type BuildPropertySetter struct { + serverDetails *config.ServerDetails + targetRepo string + buildName string + buildNumber string + projectKey string +} + +// NewBuildPropertySetter creates a new build property setter. +func NewBuildPropertySetter(serverDetails *config.ServerDetails, targetRepo, buildName, buildNumber, projectKey string) *BuildPropertySetter { + return &BuildPropertySetter{ + serverDetails: serverDetails, + targetRepo: targetRepo, + buildName: buildName, + buildNumber: buildNumber, + projectKey: projectKey, + } +} + +// SetProperties sets build properties on the given artifacts. +func (bps *BuildPropertySetter) SetProperties(artifacts []entities.Artifact) error { + if len(artifacts) == 0 || bps.serverDetails == nil { + return nil + } + + servicesManager, err := utils.CreateServiceManager(bps.serverDetails, -1, 0, false) + if err != nil { + return fmt.Errorf("create services manager: %w", err) + } + + timestamp := strconv.FormatInt(time.Now().UnixMilli(), 10) + props := bps.formatBuildProperties(timestamp) + + successCount := 0 + for _, artifact := range artifacts { + if err := bps.setPropertiesOnArtifact(servicesManager, artifact, props); err != nil { + log.Warn(fmt.Sprintf("Failed to set properties on %s: %s", artifact.Name, err.Error())) + continue + } + successCount++ + } + + log.Info(fmt.Sprintf("Successfully set build properties on %d Conan artifacts", successCount)) + return nil +} + +// formatBuildProperties creates the build properties string. +func (bps *BuildPropertySetter) formatBuildProperties(timestamp string) string { + props := fmt.Sprintf("build.name=%s;build.number=%s;build.timestamp=%s", + bps.buildName, bps.buildNumber, timestamp) + + if bps.projectKey != "" { + props += fmt.Sprintf(";build.project=%s", bps.projectKey) + } + + return props +} + +// setPropertiesOnArtifact sets properties on a single artifact. +func (bps *BuildPropertySetter) setPropertiesOnArtifact(manager artifactory.ArtifactoryServicesManager, artifact entities.Artifact, props string) error { + artifactPath := fmt.Sprintf("%s/%s/%s", bps.targetRepo, artifact.Path, artifact.Name) + + searchParams := services.SearchParams{ + CommonParams: &specutils.CommonParams{ + Pattern: artifactPath, + }, + } + + reader, err := manager.SearchFiles(searchParams) + if err != nil { + return fmt.Errorf("search artifact: %w", err) + } + defer closeReader(reader) + + propsParams := services.PropsParams{ + Reader: reader, + Props: props, + } + + _, err = manager.SetProps(propsParams) + return err +} + +// closeReader safely closes a content reader. +func closeReader(reader *content.ContentReader) { + if reader != nil { + if err := reader.Close(); err != nil { + log.Debug(fmt.Sprintf("Failed to close reader: %s", err)) + } + } +} diff --git a/artifactory/commands/conan/command.go b/artifactory/commands/conan/command.go new file mode 100644 index 00000000..7a1d6105 --- /dev/null +++ b/artifactory/commands/conan/command.go @@ -0,0 +1,258 @@ +package conan + +import ( + "fmt" + "io" + "os" + "os/exec" + + "github.com/jfrog/build-info-go/build" + "github.com/jfrog/build-info-go/entities" + gofrogcmd "github.com/jfrog/gofrog/io" + buildUtils "github.com/jfrog/jfrog-cli-core/v2/common/build" + "github.com/jfrog/jfrog-cli-core/v2/utils/config" + "github.com/jfrog/jfrog-client-go/utils/log" +) + +// ConanCommand represents a Conan CLI command with build info support. +type ConanCommand struct { + commandName string + args []string + serverDetails *config.ServerDetails + buildConfiguration *buildUtils.BuildConfiguration + workingDir string +} + +// NewConanCommand creates a new ConanCommand instance. +func NewConanCommand() *ConanCommand { + return &ConanCommand{} +} + +// SetCommandName sets the Conan subcommand name (install, create, upload, etc.). +func (c *ConanCommand) SetCommandName(name string) *ConanCommand { + c.commandName = name + return c +} + +// SetArgs sets the command arguments. +func (c *ConanCommand) SetArgs(args []string) *ConanCommand { + c.args = args + return c +} + +// SetServerDetails sets the Artifactory server configuration. +func (c *ConanCommand) SetServerDetails(details *config.ServerDetails) *ConanCommand { + c.serverDetails = details + return c +} + +// SetBuildConfiguration sets the build configuration for build info collection. +func (c *ConanCommand) SetBuildConfiguration(config *buildUtils.BuildConfiguration) *ConanCommand { + c.buildConfiguration = config + return c +} + +// Run executes the Conan command with build info collection. +func (c *ConanCommand) Run() error { + workingDir, err := os.Getwd() + if err != nil { + return fmt.Errorf("get working directory: %w", err) + } + c.workingDir = workingDir + + // Handle upload command with auto-login + if c.commandName == "upload" { + return c.runUpload() + } + + // Run standard Conan command + return c.runStandardCommand() +} + +// runUpload handles the upload command with auto-login and build info collection. +func (c *ConanCommand) runUpload() error { + // Extract remote name and perform auto-login + remoteName := ExtractRemoteName(c.args) + if remoteName != "" { + matchedServer, err := ValidateAndLogin(remoteName) + if err != nil { + return err + } + c.serverDetails = matchedServer + } + + log.Info(fmt.Sprintf("Running Conan %s.", c.commandName)) + + // Execute conan upload and capture output + output, err := c.executeAndCaptureOutput() + if err != nil { + fmt.Print(string(output)) + return fmt.Errorf("conan %s failed: %w", c.commandName, err) + } + fmt.Print(string(output)) + + // Process upload for build info + if c.buildConfiguration != nil { + return c.processUploadBuildInfo(string(output)) + } + + return nil +} + +// runStandardCommand runs non-upload Conan commands. +func (c *ConanCommand) runStandardCommand() error { + log.Info(fmt.Sprintf("Running Conan %s.", c.commandName)) + + if err := gofrogcmd.RunCmd(c); err != nil { + return fmt.Errorf("conan %s failed: %w", c.commandName, err) + } + + // Collect build info for dependency commands + if c.buildConfiguration != nil { + return c.collectDependencyBuildInfo() + } + + return nil +} + +// processUploadBuildInfo collects build info after a successful upload. +func (c *ConanCommand) processUploadBuildInfo(uploadOutput string) error { + buildName, err := c.buildConfiguration.GetBuildName() + if err != nil || buildName == "" { + return nil + } + + buildNumber, err := c.buildConfiguration.GetBuildNumber() + if err != nil || buildNumber == "" { + return nil + } + + log.Info(fmt.Sprintf("Processing Conan upload with build info: %s/%s", buildName, buildNumber)) + + processor := NewUploadProcessor(c.workingDir, c.buildConfiguration, c.serverDetails) + if err := processor.Process(uploadOutput); err != nil { + log.Warn("Failed to process Conan upload: " + err.Error()) + } + + log.Info(fmt.Sprintf("Conan build info collected. Use 'jf rt bp %s %s' to publish it.", buildName, buildNumber)) + return nil +} + +// collectDependencyBuildInfo collects dependencies using FlexPack. +func (c *ConanCommand) collectDependencyBuildInfo() error { + buildName, err := c.buildConfiguration.GetBuildName() + if err != nil || buildName == "" { + return nil + } + + buildNumber, err := c.buildConfiguration.GetBuildNumber() + if err != nil || buildNumber == "" { + return nil + } + + log.Info(fmt.Sprintf("Collecting build info for Conan project: %s/%s", buildName, buildNumber)) + + collector := NewDependencyCollector(c.workingDir, c.buildConfiguration) + if err := collector.Collect(); err != nil { + log.Warn("Failed to collect Conan build info: " + err.Error()) + return nil + } + + log.Info(fmt.Sprintf("Conan build info collected. Use 'jf rt bp %s %s' to publish it.", buildName, buildNumber)) + return nil +} + +// executeAndCaptureOutput runs the command and returns the combined output. +func (c *ConanCommand) executeAndCaptureOutput() ([]byte, error) { + cmd := c.GetCmd() + return cmd.CombinedOutput() +} + +// GetCmd returns the exec.Cmd for the Conan command. +func (c *ConanCommand) GetCmd() *exec.Cmd { + args := append([]string{c.commandName}, c.args...) + return exec.Command("conan", args...) +} + +// GetEnv returns environment variables for the command. +func (c *ConanCommand) GetEnv() map[string]string { + return map[string]string{} +} + +// GetStdWriter returns the stdout writer. +func (c *ConanCommand) GetStdWriter() io.WriteCloser { + return nil +} + +// GetErrWriter returns the stderr writer. +func (c *ConanCommand) GetErrWriter() io.WriteCloser { + return nil +} + +// CommandName returns the command identifier for logging. +func (c *ConanCommand) CommandName() string { + return "rt_conan" +} + +// ServerDetails returns the server configuration. +func (c *ConanCommand) ServerDetails() (*config.ServerDetails, error) { + return c.serverDetails, nil +} + +// DependencyCollector handles Conan dependency collection using FlexPack. +type DependencyCollector struct { + workingDir string + buildConfiguration *buildUtils.BuildConfiguration +} + +// NewDependencyCollector creates a new dependency collector. +func NewDependencyCollector(workingDir string, buildConfig *buildUtils.BuildConfiguration) *DependencyCollector { + return &DependencyCollector{ + workingDir: workingDir, + buildConfiguration: buildConfig, + } +} + +// Collect collects dependencies and saves build info. +func (dc *DependencyCollector) Collect() error { + buildName, err := dc.buildConfiguration.GetBuildName() + if err != nil { + return fmt.Errorf("get build name: %w", err) + } + + buildNumber, err := dc.buildConfiguration.GetBuildNumber() + if err != nil { + return fmt.Errorf("get build number: %w", err) + } + + // Use FlexPack to collect dependencies + collector, err := NewFlexPackCollector(dc.workingDir) + if err != nil { + return fmt.Errorf("create flexpack collector: %w", err) + } + + buildInfo, err := collector.CollectBuildInfo(buildName, buildNumber) + if err != nil { + return fmt.Errorf("collect build info: %w", err) + } + + // Save build info locally + return saveBuildInfoLocally(buildInfo) +} + +// saveBuildInfoLocally saves the build info for later publishing with 'jf rt bp'. +func saveBuildInfoLocally(buildInfo *entities.BuildInfo) error { + service := build.NewBuildInfoService() + + buildInstance, err := service.GetOrCreateBuildWithProject(buildInfo.Name, buildInfo.Number, "") + if err != nil { + return fmt.Errorf("create build: %w", err) + } + + if err := buildInstance.SaveBuildInfo(buildInfo); err != nil { + return fmt.Errorf("save build info: %w", err) + } + + log.Info("Build info saved locally.") + return nil +} diff --git a/artifactory/commands/conan/login.go b/artifactory/commands/conan/login.go new file mode 100644 index 00000000..cb64008a --- /dev/null +++ b/artifactory/commands/conan/login.go @@ -0,0 +1,269 @@ +// Package conan provides Conan package manager integration for JFrog Artifactory. +package conan + +import ( + "encoding/json" + "fmt" + "os/exec" + "strings" + + "github.com/jfrog/jfrog-cli-core/v2/utils/config" + "github.com/jfrog/jfrog-client-go/utils/log" +) + +const ( + maxLoginAttempts = 2 +) + +// ConanRemote represents a Conan remote configuration. +type ConanRemote struct { + Name string `json:"name"` + URL string `json:"url"` +} + +// ExtractRemoteName extracts the remote name from conan upload arguments. +// Looks for -r or --remote flag. +func ExtractRemoteName(args []string) string { + for i, arg := range args { + if arg == "-r" || arg == "--remote" { + if i+1 < len(args) { + return args[i+1] + } + } + if strings.HasPrefix(arg, "-r=") { + return strings.TrimPrefix(arg, "-r=") + } + if strings.HasPrefix(arg, "--remote=") { + return strings.TrimPrefix(arg, "--remote=") + } + } + return "" +} + +// ValidateAndLogin validates the remote config exists and performs login. +// Returns the matched server details for artifact collection. +func ValidateAndLogin(remoteName string) (*config.ServerDetails, error) { + // Get the remote URL from Conan + remoteURL, err := getRemoteURL(remoteName) + if err != nil { + return nil, fmt.Errorf("get Conan remote URL: %w", err) + } + log.Debug(fmt.Sprintf("Conan remote '%s' URL: %s", remoteName, remoteURL)) + + // Extract base Artifactory URL + baseURL := extractBaseURL(remoteURL) + log.Debug(fmt.Sprintf("Extracted base URL: %s", baseURL)) + + // Find all matching JFrog CLI server configs + matchingConfigs, err := findMatchingServers(baseURL) + if err != nil { + return nil, err + } + log.Info(fmt.Sprintf("Found %d matching JFrog CLI config(s): %s", len(matchingConfigs), formatServerIDs(matchingConfigs))) + + // Try to login with each matching config + return tryLoginWithConfigs(remoteName, matchingConfigs) +} + +// getRemoteURL retrieves the URL for a Conan remote. +func getRemoteURL(remoteName string) (string, error) { + cmd := exec.Command("conan", "remote", "list", "--format=json") + output, err := cmd.Output() + if err != nil { + return "", fmt.Errorf("conan remote list failed: %w", err) + } + + var remotes []ConanRemote + if err := json.Unmarshal(output, &remotes); err != nil { + return "", fmt.Errorf("parse conan remote list: %w", err) + } + + for _, remote := range remotes { + if remote.Name == remoteName { + return remote.URL, nil + } + } + + return "", fmt.Errorf("remote '%s' not found in Conan remotes", remoteName) +} + +// extractBaseURL extracts the base Artifactory URL from a Conan remote URL. +// Example: "https://myserver.jfrog.io/artifactory/api/conan/repo" -> "https://myserver.jfrog.io" +func extractBaseURL(remoteURL string) string { + // Find /artifactory/ and extract everything before it + idx := strings.Index(remoteURL, "/artifactory/") + if idx != -1 { + return remoteURL[:idx] + } + idx = strings.Index(remoteURL, "/artifactory") + if idx != -1 { + return remoteURL[:idx] + } + return strings.TrimSuffix(remoteURL, "/") +} + +// findMatchingServers finds all JFrog CLI server configs that match the remote URL. +func findMatchingServers(remoteBaseURL string) ([]*config.ServerDetails, error) { + allConfigs, err := config.GetAllServersConfigs() + if err != nil { + return nil, fmt.Errorf("get JFrog CLI server configs: %w", err) + } + + if len(allConfigs) == 0 { + return nil, fmt.Errorf("no JFrog CLI server configurations found. Please run 'jf c add' to configure a server") + } + + normalizedTarget := normalizeURL(remoteBaseURL) + + var matchingConfigs []*config.ServerDetails + seenServerIDs := make(map[string]bool) + + for _, cfg := range allConfigs { + if seenServerIDs[cfg.ServerId] { + continue + } + + if matchesServer(cfg, normalizedTarget) { + matchingConfigs = append(matchingConfigs, cfg) + seenServerIDs[cfg.ServerId] = true + } + } + + if len(matchingConfigs) == 0 { + return nil, buildNoMatchError(remoteBaseURL, allConfigs) + } + + return matchingConfigs, nil +} + +// matchesServer checks if a server config matches the target URL. +func matchesServer(cfg *config.ServerDetails, normalizedTarget string) bool { + // Check Artifactory URL + if cfg.ArtifactoryUrl != "" { + normalizedArt := normalizeURL(cfg.ArtifactoryUrl) + normalizedArt = strings.TrimSuffix(normalizedArt, "/artifactory") + if normalizedArt == normalizedTarget { + return true + } + } + + // Check platform URL + if cfg.Url != "" { + normalizedPlatform := normalizeURL(cfg.Url) + if normalizedPlatform == normalizedTarget { + return true + } + } + + return false +} + +// normalizeURL normalizes a URL for comparison. +func normalizeURL(u string) string { + return strings.TrimSuffix(strings.ToLower(u), "/") +} + +// buildNoMatchError creates a helpful error message when no matching config is found. +func buildNoMatchError(remoteBaseURL string, allConfigs []*config.ServerDetails) error { + var configuredServers []string + for _, cfg := range allConfigs { + url := cfg.Url + if url == "" { + url = cfg.ArtifactoryUrl + } + if url != "" { + configuredServers = append(configuredServers, fmt.Sprintf(" - %s: %s", cfg.ServerId, url)) + } + } + + return fmt.Errorf(`no matching JFrog CLI server config found for remote URL: %s + +The Conan remote points to an Artifactory instance that is not configured in JFrog CLI. +Please add the server configuration using: jf c add + +Configured servers: +%s`, remoteBaseURL, strings.Join(configuredServers, "\n")) +} + +// tryLoginWithConfigs attempts login with each matching config. +func tryLoginWithConfigs(remoteName string, configs []*config.ServerDetails) (*config.ServerDetails, error) { + var allErrors []string + + for _, serverDetails := range configs { + log.Debug(fmt.Sprintf("Trying to login with config '%s'...", serverDetails.ServerId)) + + var lastErr error + for attempt := 1; attempt <= maxLoginAttempts; attempt++ { + if attempt > 1 { + log.Debug(fmt.Sprintf("Retrying login with '%s' (attempt %d/%d)...", serverDetails.ServerId, attempt, maxLoginAttempts)) + } + + lastErr = loginToRemote(remoteName, serverDetails) + if lastErr == nil { + log.Info(fmt.Sprintf("Successfully logged into Conan remote '%s' using JFrog CLI config '%s'", remoteName, serverDetails.ServerId)) + return serverDetails, nil + } + + log.Debug(fmt.Sprintf("Login attempt %d with '%s' failed: %s", attempt, serverDetails.ServerId, lastErr.Error())) + } + + allErrors = append(allErrors, fmt.Sprintf(" - %s: %s", serverDetails.ServerId, lastErr.Error())) + } + + return nil, fmt.Errorf(`failed to login to Conan remote '%s' with all matching JFrog CLI configs. + +Tried the following configs: +%s + +Please verify your credentials are correct. You can update them using: jf c add --interactive`, remoteName, strings.Join(allErrors, "\n")) +} + +// loginToRemote logs into a Conan remote using JFrog CLI credentials. +func loginToRemote(remoteName string, serverDetails *config.ServerDetails) error { + username, password, err := extractCredentials(serverDetails) + if err != nil { + return err + } + + log.Debug(fmt.Sprintf("Logging into Conan remote '%s' using config '%s'", remoteName, serverDetails.ServerId)) + + cmd := exec.Command("conan", "remote", "login", remoteName, username, "-p", password) + output, err := cmd.CombinedOutput() + if err != nil { + outputStr := strings.TrimSpace(string(output)) + return fmt.Errorf("conan remote login failed: %s", outputStr) + } + + return nil +} + +// extractCredentials extracts username and password/token from server details. +func extractCredentials(serverDetails *config.ServerDetails) (username, password string, err error) { + // Prefer access token over password + if serverDetails.AccessToken != "" { + username = serverDetails.User + if username == "" { + username = "token" + } + password = serverDetails.AccessToken + return username, password, nil + } + + if serverDetails.Password != "" { + username = serverDetails.User + password = serverDetails.Password + return username, password, nil + } + + return "", "", fmt.Errorf("no credentials (password or access token) found in JFrog CLI config for server '%s'", serverDetails.ServerId) +} + +// formatServerIDs returns a comma-separated list of server IDs. +func formatServerIDs(configs []*config.ServerDetails) string { + var ids []string + for _, c := range configs { + ids = append(ids, c.ServerId) + } + return strings.Join(ids, ", ") +} + diff --git a/artifactory/commands/conan/upload.go b/artifactory/commands/conan/upload.go new file mode 100644 index 00000000..38a2d896 --- /dev/null +++ b/artifactory/commands/conan/upload.go @@ -0,0 +1,286 @@ +// Package conan provides Conan package manager integration for JFrog Artifactory. +package conan + +import ( + "fmt" + "strings" + + "github.com/jfrog/build-info-go/build" + "github.com/jfrog/build-info-go/entities" + "github.com/jfrog/build-info-go/flexpack" + buildUtils "github.com/jfrog/jfrog-cli-core/v2/common/build" + "github.com/jfrog/jfrog-cli-core/v2/utils/config" + "github.com/jfrog/jfrog-client-go/utils/log" +) + +// UploadProcessor processes Conan upload output and collects build info. +type UploadProcessor struct { + workingDir string + buildConfiguration *buildUtils.BuildConfiguration + serverDetails *config.ServerDetails +} + +// NewUploadProcessor creates a new upload processor. +func NewUploadProcessor(workingDir string, buildConfig *buildUtils.BuildConfiguration, serverDetails *config.ServerDetails) *UploadProcessor { + return &UploadProcessor{ + workingDir: workingDir, + buildConfiguration: buildConfig, + serverDetails: serverDetails, + } +} + +// Process processes the upload output and collects build info. +func (up *UploadProcessor) Process(uploadOutput string) error { + // Parse package reference from upload output + packageRef := up.parsePackageReference(uploadOutput) + if packageRef == "" { + log.Debug("No package reference found in upload output") + return nil + } + log.Debug(fmt.Sprintf("Processing upload for package: %s", packageRef)) + + // Collect dependencies using FlexPack + buildInfo, err := up.collectDependencies() + if err != nil { + log.Warn(fmt.Sprintf("Failed to collect dependencies: %v", err)) + buildInfo = up.createEmptyBuildInfo(packageRef) + } + + // Extract remote name and set target repo + remoteName := extractRemoteNameFromOutput(uploadOutput) + if remoteName == "" { + remoteName = "conan-local" + } + + // Collect artifacts from Artifactory + if up.serverDetails != nil { + artifacts, err := up.collectArtifacts(packageRef, remoteName) + if err != nil { + log.Warn(fmt.Sprintf("Failed to collect artifacts: %v", err)) + } else { + up.addArtifactsToModule(buildInfo, artifacts) + } + + // Set build properties on artifacts + if len(artifacts) > 0 { + if err := up.setBuildProperties(artifacts, remoteName); err != nil { + log.Warn(fmt.Sprintf("Failed to set build properties: %v", err)) + } + } + } + + return up.saveBuildInfo(buildInfo) +} + +// parsePackageReference extracts package reference from upload output. +func (up *UploadProcessor) parsePackageReference(output string) string { + lines := strings.Split(output, "\n") + inSummary := false + foundRemote := false + + for _, line := range lines { + if strings.Contains(line, "Upload summary") { + inSummary = true + continue + } + + if !inSummary { + continue + } + + trimmed := strings.TrimSpace(line) + if trimmed == "" || strings.HasPrefix(trimmed, "-") { + continue + } + + // Skip remote name line + if !foundRemote { + foundRemote = true + continue + } + + // Look for package reference pattern: name/version + if strings.Contains(trimmed, "/") && !strings.Contains(trimmed, ":") { + return trimmed + } + } + + // Fallback: look for "Uploading recipe" pattern + return up.parseUploadPattern(lines) +} + +// parseUploadPattern looks for package reference in upload lines. +func (up *UploadProcessor) parseUploadPattern(lines []string) string { + for _, line := range lines { + if strings.Contains(line, "Uploading recipe") { + // Extract package reference from: "Uploading recipe 'name/version#rev'" + start := strings.Index(line, "'") + end := strings.LastIndex(line, "'") + if start != -1 && end > start { + ref := line[start+1 : end] + // Remove revision if present + if hashIdx := strings.Index(ref, "#"); hashIdx != -1 { + ref = ref[:hashIdx] + } + return ref + } + } + } + return "" +} + +// collectDependencies collects dependencies using FlexPack. +func (up *UploadProcessor) collectDependencies() (*entities.BuildInfo, error) { + buildName, err := up.buildConfiguration.GetBuildName() + if err != nil { + return nil, fmt.Errorf("get build name: %w", err) + } + + buildNumber, err := up.buildConfiguration.GetBuildNumber() + if err != nil { + return nil, fmt.Errorf("get build number: %w", err) + } + + conanConfig := flexpack.ConanConfig{ + WorkingDirectory: up.workingDir, + } + + collector, err := flexpack.NewConanFlexPack(conanConfig) + if err != nil { + return nil, fmt.Errorf("create conan flexpack: %w", err) + } + + buildInfo, err := collector.CollectBuildInfo(buildName, buildNumber) + if err != nil { + return nil, fmt.Errorf("collect build info: %w", err) + } + + log.Info(fmt.Sprintf("Collected build info with %d modules", len(buildInfo.Modules))) + if len(buildInfo.Modules) > 0 { + log.Info(fmt.Sprintf("Module '%s' has %d dependencies", + buildInfo.Modules[0].Id, len(buildInfo.Modules[0].Dependencies))) + } + + return buildInfo, nil +} + +// createEmptyBuildInfo creates a minimal build info when dependency collection fails. +func (up *UploadProcessor) createEmptyBuildInfo(packageRef string) *entities.BuildInfo { + buildName, _ := up.buildConfiguration.GetBuildName() + buildNumber, _ := up.buildConfiguration.GetBuildNumber() + + return &entities.BuildInfo{ + Name: buildName, + Number: buildNumber, + Modules: []entities.Module{{Id: packageRef, Type: entities.Conan}}, + } +} + +// collectArtifacts collects artifacts from Artifactory. +func (up *UploadProcessor) collectArtifacts(packageRef, remoteName string) ([]entities.Artifact, error) { + collector := NewArtifactCollector(up.serverDetails, remoteName) + artifacts, err := collector.CollectArtifacts(packageRef) + if err != nil { + return nil, err + } + + log.Info(fmt.Sprintf("Found %d Conan artifacts in Artifactory", len(artifacts))) + return artifacts, nil +} + +// addArtifactsToModule adds artifacts to the first module in build info. +func (up *UploadProcessor) addArtifactsToModule(buildInfo *entities.BuildInfo, artifacts []entities.Artifact) { + if len(buildInfo.Modules) == 0 { + return + } + + buildInfo.Modules[0].Artifacts = artifacts + log.Info(fmt.Sprintf("Module '%s' now has %d dependencies and %d artifacts", + buildInfo.Modules[0].Id, + len(buildInfo.Modules[0].Dependencies), + len(buildInfo.Modules[0].Artifacts))) +} + +// setBuildProperties sets build properties on artifacts in Artifactory. +func (up *UploadProcessor) setBuildProperties(artifacts []entities.Artifact, remoteName string) error { + buildName, err := up.buildConfiguration.GetBuildName() + if err != nil { + return err + } + + buildNumber, err := up.buildConfiguration.GetBuildNumber() + if err != nil { + return err + } + + projectKey := up.buildConfiguration.GetProject() + + setter := NewBuildPropertySetter(up.serverDetails, remoteName, buildName, buildNumber, projectKey) + return setter.SetProperties(artifacts) +} + +// saveBuildInfo saves the build info for later publishing. +func (up *UploadProcessor) saveBuildInfo(buildInfo *entities.BuildInfo) error { + service := build.NewBuildInfoService() + + buildInstance, err := service.GetOrCreateBuildWithProject(buildInfo.Name, buildInfo.Number, "") + if err != nil { + return fmt.Errorf("create build: %w", err) + } + + if err := buildInstance.SaveBuildInfo(buildInfo); err != nil { + return fmt.Errorf("save build info: %w", err) + } + + log.Info("Successfully saved Conan build info") + return nil +} + +// extractRemoteNameFromOutput extracts the remote name from conan upload output. +func extractRemoteNameFromOutput(output string) string { + lines := strings.Split(output, "\n") + inSummary := false + + for _, line := range lines { + if strings.Contains(line, "Upload summary") { + inSummary = true + continue + } + + if !inSummary { + continue + } + + trimmed := strings.TrimSpace(line) + // First non-empty, non-dashed line after summary is the remote name + if trimmed != "" && !strings.HasPrefix(trimmed, "-") && !strings.Contains(trimmed, "/") { + return trimmed + } + } + return "" +} + +// FlexPackCollector wraps the FlexPack Conan collector. +type FlexPackCollector struct { + config flexpack.ConanConfig +} + +// NewFlexPackCollector creates a new FlexPack collector. +func NewFlexPackCollector(workingDir string) (*FlexPackCollector, error) { + return &FlexPackCollector{ + config: flexpack.ConanConfig{ + WorkingDirectory: workingDir, + }, + }, nil +} + +// CollectBuildInfo collects build info using FlexPack. +func (fc *FlexPackCollector) CollectBuildInfo(buildName, buildNumber string) (*entities.BuildInfo, error) { + collector, err := flexpack.NewConanFlexPack(fc.config) + if err != nil { + return nil, fmt.Errorf("create conan flexpack: %w", err) + } + + return collector.CollectBuildInfo(buildName, buildNumber) +} + From 314e872ec11845e37fb9c0629992ea307c4123d8 Mon Sep 17 00:00:00 2001 From: Reshmi Date: Fri, 12 Dec 2025 06:06:53 +0530 Subject: [PATCH 02/10] add tests: --- artifactory/commands/conan/artifacts_test.go | 267 ++++++++++++++++ artifactory/commands/conan/command_test.go | 133 ++++++++ artifactory/commands/conan/login_test.go | 302 +++++++++++++++++++ artifactory/commands/conan/upload.go | 12 +- artifactory/commands/conan/upload_test.go | 178 +++++++++++ 5 files changed, 886 insertions(+), 6 deletions(-) create mode 100644 artifactory/commands/conan/artifacts_test.go create mode 100644 artifactory/commands/conan/command_test.go create mode 100644 artifactory/commands/conan/login_test.go create mode 100644 artifactory/commands/conan/upload_test.go diff --git a/artifactory/commands/conan/artifacts_test.go b/artifactory/commands/conan/artifacts_test.go new file mode 100644 index 00000000..df0be2b6 --- /dev/null +++ b/artifactory/commands/conan/artifacts_test.go @@ -0,0 +1,267 @@ +package conan + +import ( + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestParsePackageReference(t *testing.T) { + tests := []struct { + name string + ref string + expected *ConanPackageInfo + expectError bool + }{ + { + name: "Conan 2.x format - name/version", + ref: "zlib/1.3.1", + expected: &ConanPackageInfo{ + Name: "zlib", + Version: "1.3.1", + User: "_", + Channel: "_", + }, + expectError: false, + }, + { + name: "Conan 1.x format - name/version@user/channel", + ref: "boost/1.82.0@myuser/stable", + expected: &ConanPackageInfo{ + Name: "boost", + Version: "1.82.0", + User: "myuser", + Channel: "stable", + }, + expectError: false, + }, + { + name: "Package with underscore in name", + ref: "my_package/2.0.0", + expected: &ConanPackageInfo{ + Name: "my_package", + Version: "2.0.0", + User: "_", + Channel: "_", + }, + expectError: false, + }, + { + name: "Package with complex version", + ref: "openssl/3.1.2", + expected: &ConanPackageInfo{ + Name: "openssl", + Version: "3.1.2", + User: "_", + Channel: "_", + }, + expectError: false, + }, + { + name: "With whitespace - should be trimmed", + ref: " fmt/10.2.1 ", + expected: &ConanPackageInfo{ + Name: "fmt", + Version: "10.2.1", + User: "_", + Channel: "_", + }, + expectError: false, + }, + { + name: "Invalid format - no slash", + ref: "invalid-package", + expectError: true, + }, + { + name: "Invalid format - empty string", + ref: "", + expectError: true, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + result, err := ParsePackageReference(tt.ref) + + if tt.expectError { + assert.Error(t, err) + assert.Nil(t, result) + } else { + assert.NoError(t, err) + assert.NotNil(t, result) + assert.Equal(t, tt.expected.Name, result.Name) + assert.Equal(t, tt.expected.Version, result.Version) + assert.Equal(t, tt.expected.User, result.User) + assert.Equal(t, tt.expected.Channel, result.Channel) + } + }) + } +} + +func TestBuildArtifactQuery(t *testing.T) { + tests := []struct { + name string + repo string + pkgInfo *ConanPackageInfo + expected string + }{ + { + name: "Conan 2.x path format", + repo: "conan-local", + pkgInfo: &ConanPackageInfo{ + Name: "zlib", + Version: "1.3.1", + User: "_", + Channel: "_", + }, + expected: `{"repo": "conan-local", "path": {"$match": "_/zlib/1.3.1/_/*"}}`, + }, + { + name: "Conan 1.x path format", + repo: "conan-local", + pkgInfo: &ConanPackageInfo{ + Name: "boost", + Version: "1.82.0", + User: "myuser", + Channel: "stable", + }, + expected: `{"repo": "conan-local", "path": {"$match": "myuser/boost/1.82.0/stable/*"}}`, + }, + { + name: "Different repository name", + repo: "my-conan-repo", + pkgInfo: &ConanPackageInfo{ + Name: "fmt", + Version: "10.2.1", + User: "_", + Channel: "_", + }, + expected: `{"repo": "my-conan-repo", "path": {"$match": "_/fmt/10.2.1/_/*"}}`, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + result := buildArtifactQuery(tt.repo, tt.pkgInfo) + assert.Equal(t, tt.expected, result) + }) + } +} + +func TestClassifyArtifactType(t *testing.T) { + tests := []struct { + name string + filename string + expected string + }{ + { + name: "Conan recipe file", + filename: "conanfile.py", + expected: "conan-recipe", + }, + { + name: "Conan manifest file", + filename: "conanmanifest.txt", + expected: "conan-manifest", + }, + { + name: "Conan info file", + filename: "conaninfo.txt", + expected: "conan-info", + }, + { + name: "Conan sources archive", + filename: "conan_sources.tgz", + expected: "conan-package", + }, + { + name: "Conan package archive", + filename: "conan_package.tgz", + expected: "conan-package", + }, + { + name: "Unknown file type", + filename: "readme.md", + expected: "conan-artifact", + }, + { + name: "Header file", + filename: "mylib.h", + expected: "conan-artifact", + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + result := classifyArtifactType(tt.filename) + assert.Equal(t, tt.expected, result) + }) + } +} + +func TestBuildPropertySetter_FormatBuildProperties(t *testing.T) { + tests := []struct { + name string + buildName string + buildNumber string + projectKey string + timestamp string + expected string + }{ + { + name: "Without project key", + buildName: "my-build", + buildNumber: "123", + projectKey: "", + timestamp: "1234567890", + expected: "build.name=my-build;build.number=123;build.timestamp=1234567890", + }, + { + name: "With project key", + buildName: "my-build", + buildNumber: "456", + projectKey: "myproject", + timestamp: "9876543210", + expected: "build.name=my-build;build.number=456;build.timestamp=9876543210;build.project=myproject", + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + setter := &BuildPropertySetter{ + buildName: tt.buildName, + buildNumber: tt.buildNumber, + projectKey: tt.projectKey, + } + result := setter.formatBuildProperties(tt.timestamp) + assert.Equal(t, tt.expected, result) + }) + } +} + +func TestNewArtifactCollector(t *testing.T) { + targetRepo := "conan-local" + + collector := NewArtifactCollector(nil, targetRepo) + + assert.NotNil(t, collector) + assert.Equal(t, targetRepo, collector.targetRepo) + assert.Nil(t, collector.serverDetails) +} + +func TestNewBuildPropertySetter(t *testing.T) { + buildName := "test-build" + buildNumber := "1" + projectKey := "test-project" + targetRepo := "conan-local" + + setter := NewBuildPropertySetter(nil, targetRepo, buildName, buildNumber, projectKey) + + assert.NotNil(t, setter) + assert.Equal(t, buildName, setter.buildName) + assert.Equal(t, buildNumber, setter.buildNumber) + assert.Equal(t, projectKey, setter.projectKey) + assert.Equal(t, targetRepo, setter.targetRepo) +} + diff --git a/artifactory/commands/conan/command_test.go b/artifactory/commands/conan/command_test.go new file mode 100644 index 00000000..0aeca22a --- /dev/null +++ b/artifactory/commands/conan/command_test.go @@ -0,0 +1,133 @@ +package conan + +import ( + "testing" + + "github.com/jfrog/jfrog-cli-core/v2/utils/config" + "github.com/stretchr/testify/assert" +) + +func TestNewConanCommand(t *testing.T) { + cmd := NewConanCommand() + + assert.NotNil(t, cmd) + assert.Empty(t, cmd.commandName) + assert.Nil(t, cmd.args) + assert.Nil(t, cmd.serverDetails) + assert.Nil(t, cmd.buildConfiguration) +} + +func TestConanCommand_SetCommandName(t *testing.T) { + cmd := NewConanCommand() + + result := cmd.SetCommandName("install") + + assert.Equal(t, "install", cmd.commandName) + assert.Same(t, cmd, result, "SetCommandName should return same instance for chaining") +} + +func TestConanCommand_SetArgs(t *testing.T) { + cmd := NewConanCommand() + args := []string{".", "--build=missing"} + + result := cmd.SetArgs(args) + + assert.Equal(t, args, cmd.args) + assert.Same(t, cmd, result, "SetArgs should return same instance for chaining") +} + +func TestConanCommand_SetServerDetails(t *testing.T) { + cmd := NewConanCommand() + serverDetails := &config.ServerDetails{ + ServerId: "test-server", + } + + result := cmd.SetServerDetails(serverDetails) + + assert.Equal(t, serverDetails, cmd.serverDetails) + assert.Same(t, cmd, result, "SetServerDetails should return same instance for chaining") +} + +func TestConanCommand_CommandName(t *testing.T) { + cmd := NewConanCommand() + + result := cmd.CommandName() + + assert.Equal(t, "rt_conan", result) +} + +func TestConanCommand_ServerDetails(t *testing.T) { + cmd := NewConanCommand() + serverDetails := &config.ServerDetails{ + ServerId: "test-server", + } + cmd.serverDetails = serverDetails + + result, err := cmd.ServerDetails() + + assert.NoError(t, err) + assert.Equal(t, serverDetails, result) +} + +func TestConanCommand_GetCmd(t *testing.T) { + cmd := NewConanCommand() + cmd.commandName = "install" + cmd.args = []string{".", "--build=missing"} + + execCmd := cmd.GetCmd() + + assert.NotNil(t, execCmd) + assert.Equal(t, "conan", execCmd.Path[len(execCmd.Path)-5:]) // ends with "conan" + assert.Contains(t, execCmd.Args, "install") + assert.Contains(t, execCmd.Args, ".") + assert.Contains(t, execCmd.Args, "--build=missing") +} + +func TestConanCommand_GetEnv(t *testing.T) { + cmd := NewConanCommand() + + env := cmd.GetEnv() + + assert.NotNil(t, env) + assert.Empty(t, env) +} + +func TestConanCommand_GetStdWriter(t *testing.T) { + cmd := NewConanCommand() + + writer := cmd.GetStdWriter() + + assert.Nil(t, writer) +} + +func TestConanCommand_GetErrWriter(t *testing.T) { + cmd := NewConanCommand() + + writer := cmd.GetErrWriter() + + assert.Nil(t, writer) +} + +func TestConanCommand_ChainedSetters(t *testing.T) { + serverDetails := &config.ServerDetails{ServerId: "test"} + + cmd := NewConanCommand(). + SetCommandName("upload"). + SetArgs([]string{"pkg/1.0", "-r", "remote"}). + SetServerDetails(serverDetails) + + assert.Equal(t, "upload", cmd.commandName) + assert.Equal(t, []string{"pkg/1.0", "-r", "remote"}, cmd.args) + assert.Equal(t, serverDetails, cmd.serverDetails) +} + +func TestNewDependencyCollector(t *testing.T) { + workingDir := "/test/path" + + collector := NewDependencyCollector(workingDir, nil) + + assert.NotNil(t, collector) + assert.Equal(t, workingDir, collector.workingDir) + assert.Nil(t, collector.buildConfiguration) +} + diff --git a/artifactory/commands/conan/login_test.go b/artifactory/commands/conan/login_test.go new file mode 100644 index 00000000..f6460a33 --- /dev/null +++ b/artifactory/commands/conan/login_test.go @@ -0,0 +1,302 @@ +package conan + +import ( + "testing" + + "github.com/jfrog/jfrog-cli-core/v2/utils/config" + "github.com/stretchr/testify/assert" +) + +func TestExtractRemoteName(t *testing.T) { + tests := []struct { + name string + args []string + expected string + }{ + { + name: "Extract with -r flag", + args: []string{"package/1.0", "-r", "my-remote", "--confirm"}, + expected: "my-remote", + }, + { + name: "Extract with --remote flag", + args: []string{"package/1.0", "--remote", "another-remote"}, + expected: "another-remote", + }, + { + name: "Extract with -r= format", + args: []string{"package/1.0", "-r=inline-remote"}, + expected: "inline-remote", + }, + { + name: "Extract with --remote= format", + args: []string{"package/1.0", "--remote=inline-remote2"}, + expected: "inline-remote2", + }, + { + name: "No remote specified", + args: []string{"package/1.0", "--confirm"}, + expected: "", + }, + { + name: "Empty args", + args: []string{}, + expected: "", + }, + { + name: "-r flag at end without value", + args: []string{"package/1.0", "-r"}, + expected: "", + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + result := ExtractRemoteName(tt.args) + assert.Equal(t, tt.expected, result) + }) + } +} + +func TestExtractBaseURL(t *testing.T) { + tests := []struct { + name string + remoteURL string + expected string + }{ + { + name: "Standard Artifactory URL with api/conan path", + remoteURL: "https://myserver.jfrog.io/artifactory/api/conan/conan-local", + expected: "https://myserver.jfrog.io", + }, + { + name: "Artifactory URL without trailing path", + remoteURL: "https://myserver.jfrog.io/artifactory/", + expected: "https://myserver.jfrog.io", + }, + { + name: "Artifactory URL without trailing slash", + remoteURL: "https://myserver.jfrog.io/artifactory", + expected: "https://myserver.jfrog.io", + }, + { + name: "Platform URL only", + remoteURL: "https://myserver.jfrog.io/", + expected: "https://myserver.jfrog.io", + }, + { + name: "Platform URL without slash", + remoteURL: "https://myserver.jfrog.io", + expected: "https://myserver.jfrog.io", + }, + { + name: "Self-hosted Artifactory", + remoteURL: "https://artifactory.company.com/artifactory/api/conan/conan-repo", + expected: "https://artifactory.company.com", + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + result := extractBaseURL(tt.remoteURL) + assert.Equal(t, tt.expected, result) + }) + } +} + +func TestNormalizeURL(t *testing.T) { + tests := []struct { + name string + input string + expected string + }{ + { + name: "URL with trailing slash", + input: "https://example.com/", + expected: "https://example.com", + }, + { + name: "URL without trailing slash", + input: "https://example.com", + expected: "https://example.com", + }, + { + name: "URL with uppercase", + input: "HTTPS://EXAMPLE.COM/", + expected: "https://example.com", + }, + { + name: "Mixed case URL", + input: "https://MyServer.JFrog.IO/", + expected: "https://myserver.jfrog.io", + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + result := normalizeURL(tt.input) + assert.Equal(t, tt.expected, result) + }) + } +} + +func TestMatchesServer(t *testing.T) { + tests := []struct { + name string + serverDetails *config.ServerDetails + normalizedTarget string + expected bool + }{ + { + name: "Match by Artifactory URL", + serverDetails: &config.ServerDetails{ + ArtifactoryUrl: "https://myserver.jfrog.io/artifactory/", + }, + normalizedTarget: "https://myserver.jfrog.io", + expected: true, + }, + { + name: "Match by Platform URL", + serverDetails: &config.ServerDetails{ + Url: "https://myserver.jfrog.io/", + }, + normalizedTarget: "https://myserver.jfrog.io", + expected: true, + }, + { + name: "No match - different server", + serverDetails: &config.ServerDetails{ + ArtifactoryUrl: "https://other-server.jfrog.io/artifactory/", + }, + normalizedTarget: "https://myserver.jfrog.io", + expected: false, + }, + { + name: "Match with both URLs set - Artifactory matches", + serverDetails: &config.ServerDetails{ + Url: "https://other.jfrog.io/", + ArtifactoryUrl: "https://myserver.jfrog.io/artifactory/", + }, + normalizedTarget: "https://myserver.jfrog.io", + expected: true, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + result := matchesServer(tt.serverDetails, tt.normalizedTarget) + assert.Equal(t, tt.expected, result) + }) + } +} + +func TestExtractCredentials(t *testing.T) { + tests := []struct { + name string + serverDetails *config.ServerDetails + expectedUsername string + expectedPassword string + expectError bool + }{ + { + name: "Extract with access token", + serverDetails: &config.ServerDetails{ + User: "myuser", + AccessToken: "my-access-token", + }, + expectedUsername: "myuser", + expectedPassword: "my-access-token", + expectError: false, + }, + { + name: "Extract with access token but no user", + serverDetails: &config.ServerDetails{ + AccessToken: "my-access-token", + }, + expectedUsername: "token", + expectedPassword: "my-access-token", + expectError: false, + }, + { + name: "Extract with password", + serverDetails: &config.ServerDetails{ + User: "myuser", + Password: "mypassword", + }, + expectedUsername: "myuser", + expectedPassword: "mypassword", + expectError: false, + }, + { + name: "Prefer access token over password", + serverDetails: &config.ServerDetails{ + User: "myuser", + Password: "mypassword", + AccessToken: "my-access-token", + }, + expectedUsername: "myuser", + expectedPassword: "my-access-token", + expectError: false, + }, + { + name: "No credentials", + serverDetails: &config.ServerDetails{ + ServerId: "test-server", + }, + expectError: true, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + username, password, err := extractCredentials(tt.serverDetails) + + if tt.expectError { + assert.Error(t, err) + assert.Contains(t, err.Error(), "no credentials") + } else { + assert.NoError(t, err) + assert.Equal(t, tt.expectedUsername, username) + assert.Equal(t, tt.expectedPassword, password) + } + }) + } +} + +func TestFormatServerIDs(t *testing.T) { + tests := []struct { + name string + configs []*config.ServerDetails + expected string + }{ + { + name: "Single server", + configs: []*config.ServerDetails{ + {ServerId: "server1"}, + }, + expected: "server1", + }, + { + name: "Multiple servers", + configs: []*config.ServerDetails{ + {ServerId: "server1"}, + {ServerId: "server2"}, + {ServerId: "server3"}, + }, + expected: "server1, server2, server3", + }, + { + name: "Empty list", + configs: []*config.ServerDetails{}, + expected: "", + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + result := formatServerIDs(tt.configs) + assert.Equal(t, tt.expected, result) + }) + } +} + diff --git a/artifactory/commands/conan/upload.go b/artifactory/commands/conan/upload.go index 38a2d896..4a0983ef 100644 --- a/artifactory/commands/conan/upload.go +++ b/artifactory/commands/conan/upload.go @@ -7,7 +7,7 @@ import ( "github.com/jfrog/build-info-go/build" "github.com/jfrog/build-info-go/entities" - "github.com/jfrog/build-info-go/flexpack" + conanflex "github.com/jfrog/build-info-go/flexpack/conan" buildUtils "github.com/jfrog/jfrog-cli-core/v2/common/build" "github.com/jfrog/jfrog-cli-core/v2/utils/config" "github.com/jfrog/jfrog-client-go/utils/log" @@ -141,11 +141,11 @@ func (up *UploadProcessor) collectDependencies() (*entities.BuildInfo, error) { return nil, fmt.Errorf("get build number: %w", err) } - conanConfig := flexpack.ConanConfig{ + conanConfig := conanflex.ConanConfig{ WorkingDirectory: up.workingDir, } - collector, err := flexpack.NewConanFlexPack(conanConfig) + collector, err := conanflex.NewConanFlexPack(conanConfig) if err != nil { return nil, fmt.Errorf("create conan flexpack: %w", err) } @@ -262,13 +262,13 @@ func extractRemoteNameFromOutput(output string) string { // FlexPackCollector wraps the FlexPack Conan collector. type FlexPackCollector struct { - config flexpack.ConanConfig + config conanflex.ConanConfig } // NewFlexPackCollector creates a new FlexPack collector. func NewFlexPackCollector(workingDir string) (*FlexPackCollector, error) { return &FlexPackCollector{ - config: flexpack.ConanConfig{ + config: conanflex.ConanConfig{ WorkingDirectory: workingDir, }, }, nil @@ -276,7 +276,7 @@ func NewFlexPackCollector(workingDir string) (*FlexPackCollector, error) { // CollectBuildInfo collects build info using FlexPack. func (fc *FlexPackCollector) CollectBuildInfo(buildName, buildNumber string) (*entities.BuildInfo, error) { - collector, err := flexpack.NewConanFlexPack(fc.config) + collector, err := conanflex.NewConanFlexPack(fc.config) if err != nil { return nil, fmt.Errorf("create conan flexpack: %w", err) } diff --git a/artifactory/commands/conan/upload_test.go b/artifactory/commands/conan/upload_test.go new file mode 100644 index 00000000..dc0ea309 --- /dev/null +++ b/artifactory/commands/conan/upload_test.go @@ -0,0 +1,178 @@ +package conan + +import ( + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestExtractRemoteNameFromOutput(t *testing.T) { + tests := []struct { + name string + output string + expected string + }{ + { + name: "Standard upload summary", + output: ` +======== Uploading to remote conan-local ======== + +-------- Checking server for existing packages -------- +simplelib/1.0.0: Checking which revisions exist in the remote server + +-------- Upload summary -------- +conan-local + simplelib/1.0.0 + revisions + 86deb56ab95f8fe27d07debf8a6ee3f9 (Uploaded) +`, + expected: "conan-local", + }, + { + name: "Different remote name", + output: ` +-------- Upload summary -------- +my-remote-repo + mypackage/2.0.0 + revisions + abc123 (Uploaded) +`, + expected: "my-remote-repo", + }, + { + name: "No upload summary", + output: ` +Some other conan output +without upload summary +`, + expected: "", + }, + { + name: "Empty output", + output: "", + expected: "", + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + result := extractRemoteNameFromOutput(tt.output) + assert.Equal(t, tt.expected, result) + }) + } +} + +func TestUploadProcessor_ParsePackageReference(t *testing.T) { + tests := []struct { + name string + output string + expected string + }{ + { + name: "Standard upload summary with package reference", + output: ` +-------- Upload summary -------- +conan-local + simplelib/1.0.0 + revisions + 86deb56ab95f8fe27d07debf8a6ee3f9 (Uploaded) +`, + expected: "simplelib/1.0.0", + }, + { + name: "Upload summary with Conan 1.x format", + output: ` +-------- Upload summary -------- +conan-local + boost/1.82.0@myuser/stable + revisions + abc123 (Uploaded) +`, + expected: "boost/1.82.0@myuser/stable", + }, + { + name: "Fallback to Uploading recipe pattern", + output: ` +simplelib/1.0.0: Uploading recipe 'simplelib/1.0.0#86deb56ab95f8fe27d07debf8a6ee3f9' (1.6KB) +Upload completed in 3s +`, + expected: "simplelib/1.0.0", + }, + { + name: "No package reference found", + output: "Some random output", + expected: "", + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + processor := &UploadProcessor{} + result := processor.parsePackageReference(tt.output) + assert.Equal(t, tt.expected, result) + }) + } +} + +func TestUploadProcessor_ParseUploadPattern(t *testing.T) { + tests := []struct { + name string + lines []string + expected string + }{ + { + name: "Standard uploading recipe line", + lines: []string{ + "simplelib/1.0.0: Uploading recipe 'simplelib/1.0.0#86deb56ab95f8fe27d07debf8a6ee3f9' (1.6KB)", + }, + expected: "simplelib/1.0.0", + }, + { + name: "Multiple lines with uploading recipe", + lines: []string{ + "Some other line", + "mypackage/2.0.0: Uploading recipe 'mypackage/2.0.0#abc123' (2KB)", + "Another line", + }, + expected: "mypackage/2.0.0", + }, + { + name: "No uploading recipe line", + lines: []string{ + "Some output", + "No recipe here", + }, + expected: "", + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + processor := &UploadProcessor{} + result := processor.parseUploadPattern(tt.lines) + assert.Equal(t, tt.expected, result) + }) + } +} + +func TestNewUploadProcessor(t *testing.T) { + workingDir := "/test/path" + + processor := NewUploadProcessor(workingDir, nil, nil) + + assert.NotNil(t, processor) + assert.Equal(t, workingDir, processor.workingDir) + assert.Nil(t, processor.buildConfiguration) + assert.Nil(t, processor.serverDetails) +} + +func TestNewFlexPackCollector(t *testing.T) { + workingDir := "/test/path" + + collector, err := NewFlexPackCollector(workingDir) + + assert.NoError(t, err) + assert.NotNil(t, collector) + assert.Equal(t, workingDir, collector.config.WorkingDirectory) +} + From 2fe81498f392326f4f0d8ef122a8a0496233d1a5 Mon Sep 17 00:00:00 2001 From: Reshmi Date: Fri, 12 Dec 2025 10:40:40 +0530 Subject: [PATCH 03/10] update dependencies --- go.mod | 35 ++++++++++++--- go.sum | 136 +++++++++++++++++++++++++++++++++++++++++++++------------ 2 files changed, 136 insertions(+), 35 deletions(-) diff --git a/go.mod b/go.mod index 83a998db..1d12c8cd 100644 --- a/go.mod +++ b/go.mod @@ -21,7 +21,7 @@ require ( oras.land/oras-go/v2 v2.6.0 ) -require golang.org/x/net v0.45.0 // indirect +require golang.org/x/net v0.47.0 // indirect require ( dario.cat/mergo v1.0.2 // indirect @@ -33,7 +33,7 @@ require ( github.com/VividCortex/ewma v1.2.0 // indirect github.com/acarl005/stripansi v0.0.0-20180116102854-5a71ef0e047d // indirect github.com/andybalholm/brotli v1.2.0 // indirect - github.com/beevik/etree v1.6.0 // indirect + github.com/apache/camel-k/v2 v2.8.0 // indirect github.com/buger/jsonparser v1.1.1 // indirect github.com/chzyer/readline v1.5.1 // indirect github.com/clipperhouse/stringish v0.1.1 // indirect @@ -53,11 +53,15 @@ require ( github.com/dsnet/compress v0.0.2-0.20210315054119-f66993602bf5 // indirect github.com/emirpasic/gods v1.18.1 // indirect github.com/fsnotify/fsnotify v1.9.0 // indirect + github.com/fxamacker/cbor/v2 v2.9.0 // indirect github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376 // indirect github.com/go-git/go-billy/v5 v5.6.2 // indirect github.com/go-git/go-git/v5 v5.16.3 // indirect + github.com/go-logr/logr v1.4.3 // indirect + github.com/go-logr/zapr v1.3.0 // indirect github.com/go-viper/mapstructure/v2 v2.4.0 // indirect github.com/gocarina/gocsv v0.0.0-20240520201108-78e41c74b4b1 // indirect + github.com/gogo/protobuf v1.3.2 // indirect github.com/golang-jwt/jwt/v4 v4.5.2 // indirect github.com/golang/groupcache v0.0.0-20241129210726-2c02b8208cf8 // indirect github.com/golang/snappy v1.0.0 // indirect @@ -65,6 +69,7 @@ require ( github.com/gookit/color v1.6.0 // indirect github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 // indirect github.com/jfrog/archiver/v3 v3.6.1 // indirect + github.com/json-iterator/go v1.1.12 // indirect github.com/kevinburke/ssh_config v1.2.0 // indirect github.com/klauspost/compress v1.18.1 // indirect github.com/klauspost/cpuid/v2 v2.3.0 // indirect @@ -76,8 +81,10 @@ require ( github.com/mattn/go-tty v0.0.7 // indirect github.com/minio/sha256-simd v1.0.1 // indirect github.com/mitchellh/go-homedir v1.1.0 // indirect + github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect + github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee // indirect github.com/nwaples/rardecode v1.1.3 // indirect - github.com/onsi/gomega v1.38.2 // indirect + github.com/onsi/ginkgo/v2 v2.25.1 // indirect github.com/opencontainers/go-digest v1.0.0 // indirect github.com/opencontainers/image-spec v1.1.1 // indirect github.com/pelletier/go-toml/v2 v2.2.4 // indirect @@ -95,28 +102,42 @@ require ( github.com/spf13/afero v1.15.0 // indirect github.com/spf13/cast v1.10.0 // indirect github.com/spf13/pflag v1.0.10 // indirect + github.com/stoewer/go-strcase v1.3.1 // indirect github.com/stretchr/objx v0.5.2 // indirect github.com/subosito/gotenv v1.6.0 // indirect github.com/ulikunitz/xz v0.5.15 // indirect github.com/urfave/cli v1.22.17 // indirect github.com/vbatts/tar-split v0.12.2 // indirect github.com/vbauerster/mpb/v8 v8.10.2 // indirect + github.com/x448/float16 v0.8.4 // indirect github.com/xanzy/ssh-agent v0.3.3 // indirect github.com/xi2/xz v0.0.0-20171230120015-48954b6210f8 // indirect github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e // indirect + go.uber.org/multierr v1.11.0 // indirect + go.uber.org/zap v1.27.0 // indirect go.yaml.in/yaml/v2 v2.4.2 // indirect go.yaml.in/yaml/v3 v3.0.4 // indirect - golang.org/x/crypto v0.43.0 // indirect + golang.org/x/crypto v0.45.0 // indirect golang.org/x/sync v0.18.0 // indirect golang.org/x/sys v0.38.0 // indirect golang.org/x/term v0.37.0 // indirect golang.org/x/text v0.31.0 // indirect google.golang.org/genproto/googleapis/rpc v0.0.0-20250303144028-a0af3efb3deb // indirect google.golang.org/grpc v1.72.1 // indirect - google.golang.org/protobuf v1.36.7 // indirect + google.golang.org/protobuf v1.36.8 // indirect + gopkg.in/inf.v0 v0.9.1 // indirect gopkg.in/warnings.v0 v0.1.2 // indirect + gopkg.in/yaml.v2 v2.4.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect + k8s.io/api v0.34.0 // indirect + k8s.io/apimachinery v0.34.0 // indirect k8s.io/client-go v0.34.0 // indirect + k8s.io/klog/v2 v2.130.1 // indirect + k8s.io/utils v0.0.0-20250604170112-4c0f3b243397 // indirect + sigs.k8s.io/controller-runtime v0.21.0 // indirect + sigs.k8s.io/json v0.0.0-20241014173422-cfa47c3a1cc8 // indirect + sigs.k8s.io/randfill v1.0.0 // indirect + sigs.k8s.io/structured-merge-diff/v6 v6.3.0 // indirect sigs.k8s.io/yaml v1.6.0 // indirect ) @@ -124,6 +145,6 @@ require ( //replace github.com/jfrog/jfrog-client-go => github.com/fluxxBot/jfrog-client-go v1.50.1-0.20251206093435-1427f3711c0b -replace github.com/jfrog/build-info-go => github.com/naveenku-jfrog/build-info-go v1.12.1-0.20251204140510-1d49e7aa4a2b +replace github.com/jfrog/build-info-go => github.com/reshmifrog/build-info-go v1.9.10-0.20251212003940-e0fb71e835f5 -replace github.com/jfrog/jfrog-cli-core/v2 => github.com/jfrog/jfrog-cli-core/v2 v2.60.1-0.20251026182600-8a8c0428f538 +// replace github.com/jfrog/jfrog-cli-core/v2 => github.com/jfrog/jfrog-cli-core/v2 v2.60.1-0.20251026182600-8a8c0428f538 diff --git a/go.sum b/go.sum index 56ac8a0e..034a81f3 100644 --- a/go.sum +++ b/go.sum @@ -21,10 +21,10 @@ github.com/andybalholm/brotli v1.2.0 h1:ukwgCxwYrmACq68yiUqwIWnGY0cTPox/M94sVwTo github.com/andybalholm/brotli v1.2.0/go.mod h1:rzTDkvFWvIrjDXZHkuS16NPggd91W3kUSvPlQ1pLaKY= github.com/anmitsu/go-shlex v0.0.0-20200514113438-38f4b401e2be h1:9AeTilPcZAjCFIImctFaOjnTIavg87rW78vTPkQqLI8= github.com/anmitsu/go-shlex v0.0.0-20200514113438-38f4b401e2be/go.mod h1:ySMOLuWl6zY27l47sB3qLNK6tF2fkHG55UZxx8oIVo4= +github.com/apache/camel-k/v2 v2.8.0 h1:zhbAzRFHjZ1n6IcaQDMbt3IidNWYheF34Xse33KrqGY= +github.com/apache/camel-k/v2 v2.8.0/go.mod h1:Dp+0oWh2okNB5cdhpnFjwd/40HwlOLpzzBLX7AT8Slk= github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5 h1:0CwZNZbxp69SHPdPJAN/hZIm0C4OItdklCFmMRWYpio= github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs= -github.com/beevik/etree v1.6.0 h1:u8Kwy8pp9D9XeITj2Z0XtA5qqZEmtJtuXZRQi+j03eE= -github.com/beevik/etree v1.6.0/go.mod h1:bh4zJxiIr62SOf9pRzN7UUYaEDa9HEKafK25+sLc0Gc= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= github.com/bradleyjkemp/cupaloy/v2 v2.8.0 h1:any4BmKE+jGIaMpnU8YgH/I2LPiLBufr6oMMlVBbn9M= @@ -107,6 +107,8 @@ github.com/frankban/quicktest v1.14.6 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHk github.com/frankban/quicktest v1.14.6/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0= github.com/fsnotify/fsnotify v1.9.0 h1:2Ml+OJNzbYCTzsxtv8vKSFD9PbJjmhYF14k/jKC7S9k= github.com/fsnotify/fsnotify v1.9.0/go.mod h1:8jBTzvmWwFyi3Pb8djgCCO5IBqzKJ/Jwo8TRcHyHii0= +github.com/fxamacker/cbor/v2 v2.9.0 h1:NpKPmjDBgUfBms6tr6JZkTHtfFGcMKsw3eGcmD/sapM= +github.com/fxamacker/cbor/v2 v2.9.0/go.mod h1:vM4b+DJCtHn+zz7h3FFp/hDAI9WNWCsZj23V5ytsSxQ= github.com/gliderlabs/ssh v0.3.8 h1:a4YXD1V7xMF9g5nTkdfnja3Sxy1PVDCj1Zg4Wb8vY6c= github.com/gliderlabs/ssh v0.3.8/go.mod h1:xYoytBv1sV0aL3CavoDuJIQNURXkkfPA/wxQ1pL1fAU= github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376 h1:+zs/tPmkDkHx3U66DAb0lQFJrpS6731Oaa12ikc+DiI= @@ -121,10 +123,16 @@ github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI= github.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= +github.com/go-logr/zapr v1.3.0 h1:XGdV8XW8zdwFiwOA2Dryh1gj2KRQyOOoNmBy4EplIcQ= +github.com/go-logr/zapr v1.3.0/go.mod h1:YKepepNBd1u/oyhd/yQmtjVXmm9uML4IXUgMOwR8/Gg= +github.com/go-task/slim-sprig/v3 v3.0.0 h1:sUs3vkvUymDpBKi3qH1YSqBQk9+9D/8M2mN1vB6EwHI= +github.com/go-task/slim-sprig/v3 v3.0.0/go.mod h1:W848ghGpv3Qj3dhTPRyJypKRiqCdHZiAzKg9hl15HA8= github.com/go-viper/mapstructure/v2 v2.4.0 h1:EBsztssimR/CONLSZZ04E8qAkxNYq4Qp9LvH92wZUgs= github.com/go-viper/mapstructure/v2 v2.4.0/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= github.com/gocarina/gocsv v0.0.0-20240520201108-78e41c74b4b1 h1:FWNFq4fM1wPfcK40yHE5UO3RUdSNPaBC+j3PokzA6OQ= github.com/gocarina/gocsv v0.0.0-20240520201108-78e41c74b4b1/go.mod h1:5YoVOkjYAQumqlV356Hj3xeYh4BdZuLE0/nRkf2NKkI= +github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= +github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= github.com/golang-jwt/jwt/v4 v4.5.2 h1:YtQM7lnr8iZ+j5q71MGKkNw9Mn7AjHM68uc9g5fXeUI= github.com/golang-jwt/jwt/v4 v4.5.2/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= github.com/golang/groupcache v0.0.0-20241129210726-2c02b8208cf8 h1:f+oWsMOmNPc8JmEHVZIycC7hBoQxHH9pNKQORJNozsQ= @@ -138,6 +146,9 @@ github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= github.com/google/go-containerregistry v0.20.7 h1:24VGNpS0IwrOZ2ms2P1QE3Xa5X9p4phx0aUgzYzHW6I= github.com/google/go-containerregistry v0.20.7/go.mod h1:Lx5LCZQjLH1QBaMPeGwsME9biPeo1lPx6lbGj/UmzgM= +github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/pprof v0.0.0-20250403155104-27863c87afa6 h1:BHT72Gu3keYf3ZEu2J0b1vyeLSOYI8bm5wbJM/8yDe8= +github.com/google/pprof v0.0.0-20250403155104-27863c87afa6/go.mod h1:boTsfXsheKC2y+lKOCMpSfarhxDeIzfZG1jqGcPl3cA= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/gookit/assert v0.1.1 h1:lh3GcawXe/p+cU7ESTZ5Ui3Sm/x8JWpIis4/1aF0mY0= @@ -150,6 +161,7 @@ github.com/gorilla/mux v1.8.1 h1:TuBL49tXwgrFYWhqrNgrUNEY92u81SPhu7sTdzQEiWY= github.com/gorilla/mux v1.8.1/go.mod h1:AKf9I4AEqPTmMytcMc0KkNouC66V3BtZ4qD5fmWSiMQ= github.com/grpc-ecosystem/grpc-gateway/v2 v2.26.3 h1:5ZPtiqj0JL5oKWmcsq4VMaAW5ukBEgSGXEN89zeH1Jo= github.com/grpc-ecosystem/grpc-gateway/v2 v2.26.3/go.mod h1:ndYquD05frm2vACXE1nsccT4oJzjhw2arTS2cpUD1PI= +github.com/hashicorp/golang-lru v1.0.2 h1:dV3g9Z/unq5DpblPpw+Oqcv4dU/1omnb4Ok8iPY6p1c= github.com/hashicorp/golang-lru/arc/v2 v2.0.5 h1:l2zaLDubNhW4XO3LnliVj0GXO3+/CGNJAg1dcN2Fpfw= github.com/hashicorp/golang-lru/arc/v2 v2.0.5/go.mod h1:ny6zBSQZi2JxIeYcv7kt2sH2PXJtirBN7RDhRpxPkxU= github.com/hashicorp/golang-lru/v2 v2.0.5 h1:wW7h1TG88eUIJ2i69gaE3uNVtEPIagzhGvHgwfx2Vm4= @@ -164,12 +176,16 @@ github.com/jfrog/archiver/v3 v3.6.1 h1:LOxnkw9pOn45DzCbZNFV6K0+6dCsQ0L8mR3ZcujO5 github.com/jfrog/archiver/v3 v3.6.1/go.mod h1:VgR+3WZS4N+i9FaDwLZbq+jeU4B4zctXL+gL4EMzfLw= 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.60.1-0.20251026182600-8a8c0428f538 h1:WgpC3kE2LkgJ+58RFbCx/ivNJzEQ4Ue8Q5BhLWWJ3tA= -github.com/jfrog/jfrog-cli-core/v2 v2.60.1-0.20251026182600-8a8c0428f538/go.mod h1:gtu43/QouMc0ENk6J/WH5glKH5S7wnPbMhFukN3FH8s= +github.com/jfrog/jfrog-cli-core/v2 v2.60.1-0.20251015045218-1a38c9e47097 h1:+W6BPxJ0nPtlQ6l6nmypW1eEANoVPiN8HDR4kQJA8uI= +github.com/jfrog/jfrog-cli-core/v2 v2.60.1-0.20251015045218-1a38c9e47097/go.mod h1:UOeOwEEmRIi57cRwghN5OBVoqkJieYQQfLpeqw8Yv38= github.com/jfrog/jfrog-client-go v1.55.1-0.20251209090954-d6b1c70d3a5e h1:9le3a99UGdBHZXv7vZ7aqxLyBpwMq+sbTWiOaI9pwCU= github.com/jfrog/jfrog-client-go v1.55.1-0.20251209090954-d6b1c70d3a5e/go.mod h1:WQ5Y+oKYyHFAlCbHN925bWhnShTd2ruxZ6YTpb76fpU= +github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= +github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= github.com/kevinburke/ssh_config v1.2.0 h1:x584FjTGwHzMwvHx18PXxbBVzfnxogHaAReU4gf13a4= github.com/kevinburke/ssh_config v1.2.0/go.mod h1:CT57kijsi8u/K/BOFA39wgDQJ9CxiF4nAY/ojJ6r6mM= +github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= +github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/klauspost/compress v1.4.1/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= github.com/klauspost/compress v1.18.1 h1:bcSGx7UbpBqMChDtsF28Lw6v/G94LPrrbMbdC3JH2co= github.com/klauspost/compress v1.18.1/go.mod h1:ZQFFVG+MdnR0P+l6wpXgIL4NTtwiKIdBnrBd8Nrxr+0= @@ -211,12 +227,18 @@ github.com/minio/sha256-simd v1.0.1 h1:6kaan5IFmwTNynnKKpDHe6FWHohJOHhCPchzK49dz github.com/minio/sha256-simd v1.0.1/go.mod h1:Pz6AKMiUdngCLpeTL/RJY1M9rUuPMYujV5xJjtbRSN8= github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= +github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee h1:W5t00kpgFdJifH4BDsTlE89Zl93FEloxaWZfGcifgq8= +github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= -github.com/naveenku-jfrog/build-info-go v1.12.1-0.20251204140510-1d49e7aa4a2b h1:vnTnpR/NmvEHR/qrpIjGsX3yWPPLHR/fIdjodeTlTck= -github.com/naveenku-jfrog/build-info-go v1.12.1-0.20251204140510-1d49e7aa4a2b/go.mod h1:NEJwH1HxzhtWuiT8eR/anbjT0A3OyLBWpZZrDJs+hWQ= github.com/nwaples/rardecode v1.1.3 h1:cWCaZwfM5H7nAD6PyEdcVnczzV8i/JtotnyW/dD9lEc= github.com/nwaples/rardecode v1.1.3/go.mod h1:5DzqNKiOdpKKBH87u8VlvAnPZMXcGRhxWkRpHbbfGS0= +github.com/onsi/ginkgo/v2 v2.25.1 h1:Fwp6crTREKM+oA6Cz4MsO8RhKQzs2/gOIVOUscMAfZY= +github.com/onsi/ginkgo/v2 v2.25.1/go.mod h1:ppTWQ1dh9KM/F1XgpeRqelR+zHVwV81DGRSDnFxK7Sk= github.com/onsi/gomega v1.38.2 h1:eZCjf2xjZAqe+LeWvKb5weQ+NcPwX84kqJ0cZNxok2A= github.com/onsi/gomega v1.38.2/go.mod h1:W2MJcYxRGV63b418Ai34Ud0hEdTVXq9NW9+Sx6uXf3k= github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U= @@ -240,20 +262,22 @@ github.com/pkg/term v1.2.0-beta.2/go.mod h1:E25nymQcrSllhX42Ok8MRm1+hyBdHY0dCeiK github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/prometheus/client_golang v1.22.0 h1:rb93p9lokFEsctTys46VnV1kLCDpVZ0a/Y92Vm0Zc6Q= -github.com/prometheus/client_golang v1.22.0/go.mod h1:R7ljNsLXhuQXYZYtw6GAE9AZg8Y7vEW5scdCXrWRXC0= -github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E= -github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY= -github.com/prometheus/common v0.62.0 h1:xasJaQlnWAeyHdUBeGjXmutelfJHWMRr+Fg4QszZ2Io= -github.com/prometheus/common v0.62.0/go.mod h1:vyBcEuLSvWos9B1+CyL7JZ2up+uFzXhkqml0W5zIY1I= -github.com/prometheus/procfs v0.15.1 h1:YagwOFzUgYfKKHX6Dr+sHT7km/hxC76UB0learggepc= -github.com/prometheus/procfs v0.15.1/go.mod h1:fB45yRUv8NstnjriLhBQLuOUt+WW4BsoGhij/e3PBqk= +github.com/prometheus/client_golang v1.23.0 h1:ust4zpdl9r4trLY/gSjlm07PuiBq2ynaXXlptpfy8Uc= +github.com/prometheus/client_golang v1.23.0/go.mod h1:i/o0R9ByOnHX0McrTMTyhYvKE4haaf2mW08I+jGAjEE= +github.com/prometheus/client_model v0.6.2 h1:oBsgwpGs7iVziMvrGhE53c/GrLUsZdHnqNwqPLxwZyk= +github.com/prometheus/client_model v0.6.2/go.mod h1:y3m2F6Gdpfy6Ut/GBsUqTWZqCUvMVzSfMLjcu6wAwpE= +github.com/prometheus/common v0.65.0 h1:QDwzd+G1twt//Kwj/Ww6E9FQq1iVMmODnILtW1t2VzE= +github.com/prometheus/common v0.65.0/go.mod h1:0gZns+BLRQ3V6NdaerOhMbwwRbNh9hkGINtQAsP5GS8= +github.com/prometheus/procfs v0.17.0 h1:FuLQ+05u4ZI+SS/w9+BWEM2TXiHKsUQ9TADiRH7DuK0= +github.com/prometheus/procfs v0.17.0/go.mod h1:oPQLaDAMRbA+u8H5Pbfq+dl3VDAvHxMUOVhe0wYB2zw= github.com/redis/go-redis/extra/rediscmd/v9 v9.0.5 h1:EaDatTxkdHG+U3Bk4EUr+DZ7fOGwTfezUiUJMaIcaho= github.com/redis/go-redis/extra/rediscmd/v9 v9.0.5/go.mod h1:fyalQWdtzDBECAQFBJuQe5bzQ02jGd5Qcbgb97Flm7U= github.com/redis/go-redis/extra/redisotel/v9 v9.0.5 h1:EfpWLLCyXw8PSM2/XNJLjI3Pb27yVE+gIAfeqp8LUCc= github.com/redis/go-redis/extra/redisotel/v9 v9.0.5/go.mod h1:WZjPDy7VNzn77AAfnAfVjZNvfJTYfPetfZk5yoSTLaQ= github.com/redis/go-redis/v9 v9.7.3 h1:YpPyAayJV+XErNsatSElgRZZVCwXX9QzkKYNvO7x0wM= github.com/redis/go-redis/v9 v9.7.3/go.mod h1:bGUrSggJ9X9GUmZpZNEOQKaANxSGgOEBRltRTZHSvrA= +github.com/reshmifrog/build-info-go v1.9.10-0.20251212003940-e0fb71e835f5 h1:UVo5H0ve3VlGceQLDKG5prjnjB1bvKzUBeLrki9U0+U= +github.com/reshmifrog/build-info-go v1.9.10-0.20251212003940-e0fb71e835f5/go.mod h1:9W4U440fdTHwW1HiB/R0VQvz/5q8ZHsms9MWcq+JrdY= github.com/rivo/uniseg v0.4.7 h1:WUdvkW8uEhrYfLC4ZzdpI2ztxP1I582+49Oc5Mq64VQ= github.com/rivo/uniseg v0.4.7/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= github.com/rogpeppe/go-internal v1.14.1 h1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0tI/otEQ= @@ -279,16 +303,20 @@ github.com/spf13/pflag v1.0.10 h1:4EBh2KAYBwaONj6b2Ye1GiHfwjqyROoF4RwYO+vPwFk= github.com/spf13/pflag v1.0.10/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= github.com/spf13/viper v1.21.0 h1:x5S+0EU27Lbphp4UKm1C+1oQO+rKx36vfCoaVebLFSU= github.com/spf13/viper v1.21.0/go.mod h1:P0lhsswPGWD/1lZJ9ny3fYnVqxiegrlNrEmgLjbTCAY= +github.com/stoewer/go-strcase v1.3.1 h1:iS0MdW+kVTxgMoE1LAZyMiYJFKlOzLooE4MxjirtkAs= +github.com/stoewer/go-strcase v1.3.1/go.mod h1:fAH5hQ5pehh+j3nZfvwdk2RgEgQjAoM8wodgtPmh1xo= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY= github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= +github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U= @@ -306,6 +334,8 @@ github.com/vbatts/tar-split v0.12.2 h1:w/Y6tjxpeiFMR47yzZPlPj/FcPLpXbTUi/9H7d3CP github.com/vbatts/tar-split v0.12.2/go.mod h1:eF6B6i6ftWQcDqEn3/iGFRFRo8cBIMSJVOpnNdfTMFA= github.com/vbauerster/mpb/v8 v8.10.2 h1:2uBykSHAYHekE11YvJhKxYmLATKHAGorZwFlyNw4hHM= github.com/vbauerster/mpb/v8 v8.10.2/go.mod h1:+Ja4P92E3/CorSZgfDtK46D7AVbDqmBQRTmyTqPElo0= +github.com/x448/float16 v0.8.4 h1:qLwI1I70+NjRFUR3zs1JPUCgaCXSh3SW62uAKT1mSBM= +github.com/x448/float16 v0.8.4/go.mod h1:14CWIYCyZA/cWjXOioeEpHeN/83MdbZDRQHoFcYsOfg= github.com/xanzy/ssh-agent v0.3.3 h1:+/15pJfg/RsTxqYcX6fHqOXZwwMP+2VyYWJeWM2qQFM= github.com/xanzy/ssh-agent v0.3.3/go.mod h1:6dzNDKs0J9rVPHPhaGCukekBHKqfl+L3KghI1Bc68Uw= github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb h1:zGWFAtiMcyryUHoUjUJX0/lt1H2+i2Ka2n+D3DImSNo= @@ -320,16 +350,18 @@ github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e h1:JVG44RsyaB9T2KIHavM github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e/go.mod h1:RbqR21r5mrJuqunuUZ/Dhy/avygyECGrLceyNeo4LiM= github.com/xyproto/randomstring v1.0.5 h1:YtlWPoRdgMu3NZtP45drfy1GKoojuR7hmRcnhZqKjWU= github.com/xyproto/randomstring v1.0.5/go.mod h1:rgmS5DeNXLivK7YprL0pY+lTuhNQW3iGxZ18UQApw/E= +github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJySYA= go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A= go.opentelemetry.io/contrib/bridges/prometheus v0.57.0 h1:UW0+QyeyBVhn+COBec3nGhfnFe5lwB0ic1JBVjzhk0w= go.opentelemetry.io/contrib/bridges/prometheus v0.57.0/go.mod h1:ppciCHRLsyCio54qbzQv0E4Jyth/fLWDTJYfvWpcSVk= go.opentelemetry.io/contrib/exporters/autoexport v0.57.0 h1:jmTVJ86dP60C01K3slFQa2NQ/Aoi7zA+wy7vMOKD9H4= go.opentelemetry.io/contrib/exporters/autoexport v0.57.0/go.mod h1:EJBheUMttD/lABFyLXhce47Wr6DPWYReCzaZiXadH7g= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.61.0 h1:F7Jx+6hwnZ41NSFTO5q4LYDtJRXBf2PD0rNBkeB/lus= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.61.0/go.mod h1:UHB22Z8QsdRDrnAtX4PntOl36ajSxcdUMt1sF7Y6E7Q= -go.opentelemetry.io/otel v1.36.0 h1:UumtzIklRBY6cI/lllNZlALOF5nNIzJVb16APdvgTXg= -go.opentelemetry.io/otel v1.36.0/go.mod h1:/TcFMXYjyRNh8khOAO9ybYkqaDBb/70aVwkNML4pP8E= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.62.0 h1:Hf9xI/XLML9ElpiHVDNwvqI0hIFlzV8dgIr35kV1kRU= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.62.0/go.mod h1:NfchwuyNoMcZ5MLHwPrODwUF1HWCXWrL31s8gSAdIKY= +go.opentelemetry.io/otel v1.37.0 h1:9zhNfelUvx0KBfu/gb+ZgeAfAgtWrfHJZcAqFC228wQ= +go.opentelemetry.io/otel v1.37.0/go.mod h1:ehE/umFRLnuLa/vSccNq9oS1ErUlkkK71gMcN34UG8I= go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.8.0 h1:WzNab7hOOLzdDF/EoWCt4glhrbMPVMOO5JYTmpz36Ls= go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.8.0/go.mod h1:hKvJwTzJdp90Vh7p6q/9PAOd55dI6WA6sWj62a/JvSs= go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.8.0 h1:S+LdBGiQXtJdowoJoQPEtI52syEP/JYBUpjO49EQhV8= @@ -354,37 +386,58 @@ go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.32.0 h1:cC2yDI3IQd0Udsu go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.32.0/go.mod h1:2PD5Ex6z8CFzDbTdOlwyNIUywRr1DN0ospafJM1wJ+s= go.opentelemetry.io/otel/log v0.8.0 h1:egZ8vV5atrUWUbnSsHn6vB8R21G2wrKqNiDt3iWertk= go.opentelemetry.io/otel/log v0.8.0/go.mod h1:M9qvDdUTRCopJcGRKg57+JSQ9LgLBrwwfC32epk5NX8= -go.opentelemetry.io/otel/metric v1.36.0 h1:MoWPKVhQvJ+eeXWHFBOPoBOi20jh6Iq2CcCREuTYufE= -go.opentelemetry.io/otel/metric v1.36.0/go.mod h1:zC7Ks+yeyJt4xig9DEw9kuUFe5C3zLbVjV2PzT6qzbs= +go.opentelemetry.io/otel/metric v1.37.0 h1:mvwbQS5m0tbmqML4NqK+e3aDiO02vsf/WgbsdpcPoZE= +go.opentelemetry.io/otel/metric v1.37.0/go.mod h1:04wGrZurHYKOc+RKeye86GwKiTb9FKm1WHtO+4EVr2E= go.opentelemetry.io/otel/sdk v1.34.0 h1:95zS4k/2GOy069d321O8jWgYsW3MzVV+KuSPKp7Wr1A= go.opentelemetry.io/otel/sdk v1.34.0/go.mod h1:0e/pNiaMAqaykJGKbi+tSjWfNNHMTxoC9qANsCzbyxU= go.opentelemetry.io/otel/sdk/log v0.8.0 h1:zg7GUYXqxk1jnGF/dTdLPrK06xJdrXgqgFLnI4Crxvs= go.opentelemetry.io/otel/sdk/log v0.8.0/go.mod h1:50iXr0UVwQrYS45KbruFrEt4LvAdCaWWgIrsN3ZQggo= go.opentelemetry.io/otel/sdk/metric v1.34.0 h1:5CeK9ujjbFVL5c1PhLuStg1wxA7vQv7ce1EK0Gyvahk= go.opentelemetry.io/otel/sdk/metric v1.34.0/go.mod h1:jQ/r8Ze28zRKoNRdkjCZxfs6YvBTG1+YIqyFVFYec5w= -go.opentelemetry.io/otel/trace v1.36.0 h1:ahxWNuqZjpdiFAyrIoQ4GIiAIhxAunQR6MUoKrsNd4w= -go.opentelemetry.io/otel/trace v1.36.0/go.mod h1:gQ+OnDZzrybY4k4seLzPAWNwVBBVlF2szhehOBB/tGA= +go.opentelemetry.io/otel/trace v1.37.0 h1:HLdcFNbRQBE2imdSEgm/kwqmQj1Or1l/7bW6mxVK7z4= +go.opentelemetry.io/otel/trace v1.37.0/go.mod h1:TlgrlQ+PtQO5XFerSPUYG0JSgGyryXewPGyayAWSBS0= go.opentelemetry.io/proto/otlp v1.5.0 h1:xJvq7gMzB31/d406fB8U5CBdyQGw4P399D1aQWU/3i4= go.opentelemetry.io/proto/otlp v1.5.0/go.mod h1:keN8WnHxOy8PG0rQZjJJ5A2ebUoafqWp0eVQ4yIXvJ4= +go.uber.org/automaxprocs v1.6.0 h1:O3y2/QNTOdbF+e/dpXNNW7Rx2hZ4sTIPyybbxyNqTUs= +go.uber.org/automaxprocs v1.6.0/go.mod h1:ifeIMSnPZuznNm6jmdzmU3/bfk01Fe2fotchwEFJ8r8= +go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= +go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= +go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= +go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= +go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8= +go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= go.yaml.in/yaml/v2 v2.4.2 h1:DzmwEr2rDGHl7lsFgAHxmNz/1NlQ7xLIrlN2h5d1eGI= go.yaml.in/yaml/v2 v2.4.2/go.mod h1:081UH+NErpNdqlCXm3TtEran0rJZGxAYx9hb/ELlsPU= go.yaml.in/yaml/v3 v3.0.4 h1:tfq32ie2Jv2UxXFdLJdh3jXuOzWiL1fo0bu/FbuKpbc= go.yaml.in/yaml/v3 v3.0.4/go.mod h1:DhzuOOF2ATzADvBadXxruRBLzYTpT36CKvDb3+aBEFg= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.43.0 h1:dduJYIi3A3KOfdGOHX8AVZ/jGiyPa3IbBozJ5kNuE04= -golang.org/x/crypto v0.43.0/go.mod h1:BFbav4mRNlXJL4wNeejLpWxB7wMbc79PdRGhWKncxR0= +golang.org/x/crypto v0.45.0 h1:jMBrvKuj23MTlT0bQEOBcAE0mjg8mK9RXFhRH6nyF3Q= +golang.org/x/crypto v0.45.0/go.mod h1:XTGrrkGJve7CYK7J8PEww4aY7gM3qMCElcJQ8n8JdX4= golang.org/x/exp v0.0.0-20251125195548-87e1e737ad39 h1:DHNhtq3sNNzrvduZZIiFyXWOL9IWaDPHqTnLJp+rCBY= golang.org/x/exp v0.0.0-20251125195548-87e1e737ad39/go.mod h1:46edojNIoXTNOhySWIWdix628clX9ODXwPsQuG6hsK0= +golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.30.0 h1:fDEXFVZ/fmCKProc/yAXXUijritrDzahmwwefnjoPFk= golang.org/x/mod v0.30.0/go.mod h1:lAsf5O2EvJeSFMiBxXDki7sCgAxEUcZHXoXMKT4GJKc= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.45.0 h1:RLBg5JKixCy82FtLJpeNlVM0nrSqpCRYzVU1n8kj0tM= -golang.org/x/net v0.45.0/go.mod h1:ECOoLqd5U3Lhyeyo/QDCEVQ4sNgYsqvCZ722XogGieY= +golang.org/x/net v0.47.0 h1:Mx+4dIFzqraBXUugkia1OOvlD6LemFo1ALMHjrXDOhY= +golang.org/x/net v0.47.0/go.mod h1:/jNxtkgq5yWUGYkaZGqo27cfGZ1c5Nen03aYrrKpVRU= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.18.0 h1:kr88TuHDroi+UVf+0hZnirlk8o8T+4MrK6mr60WkH/I= golang.org/x/sync v0.18.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI= golang.org/x/sys v0.0.0-20181122145206-62eef0e2fa9b/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -392,6 +445,7 @@ golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200909081042-eff7692f9009/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200918174421-af09f7315aff/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -405,13 +459,21 @@ golang.org/x/sys v0.38.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.37.0 h1:8EGAD0qCmHYZg6J17DvsMy9/wJ7/D/4pV/wfnld5lTU= golang.org/x/term v0.37.0/go.mod h1:5pB4lxRNYYVZuTLmy8oR2BH8dflOR+IbTYFD8fi3254= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.31.0 h1:aC8ghyu4JhP8VojJ2lEHBnochRno1sgL6nEi9WGFGMM= golang.org/x/text v0.31.0/go.mod h1:tKRAlv61yKIjGGHX/4tP1LTbc13YSec1pxVEWXzfoeM= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.39.0 h1:ik4ho21kwuQln40uelmciQPp9SipgNDdrafrYA4TmQQ= golang.org/x/tools v0.39.0/go.mod h1:JnefbkDPyD8UU2kI5fuf8ZX4/yUeh9W877ZeBONxUqQ= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= google.golang.org/genproto v0.0.0-20231211222908-989df2bf70f3 h1:1hfbdAfFbkmpg41000wDVqr7jUpK/Yo+LPnIxxGzmkg= google.golang.org/genproto/googleapis/api v0.0.0-20250303144028-a0af3efb3deb h1:p31xT4yrYrSM/G4Sn2+TNUkVhFCbG9y8itM2S6Th950= google.golang.org/genproto/googleapis/api v0.0.0-20250303144028-a0af3efb3deb/go.mod h1:jbe3Bkdp+Dh2IrslsFCklNhweNTBgSYanP1UXhJDhKg= @@ -419,12 +481,14 @@ google.golang.org/genproto/googleapis/rpc v0.0.0-20250303144028-a0af3efb3deb h1: google.golang.org/genproto/googleapis/rpc v0.0.0-20250303144028-a0af3efb3deb/go.mod h1:LuRYeWDFV6WOn90g357N17oMCaxpgCnbi/44qJvDn2I= google.golang.org/grpc v1.72.1 h1:HR03wO6eyZ7lknl75XlxABNVLLFc2PAb6mHlYh756mA= google.golang.org/grpc v1.72.1/go.mod h1:wH5Aktxcg25y1I3w7H69nHfXdOG3UiadoBtjh3izSDM= -google.golang.org/protobuf v1.36.7 h1:IgrO7UwFQGJdRNXH/sQux4R1Dj1WAKcLElzeeRaXV2A= -google.golang.org/protobuf v1.36.7/go.mod h1:jduwjTPXsFjZGTmRluh+L6NjiWu7pchiJ2/5YcXBHnY= +google.golang.org/protobuf v1.36.8 h1:xHScyCOEuuwZEc6UtSOvPbAT4zRh0xcNRYekJwfqyMc= +google.golang.org/protobuf v1.36.8/go.mod h1:fuxRtAxBytpl4zzqUh6/eyUujkJdNiuEkXntxiD/uRU= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= +gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= +gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/warnings.v0 v0.1.2 h1:wFXVbFY8DY5/xOe1ECiWdKCzZlxgshcYVNkBHstARME= @@ -439,9 +503,25 @@ gotest.tools/v3 v3.0.3 h1:4AuOwCGf4lLR9u3YOe2awrHygurzhO/HeQ6laiA6Sx0= gotest.tools/v3 v3.0.3/go.mod h1:Z7Lb0S5l+klDB31fvDQX8ss/FlKDxtlFlw3Oa8Ymbl8= helm.sh/helm/v3 v3.19.2 h1:psQjaM8aIWrSVEly6PgYtLu/y6MRSmok4ERiGhZmtUY= helm.sh/helm/v3 v3.19.2/go.mod h1:gX10tB5ErM+8fr7bglUUS/UfTOO8UUTYWIBH1IYNnpE= +k8s.io/api v0.34.0 h1:L+JtP2wDbEYPUeNGbeSa/5GwFtIA662EmT2YSLOkAVE= +k8s.io/api v0.34.0/go.mod h1:YzgkIzOOlhl9uwWCZNqpw6RJy9L2FK4dlJeayUoydug= +k8s.io/apimachinery v0.34.0 h1:eR1WO5fo0HyoQZt1wdISpFDffnWOvFLOOeJ7MgIv4z0= +k8s.io/apimachinery v0.34.0/go.mod h1:/GwIlEcWuTX9zKIg2mbw0LRFIsXwrfoVxn+ef0X13lw= k8s.io/client-go v0.34.0 h1:YoWv5r7bsBfb0Hs2jh8SOvFbKzzxyNo0nSb0zC19KZo= k8s.io/client-go v0.34.0/go.mod h1:ozgMnEKXkRjeMvBZdV1AijMHLTh3pbACPvK7zFR+QQY= +k8s.io/klog/v2 v2.130.1 h1:n9Xl7H1Xvksem4KFG4PYbdQCQxqc/tTUyrgXaOhHSzk= +k8s.io/klog/v2 v2.130.1/go.mod h1:3Jpz1GvMt720eyJH1ckRHK1EDfpxISzJ7I9OYgaDtPE= +k8s.io/utils v0.0.0-20250604170112-4c0f3b243397 h1:hwvWFiBzdWw1FhfY1FooPn3kzWuJ8tmbZBHi4zVsl1Y= +k8s.io/utils v0.0.0-20250604170112-4c0f3b243397/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= oras.land/oras-go/v2 v2.6.0 h1:X4ELRsiGkrbeox69+9tzTu492FMUu7zJQW6eJU+I2oc= oras.land/oras-go/v2 v2.6.0/go.mod h1:magiQDfG6H1O9APp+rOsvCPcW1GD2MM7vgnKY0Y+u1o= +sigs.k8s.io/controller-runtime v0.21.0 h1:CYfjpEuicjUecRk+KAeyYh+ouUBn4llGyDYytIGcJS8= +sigs.k8s.io/controller-runtime v0.21.0/go.mod h1:OSg14+F65eWqIu4DceX7k/+QRAbTTvxeQSNSOQpukWM= +sigs.k8s.io/json v0.0.0-20241014173422-cfa47c3a1cc8 h1:gBQPwqORJ8d8/YNZWEjoZs7npUVDpVXUUOFfW6CgAqE= +sigs.k8s.io/json v0.0.0-20241014173422-cfa47c3a1cc8/go.mod h1:mdzfpAEoE6DHQEN0uh9ZbOCuHbLK5wOm7dK4ctXE9Tg= +sigs.k8s.io/randfill v1.0.0 h1:JfjMILfT8A6RbawdsK2JXGBR5AQVfd+9TbzrlneTyrU= +sigs.k8s.io/randfill v1.0.0/go.mod h1:XeLlZ/jmk4i1HRopwe7/aU3H5n1zNUcX6TM94b3QxOY= +sigs.k8s.io/structured-merge-diff/v6 v6.3.0 h1:jTijUJbW353oVOd9oTlifJqOGEkUw2jB/fXCbTiQEco= +sigs.k8s.io/structured-merge-diff/v6 v6.3.0/go.mod h1:M3W8sfWvn2HhQDIbGWj3S099YozAsymCo/wrT5ohRUE= sigs.k8s.io/yaml v1.6.0 h1:G8fkbMSAFqgEFgh4b1wmtzDnioxFCUgTZhlbj5P9QYs= sigs.k8s.io/yaml v1.6.0/go.mod h1:796bPqUfzR/0jLAl6XjHl3Ck7MiyVv8dbTdyT3/pMf4= From 0a56d3be9c2ada937fd8fb764deba3b1a0b85cd7 Mon Sep 17 00:00:00 2001 From: Reshmi Date: Tue, 16 Dec 2025 14:57:30 +0530 Subject: [PATCH 04/10] improved logic for conan build info collection --- artifactory/commands/conan/artifacts.go | 70 ++++---- artifactory/commands/conan/command.go | 228 +++++++++++++++-------- artifactory/commands/conan/login.go | 45 ++++- artifactory/commands/conan/upload.go | 229 ++++++++++++++++-------- 4 files changed, 383 insertions(+), 189 deletions(-) diff --git a/artifactory/commands/conan/artifacts.go b/artifactory/commands/conan/artifacts.go index d00ba92c..d4e846dc 100644 --- a/artifactory/commands/conan/artifacts.go +++ b/artifactory/commands/conan/artifacts.go @@ -17,6 +17,7 @@ import ( ) // ConanPackageInfo holds parsed Conan package reference information. +// Supports both Conan 2.x (name/version) and 1.x (name/version@user/channel) formats. type ConanPackageInfo struct { Name string Version string @@ -49,24 +50,34 @@ func (ac *ArtifactCollector) CollectArtifacts(packageRef string) ([]entities.Art return nil, err } + return ac.searchArtifacts(buildArtifactQuery(ac.targetRepo, pkgInfo)) +} + +// CollectArtifactsForPath collects artifacts from a specific path pattern. +// Used to collect only artifacts that were uploaded in the current build. +func (ac *ArtifactCollector) CollectArtifactsForPath(pathPattern string) ([]entities.Artifact, error) { + if ac.serverDetails == nil { + return nil, fmt.Errorf("server details not initialized") + } + + query := fmt.Sprintf(`{"repo": "%s", "path": {"$match": "%s/*"}}`, ac.targetRepo, pathPattern) + return ac.searchArtifacts(query) +} + +// searchArtifacts executes an AQL query and returns matching artifacts. +func (ac *ArtifactCollector) searchArtifacts(aqlQuery string) ([]entities.Artifact, error) { servicesManager, err := utils.CreateServiceManager(ac.serverDetails, -1, 0, false) if err != nil { return nil, fmt.Errorf("create services manager: %w", err) } - return ac.searchArtifacts(servicesManager, pkgInfo) -} - -// searchArtifacts searches for Conan artifacts in Artifactory. -func (ac *ArtifactCollector) searchArtifacts(manager artifactory.ArtifactoryServicesManager, pkgInfo *ConanPackageInfo) ([]entities.Artifact, error) { - searchQuery := buildArtifactQuery(ac.targetRepo, pkgInfo) searchParams := services.SearchParams{ CommonParams: &specutils.CommonParams{ - Aql: specutils.Aql{ItemsFind: searchQuery}, + Aql: specutils.Aql{ItemsFind: aqlQuery}, }, } - reader, err := manager.SearchFiles(searchParams) + reader, err := servicesManager.SearchFiles(searchParams) if err != nil { return nil, fmt.Errorf("search files: %w", err) } @@ -83,7 +94,6 @@ func parseSearchResults(reader *content.ContentReader) ([]entities.Artifact, err artifact := entities.Artifact{ Name: item.Name, Path: item.Path, - Type: classifyArtifactType(item.Name), Checksum: entities.Checksum{ Sha1: item.Actual_Sha1, Sha256: item.Sha256, @@ -96,29 +106,14 @@ func parseSearchResults(reader *content.ContentReader) ([]entities.Artifact, err return artifacts, nil } -// classifyArtifactType determines the artifact type based on filename. -func classifyArtifactType(name string) string { - switch { - case name == "conanfile.py": - return "conan-recipe" - case name == "conanmanifest.txt": - return "conan-manifest" - case name == "conaninfo.txt": - return "conan-info" - case strings.HasSuffix(name, ".tgz"): - return "conan-package" - default: - return "conan-artifact" - } -} - -// ParsePackageReference parses a Conan package reference string. -// Supports both formats: name/version and name/version@user/channel +// ParsePackageReference parses a Conan package reference string into structured info. +// Supports both formats: +// - Conan 2.x: name/version (e.g., "zlib/1.2.13") +// - Conan 1.x: name/version@user/channel (e.g., "zlib/1.2.13@_/_") func ParsePackageReference(ref string) (*ConanPackageInfo, error) { - // Remove any trailing whitespace or package ID ref = strings.TrimSpace(ref) - - // Check for @user/channel format + + // Check for @user/channel format (Conan 1.x style) if idx := strings.Index(ref, "@"); idx != -1 { nameVersion := ref[:idx] userChannel := ref[idx+1:] @@ -153,18 +148,20 @@ func ParsePackageReference(ref string) (*ConanPackageInfo, error) { } // buildArtifactQuery creates an AQL query for Conan artifacts. +// Conan stores artifacts in different path formats depending on version: +// - Conan 2.x: _/name/version/_/revision/... +// - Conan 1.x: user/name/version/channel/revision/... func buildArtifactQuery(repo string, pkg *ConanPackageInfo) string { - // Conan 2.x uses _/name/version/_ path format if pkg.User == "_" && pkg.Channel == "_" { return fmt.Sprintf(`{"repo": "%s", "path": {"$match": "_/%s/%s/_/*"}}`, repo, pkg.Name, pkg.Version) } - // Conan 1.x uses user/name/version/channel path format return fmt.Sprintf(`{"repo": "%s", "path": {"$match": "%s/%s/%s/%s/*"}}`, repo, pkg.User, pkg.Name, pkg.Version, pkg.Channel) } -// BuildPropertySetter sets build properties on Conan artifacts. +// BuildPropertySetter sets build properties on Conan artifacts in Artifactory. +// This is required to link artifacts to build info in Artifactory UI. type BuildPropertySetter struct { serverDetails *config.ServerDetails targetRepo string @@ -185,6 +182,8 @@ func NewBuildPropertySetter(serverDetails *config.ServerDetails, targetRepo, bui } // SetProperties sets build properties on the given artifacts. +// Properties are set one by one as Artifactory API requires individual file paths. +// This is the same approach used by Maven and other package managers. func (bps *BuildPropertySetter) SetProperties(artifacts []entities.Artifact) error { if len(artifacts) == 0 || bps.serverDetails == nil { return nil @@ -201,17 +200,18 @@ func (bps *BuildPropertySetter) SetProperties(artifacts []entities.Artifact) err successCount := 0 for _, artifact := range artifacts { if err := bps.setPropertiesOnArtifact(servicesManager, artifact, props); err != nil { - log.Warn(fmt.Sprintf("Failed to set properties on %s: %s", artifact.Name, err.Error())) + log.Debug(fmt.Sprintf("Failed to set properties on %s: %s", artifact.Name, err.Error())) continue } successCount++ } - log.Info(fmt.Sprintf("Successfully set build properties on %d Conan artifacts", successCount)) + log.Info(fmt.Sprintf("Set build properties on %d Conan artifacts", successCount)) return nil } // formatBuildProperties creates the build properties string. +// Only includes build.name, build.number, build.timestamp (and optional build.project). func (bps *BuildPropertySetter) formatBuildProperties(timestamp string) string { props := fmt.Sprintf("build.name=%s;build.number=%s;build.timestamp=%s", bps.buildName, bps.buildNumber, timestamp) diff --git a/artifactory/commands/conan/command.go b/artifactory/commands/conan/command.go index 7a1d6105..af7bec65 100644 --- a/artifactory/commands/conan/command.go +++ b/artifactory/commands/conan/command.go @@ -5,9 +5,11 @@ import ( "io" "os" "os/exec" + "strings" "github.com/jfrog/build-info-go/build" "github.com/jfrog/build-info-go/entities" + conanflex "github.com/jfrog/build-info-go/flexpack/conan" gofrogcmd "github.com/jfrog/gofrog/io" buildUtils "github.com/jfrog/jfrog-cli-core/v2/common/build" "github.com/jfrog/jfrog-cli-core/v2/utils/config" @@ -52,6 +54,28 @@ func (c *ConanCommand) SetBuildConfiguration(config *buildUtils.BuildConfigurati return c } +// Commands that may need remote access for downloading dependencies or packages. +// These commands might interact with Conan remotes and require authentication. +var commandsNeedingRemoteAccess = []string{ + "install", + "create", + "build", + "download", + "upload", + "search", + "list", +} + +// needsRemoteAccess checks if a command might need remote access. +func needsRemoteAccess(cmd string) bool { + for _, c := range commandsNeedingRemoteAccess { + if c == cmd { + return true + } + } + return false +} + // Run executes the Conan command with build info collection. func (c *ConanCommand) Run() error { workingDir, err := os.Getwd() @@ -60,28 +84,91 @@ func (c *ConanCommand) Run() error { } c.workingDir = workingDir - // Handle upload command with auto-login + // Perform auto-login for commands that need remote access + if needsRemoteAccess(c.commandName) { + if err := c.autoLoginToRemotes(); err != nil { + log.Debug(fmt.Sprintf("Auto-login warning: %v", err)) + } + } + + // Upload command requires special handling to parse output and collect artifacts if c.commandName == "upload" { - return c.runUpload() + return c.runUploadCommand() } - // Run standard Conan command - return c.runStandardCommand() + // Run other Conan commands + return c.runConanCommand() } -// runUpload handles the upload command with auto-login and build info collection. -func (c *ConanCommand) runUpload() error { - // Extract remote name and perform auto-login +// autoLoginToRemotes attempts to log into all configured Conan remotes that match JFrog CLI configs. +func (c *ConanCommand) autoLoginToRemotes() error { + // First check if a specific remote is specified in args remoteName := ExtractRemoteName(c.args) if remoteName != "" { matchedServer, err := ValidateAndLogin(remoteName) if err != nil { - return err + log.Debug(fmt.Sprintf("Could not auto-login to remote '%s': %v", remoteName, err)) + } else { + c.serverDetails = matchedServer } - c.serverDetails = matchedServer + return nil + } + + // No specific remote specified, try to login to all Artifactory remotes + return c.loginToAllArtifactoryRemotes() +} + +// loginToAllArtifactoryRemotes attempts to log into all Conan remotes that point to Artifactory. +func (c *ConanCommand) loginToAllArtifactoryRemotes() error { + remotes, err := ListConanRemotes() + if err != nil { + return fmt.Errorf("list conan remotes: %w", err) } - log.Info(fmt.Sprintf("Running Conan %s.", c.commandName)) + loggedInCount := 0 + for _, remote := range remotes { + // Only process remotes with /api/conan/ URL pattern (Artifactory Conan repos) + if !isArtifactoryConanRemote(remote.URL) { + log.Debug(fmt.Sprintf("Skipping remote '%s': not an Artifactory Conan URL", remote.Name)) + continue + } + + log.Debug(fmt.Sprintf("Found Artifactory Conan remote: %s -> %s", remote.Name, remote.URL)) + + matchedServer, err := ValidateAndLogin(remote.Name) + if err != nil { + log.Debug(fmt.Sprintf("Could not auto-login to remote '%s': %v", remote.Name, err)) + continue + } + + loggedInCount++ + log.Debug(fmt.Sprintf("Successfully logged into remote '%s'", remote.Name)) + + // Use the first successfully logged-in server for artifact collection + if c.serverDetails == nil { + c.serverDetails = matchedServer + } + } + + if loggedInCount > 0 { + log.Debug(fmt.Sprintf("Auto-login completed: logged into %d Artifactory remote(s)", loggedInCount)) + } + + return nil +} + +// isArtifactoryConanRemote checks if a URL points to an Artifactory Conan repository. +// Artifactory Conan URLs contain /api/conan/ in the path. +func isArtifactoryConanRemote(url string) bool { + return strings.Contains(url, "/api/conan/") +} + +// runUploadCommand handles the upload command with build info collection. +// Upload requires special handling because: +// 1. We need to capture the output to determine which artifacts were uploaded +// 2. We need to collect artifacts from Artifactory and set build properties +func (c *ConanCommand) runUploadCommand() error { + log.Info(fmt.Sprintf("Running Conan %s", c.commandName)) // Execute conan upload and capture output output, err := c.executeAndCaptureOutput() @@ -91,17 +178,17 @@ func (c *ConanCommand) runUpload() error { } fmt.Print(string(output)) - // Process upload for build info + // Process upload for build info if build configuration is provided if c.buildConfiguration != nil { - return c.processUploadBuildInfo(string(output)) + return c.processBuildInfo(string(output)) } return nil } -// runStandardCommand runs non-upload Conan commands. -func (c *ConanCommand) runStandardCommand() error { - log.Info(fmt.Sprintf("Running Conan %s.", c.commandName)) +// runConanCommand runs non-upload Conan commands. +func (c *ConanCommand) runConanCommand() error { + log.Info(fmt.Sprintf("Running Conan %s", c.commandName)) if err := gofrogcmd.RunCmd(c); err != nil { return fmt.Errorf("conan %s failed: %w", c.commandName, err) @@ -109,22 +196,17 @@ func (c *ConanCommand) runStandardCommand() error { // Collect build info for dependency commands if c.buildConfiguration != nil { - return c.collectDependencyBuildInfo() + return c.collectAndSaveBuildInfo() } return nil } -// processUploadBuildInfo collects build info after a successful upload. -func (c *ConanCommand) processUploadBuildInfo(uploadOutput string) error { - buildName, err := c.buildConfiguration.GetBuildName() - if err != nil || buildName == "" { - return nil - } - - buildNumber, err := c.buildConfiguration.GetBuildNumber() - if err != nil || buildNumber == "" { - return nil +// processBuildInfo processes build info after a successful upload. +func (c *ConanCommand) processBuildInfo(uploadOutput string) error { + buildName, buildNumber, err := c.getBuildNameAndNumber() + if err != nil { + return nil // No build info configured, skip silently } log.Info(fmt.Sprintf("Processing Conan upload with build info: %s/%s", buildName, buildNumber)) @@ -138,30 +220,59 @@ func (c *ConanCommand) processUploadBuildInfo(uploadOutput string) error { return nil } -// collectDependencyBuildInfo collects dependencies using FlexPack. -func (c *ConanCommand) collectDependencyBuildInfo() error { - buildName, err := c.buildConfiguration.GetBuildName() - if err != nil || buildName == "" { - return nil +// collectAndSaveBuildInfo collects dependencies and saves build info locally. +func (c *ConanCommand) collectAndSaveBuildInfo() error { + buildName, buildNumber, err := c.getBuildNameAndNumber() + if err != nil { + return nil // No build info configured, skip silently } - buildNumber, err := c.buildConfiguration.GetBuildNumber() - if err != nil || buildNumber == "" { - return nil + log.Info(fmt.Sprintf("Collecting build info for Conan project: %s/%s", buildName, buildNumber)) + + // Create FlexPack collector + conanConfig := conanflex.ConanConfig{ + WorkingDirectory: c.workingDir, } - log.Info(fmt.Sprintf("Collecting build info for Conan project: %s/%s", buildName, buildNumber)) + collector, err := conanflex.NewConanFlexPack(conanConfig) + if err != nil { + log.Warn("Failed to create Conan FlexPack: " + err.Error()) + return nil + } - collector := NewDependencyCollector(c.workingDir, c.buildConfiguration) - if err := collector.Collect(); err != nil { + // Collect build info + buildInfo, err := collector.CollectBuildInfo(buildName, buildNumber) + if err != nil { log.Warn("Failed to collect Conan build info: " + err.Error()) return nil } + // Save build info locally + if err := saveBuildInfoLocally(buildInfo); err != nil { + log.Warn("Failed to save build info: " + err.Error()) + return nil + } + log.Info(fmt.Sprintf("Conan build info collected. Use 'jf rt bp %s %s' to publish it.", buildName, buildNumber)) return nil } +// getBuildNameAndNumber returns build name and number from configuration. +// Returns error if either is missing. +func (c *ConanCommand) getBuildNameAndNumber() (string, string, error) { + buildName, err := c.buildConfiguration.GetBuildName() + if err != nil || buildName == "" { + return "", "", fmt.Errorf("build name not configured") + } + + buildNumber, err := c.buildConfiguration.GetBuildNumber() + if err != nil || buildNumber == "" { + return "", "", fmt.Errorf("build number not configured") + } + + return buildName, buildNumber, nil +} + // executeAndCaptureOutput runs the command and returns the combined output. func (c *ConanCommand) executeAndCaptureOutput() ([]byte, error) { cmd := c.GetCmd() @@ -199,47 +310,6 @@ func (c *ConanCommand) ServerDetails() (*config.ServerDetails, error) { return c.serverDetails, nil } -// DependencyCollector handles Conan dependency collection using FlexPack. -type DependencyCollector struct { - workingDir string - buildConfiguration *buildUtils.BuildConfiguration -} - -// NewDependencyCollector creates a new dependency collector. -func NewDependencyCollector(workingDir string, buildConfig *buildUtils.BuildConfiguration) *DependencyCollector { - return &DependencyCollector{ - workingDir: workingDir, - buildConfiguration: buildConfig, - } -} - -// Collect collects dependencies and saves build info. -func (dc *DependencyCollector) Collect() error { - buildName, err := dc.buildConfiguration.GetBuildName() - if err != nil { - return fmt.Errorf("get build name: %w", err) - } - - buildNumber, err := dc.buildConfiguration.GetBuildNumber() - if err != nil { - return fmt.Errorf("get build number: %w", err) - } - - // Use FlexPack to collect dependencies - collector, err := NewFlexPackCollector(dc.workingDir) - if err != nil { - return fmt.Errorf("create flexpack collector: %w", err) - } - - buildInfo, err := collector.CollectBuildInfo(buildName, buildNumber) - if err != nil { - return fmt.Errorf("collect build info: %w", err) - } - - // Save build info locally - return saveBuildInfoLocally(buildInfo) -} - // saveBuildInfoLocally saves the build info for later publishing with 'jf rt bp'. func saveBuildInfoLocally(buildInfo *entities.BuildInfo) error { service := build.NewBuildInfoService() @@ -253,6 +323,6 @@ func saveBuildInfoLocally(buildInfo *entities.BuildInfo) error { return fmt.Errorf("save build info: %w", err) } - log.Info("Build info saved locally.") + log.Debug("Build info saved locally") return nil } diff --git a/artifactory/commands/conan/login.go b/artifactory/commands/conan/login.go index cb64008a..f588a585 100644 --- a/artifactory/commands/conan/login.go +++ b/artifactory/commands/conan/login.go @@ -65,17 +65,27 @@ func ValidateAndLogin(remoteName string) (*config.ServerDetails, error) { return tryLoginWithConfigs(remoteName, matchingConfigs) } -// getRemoteURL retrieves the URL for a Conan remote. -func getRemoteURL(remoteName string) (string, error) { +// ListConanRemotes returns all configured Conan remotes. +func ListConanRemotes() ([]ConanRemote, error) { cmd := exec.Command("conan", "remote", "list", "--format=json") output, err := cmd.Output() if err != nil { - return "", fmt.Errorf("conan remote list failed: %w", err) + return nil, fmt.Errorf("conan remote list failed: %w", err) } var remotes []ConanRemote if err := json.Unmarshal(output, &remotes); err != nil { - return "", fmt.Errorf("parse conan remote list: %w", err) + return nil, fmt.Errorf("parse conan remote list: %w", err) + } + + return remotes, nil +} + +// getRemoteURL retrieves the URL for a Conan remote. +func getRemoteURL(remoteName string) (string, error) { + remotes, err := ListConanRemotes() + if err != nil { + return "", err } for _, remote := range remotes { @@ -87,6 +97,33 @@ func getRemoteURL(remoteName string) (string, error) { return "", fmt.Errorf("remote '%s' not found in Conan remotes", remoteName) } +// ExtractRepoName extracts the Artifactory repository name from a Conan remote URL. +// Example: "https://myserver.jfrog.io/artifactory/api/conan/repo-name" -> "repo-name" +func ExtractRepoName(remoteURL string) string { + // Format: .../api/conan/ + idx := strings.Index(remoteURL, "/api/conan/") + if idx != -1 { + repoName := remoteURL[idx+len("/api/conan/"):] + // Remove trailing slash if present + repoName = strings.TrimSuffix(repoName, "/") + return repoName + } + return "" +} + +// GetRepoNameForRemote gets the Artifactory repository name for a Conan remote. +func GetRepoNameForRemote(remoteName string) (string, error) { + remoteURL, err := getRemoteURL(remoteName) + if err != nil { + return "", err + } + repoName := ExtractRepoName(remoteURL) + if repoName == "" { + return "", fmt.Errorf("could not extract repo name from URL: %s", remoteURL) + } + return repoName, nil +} + // extractBaseURL extracts the base Artifactory URL from a Conan remote URL. // Example: "https://myserver.jfrog.io/artifactory/api/conan/repo" -> "https://myserver.jfrog.io" func extractBaseURL(remoteURL string) string { diff --git a/artifactory/commands/conan/upload.go b/artifactory/commands/conan/upload.go index 4a0983ef..52139adf 100644 --- a/artifactory/commands/conan/upload.go +++ b/artifactory/commands/conan/upload.go @@ -14,6 +14,10 @@ import ( ) // UploadProcessor processes Conan upload output and collects build info. +// It parses the upload output to: +// 1. Extract which artifacts were uploaded (to avoid collecting all revisions) +// 2. Collect dependencies from the local project +// 3. Set build properties on uploaded artifacts type UploadProcessor struct { workingDir string buildConfiguration *buildUtils.BuildConfiguration @@ -31,6 +35,10 @@ func NewUploadProcessor(workingDir string, buildConfig *buildUtils.BuildConfigur // Process processes the upload output and collects build info. func (up *UploadProcessor) Process(uploadOutput string) error { + // Parse uploaded artifacts from output - only collect what was actually uploaded + uploadedPaths := up.parseUploadedArtifactPaths(uploadOutput) + log.Debug(fmt.Sprintf("Found %d uploaded artifact paths", len(uploadedPaths))) + // Parse package reference from upload output packageRef := up.parsePackageReference(uploadOutput) if packageRef == "" { @@ -46,25 +54,28 @@ func (up *UploadProcessor) Process(uploadOutput string) error { buildInfo = up.createEmptyBuildInfo(packageRef) } - // Extract remote name and set target repo - remoteName := extractRemoteNameFromOutput(uploadOutput) - if remoteName == "" { - remoteName = "conan-local" + // Get target repository from upload output + targetRepo, err := up.getTargetRepository(uploadOutput) + if err != nil { + log.Warn(fmt.Sprintf("Could not determine target repository: %v", err)) + log.Warn("Build info will be saved but artifacts may not be linked correctly") + return up.saveBuildInfo(buildInfo) } + log.Debug(fmt.Sprintf("Using Artifactory repository: %s", targetRepo)) - // Collect artifacts from Artifactory - if up.serverDetails != nil { - artifacts, err := up.collectArtifacts(packageRef, remoteName) - if err != nil { - log.Warn(fmt.Sprintf("Failed to collect artifacts: %v", err)) + // Collect artifacts from Artifactory - only for uploaded paths + if up.serverDetails != nil && len(uploadedPaths) > 0 { + artifacts, collectErr := up.collectUploadedArtifacts(uploadedPaths, targetRepo) + if collectErr != nil { + log.Warn(fmt.Sprintf("Failed to collect artifacts: %v", collectErr)) } else { up.addArtifactsToModule(buildInfo, artifacts) - } - // Set build properties on artifacts - if len(artifacts) > 0 { - if err := up.setBuildProperties(artifacts, remoteName); err != nil { - log.Warn(fmt.Sprintf("Failed to set build properties: %v", err)) + // Set build properties on artifacts + if len(artifacts) > 0 { + if err := up.setBuildProperties(artifacts, targetRepo); err != nil { + log.Warn(fmt.Sprintf("Failed to set build properties: %v", err)) + } } } } @@ -72,6 +83,128 @@ func (up *UploadProcessor) Process(uploadOutput string) error { return up.saveBuildInfo(buildInfo) } +// getTargetRepository extracts the Conan remote from upload output and resolves it to Artifactory repo. +// Returns error if remote cannot be determined or is not an Artifactory repository. +func (up *UploadProcessor) getTargetRepository(uploadOutput string) (string, error) { + remoteName := extractRemoteNameFromOutput(uploadOutput) + if remoteName == "" { + return "", fmt.Errorf("could not extract remote name from upload output") + } + + // Verify this is an Artifactory Conan remote + remoteURL, err := getRemoteURL(remoteName) + if err != nil { + return "", fmt.Errorf("could not get URL for remote '%s': %w", remoteName, err) + } + + if !isArtifactoryConanRemote(remoteURL) { + return "", fmt.Errorf("remote '%s' is not an Artifactory Conan repository (URL: %s)", remoteName, remoteURL) + } + + // Get the Artifactory repository name from the URL + repoName := ExtractRepoName(remoteURL) + if repoName == "" { + return "", fmt.Errorf("could not extract repository name from URL: %s", remoteURL) + } + + return repoName, nil +} + +// parseUploadedArtifactPaths extracts the specific paths that were uploaded from conan upload output. +// Conan upload output has a hierarchical structure: +// +// simplelib/1.0.0 <- Package name/version +// 86deb56ab95f8fe27d07debf8a6ee3f9 (Uploaded) <- Recipe revision (MD5, 32 chars) +// 9f5e648a74c49245b42a22f586fcb7c4da7f5821 <- Package ID (SHA1, 40 chars) +// 7002fe990671bdb248e67579987227c4 (Uploaded) <- Package revision (MD5, 32 chars) +// +// This method parses this structure and builds Artifactory paths like: +// - _/simplelib/1.0.0/_/86deb56.../export (for recipe) +// - _/simplelib/1.0.0/_/86deb56.../package/9f5e648.../7002fe9... (for package) +func (up *UploadProcessor) parseUploadedArtifactPaths(output string) []string { + var paths []string + lines := strings.Split(output, "\n") + + // State tracking for hierarchical parsing + var currentPkg string // Current package name/version (e.g., "simplelib/1.0.0") + var currentRecipeRev string // Current recipe revision hash (MD5, 32 chars) + var currentPkgId string // Current package ID (SHA1, 40 chars) + + for _, line := range lines { + trimmed := strings.TrimSpace(line) + + // Match package name/version line: "simplelib/1.0.0" + if up.isPackageNameLine(trimmed) { + parts := strings.Split(trimmed, "/") + if len(parts) == 2 { + currentPkg = trimmed + currentRecipeRev = "" + currentPkgId = "" + } + continue + } + + // Match recipe revision with (Uploaded): "86deb56ab95f8fe27d07debf8a6ee3f9 (Uploaded)" + if strings.Contains(trimmed, "(Uploaded)") && currentPkg != "" { + rev := strings.TrimSuffix(strings.TrimSpace(trimmed), " (Uploaded)") + if len(rev) == 32 && currentPkgId == "" { + // This is a recipe revision (no package ID seen yet) + currentRecipeRev = rev + path := fmt.Sprintf("_/%s/_/%s/export", currentPkg, rev) + paths = append(paths, path) + log.Debug(fmt.Sprintf("Found uploaded recipe: %s", path)) + } else if len(rev) == 32 && currentPkgId != "" && currentRecipeRev != "" { + // This is a package revision + path := fmt.Sprintf("_/%s/_/%s/package/%s/%s", currentPkg, currentRecipeRev, currentPkgId, rev) + paths = append(paths, path) + log.Debug(fmt.Sprintf("Found uploaded package: %s", path)) + currentPkgId = "" // Reset for next package + } + continue + } + + // Match package ID line (SHA1, 40 chars, no spaces) + if currentRecipeRev != "" && len(trimmed) == 40 && !strings.Contains(trimmed, " ") { + currentPkgId = trimmed + } + } + + return paths +} + +// isPackageNameLine checks if a line represents a package name/version. +func (up *UploadProcessor) isPackageNameLine(line string) bool { + return strings.Contains(line, "/") && + !strings.Contains(line, "#") && + !strings.Contains(line, ":") && + !strings.HasPrefix(line, "_") && + !strings.Contains(line, "Uploading") && + !strings.Contains(line, "Skipped") && + !strings.Contains(line, "(") +} + +// collectUploadedArtifacts collects only artifacts from specific paths that were uploaded. +func (up *UploadProcessor) collectUploadedArtifacts(uploadedPaths []string, targetRepo string) ([]entities.Artifact, error) { + if up.serverDetails == nil { + return nil, fmt.Errorf("server details not initialized") + } + + collector := NewArtifactCollector(up.serverDetails, targetRepo) + var allArtifacts []entities.Artifact + + for _, path := range uploadedPaths { + artifacts, err := collector.CollectArtifactsForPath(path) + if err != nil { + log.Debug(fmt.Sprintf("Failed to collect artifacts for path %s: %v", path, err)) + continue + } + allArtifacts = append(allArtifacts, artifacts...) + } + + log.Info(fmt.Sprintf("Collected %d Conan artifacts", len(allArtifacts))) + return allArtifacts, nil +} + // parsePackageReference extracts package reference from upload output. func (up *UploadProcessor) parsePackageReference(output string) string { lines := strings.Split(output, "\n") @@ -105,20 +238,20 @@ func (up *UploadProcessor) parsePackageReference(output string) string { } } - // Fallback: look for "Uploading recipe" pattern - return up.parseUploadPattern(lines) + // Fallback: look for "Uploading recipe" pattern (older Conan output format) + return up.parseUploadingRecipePattern(lines) } -// parseUploadPattern looks for package reference in upload lines. -func (up *UploadProcessor) parseUploadPattern(lines []string) string { +// parseUploadingRecipePattern extracts package reference from "Uploading recipe" lines. +// Example: "Uploading recipe 'simplelib/1.0.0#86deb56...'" +func (up *UploadProcessor) parseUploadingRecipePattern(lines []string) string { for _, line := range lines { if strings.Contains(line, "Uploading recipe") { - // Extract package reference from: "Uploading recipe 'name/version#rev'" start := strings.Index(line, "'") end := strings.LastIndex(line, "'") if start != -1 && end > start { ref := line[start+1 : end] - // Remove revision if present + // Remove revision if present (after #) if hashIdx := strings.Index(ref, "#"); hashIdx != -1 { ref = ref[:hashIdx] } @@ -155,12 +288,7 @@ func (up *UploadProcessor) collectDependencies() (*entities.BuildInfo, error) { return nil, fmt.Errorf("collect build info: %w", err) } - log.Info(fmt.Sprintf("Collected build info with %d modules", len(buildInfo.Modules))) - if len(buildInfo.Modules) > 0 { - log.Info(fmt.Sprintf("Module '%s' has %d dependencies", - buildInfo.Modules[0].Id, len(buildInfo.Modules[0].Dependencies))) - } - + log.Debug(fmt.Sprintf("Collected build info with %d modules", len(buildInfo.Modules))) return buildInfo, nil } @@ -176,33 +304,16 @@ func (up *UploadProcessor) createEmptyBuildInfo(packageRef string) *entities.Bui } } -// collectArtifacts collects artifacts from Artifactory. -func (up *UploadProcessor) collectArtifacts(packageRef, remoteName string) ([]entities.Artifact, error) { - collector := NewArtifactCollector(up.serverDetails, remoteName) - artifacts, err := collector.CollectArtifacts(packageRef) - if err != nil { - return nil, err - } - - log.Info(fmt.Sprintf("Found %d Conan artifacts in Artifactory", len(artifacts))) - return artifacts, nil -} - // addArtifactsToModule adds artifacts to the first module in build info. func (up *UploadProcessor) addArtifactsToModule(buildInfo *entities.BuildInfo, artifacts []entities.Artifact) { if len(buildInfo.Modules) == 0 { return } - buildInfo.Modules[0].Artifacts = artifacts - log.Info(fmt.Sprintf("Module '%s' now has %d dependencies and %d artifacts", - buildInfo.Modules[0].Id, - len(buildInfo.Modules[0].Dependencies), - len(buildInfo.Modules[0].Artifacts))) } // setBuildProperties sets build properties on artifacts in Artifactory. -func (up *UploadProcessor) setBuildProperties(artifacts []entities.Artifact, remoteName string) error { +func (up *UploadProcessor) setBuildProperties(artifacts []entities.Artifact, targetRepo string) error { buildName, err := up.buildConfiguration.GetBuildName() if err != nil { return err @@ -215,7 +326,7 @@ func (up *UploadProcessor) setBuildProperties(artifacts []entities.Artifact, rem projectKey := up.buildConfiguration.GetProject() - setter := NewBuildPropertySetter(up.serverDetails, remoteName, buildName, buildNumber, projectKey) + setter := NewBuildPropertySetter(up.serverDetails, targetRepo, buildName, buildNumber, projectKey) return setter.SetProperties(artifacts) } @@ -232,11 +343,12 @@ func (up *UploadProcessor) saveBuildInfo(buildInfo *entities.BuildInfo) error { return fmt.Errorf("save build info: %w", err) } - log.Info("Successfully saved Conan build info") + log.Info("Conan build info saved locally") return nil } // extractRemoteNameFromOutput extracts the remote name from conan upload output. +// Looks in the "Upload summary" section for the remote name. func extractRemoteNameFromOutput(output string) string { lines := strings.Split(output, "\n") inSummary := false @@ -259,28 +371,3 @@ func extractRemoteNameFromOutput(output string) string { } return "" } - -// FlexPackCollector wraps the FlexPack Conan collector. -type FlexPackCollector struct { - config conanflex.ConanConfig -} - -// NewFlexPackCollector creates a new FlexPack collector. -func NewFlexPackCollector(workingDir string) (*FlexPackCollector, error) { - return &FlexPackCollector{ - config: conanflex.ConanConfig{ - WorkingDirectory: workingDir, - }, - }, nil -} - -// CollectBuildInfo collects build info using FlexPack. -func (fc *FlexPackCollector) CollectBuildInfo(buildName, buildNumber string) (*entities.BuildInfo, error) { - collector, err := conanflex.NewConanFlexPack(fc.config) - if err != nil { - return nil, fmt.Errorf("create conan flexpack: %w", err) - } - - return collector.CollectBuildInfo(buildName, buildNumber) -} - From ec943fa56453fca732c3b13fb99119a4632bab69 Mon Sep 17 00:00:00 2001 From: Reshmi Date: Mon, 22 Dec 2025 16:17:35 +0530 Subject: [PATCH 05/10] refactor logic for upload artifacts and login into rt --- artifactory/commands/conan/artifacts.go | 102 +++++++++++-------- artifactory/commands/conan/artifacts_test.go | 3 + artifactory/commands/conan/command_test.go | 3 + artifactory/commands/conan/login.go | 22 ++-- artifactory/commands/conan/login_test.go | 3 + artifactory/commands/conan/upload.go | 94 +++++++++++------ artifactory/commands/conan/upload_test.go | 3 + 7 files changed, 147 insertions(+), 83 deletions(-) diff --git a/artifactory/commands/conan/artifacts.go b/artifactory/commands/conan/artifacts.go index d4e846dc..e7551d57 100644 --- a/artifactory/commands/conan/artifacts.go +++ b/artifactory/commands/conan/artifacts.go @@ -9,7 +9,6 @@ import ( "github.com/jfrog/build-info-go/entities" "github.com/jfrog/jfrog-cli-core/v2/artifactory/utils" "github.com/jfrog/jfrog-cli-core/v2/utils/config" - "github.com/jfrog/jfrog-client-go/artifactory" "github.com/jfrog/jfrog-client-go/artifactory/services" specutils "github.com/jfrog/jfrog-client-go/artifactory/services/utils" "github.com/jfrog/jfrog-client-go/utils/io/content" @@ -53,14 +52,16 @@ func (ac *ArtifactCollector) CollectArtifacts(packageRef string) ([]entities.Art return ac.searchArtifacts(buildArtifactQuery(ac.targetRepo, pkgInfo)) } -// CollectArtifactsForPath collects artifacts from a specific path pattern. +// CollectArtifactsForPath collects artifacts from a specific path. // Used to collect only artifacts that were uploaded in the current build. -func (ac *ArtifactCollector) CollectArtifactsForPath(pathPattern string) ([]entities.Artifact, error) { +// The path should be exact (e.g., "_/multideps/1.0.0/_/revision/export") +func (ac *ArtifactCollector) CollectArtifactsForPath(exactPath string) ([]entities.Artifact, error) { if ac.serverDetails == nil { return nil, fmt.Errorf("server details not initialized") } - query := fmt.Sprintf(`{"repo": "%s", "path": {"$match": "%s/*"}}`, ac.targetRepo, pathPattern) + // Use exact path match - artifacts are directly in the path, not subfolders + query := fmt.Sprintf(`{"repo": "%s", "path": "%s"}`, ac.targetRepo, exactPath) return ac.searchArtifacts(query) } @@ -181,9 +182,9 @@ func NewBuildPropertySetter(serverDetails *config.ServerDetails, targetRepo, bui } } -// SetProperties sets build properties on the given artifacts. -// Properties are set one by one as Artifactory API requires individual file paths. -// This is the same approach used by Maven and other package managers. +// SetProperties sets build properties on the given artifacts in a single batch operation. +// This uses the same approach as Docker - writing all items to a temp file and making +// one SetProps call, which is much more efficient than individual calls per artifact. func (bps *BuildPropertySetter) SetProperties(artifacts []entities.Artifact) error { if len(artifacts) == 0 || bps.serverDetails == nil { return nil @@ -194,22 +195,68 @@ func (bps *BuildPropertySetter) SetProperties(artifacts []entities.Artifact) err return fmt.Errorf("create services manager: %w", err) } + // Convert artifacts to ResultItem format for batch processing + resultItems := bps.convertToResultItems(artifacts) + if len(resultItems) == 0 { + return nil + } + + // Write all items to a temp file (like Docker does) + pathToFile, err := bps.writeItemsToFile(resultItems) + if err != nil { + return fmt.Errorf("write items to file: %w", err) + } + + // Create reader and set properties in one batch call + reader := content.NewContentReader(pathToFile, content.DefaultKey) + defer closeReader(reader) + timestamp := strconv.FormatInt(time.Now().UnixMilli(), 10) props := bps.formatBuildProperties(timestamp) - successCount := 0 - for _, artifact := range artifacts { - if err := bps.setPropertiesOnArtifact(servicesManager, artifact, props); err != nil { - log.Debug(fmt.Sprintf("Failed to set properties on %s: %s", artifact.Name, err.Error())) - continue - } - successCount++ + _, err = servicesManager.SetProps(services.PropsParams{Reader: reader, Props: props}) + if err != nil { + return fmt.Errorf("set properties: %w", err) } - log.Info(fmt.Sprintf("Set build properties on %d Conan artifacts", successCount)) + log.Info(fmt.Sprintf("Set build properties on %d Conan artifacts (batch)", len(artifacts))) return nil } +// convertToResultItems converts build-info artifacts to ResultItem format for SetProps. +func (bps *BuildPropertySetter) convertToResultItems(artifacts []entities.Artifact) []specutils.ResultItem { + var items []specutils.ResultItem + for _, artifact := range artifacts { + items = append(items, specutils.ResultItem{ + Repo: bps.targetRepo, + Path: artifact.Path, + Name: artifact.Name, + Actual_Sha1: artifact.Checksum.Sha1, + Actual_Md5: artifact.Checksum.Md5, + Sha256: artifact.Checksum.Sha256, + }) + } + return items +} + +// writeItemsToFile writes result items to a temp file for batch processing. +func (bps *BuildPropertySetter) writeItemsToFile(items []specutils.ResultItem) (string, error) { + writer, err := content.NewContentWriter("results", true, false) + if err != nil { + return "", err + } + defer func() { + if closeErr := writer.Close(); closeErr != nil { + log.Debug(fmt.Sprintf("Failed to close writer: %s", closeErr)) + } + }() + + for _, item := range items { + writer.Write(item) + } + return writer.GetFilePath(), nil +} + // formatBuildProperties creates the build properties string. // Only includes build.name, build.number, build.timestamp (and optional build.project). func (bps *BuildPropertySetter) formatBuildProperties(timestamp string) string { @@ -223,31 +270,6 @@ func (bps *BuildPropertySetter) formatBuildProperties(timestamp string) string { return props } -// setPropertiesOnArtifact sets properties on a single artifact. -func (bps *BuildPropertySetter) setPropertiesOnArtifact(manager artifactory.ArtifactoryServicesManager, artifact entities.Artifact, props string) error { - artifactPath := fmt.Sprintf("%s/%s/%s", bps.targetRepo, artifact.Path, artifact.Name) - - searchParams := services.SearchParams{ - CommonParams: &specutils.CommonParams{ - Pattern: artifactPath, - }, - } - - reader, err := manager.SearchFiles(searchParams) - if err != nil { - return fmt.Errorf("search artifact: %w", err) - } - defer closeReader(reader) - - propsParams := services.PropsParams{ - Reader: reader, - Props: props, - } - - _, err = manager.SetProps(propsParams) - return err -} - // closeReader safely closes a content reader. func closeReader(reader *content.ContentReader) { if reader != nil { diff --git a/artifactory/commands/conan/artifacts_test.go b/artifactory/commands/conan/artifacts_test.go index df0be2b6..a1902b49 100644 --- a/artifactory/commands/conan/artifacts_test.go +++ b/artifactory/commands/conan/artifacts_test.go @@ -265,3 +265,6 @@ func TestNewBuildPropertySetter(t *testing.T) { assert.Equal(t, targetRepo, setter.targetRepo) } + + + diff --git a/artifactory/commands/conan/command_test.go b/artifactory/commands/conan/command_test.go index 0aeca22a..d85f1698 100644 --- a/artifactory/commands/conan/command_test.go +++ b/artifactory/commands/conan/command_test.go @@ -131,3 +131,6 @@ func TestNewDependencyCollector(t *testing.T) { assert.Nil(t, collector.buildConfiguration) } + + + diff --git a/artifactory/commands/conan/login.go b/artifactory/commands/conan/login.go index f588a585..024a40ad 100644 --- a/artifactory/commands/conan/login.go +++ b/artifactory/commands/conan/login.go @@ -59,7 +59,6 @@ func ValidateAndLogin(remoteName string) (*config.ServerDetails, error) { if err != nil { return nil, err } - log.Info(fmt.Sprintf("Found %d matching JFrog CLI config(s): %s", len(matchingConfigs), formatServerIDs(matchingConfigs))) // Try to login with each matching config return tryLoginWithConfigs(remoteName, matchingConfigs) @@ -275,23 +274,25 @@ func loginToRemote(remoteName string, serverDetails *config.ServerDetails) error } // extractCredentials extracts username and password/token from server details. +// For Conan authentication with Artifactory func extractCredentials(serverDetails *config.ServerDetails) (username, password string, err error) { - // Prefer access token over password - if serverDetails.AccessToken != "" { - username = serverDetails.User - if username == "" { - username = "token" - } - password = serverDetails.AccessToken - return username, password, nil + username = serverDetails.User + if username == "" { + username = "admin" } + // Prefer password over access token for Conan (API keys work more reliably) if serverDetails.Password != "" { - username = serverDetails.User password = serverDetails.Password return username, password, nil } + // Fall back to access token if no password + if serverDetails.AccessToken != "" { + password = serverDetails.AccessToken + return username, password, nil + } + return "", "", fmt.Errorf("no credentials (password or access token) found in JFrog CLI config for server '%s'", serverDetails.ServerId) } @@ -303,4 +304,3 @@ func formatServerIDs(configs []*config.ServerDetails) string { } return strings.Join(ids, ", ") } - diff --git a/artifactory/commands/conan/login_test.go b/artifactory/commands/conan/login_test.go index f6460a33..bcd56360 100644 --- a/artifactory/commands/conan/login_test.go +++ b/artifactory/commands/conan/login_test.go @@ -300,3 +300,6 @@ func TestFormatServerIDs(t *testing.T) { } } + + + diff --git a/artifactory/commands/conan/upload.go b/artifactory/commands/conan/upload.go index 52139adf..27625c3c 100644 --- a/artifactory/commands/conan/upload.go +++ b/artifactory/commands/conan/upload.go @@ -111,60 +111,90 @@ func (up *UploadProcessor) getTargetRepository(uploadOutput string) (string, err } // parseUploadedArtifactPaths extracts the specific paths that were uploaded from conan upload output. -// Conan upload output has a hierarchical structure: +// Conan 2.x upload summary format: // -// simplelib/1.0.0 <- Package name/version -// 86deb56ab95f8fe27d07debf8a6ee3f9 (Uploaded) <- Recipe revision (MD5, 32 chars) -// 9f5e648a74c49245b42a22f586fcb7c4da7f5821 <- Package ID (SHA1, 40 chars) -// 7002fe990671bdb248e67579987227c4 (Uploaded) <- Package revision (MD5, 32 chars) +// Upload summary: +// conan-local-testing-reshmi <- Remote name +// multideps/1.0.0 <- Package name/version +// revisions +// 797d134a8590a1bfa06d846768443f48 (Uploaded) <- Recipe revision +// packages +// 594ed0eb2e9dfcc60607438924c35871514e6c2a <- Package ID +// revisions +// ca858ea14c32f931e49241df0b52bec9 (Uploaded) <- Package revision // // This method parses this structure and builds Artifactory paths like: -// - _/simplelib/1.0.0/_/86deb56.../export (for recipe) -// - _/simplelib/1.0.0/_/86deb56.../package/9f5e648.../7002fe9... (for package) +// - _/multideps/1.0.0/_/797d134.../export (for recipe) +// - _/multideps/1.0.0/_/797d134.../package/594ed0.../ca858ea... (for package) func (up *UploadProcessor) parseUploadedArtifactPaths(output string) []string { var paths []string lines := strings.Split(output, "\n") // State tracking for hierarchical parsing - var currentPkg string // Current package name/version (e.g., "simplelib/1.0.0") + var currentPkg string // Current package name/version (e.g., "multideps/1.0.0") var currentRecipeRev string // Current recipe revision hash (MD5, 32 chars) var currentPkgId string // Current package ID (SHA1, 40 chars) + inUploadSection := false for _, line := range lines { trimmed := strings.TrimSpace(line) - // Match package name/version line: "simplelib/1.0.0" + // Start parsing after "Upload summary" or "Uploading to remote" + if strings.Contains(line, "Upload summary") || strings.Contains(line, "Uploading to remote") { + inUploadSection = true + continue + } + + if !inUploadSection { + continue + } + + // Skip empty lines and section markers + if trimmed == "" || trimmed == "revisions" || trimmed == "packages" { + continue + } + + // Match package name/version line: "multideps/1.0.0" + // Must contain "/" but not be a path or special marker if up.isPackageNameLine(trimmed) { - parts := strings.Split(trimmed, "/") - if len(parts) == 2 { - currentPkg = trimmed - currentRecipeRev = "" - currentPkgId = "" - } + currentPkg = trimmed + currentRecipeRev = "" + currentPkgId = "" continue } - // Match recipe revision with (Uploaded): "86deb56ab95f8fe27d07debf8a6ee3f9 (Uploaded)" - if strings.Contains(trimmed, "(Uploaded)") && currentPkg != "" { - rev := strings.TrimSuffix(strings.TrimSpace(trimmed), " (Uploaded)") - if len(rev) == 32 && currentPkgId == "" { - // This is a recipe revision (no package ID seen yet) - currentRecipeRev = rev - path := fmt.Sprintf("_/%s/_/%s/export", currentPkg, rev) - paths = append(paths, path) - log.Debug(fmt.Sprintf("Found uploaded recipe: %s", path)) - } else if len(rev) == 32 && currentPkgId != "" && currentRecipeRev != "" { - // This is a package revision - path := fmt.Sprintf("_/%s/_/%s/package/%s/%s", currentPkg, currentRecipeRev, currentPkgId, rev) - paths = append(paths, path) - log.Debug(fmt.Sprintf("Found uploaded package: %s", path)) - currentPkgId = "" // Reset for next package + // Match recipe/package revision with (Uploaded) or (Skipped, already in server) + // Both cases mean the artifact is in Artifactory and should be part of build info + if strings.Contains(trimmed, "(Uploaded)") || strings.Contains(trimmed, "(Skipped") { + // Extract revision hash by removing status suffix + rev := trimmed + if idx := strings.Index(rev, " ("); idx != -1 { + rev = rev[:idx] + } + rev = strings.TrimSpace(rev) + + if len(rev) == 32 { + if currentPkgId == "" { + // This is a recipe revision + currentRecipeRev = rev + if currentPkg != "" { + path := fmt.Sprintf("_/%s/_/%s/export", currentPkg, rev) + paths = append(paths, path) + } + } else if currentRecipeRev != "" { + // This is a package revision + if currentPkg != "" { + path := fmt.Sprintf("_/%s/_/%s/package/%s/%s", currentPkg, currentRecipeRev, currentPkgId, rev) + paths = append(paths, path) + } + currentPkgId = "" // Reset for next package + } } continue } - // Match package ID line (SHA1, 40 chars, no spaces) - if currentRecipeRev != "" && len(trimmed) == 40 && !strings.Contains(trimmed, " ") { + // Match package ID line (SHA1, 40 chars, no spaces, no parentheses) + if len(trimmed) == 40 && !strings.Contains(trimmed, " ") && !strings.Contains(trimmed, "(") { currentPkgId = trimmed } } diff --git a/artifactory/commands/conan/upload_test.go b/artifactory/commands/conan/upload_test.go index dc0ea309..32e18c31 100644 --- a/artifactory/commands/conan/upload_test.go +++ b/artifactory/commands/conan/upload_test.go @@ -176,3 +176,6 @@ func TestNewFlexPackCollector(t *testing.T) { assert.Equal(t, workingDir, collector.config.WorkingDirectory) } + + + From f0f7228d52f442451fcc0a08e65d6b53dd952ef3 Mon Sep 17 00:00:00 2001 From: Reshmi Date: Tue, 23 Dec 2025 10:25:50 +0530 Subject: [PATCH 06/10] remvoed unused methods and tests --- artifactory/commands/conan/artifacts.go | 2 +- artifactory/commands/conan/artifacts_test.go | 50 -------------------- artifactory/commands/conan/command_test.go | 9 ---- artifactory/commands/conan/login_test.go | 6 +-- artifactory/commands/conan/upload_test.go | 49 ------------------- 5 files changed, 4 insertions(+), 112 deletions(-) diff --git a/artifactory/commands/conan/artifacts.go b/artifactory/commands/conan/artifacts.go index e7551d57..55e1b98d 100644 --- a/artifactory/commands/conan/artifacts.go +++ b/artifactory/commands/conan/artifacts.go @@ -214,7 +214,7 @@ func (bps *BuildPropertySetter) SetProperties(artifacts []entities.Artifact) err timestamp := strconv.FormatInt(time.Now().UnixMilli(), 10) props := bps.formatBuildProperties(timestamp) - _, err = servicesManager.SetProps(services.PropsParams{Reader: reader, Props: props}) + _, err = servicesManager.SetProps(services.PropsParams{Reader: reader, Props: props, UseDebugLogs: true, IsRecursive: true}) if err != nil { return fmt.Errorf("set properties: %w", err) } diff --git a/artifactory/commands/conan/artifacts_test.go b/artifactory/commands/conan/artifacts_test.go index a1902b49..97573166 100644 --- a/artifactory/commands/conan/artifacts_test.go +++ b/artifactory/commands/conan/artifacts_test.go @@ -149,56 +149,6 @@ func TestBuildArtifactQuery(t *testing.T) { } } -func TestClassifyArtifactType(t *testing.T) { - tests := []struct { - name string - filename string - expected string - }{ - { - name: "Conan recipe file", - filename: "conanfile.py", - expected: "conan-recipe", - }, - { - name: "Conan manifest file", - filename: "conanmanifest.txt", - expected: "conan-manifest", - }, - { - name: "Conan info file", - filename: "conaninfo.txt", - expected: "conan-info", - }, - { - name: "Conan sources archive", - filename: "conan_sources.tgz", - expected: "conan-package", - }, - { - name: "Conan package archive", - filename: "conan_package.tgz", - expected: "conan-package", - }, - { - name: "Unknown file type", - filename: "readme.md", - expected: "conan-artifact", - }, - { - name: "Header file", - filename: "mylib.h", - expected: "conan-artifact", - }, - } - - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - result := classifyArtifactType(tt.filename) - assert.Equal(t, tt.expected, result) - }) - } -} func TestBuildPropertySetter_FormatBuildProperties(t *testing.T) { tests := []struct { diff --git a/artifactory/commands/conan/command_test.go b/artifactory/commands/conan/command_test.go index d85f1698..b86e7167 100644 --- a/artifactory/commands/conan/command_test.go +++ b/artifactory/commands/conan/command_test.go @@ -121,15 +121,6 @@ func TestConanCommand_ChainedSetters(t *testing.T) { assert.Equal(t, serverDetails, cmd.serverDetails) } -func TestNewDependencyCollector(t *testing.T) { - workingDir := "/test/path" - - collector := NewDependencyCollector(workingDir, nil) - - assert.NotNil(t, collector) - assert.Equal(t, workingDir, collector.workingDir) - assert.Nil(t, collector.buildConfiguration) -} diff --git a/artifactory/commands/conan/login_test.go b/artifactory/commands/conan/login_test.go index bcd56360..a4c395c9 100644 --- a/artifactory/commands/conan/login_test.go +++ b/artifactory/commands/conan/login_test.go @@ -213,7 +213,7 @@ func TestExtractCredentials(t *testing.T) { serverDetails: &config.ServerDetails{ AccessToken: "my-access-token", }, - expectedUsername: "token", + expectedUsername: "admin", // Defaults to "admin" when no user specified expectedPassword: "my-access-token", expectError: false, }, @@ -228,14 +228,14 @@ func TestExtractCredentials(t *testing.T) { expectError: false, }, { - name: "Prefer access token over password", + name: "Prefer password over access token", serverDetails: &config.ServerDetails{ User: "myuser", Password: "mypassword", AccessToken: "my-access-token", }, expectedUsername: "myuser", - expectedPassword: "my-access-token", + expectedPassword: "mypassword", // Password is preferred for Conan (API keys work more reliably) expectError: false, }, { diff --git a/artifactory/commands/conan/upload_test.go b/artifactory/commands/conan/upload_test.go index 32e18c31..915869f6 100644 --- a/artifactory/commands/conan/upload_test.go +++ b/artifactory/commands/conan/upload_test.go @@ -114,46 +114,6 @@ Upload completed in 3s } } -func TestUploadProcessor_ParseUploadPattern(t *testing.T) { - tests := []struct { - name string - lines []string - expected string - }{ - { - name: "Standard uploading recipe line", - lines: []string{ - "simplelib/1.0.0: Uploading recipe 'simplelib/1.0.0#86deb56ab95f8fe27d07debf8a6ee3f9' (1.6KB)", - }, - expected: "simplelib/1.0.0", - }, - { - name: "Multiple lines with uploading recipe", - lines: []string{ - "Some other line", - "mypackage/2.0.0: Uploading recipe 'mypackage/2.0.0#abc123' (2KB)", - "Another line", - }, - expected: "mypackage/2.0.0", - }, - { - name: "No uploading recipe line", - lines: []string{ - "Some output", - "No recipe here", - }, - expected: "", - }, - } - - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - processor := &UploadProcessor{} - result := processor.parseUploadPattern(tt.lines) - assert.Equal(t, tt.expected, result) - }) - } -} func TestNewUploadProcessor(t *testing.T) { workingDir := "/test/path" @@ -166,15 +126,6 @@ func TestNewUploadProcessor(t *testing.T) { assert.Nil(t, processor.serverDetails) } -func TestNewFlexPackCollector(t *testing.T) { - workingDir := "/test/path" - - collector, err := NewFlexPackCollector(workingDir) - - assert.NoError(t, err) - assert.NotNil(t, collector) - assert.Equal(t, workingDir, collector.config.WorkingDirectory) -} From f7f41aace23114b02df9a7d242967dc7f64a5752 Mon Sep 17 00:00:00 2001 From: Reshmi Date: Tue, 23 Dec 2025 10:38:02 +0530 Subject: [PATCH 07/10] fixed linters --- artifactory/commands/conan/artifacts.go | 12 ++++++------ artifactory/commands/conan/command.go | 21 +++++++-------------- 2 files changed, 13 insertions(+), 20 deletions(-) diff --git a/artifactory/commands/conan/artifacts.go b/artifactory/commands/conan/artifacts.go index 55e1b98d..5ccd8a48 100644 --- a/artifactory/commands/conan/artifacts.go +++ b/artifactory/commands/conan/artifacts.go @@ -84,11 +84,11 @@ func (ac *ArtifactCollector) searchArtifacts(aqlQuery string) ([]entities.Artifa } defer closeReader(reader) - return parseSearchResults(reader) + return parseSearchResults(reader), nil } // parseSearchResults converts AQL search results to artifacts. -func parseSearchResults(reader *content.ContentReader) ([]entities.Artifact, error) { +func parseSearchResults(reader *content.ContentReader) []entities.Artifact { var artifacts []entities.Artifact for item := new(specutils.ResultItem); reader.NextRecord(item) == nil; item = new(specutils.ResultItem) { @@ -104,7 +104,7 @@ func parseSearchResults(reader *content.ContentReader) ([]entities.Artifact, err artifacts = append(artifacts, artifact) } - return artifacts, nil + return artifacts } // ParsePackageReference parses a Conan package reference string into structured info. @@ -231,9 +231,9 @@ func (bps *BuildPropertySetter) convertToResultItems(artifacts []entities.Artifa Repo: bps.targetRepo, Path: artifact.Path, Name: artifact.Name, - Actual_Sha1: artifact.Checksum.Sha1, - Actual_Md5: artifact.Checksum.Md5, - Sha256: artifact.Checksum.Sha256, + Actual_Sha1: artifact.Sha1, + Actual_Md5: artifact.Md5, + Sha256: artifact.Sha256, }) } return items diff --git a/artifactory/commands/conan/command.go b/artifactory/commands/conan/command.go index af7bec65..cdfbf402 100644 --- a/artifactory/commands/conan/command.go +++ b/artifactory/commands/conan/command.go @@ -204,8 +204,8 @@ func (c *ConanCommand) runConanCommand() error { // processBuildInfo processes build info after a successful upload. func (c *ConanCommand) processBuildInfo(uploadOutput string) error { - buildName, buildNumber, err := c.getBuildNameAndNumber() - if err != nil { + buildName, buildNumber, _ := c.getBuildNameAndNumber() + if buildName == "" || buildNumber == "" { return nil // No build info configured, skip silently } @@ -222,8 +222,8 @@ func (c *ConanCommand) processBuildInfo(uploadOutput string) error { // collectAndSaveBuildInfo collects dependencies and saves build info locally. func (c *ConanCommand) collectAndSaveBuildInfo() error { - buildName, buildNumber, err := c.getBuildNameAndNumber() - if err != nil { + buildName, buildNumber, _ := c.getBuildNameAndNumber() + if buildName == "" || buildNumber == "" { return nil // No build info configured, skip silently } @@ -236,21 +236,14 @@ func (c *ConanCommand) collectAndSaveBuildInfo() error { collector, err := conanflex.NewConanFlexPack(conanConfig) if err != nil { - log.Warn("Failed to create Conan FlexPack: " + err.Error()) - return nil + return fmt.Errorf("failed to create Conan FlexPack: %w", err) } - - // Collect build info buildInfo, err := collector.CollectBuildInfo(buildName, buildNumber) if err != nil { - log.Warn("Failed to collect Conan build info: " + err.Error()) - return nil + return fmt.Errorf("failed to collect Conan build info: %w", err) } - - // Save build info locally if err := saveBuildInfoLocally(buildInfo); err != nil { - log.Warn("Failed to save build info: " + err.Error()) - return nil + return fmt.Errorf("failed to save build info: %w", err) } log.Info(fmt.Sprintf("Conan build info collected. Use 'jf rt bp %s %s' to publish it.", buildName, buildNumber)) From 43857b3137ec9836dbaa2d2398e2b8aab28df42d Mon Sep 17 00:00:00 2001 From: Reshmi Date: Tue, 23 Dec 2025 15:10:55 +0530 Subject: [PATCH 08/10] updated build info dependency --- go.mod | 4 ++-- go.sum | 1 + 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/go.mod b/go.mod index 06a8deeb..809497d2 100644 --- a/go.mod +++ b/go.mod @@ -7,7 +7,7 @@ require ( github.com/forPelevin/gomoji v1.4.1 github.com/google/go-containerregistry v0.20.7 github.com/jedib0t/go-pretty/v6 v6.7.5 - github.com/jfrog/build-info-go v1.12.5-0.20251209171349-eb030db986f9 + github.com/jfrog/build-info-go v1.12.5-0.20251209031413-f5f0e93dc8db github.com/jfrog/gofrog v1.7.6 github.com/jfrog/jfrog-cli-core/v2 v2.60.1-0.20251015045218-1a38c9e47097 github.com/jfrog/jfrog-client-go v1.55.1-0.20251209090954-d6b1c70d3a5e @@ -147,6 +147,6 @@ require ( replace github.com/jfrog/jfrog-client-go => github.com/naveenku-jfrog/jfrog-client-go v1.54.2-0.20251212200746-04c08281da50 -replace github.com/jfrog/build-info-go => github.com/reshmifrog/build-info-go v1.8.9-0.20251222123737-474506b9e128 +// replace github.com/jfrog/build-info-go => github.com/reshmifrog/build-info-go v1.8.9-0.20251222123737-474506b9e128 // replace github.com/jfrog/jfrog-cli-core/v2 => github.com/jfrog/jfrog-cli-core/v2 v2.60.1-0.20251026182600-8a8c0428f538 diff --git a/go.sum b/go.sum index 00a9a6d6..41bf2b20 100644 --- a/go.sum +++ b/go.sum @@ -174,6 +174,7 @@ github.com/jedib0t/go-pretty/v6 v6.7.5 h1:9dJSWTJnsXJVVAbvxIFxeHf/JxoJd7GUl5o3Uz github.com/jedib0t/go-pretty/v6 v6.7.5/go.mod h1:YwC5CE4fJ1HFUDeivSV1r//AmANFHyqczZk+U6BDALU= github.com/jfrog/archiver/v3 v3.6.1 h1:LOxnkw9pOn45DzCbZNFV6K0+6dCsQ0L8mR3ZcujO5eI= github.com/jfrog/archiver/v3 v3.6.1/go.mod h1:VgR+3WZS4N+i9FaDwLZbq+jeU4B4zctXL+gL4EMzfLw= +github.com/jfrog/build-info-go v1.12.5-0.20251209031413-f5f0e93dc8db/go.mod h1:9W4U440fdTHwW1HiB/R0VQvz/5q8ZHsms9MWcq+JrdY= 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.60.1-0.20251015045218-1a38c9e47097 h1:+W6BPxJ0nPtlQ6l6nmypW1eEANoVPiN8HDR4kQJA8uI= From 7d453009e5da306d1f6129b9fa558d294ee2bbc8 Mon Sep 17 00:00:00 2001 From: Reshmi Date: Tue, 23 Dec 2025 15:58:56 +0530 Subject: [PATCH 09/10] update deps --- go.mod | 42 ++--- go.sum | 528 --------------------------------------------------------- 2 files changed, 11 insertions(+), 559 deletions(-) delete mode 100644 go.sum diff --git a/go.mod b/go.mod index 809497d2..c7b1a323 100644 --- a/go.mod +++ b/go.mod @@ -7,10 +7,10 @@ require ( github.com/forPelevin/gomoji v1.4.1 github.com/google/go-containerregistry v0.20.7 github.com/jedib0t/go-pretty/v6 v6.7.5 - github.com/jfrog/build-info-go v1.12.5-0.20251209031413-f5f0e93dc8db + github.com/jfrog/build-info-go v1.8.9-0.20251223092904-9e9460642431 github.com/jfrog/gofrog v1.7.6 - github.com/jfrog/jfrog-cli-core/v2 v2.60.1-0.20251015045218-1a38c9e47097 - github.com/jfrog/jfrog-client-go v1.55.1-0.20251209090954-d6b1c70d3a5e + github.com/jfrog/jfrog-cli-core/v2 v2.60.1-0.20251223102649-e659f6937251 + github.com/jfrog/jfrog-client-go v1.55.1-0.20251223101502-1a13a993b0c7 github.com/pkg/errors v0.9.1 github.com/spf13/viper v1.21.0 github.com/stretchr/testify v1.11.1 @@ -33,7 +33,7 @@ require ( github.com/VividCortex/ewma v1.2.0 // indirect github.com/acarl005/stripansi v0.0.0-20180116102854-5a71ef0e047d // indirect github.com/andybalholm/brotli v1.2.0 // indirect - github.com/apache/camel-k/v2 v2.8.0 // indirect + github.com/beevik/etree v1.6.0 // indirect github.com/buger/jsonparser v1.1.1 // indirect github.com/chzyer/readline v1.5.1 // indirect github.com/clipperhouse/stringish v0.1.1 // indirect @@ -53,15 +53,11 @@ require ( github.com/dsnet/compress v0.0.2-0.20210315054119-f66993602bf5 // indirect github.com/emirpasic/gods v1.18.1 // indirect github.com/fsnotify/fsnotify v1.9.0 // indirect - github.com/fxamacker/cbor/v2 v2.9.0 // indirect github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376 // indirect github.com/go-git/go-billy/v5 v5.6.2 // indirect github.com/go-git/go-git/v5 v5.16.3 // indirect - github.com/go-logr/logr v1.4.3 // indirect - github.com/go-logr/zapr v1.3.0 // indirect github.com/go-viper/mapstructure/v2 v2.4.0 // indirect github.com/gocarina/gocsv v0.0.0-20240520201108-78e41c74b4b1 // indirect - github.com/gogo/protobuf v1.3.2 // indirect github.com/golang-jwt/jwt/v4 v4.5.2 // indirect github.com/golang/groupcache v0.0.0-20241129210726-2c02b8208cf8 // indirect github.com/golang/snappy v1.0.0 // indirect @@ -69,7 +65,6 @@ require ( github.com/gookit/color v1.6.0 // indirect github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 // indirect github.com/jfrog/archiver/v3 v3.6.1 // indirect - github.com/json-iterator/go v1.1.12 // indirect github.com/kevinburke/ssh_config v1.2.0 // indirect github.com/klauspost/compress v1.18.1 // indirect github.com/klauspost/cpuid/v2 v2.3.0 // indirect @@ -81,10 +76,8 @@ require ( github.com/mattn/go-tty v0.0.7 // indirect github.com/minio/sha256-simd v1.0.1 // indirect github.com/mitchellh/go-homedir v1.1.0 // indirect - github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect - github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee // indirect github.com/nwaples/rardecode v1.1.3 // indirect - github.com/onsi/ginkgo/v2 v2.25.1 // indirect + github.com/onsi/gomega v1.38.2 // indirect github.com/opencontainers/go-digest v1.0.0 // indirect github.com/opencontainers/image-spec v1.1.1 // indirect github.com/pelletier/go-toml/v2 v2.2.4 // indirect @@ -93,6 +86,8 @@ require ( github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c // indirect github.com/pkg/term v1.2.0-beta.2 // indirect github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect + github.com/prometheus/client_golang v1.23.0 // indirect + github.com/prometheus/procfs v0.17.0 // indirect github.com/rivo/uniseg v0.4.7 // indirect github.com/russross/blackfriday/v2 v2.1.0 // indirect github.com/sagikazarmark/locafero v0.12.0 // indirect @@ -102,21 +97,16 @@ require ( github.com/spf13/afero v1.15.0 // indirect github.com/spf13/cast v1.10.0 // indirect github.com/spf13/pflag v1.0.10 // indirect - github.com/stoewer/go-strcase v1.3.1 // indirect github.com/stretchr/objx v0.5.2 // indirect github.com/subosito/gotenv v1.6.0 // indirect github.com/ulikunitz/xz v0.5.15 // indirect github.com/urfave/cli v1.22.17 // indirect github.com/vbatts/tar-split v0.12.2 // indirect github.com/vbauerster/mpb/v8 v8.10.2 // indirect - github.com/x448/float16 v0.8.4 // indirect github.com/xanzy/ssh-agent v0.3.3 // indirect github.com/xi2/xz v0.0.0-20171230120015-48954b6210f8 // indirect github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e // indirect - go.opentelemetry.io/otel/sdk v1.37.0 // indirect - go.opentelemetry.io/otel/sdk/metric v1.37.0 // indirect - go.uber.org/multierr v1.11.0 // indirect - go.uber.org/zap v1.27.0 // indirect + go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.62.0 // indirect go.yaml.in/yaml/v2 v2.4.2 // indirect go.yaml.in/yaml/v3 v3.0.4 // indirect golang.org/x/crypto v0.45.0 // indirect @@ -127,26 +117,16 @@ require ( google.golang.org/genproto/googleapis/rpc v0.0.0-20250303144028-a0af3efb3deb // indirect google.golang.org/grpc v1.72.1 // indirect google.golang.org/protobuf v1.36.8 // indirect - gopkg.in/inf.v0 v0.9.1 // indirect gopkg.in/warnings.v0 v0.1.2 // indirect - gopkg.in/yaml.v2 v2.4.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect - k8s.io/api v0.34.0 // indirect - k8s.io/apimachinery v0.34.0 // indirect k8s.io/client-go v0.34.0 // indirect - k8s.io/klog/v2 v2.130.1 // indirect - k8s.io/utils v0.0.0-20250604170112-4c0f3b243397 // indirect - sigs.k8s.io/controller-runtime v0.21.0 // indirect - sigs.k8s.io/json v0.0.0-20241014173422-cfa47c3a1cc8 // indirect - sigs.k8s.io/randfill v1.0.0 // indirect - sigs.k8s.io/structured-merge-diff/v6 v6.3.0 // indirect sigs.k8s.io/yaml v1.6.0 // indirect ) -//replace github.com/jfrog/jfrog-cli-core/v2 => github.com/jfrog/jfrog-cli-core/v2 v2.60.1-0.20251015045218-1a38c9e47097 +replace github.com/jfrog/jfrog-cli-core/v2 => ../jfrog-cli-core -replace github.com/jfrog/jfrog-client-go => github.com/naveenku-jfrog/jfrog-client-go v1.54.2-0.20251212200746-04c08281da50 +replace github.com/jfrog/jfrog-client-go => ../jfrog-client-go -// replace github.com/jfrog/build-info-go => github.com/reshmifrog/build-info-go v1.8.9-0.20251222123737-474506b9e128 +//replace github.com/jfrog/build-info-go => github.com/jfrog/build-info-go v1.8.9-0.20251223092904-9e9460642431 // replace github.com/jfrog/jfrog-cli-core/v2 => github.com/jfrog/jfrog-cli-core/v2 v2.60.1-0.20251026182600-8a8c0428f538 diff --git a/go.sum b/go.sum deleted file mode 100644 index 41bf2b20..00000000 --- a/go.sum +++ /dev/null @@ -1,528 +0,0 @@ -dario.cat/mergo v1.0.2 h1:85+piFYR1tMbRrLcDwR18y4UKJ3aH1Tbzi24VRW1TK8= -dario.cat/mergo v1.0.2/go.mod h1:E/hbnu0NxMFBjpMIE34DRGLWqDy0g5FuKDhCb31ngxA= -github.com/AdaLogics/go-fuzz-headers v0.0.0-20230811130428-ced1acdcaa24 h1:bvDV9vkmnHYOMsOr4WLk+Vo07yKIzd94sVoIqshQ4bU= -github.com/AdaLogics/go-fuzz-headers v0.0.0-20230811130428-ced1acdcaa24/go.mod h1:8o94RPi1/7XTJvwPpRSzSUedZrtlirdB3r9Z20bi2f8= -github.com/BurntSushi/toml v1.5.0 h1:W5quZX/G/csjUnuI8SUYlsHs9M38FC7znL0lIO+DvMg= -github.com/BurntSushi/toml v1.5.0/go.mod h1:ukJfTF/6rtPPRCnwkur4qwRxa8vTRFBF0uk2lLoLwho= -github.com/CycloneDX/cyclonedx-go v0.9.3 h1:Pyk/lwavPz7AaZNvugKFkdWOm93MzaIyWmBwmBo3aUI= -github.com/CycloneDX/cyclonedx-go v0.9.3/go.mod h1:vcK6pKgO1WanCdd61qx4bFnSsDJQ6SbM2ZuMIgq86Jg= -github.com/Masterminds/semver/v3 v3.4.0 h1:Zog+i5UMtVoCU8oKka5P7i9q9HgrJeGzI9SA1Xbatp0= -github.com/Masterminds/semver/v3 v3.4.0/go.mod h1:4V+yj/TJE1HU9XfppCwVMZq3I84lprf4nC11bSS5beM= -github.com/Microsoft/go-winio v0.5.2/go.mod h1:WpS1mjBmmwHBEWmogvA2mj8546UReBk4v8QkMxJ6pZY= -github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY= -github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU= -github.com/ProtonMail/go-crypto v1.3.0 h1:ILq8+Sf5If5DCpHQp4PbZdS1J7HDFRXz/+xKBiRGFrw= -github.com/ProtonMail/go-crypto v1.3.0/go.mod h1:9whxjD8Rbs29b4XWbB8irEcE8KHMqaR2e7GWU1R+/PE= -github.com/VividCortex/ewma v1.2.0 h1:f58SaIzcDXrSy3kWaHNvuJgJ3Nmz59Zji6XoJR/q1ow= -github.com/VividCortex/ewma v1.2.0/go.mod h1:nz4BbCtbLyFDeC9SUHbtcT5644juEuWfUAUnGx7j5l4= -github.com/acarl005/stripansi v0.0.0-20180116102854-5a71ef0e047d h1:licZJFw2RwpHMqeKTCYkitsPqHNxTmd4SNR5r94FGM8= -github.com/acarl005/stripansi v0.0.0-20180116102854-5a71ef0e047d/go.mod h1:asat636LX7Bqt5lYEZ27JNDcqxfjdBQuJ/MM4CN/Lzo= -github.com/andybalholm/brotli v1.2.0 h1:ukwgCxwYrmACq68yiUqwIWnGY0cTPox/M94sVwToPjQ= -github.com/andybalholm/brotli v1.2.0/go.mod h1:rzTDkvFWvIrjDXZHkuS16NPggd91W3kUSvPlQ1pLaKY= -github.com/anmitsu/go-shlex v0.0.0-20200514113438-38f4b401e2be h1:9AeTilPcZAjCFIImctFaOjnTIavg87rW78vTPkQqLI8= -github.com/anmitsu/go-shlex v0.0.0-20200514113438-38f4b401e2be/go.mod h1:ySMOLuWl6zY27l47sB3qLNK6tF2fkHG55UZxx8oIVo4= -github.com/apache/camel-k/v2 v2.8.0 h1:zhbAzRFHjZ1n6IcaQDMbt3IidNWYheF34Xse33KrqGY= -github.com/apache/camel-k/v2 v2.8.0/go.mod h1:Dp+0oWh2okNB5cdhpnFjwd/40HwlOLpzzBLX7AT8Slk= -github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5 h1:0CwZNZbxp69SHPdPJAN/hZIm0C4OItdklCFmMRWYpio= -github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs= -github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= -github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= -github.com/bradleyjkemp/cupaloy/v2 v2.8.0 h1:any4BmKE+jGIaMpnU8YgH/I2LPiLBufr6oMMlVBbn9M= -github.com/bradleyjkemp/cupaloy/v2 v2.8.0/go.mod h1:bm7JXdkRd4BHJk9HpwqAI8BoAY1lps46Enkdqw6aRX0= -github.com/bshuster-repo/logrus-logstash-hook v1.0.0 h1:e+C0SB5R1pu//O4MQ3f9cFuPGoOVeF2fE4Og9otCc70= -github.com/bshuster-repo/logrus-logstash-hook v1.0.0/go.mod h1:zsTqEiSzDgAa/8GZR7E1qaXrhYNDKBYy5/dWPTIflbk= -github.com/buger/jsonparser v1.1.1 h1:2PnMjfWD7wBILjqQbt530v576A/cAbQvEW9gGIpYMUs= -github.com/buger/jsonparser v1.1.1/go.mod h1:6RYKKt7H4d4+iWqouImQ9R2FZql3VbhNgx27UK13J/0= -github.com/c-bata/go-prompt v0.2.6 h1:POP+nrHE+DfLYx370bedwNhsqmpCUynWPxuHi0C5vZI= -github.com/c-bata/go-prompt v0.2.6/go.mod h1:/LMAke8wD2FsNu9EXNdHxNLbd9MedkPnCdfpU9wwHfY= -github.com/cenkalti/backoff/v4 v4.3.0 h1:MyRJ/UdXutAwSAT+s3wNd7MfTIcy71VQueUuFK343L8= -github.com/cenkalti/backoff/v4 v4.3.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE= -github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= -github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= -github.com/chzyer/logex v1.2.1 h1:XHDu3E6q+gdHgsdTPH6ImJMIp436vR6MPtH8gP05QzM= -github.com/chzyer/logex v1.2.1/go.mod h1:JLbx6lG2kDbNRFnfkgvh4eRJRPX1QCoOIWomwysCBrQ= -github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= -github.com/chzyer/readline v1.5.1 h1:upd/6fQk4src78LMRzh5vItIt361/o4uq553V8B5sGI= -github.com/chzyer/readline v1.5.1/go.mod h1:Eh+b79XXUwfKfcPLepksvw2tcLE/Ct21YObkaSkeBlk= -github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= -github.com/chzyer/test v1.0.0 h1:p3BQDXSxOhOG0P9z6/hGnII4LGiEPOYBhs8asl/fC04= -github.com/chzyer/test v1.0.0/go.mod h1:2JlltgoNkt4TW/z9V/IzDdFaMTM2JPIi26O1pF38GC8= -github.com/clipperhouse/stringish v0.1.1 h1:+NSqMOr3GR6k1FdRhhnXrLfztGzuG+VuFDfatpWHKCs= -github.com/clipperhouse/stringish v0.1.1/go.mod h1:v/WhFtE1q0ovMta2+m+UbpZ+2/HEXNWYXQgCt4hdOzA= -github.com/clipperhouse/uax29/v2 v2.3.0 h1:SNdx9DVUqMoBuBoW3iLOj4FQv3dN5mDtuqwuhIGpJy4= -github.com/clipperhouse/uax29/v2 v2.3.0/go.mod h1:Wn1g7MK6OoeDT0vL+Q0SQLDz/KpfsVRgg6W7ihQeh4g= -github.com/cloudflare/circl v1.6.1 h1:zqIqSPIndyBh1bjLVVDHMPpVKqp8Su/V+6MeDzzQBQ0= -github.com/cloudflare/circl v1.6.1/go.mod h1:uddAzsPgqdMAYatqJ0lsjX1oECcQLIlRpzZh3pJrofs= -github.com/containerd/containerd v1.7.29 h1:90fWABQsaN9mJhGkoVnuzEY+o1XDPbg9BTC9QTAHnuE= -github.com/containerd/containerd v1.7.29/go.mod h1:azUkWcOvHrWvaiUjSQH0fjzuHIwSPg1WL5PshGP4Szs= -github.com/containerd/errdefs v1.0.0 h1:tg5yIfIlQIrxYtu9ajqY42W3lpS19XqdxRQeEwYG8PI= -github.com/containerd/errdefs v1.0.0/go.mod h1:+YBYIdtsnF4Iw6nWZhJcqGSg/dwvV7tyJ/kCkyJ2k+M= -github.com/containerd/log v0.1.0 h1:TCJt7ioM2cr/tfR8GPbGf9/VRAX8D2B4PjzCpfX540I= -github.com/containerd/log v0.1.0/go.mod h1:VRRf09a7mHDIRezVKTRCrOq78v577GXq3bSa3EhrzVo= -github.com/containerd/platforms v0.2.1 h1:zvwtM3rz2YHPQsF2CHYM8+KtB5dvhISiXh5ZpSBQv6A= -github.com/containerd/platforms v0.2.1/go.mod h1:XHCb+2/hzowdiut9rkudds9bE5yJ7npe7dG/wG+uFPw= -github.com/containerd/stargz-snapshotter/estargz v0.18.1 h1:cy2/lpgBXDA3cDKSyEfNOFMA/c10O1axL69EU7iirO8= -github.com/containerd/stargz-snapshotter/estargz v0.18.1/go.mod h1:ALIEqa7B6oVDsrF37GkGN20SuvG/pIMm7FwP7ZmRb0Q= -github.com/coreos/go-systemd/v22 v22.5.0 h1:RrqgGjYQKalulkV8NGVIfkXQf6YYmOyiJKk8iXXhfZs= -github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= -github.com/cpuguy83/go-md2man/v2 v2.0.7 h1:zbFlGlXEAKlwXpmvle3d8Oe3YnkKIK4xSRTd3sHPnBo= -github.com/cpuguy83/go-md2man/v2 v2.0.7/go.mod h1:oOW0eioCTA6cOiMLiUPZOpcVxMig6NIQQ7OS05n1F4g= -github.com/cyphar/filepath-securejoin v0.6.0 h1:BtGB77njd6SVO6VztOHfPxKitJvd/VPT+OFBFMOi1Is= -github.com/cyphar/filepath-securejoin v0.6.0/go.mod h1:A8hd4EnAeyujCJRrICiOWqjS1AX0a9kM5XL+NwKoYSc= -github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= -github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78= -github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc= -github.com/distribution/distribution/v3 v3.0.0 h1:q4R8wemdRQDClzoNNStftB2ZAfqOiN6UX90KJc4HjyM= -github.com/distribution/distribution/v3 v3.0.0/go.mod h1:tRNuFoZsUdyRVegq8xGNeds4KLjwLCRin/tTo6i1DhU= -github.com/distribution/reference v0.6.0 h1:0IXCQ5g4/QMHHkarYzh5l+u8T3t73zM5QvfrDyIgxBk= -github.com/distribution/reference v0.6.0/go.mod h1:BbU0aIcezP1/5jX/8MP0YiH4SdvB5Y4f/wlDRiLyi3E= -github.com/docker/cli v29.0.3+incompatible h1:8J+PZIcF2xLd6h5sHPsp5pvvJA+Sr2wGQxHkRl53a1E= -github.com/docker/cli v29.0.3+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= -github.com/docker/distribution v2.8.3+incompatible h1:AtKxIZ36LoNK51+Z6RpzLpddBirtxJnzDrHLEKxTAYk= -github.com/docker/distribution v2.8.3+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= -github.com/docker/docker-credential-helpers v0.9.3 h1:gAm/VtF9wgqJMoxzT3Gj5p4AqIjCBS4wrsOh9yRqcz8= -github.com/docker/docker-credential-helpers v0.9.3/go.mod h1:x+4Gbw9aGmChi3qTLZj8Dfn0TD20M/fuWy0E5+WDeCo= -github.com/docker/go-events v0.0.0-20190806004212-e31b211e4f1c h1:+pKlWGMw7gf6bQ+oDZB4KHQFypsfjYlq/C4rfL7D3g8= -github.com/docker/go-events v0.0.0-20190806004212-e31b211e4f1c/go.mod h1:Uw6UezgYA44ePAFQYUehOuCzmy5zmg/+nl2ZfMWGkpA= -github.com/docker/go-metrics v0.0.1 h1:AgB/0SvBxihN0X8OR4SjsblXkbMvalQ8cjmtKQ2rQV8= -github.com/docker/go-metrics v0.0.1/go.mod h1:cG1hvH2utMXtqgqqYE9plW6lDxS3/5ayHzueweSI3Vw= -github.com/dsnet/compress v0.0.2-0.20210315054119-f66993602bf5 h1:iFaUwBSo5Svw6L7HYpRu/0lE3e0BaElwnNO1qkNQxBY= -github.com/dsnet/compress v0.0.2-0.20210315054119-f66993602bf5/go.mod h1:qssHWj60/X5sZFNxpG4HBPDHVqxNm4DfnCKgrbZOT+s= -github.com/dsnet/golib v0.0.0-20171103203638-1ea166775780/go.mod h1:Lj+Z9rebOhdfkVLjJ8T6VcRQv3SXugXy999NBtR9aFY= -github.com/elazarl/goproxy v1.7.2 h1:Y2o6urb7Eule09PjlhQRGNsqRfPmYI3KKQLFpCAV3+o= -github.com/elazarl/goproxy v1.7.2/go.mod h1:82vkLNir0ALaW14Rc399OTTjyNREgmdL2cVoIbS6XaE= -github.com/emirpasic/gods v1.18.1 h1:FXtiHYKDGKCW2KzwZKx0iC0PQmdlorYgdFG9jPXJ1Bc= -github.com/emirpasic/gods v1.18.1/go.mod h1:8tpGGwCnJ5H4r6BWwaV6OrWmMoPhUl5jm/FMNAnJvWQ= -github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= -github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= -github.com/forPelevin/gomoji v1.4.1 h1:7U+Bl8o6RV/dOQz7coQFWj/jX6Ram6/cWFOuFDEPEUo= -github.com/forPelevin/gomoji v1.4.1/go.mod h1:mM6GtmCgpoQP2usDArc6GjbXrti5+FffolyQfGgPboQ= -github.com/foxcpp/go-mockdns v1.1.0 h1:jI0rD8M0wuYAxL7r/ynTrCQQq0BVqfB99Vgk7DlmewI= -github.com/foxcpp/go-mockdns v1.1.0/go.mod h1:IhLeSFGed3mJIAXPH2aiRQB+kqz7oqu8ld2qVbOu7Wk= -github.com/frankban/quicktest v1.14.6 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHkI4W8= -github.com/frankban/quicktest v1.14.6/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0= -github.com/fsnotify/fsnotify v1.9.0 h1:2Ml+OJNzbYCTzsxtv8vKSFD9PbJjmhYF14k/jKC7S9k= -github.com/fsnotify/fsnotify v1.9.0/go.mod h1:8jBTzvmWwFyi3Pb8djgCCO5IBqzKJ/Jwo8TRcHyHii0= -github.com/fxamacker/cbor/v2 v2.9.0 h1:NpKPmjDBgUfBms6tr6JZkTHtfFGcMKsw3eGcmD/sapM= -github.com/fxamacker/cbor/v2 v2.9.0/go.mod h1:vM4b+DJCtHn+zz7h3FFp/hDAI9WNWCsZj23V5ytsSxQ= -github.com/gliderlabs/ssh v0.3.8 h1:a4YXD1V7xMF9g5nTkdfnja3Sxy1PVDCj1Zg4Wb8vY6c= -github.com/gliderlabs/ssh v0.3.8/go.mod h1:xYoytBv1sV0aL3CavoDuJIQNURXkkfPA/wxQ1pL1fAU= -github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376 h1:+zs/tPmkDkHx3U66DAb0lQFJrpS6731Oaa12ikc+DiI= -github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376/go.mod h1:an3vInlBmSxCcxctByoQdvwPiA7DTK7jaaFDBTtu0ic= -github.com/go-git/go-billy/v5 v5.6.2 h1:6Q86EsPXMa7c3YZ3aLAQsMA0VlWmy43r6FHqa/UNbRM= -github.com/go-git/go-billy/v5 v5.6.2/go.mod h1:rcFC2rAsp/erv7CMz9GczHcuD0D32fWzH+MJAU+jaUU= -github.com/go-git/go-git-fixtures/v4 v4.3.2-0.20231010084843-55a94097c399 h1:eMje31YglSBqCdIqdhKBW8lokaMrL3uTkpGYlE2OOT4= -github.com/go-git/go-git-fixtures/v4 v4.3.2-0.20231010084843-55a94097c399/go.mod h1:1OCfN199q1Jm3HZlxleg+Dw/mwps2Wbk9frAWm+4FII= -github.com/go-git/go-git/v5 v5.16.3 h1:Z8BtvxZ09bYm/yYNgPKCzgWtaRqDTgIKRgIRHBfU6Z8= -github.com/go-git/go-git/v5 v5.16.3/go.mod h1:4Ge4alE/5gPs30F2H1esi2gPd69R0C39lolkucHBOp8= -github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI= -github.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= -github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= -github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= -github.com/go-logr/zapr v1.3.0 h1:XGdV8XW8zdwFiwOA2Dryh1gj2KRQyOOoNmBy4EplIcQ= -github.com/go-logr/zapr v1.3.0/go.mod h1:YKepepNBd1u/oyhd/yQmtjVXmm9uML4IXUgMOwR8/Gg= -github.com/go-task/slim-sprig/v3 v3.0.0 h1:sUs3vkvUymDpBKi3qH1YSqBQk9+9D/8M2mN1vB6EwHI= -github.com/go-task/slim-sprig/v3 v3.0.0/go.mod h1:W848ghGpv3Qj3dhTPRyJypKRiqCdHZiAzKg9hl15HA8= -github.com/go-viper/mapstructure/v2 v2.4.0 h1:EBsztssimR/CONLSZZ04E8qAkxNYq4Qp9LvH92wZUgs= -github.com/go-viper/mapstructure/v2 v2.4.0/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= -github.com/gocarina/gocsv v0.0.0-20240520201108-78e41c74b4b1 h1:FWNFq4fM1wPfcK40yHE5UO3RUdSNPaBC+j3PokzA6OQ= -github.com/gocarina/gocsv v0.0.0-20240520201108-78e41c74b4b1/go.mod h1:5YoVOkjYAQumqlV356Hj3xeYh4BdZuLE0/nRkf2NKkI= -github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= -github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= -github.com/golang-jwt/jwt/v4 v4.5.2 h1:YtQM7lnr8iZ+j5q71MGKkNw9Mn7AjHM68uc9g5fXeUI= -github.com/golang-jwt/jwt/v4 v4.5.2/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= -github.com/golang/groupcache v0.0.0-20241129210726-2c02b8208cf8 h1:f+oWsMOmNPc8JmEHVZIycC7hBoQxHH9pNKQORJNozsQ= -github.com/golang/groupcache v0.0.0-20241129210726-2c02b8208cf8/go.mod h1:wcDNUvekVysuuOpQKo3191zZyTpiI6se1N1ULghS0sw= -github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= -github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= -github.com/golang/snappy v1.0.0 h1:Oy607GVXHs7RtbggtPBnr2RmDArIsAefDwvrdWvRhGs= -github.com/golang/snappy v1.0.0/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= -github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= -github.com/google/go-containerregistry v0.20.7 h1:24VGNpS0IwrOZ2ms2P1QE3Xa5X9p4phx0aUgzYzHW6I= -github.com/google/go-containerregistry v0.20.7/go.mod h1:Lx5LCZQjLH1QBaMPeGwsME9biPeo1lPx6lbGj/UmzgM= -github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/pprof v0.0.0-20250403155104-27863c87afa6 h1:BHT72Gu3keYf3ZEu2J0b1vyeLSOYI8bm5wbJM/8yDe8= -github.com/google/pprof v0.0.0-20250403155104-27863c87afa6/go.mod h1:boTsfXsheKC2y+lKOCMpSfarhxDeIzfZG1jqGcPl3cA= -github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= -github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/gookit/assert v0.1.1 h1:lh3GcawXe/p+cU7ESTZ5Ui3Sm/x8JWpIis4/1aF0mY0= -github.com/gookit/assert v0.1.1/go.mod h1:jS5bmIVQZTIwk42uXl4lyj4iaaxx32tqH16CFj0VX2E= -github.com/gookit/color v1.6.0 h1:JjJXBTk1ETNyqyilJhkTXJYYigHG24TM9Xa2M1xAhRA= -github.com/gookit/color v1.6.0/go.mod h1:9ACFc7/1IpHGBW8RwuDm/0YEnhg3dwwXpoMsmtyHfjs= -github.com/gorilla/handlers v1.5.2 h1:cLTUSsNkgcwhgRqvCNmdbRWG0A3N4F+M2nWKdScwyEE= -github.com/gorilla/handlers v1.5.2/go.mod h1:dX+xVpaxdSw+q0Qek8SSsl3dfMk3jNddUkMzo0GtH0w= -github.com/gorilla/mux v1.8.1 h1:TuBL49tXwgrFYWhqrNgrUNEY92u81SPhu7sTdzQEiWY= -github.com/gorilla/mux v1.8.1/go.mod h1:AKf9I4AEqPTmMytcMc0KkNouC66V3BtZ4qD5fmWSiMQ= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.26.3 h1:5ZPtiqj0JL5oKWmcsq4VMaAW5ukBEgSGXEN89zeH1Jo= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.26.3/go.mod h1:ndYquD05frm2vACXE1nsccT4oJzjhw2arTS2cpUD1PI= -github.com/hashicorp/golang-lru v1.0.2 h1:dV3g9Z/unq5DpblPpw+Oqcv4dU/1omnb4Ok8iPY6p1c= -github.com/hashicorp/golang-lru/arc/v2 v2.0.5 h1:l2zaLDubNhW4XO3LnliVj0GXO3+/CGNJAg1dcN2Fpfw= -github.com/hashicorp/golang-lru/arc/v2 v2.0.5/go.mod h1:ny6zBSQZi2JxIeYcv7kt2sH2PXJtirBN7RDhRpxPkxU= -github.com/hashicorp/golang-lru/v2 v2.0.5 h1:wW7h1TG88eUIJ2i69gaE3uNVtEPIagzhGvHgwfx2Vm4= -github.com/hashicorp/golang-lru/v2 v2.0.5/go.mod h1:QeFd9opnmA6QUJc5vARoKUSoFhyfM2/ZepoAG6RGpeM= -github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= -github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= -github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 h1:BQSFePA1RWJOlocH6Fxy8MmwDt+yVQYULKfN0RoTN8A= -github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99/go.mod h1:1lJo3i6rXxKeerYnT8Nvf0QmHCRC1n8sfWVwXF2Frvo= -github.com/jedib0t/go-pretty/v6 v6.7.5 h1:9dJSWTJnsXJVVAbvxIFxeHf/JxoJd7GUl5o3UzhtuiM= -github.com/jedib0t/go-pretty/v6 v6.7.5/go.mod h1:YwC5CE4fJ1HFUDeivSV1r//AmANFHyqczZk+U6BDALU= -github.com/jfrog/archiver/v3 v3.6.1 h1:LOxnkw9pOn45DzCbZNFV6K0+6dCsQ0L8mR3ZcujO5eI= -github.com/jfrog/archiver/v3 v3.6.1/go.mod h1:VgR+3WZS4N+i9FaDwLZbq+jeU4B4zctXL+gL4EMzfLw= -github.com/jfrog/build-info-go v1.12.5-0.20251209031413-f5f0e93dc8db/go.mod h1:9W4U440fdTHwW1HiB/R0VQvz/5q8ZHsms9MWcq+JrdY= -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.60.1-0.20251015045218-1a38c9e47097 h1:+W6BPxJ0nPtlQ6l6nmypW1eEANoVPiN8HDR4kQJA8uI= -github.com/jfrog/jfrog-cli-core/v2 v2.60.1-0.20251015045218-1a38c9e47097/go.mod h1:UOeOwEEmRIi57cRwghN5OBVoqkJieYQQfLpeqw8Yv38= -github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= -github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= -github.com/kevinburke/ssh_config v1.2.0 h1:x584FjTGwHzMwvHx18PXxbBVzfnxogHaAReU4gf13a4= -github.com/kevinburke/ssh_config v1.2.0/go.mod h1:CT57kijsi8u/K/BOFA39wgDQJ9CxiF4nAY/ojJ6r6mM= -github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= -github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= -github.com/klauspost/compress v1.4.1/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= -github.com/klauspost/compress v1.18.1 h1:bcSGx7UbpBqMChDtsF28Lw6v/G94LPrrbMbdC3JH2co= -github.com/klauspost/compress v1.18.1/go.mod h1:ZQFFVG+MdnR0P+l6wpXgIL4NTtwiKIdBnrBd8Nrxr+0= -github.com/klauspost/cpuid v1.2.0/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek= -github.com/klauspost/cpuid/v2 v2.3.0 h1:S4CRMLnYUhGeDFDqkGriYKdfoFlDnMtqTiI/sFzhA9Y= -github.com/klauspost/cpuid/v2 v2.3.0/go.mod h1:hqwkgyIinND0mEev00jJYCxPNVRVXFQeu1XKlok6oO0= -github.com/klauspost/pgzip v1.2.6 h1:8RXeL5crjEUFnR2/Sn6GJNWtSQ3Dk8pq4CL3jvdDyjU= -github.com/klauspost/pgzip v1.2.6/go.mod h1:Ch1tH69qFZu15pkjo5kYi6mth2Zzwzt50oCQKQE9RUs= -github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= -github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= -github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= -github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= -github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= -github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= -github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= -github.com/magiconair/properties v1.8.10 h1:s31yESBquKXCV9a/ScB3ESkOjUYYv+X0rg8SYxI99mE= -github.com/magiconair/properties v1.8.10/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0= -github.com/manifoldco/promptui v0.9.0 h1:3V4HzJk1TtXW1MTZMP7mdlwbBpIinw3HztaIlYthEiA= -github.com/manifoldco/promptui v0.9.0/go.mod h1:ka04sppxSGFAtxX0qhlYQjISsg9mR4GWtQEhdbn6Pgg= -github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= -github.com/mattn/go-colorable v0.1.7/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= -github.com/mattn/go-colorable v0.1.14 h1:9A9LHSqF/7dyVVX6g0U9cwm9pG3kP9gSzcuIPHPsaIE= -github.com/mattn/go-colorable v0.1.14/go.mod h1:6LmQG8QLFO4G5z1gPvYEzlUgJ2wF+stgPZH1UqBm1s8= -github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= -github.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84= -github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= -github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= -github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= -github.com/mattn/go-runewidth v0.0.6/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= -github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= -github.com/mattn/go-runewidth v0.0.19 h1:v++JhqYnZuu5jSKrk9RbgF5v4CGUjqRfBm05byFGLdw= -github.com/mattn/go-runewidth v0.0.19/go.mod h1:XBkDxAl56ILZc9knddidhrOlY5R/pDhgLpndooCuJAs= -github.com/mattn/go-tty v0.0.3/go.mod h1:ihxohKRERHTVzN+aSVRwACLCeqIoZAWpoICkkvrWyR0= -github.com/mattn/go-tty v0.0.7 h1:KJ486B6qI8+wBO7kQxYgmmEFDaFEE96JMBQ7h400N8Q= -github.com/mattn/go-tty v0.0.7/go.mod h1:f2i5ZOvXBU/tCABmLmOfzLz9azMo5wdAaElRNnJKr+k= -github.com/miekg/dns v1.1.57 h1:Jzi7ApEIzwEPLHWRcafCN9LZSBbqQpxjt/wpgvg7wcM= -github.com/miekg/dns v1.1.57/go.mod h1:uqRjCRUuEAA6qsOiJvDd+CFo/vW+y5WR6SNmHE55hZk= -github.com/minio/sha256-simd v1.0.1 h1:6kaan5IFmwTNynnKKpDHe6FWHohJOHhCPchzK49dzMM= -github.com/minio/sha256-simd v1.0.1/go.mod h1:Pz6AKMiUdngCLpeTL/RJY1M9rUuPMYujV5xJjtbRSN8= -github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= -github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= -github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= -github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= -github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= -github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= -github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee h1:W5t00kpgFdJifH4BDsTlE89Zl93FEloxaWZfGcifgq8= -github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= -github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA= -github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= -github.com/naveenku-jfrog/jfrog-client-go v1.54.2-0.20251212200746-04c08281da50 h1:LXVnlk26YzvgdC7iFQzJNDzWhF1UZF0c+1VI07v0pOk= -github.com/naveenku-jfrog/jfrog-client-go v1.54.2-0.20251212200746-04c08281da50/go.mod h1:WQ5Y+oKYyHFAlCbHN925bWhnShTd2ruxZ6YTpb76fpU= -github.com/nwaples/rardecode v1.1.3 h1:cWCaZwfM5H7nAD6PyEdcVnczzV8i/JtotnyW/dD9lEc= -github.com/nwaples/rardecode v1.1.3/go.mod h1:5DzqNKiOdpKKBH87u8VlvAnPZMXcGRhxWkRpHbbfGS0= -github.com/onsi/ginkgo/v2 v2.25.1 h1:Fwp6crTREKM+oA6Cz4MsO8RhKQzs2/gOIVOUscMAfZY= -github.com/onsi/ginkgo/v2 v2.25.1/go.mod h1:ppTWQ1dh9KM/F1XgpeRqelR+zHVwV81DGRSDnFxK7Sk= -github.com/onsi/gomega v1.38.2 h1:eZCjf2xjZAqe+LeWvKb5weQ+NcPwX84kqJ0cZNxok2A= -github.com/onsi/gomega v1.38.2/go.mod h1:W2MJcYxRGV63b418Ai34Ud0hEdTVXq9NW9+Sx6uXf3k= -github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U= -github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= -github.com/opencontainers/image-spec v1.1.1 h1:y0fUlFfIZhPF1W537XOLg0/fcx6zcHCJwooC2xJA040= -github.com/opencontainers/image-spec v1.1.1/go.mod h1:qpqAh3Dmcf36wStyyWU+kCeDgrGnAve2nCC8+7h8Q0M= -github.com/pelletier/go-toml/v2 v2.2.4 h1:mye9XuhQ6gvn5h28+VilKrrPoQVanw5PMw/TB0t5Ec4= -github.com/pelletier/go-toml/v2 v2.2.4/go.mod h1:2gIqNv+qfxSVS7cM2xJQKtLSTLUE9V8t9Stt+h56mCY= -github.com/phayes/freeport v0.0.0-20220201140144-74d24b5ae9f5 h1:Ii+DKncOVM8Cu1Hc+ETb5K+23HdAMvESYE3ZJ5b5cMI= -github.com/phayes/freeport v0.0.0-20220201140144-74d24b5ae9f5/go.mod h1:iIss55rKnNBTvrwdmkUpLnDpZoAHvWaiq5+iMmen4AE= -github.com/pierrec/lz4/v4 v4.1.22 h1:cKFw6uJDK+/gfw5BcDL0JL5aBsAFdsIT18eRtLj7VIU= -github.com/pierrec/lz4/v4 v4.1.22/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= -github.com/pjbgf/sha1cd v0.3.2 h1:a9wb0bp1oC2TGwStyn0Umc/IGKQnEgF0vVaZ8QF8eo4= -github.com/pjbgf/sha1cd v0.3.2/go.mod h1:zQWigSxVmsHEZow5qaLtPYxpcKMMQpa09ixqBxuCS6A= -github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c h1:+mdjkGKdHQG3305AYmdv1U2eRNDiU2ErMBj1gwrq8eQ= -github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c/go.mod h1:7rwL4CYBLnjLxUqIJNnCWiEdr3bn6IUYi15bNlnbCCU= -github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= -github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/term v1.2.0-beta.2 h1:L3y/h2jkuBVFdWiJvNfYfKmzcCnILw7mJWm2JQuMppw= -github.com/pkg/term v1.2.0-beta.2/go.mod h1:E25nymQcrSllhX42Ok8MRm1+hyBdHY0dCeiKZ9jpNGw= -github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= -github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/prometheus/client_golang v1.23.0 h1:ust4zpdl9r4trLY/gSjlm07PuiBq2ynaXXlptpfy8Uc= -github.com/prometheus/client_golang v1.23.0/go.mod h1:i/o0R9ByOnHX0McrTMTyhYvKE4haaf2mW08I+jGAjEE= -github.com/prometheus/client_model v0.6.2 h1:oBsgwpGs7iVziMvrGhE53c/GrLUsZdHnqNwqPLxwZyk= -github.com/prometheus/client_model v0.6.2/go.mod h1:y3m2F6Gdpfy6Ut/GBsUqTWZqCUvMVzSfMLjcu6wAwpE= -github.com/prometheus/common v0.65.0 h1:QDwzd+G1twt//Kwj/Ww6E9FQq1iVMmODnILtW1t2VzE= -github.com/prometheus/common v0.65.0/go.mod h1:0gZns+BLRQ3V6NdaerOhMbwwRbNh9hkGINtQAsP5GS8= -github.com/prometheus/procfs v0.17.0 h1:FuLQ+05u4ZI+SS/w9+BWEM2TXiHKsUQ9TADiRH7DuK0= -github.com/prometheus/procfs v0.17.0/go.mod h1:oPQLaDAMRbA+u8H5Pbfq+dl3VDAvHxMUOVhe0wYB2zw= -github.com/redis/go-redis/extra/rediscmd/v9 v9.0.5 h1:EaDatTxkdHG+U3Bk4EUr+DZ7fOGwTfezUiUJMaIcaho= -github.com/redis/go-redis/extra/rediscmd/v9 v9.0.5/go.mod h1:fyalQWdtzDBECAQFBJuQe5bzQ02jGd5Qcbgb97Flm7U= -github.com/redis/go-redis/extra/redisotel/v9 v9.0.5 h1:EfpWLLCyXw8PSM2/XNJLjI3Pb27yVE+gIAfeqp8LUCc= -github.com/redis/go-redis/extra/redisotel/v9 v9.0.5/go.mod h1:WZjPDy7VNzn77AAfnAfVjZNvfJTYfPetfZk5yoSTLaQ= -github.com/redis/go-redis/v9 v9.7.3 h1:YpPyAayJV+XErNsatSElgRZZVCwXX9QzkKYNvO7x0wM= -github.com/redis/go-redis/v9 v9.7.3/go.mod h1:bGUrSggJ9X9GUmZpZNEOQKaANxSGgOEBRltRTZHSvrA= -github.com/reshmifrog/build-info-go v1.8.9-0.20251222123737-474506b9e128 h1:095eA3aIvln4NiRmiynXC6EobQMeGXAekchiN1QK7s4= -github.com/reshmifrog/build-info-go v1.8.9-0.20251222123737-474506b9e128/go.mod h1:9W4U440fdTHwW1HiB/R0VQvz/5q8ZHsms9MWcq+JrdY= -github.com/rivo/uniseg v0.4.7 h1:WUdvkW8uEhrYfLC4ZzdpI2ztxP1I582+49Oc5Mq64VQ= -github.com/rivo/uniseg v0.4.7/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= -github.com/rogpeppe/go-internal v1.14.1 h1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0tI/otEQ= -github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc= -github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk= -github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= -github.com/sagikazarmark/locafero v0.12.0 h1:/NQhBAkUb4+fH1jivKHWusDYFjMOOKU88eegjfxfHb4= -github.com/sagikazarmark/locafero v0.12.0/go.mod h1:sZh36u/YSZ918v0Io+U9ogLYQJ9tLLBmM4eneO6WwsI= -github.com/sergi/go-diff v1.3.2-0.20230802210424-5b0b94c5c0d3 h1:n661drycOFuPLCN3Uc8sB6B/s6Z4t2xvBgU1htSHuq8= -github.com/sergi/go-diff v1.3.2-0.20230802210424-5b0b94c5c0d3/go.mod h1:A0bzQcvG0E7Rwjx0REVgAGH58e96+X0MeOfepqsbeW4= -github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= -github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= -github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= -github.com/skeema/knownhosts v1.3.1 h1:X2osQ+RAjK76shCbvhHHHVl3ZlgDm8apHEHFqRjnBY8= -github.com/skeema/knownhosts v1.3.1/go.mod h1:r7KTdC8l4uxWRyK2TpQZ/1o5HaSzh06ePQNxPwTcfiY= -github.com/spf13/afero v1.15.0 h1:b/YBCLWAJdFWJTN9cLhiXXcD7mzKn9Dm86dNnfyQw1I= -github.com/spf13/afero v1.15.0/go.mod h1:NC2ByUVxtQs4b3sIUphxK0NioZnmxgyCrfzeuq8lxMg= -github.com/spf13/cast v1.10.0 h1:h2x0u2shc1QuLHfxi+cTJvs30+ZAHOGRic8uyGTDWxY= -github.com/spf13/cast v1.10.0/go.mod h1:jNfB8QC9IA6ZuY2ZjDp0KtFO2LZZlg4S/7bzP6qqeHo= -github.com/spf13/cobra v1.10.1 h1:lJeBwCfmrnXthfAupyUTzJ/J4Nc1RsHC/mSRU2dll/s= -github.com/spf13/cobra v1.10.1/go.mod h1:7SmJGaTHFVBY0jW4NXGluQoLvhqFQM+6XSKD+P4XaB0= -github.com/spf13/pflag v1.0.10 h1:4EBh2KAYBwaONj6b2Ye1GiHfwjqyROoF4RwYO+vPwFk= -github.com/spf13/pflag v1.0.10/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= -github.com/spf13/viper v1.21.0 h1:x5S+0EU27Lbphp4UKm1C+1oQO+rKx36vfCoaVebLFSU= -github.com/spf13/viper v1.21.0/go.mod h1:P0lhsswPGWD/1lZJ9ny3fYnVqxiegrlNrEmgLjbTCAY= -github.com/stoewer/go-strcase v1.3.1 h1:iS0MdW+kVTxgMoE1LAZyMiYJFKlOzLooE4MxjirtkAs= -github.com/stoewer/go-strcase v1.3.1/go.mod h1:fAH5hQ5pehh+j3nZfvwdk2RgEgQjAoM8wodgtPmh1xo= -github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= -github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= -github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY= -github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= -github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= -github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= -github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= -github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= -github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= -github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= -github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U= -github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= -github.com/subosito/gotenv v1.6.0 h1:9NlTDc1FTs4qu0DDq7AEtTPNw6SVm7uBMsUCUjABIf8= -github.com/subosito/gotenv v1.6.0/go.mod h1:Dk4QP5c2W3ibzajGcXpNraDfq2IrhjMIvMSWPKKo0FU= -github.com/terminalstatic/go-xsd-validate v0.1.6 h1:TenYeQ3eY631qNi1/cTmLH/s2slHPRKTTHT+XSHkepo= -github.com/terminalstatic/go-xsd-validate v0.1.6/go.mod h1:18lsvYFofBflqCrvo1umpABZ99+GneNTw2kEEc8UPJw= -github.com/ulikunitz/xz v0.5.8/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14= -github.com/ulikunitz/xz v0.5.15 h1:9DNdB5s+SgV3bQ2ApL10xRc35ck0DuIX/isZvIk+ubY= -github.com/ulikunitz/xz v0.5.15/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14= -github.com/urfave/cli v1.22.17 h1:SYzXoiPfQjHBbkYxbew5prZHS1TOLT3ierW8SYLqtVQ= -github.com/urfave/cli v1.22.17/go.mod h1:b0ht0aqgH/6pBYzzxURyrM4xXNgsoT/n2ZzwQiEhNVo= -github.com/vbatts/tar-split v0.12.2 h1:w/Y6tjxpeiFMR47yzZPlPj/FcPLpXbTUi/9H7d3CPa4= -github.com/vbatts/tar-split v0.12.2/go.mod h1:eF6B6i6ftWQcDqEn3/iGFRFRo8cBIMSJVOpnNdfTMFA= -github.com/vbauerster/mpb/v8 v8.10.2 h1:2uBykSHAYHekE11YvJhKxYmLATKHAGorZwFlyNw4hHM= -github.com/vbauerster/mpb/v8 v8.10.2/go.mod h1:+Ja4P92E3/CorSZgfDtK46D7AVbDqmBQRTmyTqPElo0= -github.com/x448/float16 v0.8.4 h1:qLwI1I70+NjRFUR3zs1JPUCgaCXSh3SW62uAKT1mSBM= -github.com/x448/float16 v0.8.4/go.mod h1:14CWIYCyZA/cWjXOioeEpHeN/83MdbZDRQHoFcYsOfg= -github.com/xanzy/ssh-agent v0.3.3 h1:+/15pJfg/RsTxqYcX6fHqOXZwwMP+2VyYWJeWM2qQFM= -github.com/xanzy/ssh-agent v0.3.3/go.mod h1:6dzNDKs0J9rVPHPhaGCukekBHKqfl+L3KghI1Bc68Uw= -github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb h1:zGWFAtiMcyryUHoUjUJX0/lt1H2+i2Ka2n+D3DImSNo= -github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= -github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 h1:EzJWgHovont7NscjpAxXsDA8S8BMYve8Y5+7cuRE7R0= -github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ= -github.com/xeipuuv/gojsonschema v1.2.0 h1:LhYJRs+L4fBtjZUfuSZIKGeVu0QRy8e5Xi7D17UxZ74= -github.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQluxsYJ78Id3Y= -github.com/xi2/xz v0.0.0-20171230120015-48954b6210f8 h1:nIPpBwaJSVYIxUFsDv3M8ofmx9yWTog9BfvIu0q41lo= -github.com/xi2/xz v0.0.0-20171230120015-48954b6210f8/go.mod h1:HUYIGzjTL3rfEspMxjDjgmT5uz5wzYJKVo23qUhYTos= -github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e h1:JVG44RsyaB9T2KIHavMF/ppJZNG9ZpyihvCd0w101no= -github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e/go.mod h1:RbqR21r5mrJuqunuUZ/Dhy/avygyECGrLceyNeo4LiM= -github.com/xyproto/randomstring v1.0.5 h1:YtlWPoRdgMu3NZtP45drfy1GKoojuR7hmRcnhZqKjWU= -github.com/xyproto/randomstring v1.0.5/go.mod h1:rgmS5DeNXLivK7YprL0pY+lTuhNQW3iGxZ18UQApw/E= -github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJySYA= -go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A= -go.opentelemetry.io/contrib/bridges/prometheus v0.57.0 h1:UW0+QyeyBVhn+COBec3nGhfnFe5lwB0ic1JBVjzhk0w= -go.opentelemetry.io/contrib/bridges/prometheus v0.57.0/go.mod h1:ppciCHRLsyCio54qbzQv0E4Jyth/fLWDTJYfvWpcSVk= -go.opentelemetry.io/contrib/exporters/autoexport v0.57.0 h1:jmTVJ86dP60C01K3slFQa2NQ/Aoi7zA+wy7vMOKD9H4= -go.opentelemetry.io/contrib/exporters/autoexport v0.57.0/go.mod h1:EJBheUMttD/lABFyLXhce47Wr6DPWYReCzaZiXadH7g= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.62.0 h1:Hf9xI/XLML9ElpiHVDNwvqI0hIFlzV8dgIr35kV1kRU= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.62.0/go.mod h1:NfchwuyNoMcZ5MLHwPrODwUF1HWCXWrL31s8gSAdIKY= -go.opentelemetry.io/otel v1.37.0 h1:9zhNfelUvx0KBfu/gb+ZgeAfAgtWrfHJZcAqFC228wQ= -go.opentelemetry.io/otel v1.37.0/go.mod h1:ehE/umFRLnuLa/vSccNq9oS1ErUlkkK71gMcN34UG8I= -go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.8.0 h1:WzNab7hOOLzdDF/EoWCt4glhrbMPVMOO5JYTmpz36Ls= -go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.8.0/go.mod h1:hKvJwTzJdp90Vh7p6q/9PAOd55dI6WA6sWj62a/JvSs= -go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.8.0 h1:S+LdBGiQXtJdowoJoQPEtI52syEP/JYBUpjO49EQhV8= -go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.8.0/go.mod h1:5KXybFvPGds3QinJWQT7pmXf+TN5YIa7CNYObWRkj50= -go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.32.0 h1:j7ZSD+5yn+lo3sGV69nW04rRR0jhYnBwjuX3r0HvnK0= -go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.32.0/go.mod h1:WXbYJTUaZXAbYd8lbgGuvih0yuCfOFC5RJoYnoLcGz8= -go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.32.0 h1:t/Qur3vKSkUCcDVaSumWF2PKHt85pc7fRvFuoVT8qFU= -go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.32.0/go.mod h1:Rl61tySSdcOJWoEgYZVtmnKdA0GeKrSqkHC1t+91CH8= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.34.0 h1:OeNbIYk/2C15ckl7glBlOBp5+WlYsOElzTNmiPW/x60= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.34.0/go.mod h1:7Bept48yIeqxP2OZ9/AqIpYS94h2or0aB4FypJTc8ZM= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.34.0 h1:tgJ0uaNS4c98WRNUEx5U3aDlrDOI5Rs+1Vifcw4DJ8U= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.34.0/go.mod h1:U7HYyW0zt/a9x5J1Kjs+r1f/d4ZHnYFclhYY2+YbeoE= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.33.0 h1:wpMfgF8E1rkrT1Z6meFh1NDtownE9Ii3n3X2GJYjsaU= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.33.0/go.mod h1:wAy0T/dUbs468uOlkT31xjvqQgEVXv58BRFWEgn5v/0= -go.opentelemetry.io/otel/exporters/prometheus v0.54.0 h1:rFwzp68QMgtzu9PgP3jm9XaMICI6TsofWWPcBDKwlsU= -go.opentelemetry.io/otel/exporters/prometheus v0.54.0/go.mod h1:QyjcV9qDP6VeK5qPyKETvNjmaaEc7+gqjh4SS0ZYzDU= -go.opentelemetry.io/otel/exporters/stdout/stdoutlog v0.8.0 h1:CHXNXwfKWfzS65yrlB2PVds1IBZcdsX8Vepy9of0iRU= -go.opentelemetry.io/otel/exporters/stdout/stdoutlog v0.8.0/go.mod h1:zKU4zUgKiaRxrdovSS2amdM5gOc59slmo/zJwGX+YBg= -go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.32.0 h1:SZmDnHcgp3zwlPBS2JX2urGYe/jBKEIT6ZedHRUyCz8= -go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.32.0/go.mod h1:fdWW0HtZJ7+jNpTKUR0GpMEDP69nR8YBJQxNiVCE3jk= -go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.32.0 h1:cC2yDI3IQd0Udsux7Qmq8ToKAx1XCilTQECZ0KDZyTw= -go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.32.0/go.mod h1:2PD5Ex6z8CFzDbTdOlwyNIUywRr1DN0ospafJM1wJ+s= -go.opentelemetry.io/otel/log v0.8.0 h1:egZ8vV5atrUWUbnSsHn6vB8R21G2wrKqNiDt3iWertk= -go.opentelemetry.io/otel/log v0.8.0/go.mod h1:M9qvDdUTRCopJcGRKg57+JSQ9LgLBrwwfC32epk5NX8= -go.opentelemetry.io/otel/metric v1.37.0 h1:mvwbQS5m0tbmqML4NqK+e3aDiO02vsf/WgbsdpcPoZE= -go.opentelemetry.io/otel/metric v1.37.0/go.mod h1:04wGrZurHYKOc+RKeye86GwKiTb9FKm1WHtO+4EVr2E= -go.opentelemetry.io/otel/sdk v1.37.0 h1:ItB0QUqnjesGRvNcmAcU0LyvkVyGJ2xftD29bWdDvKI= -go.opentelemetry.io/otel/sdk v1.37.0/go.mod h1:VredYzxUvuo2q3WRcDnKDjbdvmO0sCzOvVAiY+yUkAg= -go.opentelemetry.io/otel/sdk/log v0.8.0 h1:zg7GUYXqxk1jnGF/dTdLPrK06xJdrXgqgFLnI4Crxvs= -go.opentelemetry.io/otel/sdk/log v0.8.0/go.mod h1:50iXr0UVwQrYS45KbruFrEt4LvAdCaWWgIrsN3ZQggo= -go.opentelemetry.io/otel/sdk/metric v1.37.0 h1:90lI228XrB9jCMuSdA0673aubgRobVZFhbjxHHspCPc= -go.opentelemetry.io/otel/sdk/metric v1.37.0/go.mod h1:cNen4ZWfiD37l5NhS+Keb5RXVWZWpRE+9WyVCpbo5ps= -go.opentelemetry.io/otel/trace v1.37.0 h1:HLdcFNbRQBE2imdSEgm/kwqmQj1Or1l/7bW6mxVK7z4= -go.opentelemetry.io/otel/trace v1.37.0/go.mod h1:TlgrlQ+PtQO5XFerSPUYG0JSgGyryXewPGyayAWSBS0= -go.opentelemetry.io/proto/otlp v1.5.0 h1:xJvq7gMzB31/d406fB8U5CBdyQGw4P399D1aQWU/3i4= -go.opentelemetry.io/proto/otlp v1.5.0/go.mod h1:keN8WnHxOy8PG0rQZjJJ5A2ebUoafqWp0eVQ4yIXvJ4= -go.uber.org/automaxprocs v1.6.0 h1:O3y2/QNTOdbF+e/dpXNNW7Rx2hZ4sTIPyybbxyNqTUs= -go.uber.org/automaxprocs v1.6.0/go.mod h1:ifeIMSnPZuznNm6jmdzmU3/bfk01Fe2fotchwEFJ8r8= -go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= -go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= -go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= -go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= -go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8= -go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= -go.yaml.in/yaml/v2 v2.4.2 h1:DzmwEr2rDGHl7lsFgAHxmNz/1NlQ7xLIrlN2h5d1eGI= -go.yaml.in/yaml/v2 v2.4.2/go.mod h1:081UH+NErpNdqlCXm3TtEran0rJZGxAYx9hb/ELlsPU= -go.yaml.in/yaml/v3 v3.0.4 h1:tfq32ie2Jv2UxXFdLJdh3jXuOzWiL1fo0bu/FbuKpbc= -go.yaml.in/yaml/v3 v3.0.4/go.mod h1:DhzuOOF2ATzADvBadXxruRBLzYTpT36CKvDb3+aBEFg= -golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.45.0 h1:jMBrvKuj23MTlT0bQEOBcAE0mjg8mK9RXFhRH6nyF3Q= -golang.org/x/crypto v0.45.0/go.mod h1:XTGrrkGJve7CYK7J8PEww4aY7gM3qMCElcJQ8n8JdX4= -golang.org/x/exp v0.0.0-20251125195548-87e1e737ad39 h1:DHNhtq3sNNzrvduZZIiFyXWOL9IWaDPHqTnLJp+rCBY= -golang.org/x/exp v0.0.0-20251125195548-87e1e737ad39/go.mod h1:46edojNIoXTNOhySWIWdix628clX9ODXwPsQuG6hsK0= -golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.30.0 h1:fDEXFVZ/fmCKProc/yAXXUijritrDzahmwwefnjoPFk= -golang.org/x/mod v0.30.0/go.mod h1:lAsf5O2EvJeSFMiBxXDki7sCgAxEUcZHXoXMKT4GJKc= -golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.47.0 h1:Mx+4dIFzqraBXUugkia1OOvlD6LemFo1ALMHjrXDOhY= -golang.org/x/net v0.47.0/go.mod h1:/jNxtkgq5yWUGYkaZGqo27cfGZ1c5Nen03aYrrKpVRU= -golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.18.0 h1:kr88TuHDroi+UVf+0hZnirlk8o8T+4MrK6mr60WkH/I= -golang.org/x/sync v0.18.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI= -golang.org/x/sys v0.0.0-20181122145206-62eef0e2fa9b/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200909081042-eff7692f9009/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200918174421-af09f7315aff/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220310020820-b874c991c1a5/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.38.0 h1:3yZWxaJjBmCWXqhN1qh02AkOnCQ1poK6oF+a7xWL6Gc= -golang.org/x/sys v0.38.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= -golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= -golang.org/x/term v0.37.0 h1:8EGAD0qCmHYZg6J17DvsMy9/wJ7/D/4pV/wfnld5lTU= -golang.org/x/term v0.37.0/go.mod h1:5pB4lxRNYYVZuTLmy8oR2BH8dflOR+IbTYFD8fi3254= -golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.31.0 h1:aC8ghyu4JhP8VojJ2lEHBnochRno1sgL6nEi9WGFGMM= -golang.org/x/text v0.31.0/go.mod h1:tKRAlv61yKIjGGHX/4tP1LTbc13YSec1pxVEWXzfoeM= -golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.39.0 h1:ik4ho21kwuQln40uelmciQPp9SipgNDdrafrYA4TmQQ= -golang.org/x/tools v0.39.0/go.mod h1:JnefbkDPyD8UU2kI5fuf8ZX4/yUeh9W877ZeBONxUqQ= -golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -google.golang.org/genproto v0.0.0-20231211222908-989df2bf70f3 h1:1hfbdAfFbkmpg41000wDVqr7jUpK/Yo+LPnIxxGzmkg= -google.golang.org/genproto/googleapis/api v0.0.0-20250303144028-a0af3efb3deb h1:p31xT4yrYrSM/G4Sn2+TNUkVhFCbG9y8itM2S6Th950= -google.golang.org/genproto/googleapis/api v0.0.0-20250303144028-a0af3efb3deb/go.mod h1:jbe3Bkdp+Dh2IrslsFCklNhweNTBgSYanP1UXhJDhKg= -google.golang.org/genproto/googleapis/rpc v0.0.0-20250303144028-a0af3efb3deb h1:TLPQVbx1GJ8VKZxz52VAxl1EBgKXXbTiU9Fc5fZeLn4= -google.golang.org/genproto/googleapis/rpc v0.0.0-20250303144028-a0af3efb3deb/go.mod h1:LuRYeWDFV6WOn90g357N17oMCaxpgCnbi/44qJvDn2I= -google.golang.org/grpc v1.72.1 h1:HR03wO6eyZ7lknl75XlxABNVLLFc2PAb6mHlYh756mA= -google.golang.org/grpc v1.72.1/go.mod h1:wH5Aktxcg25y1I3w7H69nHfXdOG3UiadoBtjh3izSDM= -google.golang.org/protobuf v1.36.8 h1:xHScyCOEuuwZEc6UtSOvPbAT4zRh0xcNRYekJwfqyMc= -google.golang.org/protobuf v1.36.8/go.mod h1:fuxRtAxBytpl4zzqUh6/eyUujkJdNiuEkXntxiD/uRU= -gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= -gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= -gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= -gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= -gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= -gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= -gopkg.in/warnings.v0 v0.1.2 h1:wFXVbFY8DY5/xOe1ECiWdKCzZlxgshcYVNkBHstARME= -gopkg.in/warnings.v0 v0.1.2/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRNI= -gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= -gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= -gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= -gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gotest.tools/v3 v3.0.3 h1:4AuOwCGf4lLR9u3YOe2awrHygurzhO/HeQ6laiA6Sx0= -gotest.tools/v3 v3.0.3/go.mod h1:Z7Lb0S5l+klDB31fvDQX8ss/FlKDxtlFlw3Oa8Ymbl8= -helm.sh/helm/v3 v3.19.2 h1:psQjaM8aIWrSVEly6PgYtLu/y6MRSmok4ERiGhZmtUY= -helm.sh/helm/v3 v3.19.2/go.mod h1:gX10tB5ErM+8fr7bglUUS/UfTOO8UUTYWIBH1IYNnpE= -k8s.io/api v0.34.0 h1:L+JtP2wDbEYPUeNGbeSa/5GwFtIA662EmT2YSLOkAVE= -k8s.io/api v0.34.0/go.mod h1:YzgkIzOOlhl9uwWCZNqpw6RJy9L2FK4dlJeayUoydug= -k8s.io/apimachinery v0.34.0 h1:eR1WO5fo0HyoQZt1wdISpFDffnWOvFLOOeJ7MgIv4z0= -k8s.io/apimachinery v0.34.0/go.mod h1:/GwIlEcWuTX9zKIg2mbw0LRFIsXwrfoVxn+ef0X13lw= -k8s.io/client-go v0.34.0 h1:YoWv5r7bsBfb0Hs2jh8SOvFbKzzxyNo0nSb0zC19KZo= -k8s.io/client-go v0.34.0/go.mod h1:ozgMnEKXkRjeMvBZdV1AijMHLTh3pbACPvK7zFR+QQY= -k8s.io/klog/v2 v2.130.1 h1:n9Xl7H1Xvksem4KFG4PYbdQCQxqc/tTUyrgXaOhHSzk= -k8s.io/klog/v2 v2.130.1/go.mod h1:3Jpz1GvMt720eyJH1ckRHK1EDfpxISzJ7I9OYgaDtPE= -k8s.io/utils v0.0.0-20250604170112-4c0f3b243397 h1:hwvWFiBzdWw1FhfY1FooPn3kzWuJ8tmbZBHi4zVsl1Y= -k8s.io/utils v0.0.0-20250604170112-4c0f3b243397/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= -oras.land/oras-go/v2 v2.6.0 h1:X4ELRsiGkrbeox69+9tzTu492FMUu7zJQW6eJU+I2oc= -oras.land/oras-go/v2 v2.6.0/go.mod h1:magiQDfG6H1O9APp+rOsvCPcW1GD2MM7vgnKY0Y+u1o= -sigs.k8s.io/controller-runtime v0.21.0 h1:CYfjpEuicjUecRk+KAeyYh+ouUBn4llGyDYytIGcJS8= -sigs.k8s.io/controller-runtime v0.21.0/go.mod h1:OSg14+F65eWqIu4DceX7k/+QRAbTTvxeQSNSOQpukWM= -sigs.k8s.io/json v0.0.0-20241014173422-cfa47c3a1cc8 h1:gBQPwqORJ8d8/YNZWEjoZs7npUVDpVXUUOFfW6CgAqE= -sigs.k8s.io/json v0.0.0-20241014173422-cfa47c3a1cc8/go.mod h1:mdzfpAEoE6DHQEN0uh9ZbOCuHbLK5wOm7dK4ctXE9Tg= -sigs.k8s.io/randfill v1.0.0 h1:JfjMILfT8A6RbawdsK2JXGBR5AQVfd+9TbzrlneTyrU= -sigs.k8s.io/randfill v1.0.0/go.mod h1:XeLlZ/jmk4i1HRopwe7/aU3H5n1zNUcX6TM94b3QxOY= -sigs.k8s.io/structured-merge-diff/v6 v6.3.0 h1:jTijUJbW353oVOd9oTlifJqOGEkUw2jB/fXCbTiQEco= -sigs.k8s.io/structured-merge-diff/v6 v6.3.0/go.mod h1:M3W8sfWvn2HhQDIbGWj3S099YozAsymCo/wrT5ohRUE= -sigs.k8s.io/yaml v1.6.0 h1:G8fkbMSAFqgEFgh4b1wmtzDnioxFCUgTZhlbj5P9QYs= -sigs.k8s.io/yaml v1.6.0/go.mod h1:796bPqUfzR/0jLAl6XjHl3Ck7MiyVv8dbTdyT3/pMf4= From f392ba03be27f95e457e61796314e7ef5820bcd6 Mon Sep 17 00:00:00 2001 From: Reshmi Date: Tue, 23 Dec 2025 15:59:42 +0530 Subject: [PATCH 10/10] update deps: --- go.mod | 4 - go.sum | 447 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 447 insertions(+), 4 deletions(-) create mode 100644 go.sum diff --git a/go.mod b/go.mod index c7b1a323..0b8f7674 100644 --- a/go.mod +++ b/go.mod @@ -123,10 +123,6 @@ require ( sigs.k8s.io/yaml v1.6.0 // indirect ) -replace github.com/jfrog/jfrog-cli-core/v2 => ../jfrog-cli-core - -replace github.com/jfrog/jfrog-client-go => ../jfrog-client-go - //replace github.com/jfrog/build-info-go => github.com/jfrog/build-info-go v1.8.9-0.20251223092904-9e9460642431 // replace github.com/jfrog/jfrog-cli-core/v2 => github.com/jfrog/jfrog-cli-core/v2 v2.60.1-0.20251026182600-8a8c0428f538 diff --git a/go.sum b/go.sum new file mode 100644 index 00000000..6a4c03dd --- /dev/null +++ b/go.sum @@ -0,0 +1,447 @@ +dario.cat/mergo v1.0.2 h1:85+piFYR1tMbRrLcDwR18y4UKJ3aH1Tbzi24VRW1TK8= +dario.cat/mergo v1.0.2/go.mod h1:E/hbnu0NxMFBjpMIE34DRGLWqDy0g5FuKDhCb31ngxA= +github.com/AdaLogics/go-fuzz-headers v0.0.0-20230811130428-ced1acdcaa24 h1:bvDV9vkmnHYOMsOr4WLk+Vo07yKIzd94sVoIqshQ4bU= +github.com/AdaLogics/go-fuzz-headers v0.0.0-20230811130428-ced1acdcaa24/go.mod h1:8o94RPi1/7XTJvwPpRSzSUedZrtlirdB3r9Z20bi2f8= +github.com/BurntSushi/toml v1.5.0 h1:W5quZX/G/csjUnuI8SUYlsHs9M38FC7znL0lIO+DvMg= +github.com/BurntSushi/toml v1.5.0/go.mod h1:ukJfTF/6rtPPRCnwkur4qwRxa8vTRFBF0uk2lLoLwho= +github.com/CycloneDX/cyclonedx-go v0.9.3 h1:Pyk/lwavPz7AaZNvugKFkdWOm93MzaIyWmBwmBo3aUI= +github.com/CycloneDX/cyclonedx-go v0.9.3/go.mod h1:vcK6pKgO1WanCdd61qx4bFnSsDJQ6SbM2ZuMIgq86Jg= +github.com/Masterminds/semver/v3 v3.4.0 h1:Zog+i5UMtVoCU8oKka5P7i9q9HgrJeGzI9SA1Xbatp0= +github.com/Masterminds/semver/v3 v3.4.0/go.mod h1:4V+yj/TJE1HU9XfppCwVMZq3I84lprf4nC11bSS5beM= +github.com/Microsoft/go-winio v0.5.2/go.mod h1:WpS1mjBmmwHBEWmogvA2mj8546UReBk4v8QkMxJ6pZY= +github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY= +github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU= +github.com/ProtonMail/go-crypto v1.3.0 h1:ILq8+Sf5If5DCpHQp4PbZdS1J7HDFRXz/+xKBiRGFrw= +github.com/ProtonMail/go-crypto v1.3.0/go.mod h1:9whxjD8Rbs29b4XWbB8irEcE8KHMqaR2e7GWU1R+/PE= +github.com/VividCortex/ewma v1.2.0 h1:f58SaIzcDXrSy3kWaHNvuJgJ3Nmz59Zji6XoJR/q1ow= +github.com/VividCortex/ewma v1.2.0/go.mod h1:nz4BbCtbLyFDeC9SUHbtcT5644juEuWfUAUnGx7j5l4= +github.com/acarl005/stripansi v0.0.0-20180116102854-5a71ef0e047d h1:licZJFw2RwpHMqeKTCYkitsPqHNxTmd4SNR5r94FGM8= +github.com/acarl005/stripansi v0.0.0-20180116102854-5a71ef0e047d/go.mod h1:asat636LX7Bqt5lYEZ27JNDcqxfjdBQuJ/MM4CN/Lzo= +github.com/andybalholm/brotli v1.2.0 h1:ukwgCxwYrmACq68yiUqwIWnGY0cTPox/M94sVwToPjQ= +github.com/andybalholm/brotli v1.2.0/go.mod h1:rzTDkvFWvIrjDXZHkuS16NPggd91W3kUSvPlQ1pLaKY= +github.com/anmitsu/go-shlex v0.0.0-20200514113438-38f4b401e2be h1:9AeTilPcZAjCFIImctFaOjnTIavg87rW78vTPkQqLI8= +github.com/anmitsu/go-shlex v0.0.0-20200514113438-38f4b401e2be/go.mod h1:ySMOLuWl6zY27l47sB3qLNK6tF2fkHG55UZxx8oIVo4= +github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5 h1:0CwZNZbxp69SHPdPJAN/hZIm0C4OItdklCFmMRWYpio= +github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs= +github.com/beevik/etree v1.6.0 h1:u8Kwy8pp9D9XeITj2Z0XtA5qqZEmtJtuXZRQi+j03eE= +github.com/beevik/etree v1.6.0/go.mod h1:bh4zJxiIr62SOf9pRzN7UUYaEDa9HEKafK25+sLc0Gc= +github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= +github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= +github.com/bradleyjkemp/cupaloy/v2 v2.8.0 h1:any4BmKE+jGIaMpnU8YgH/I2LPiLBufr6oMMlVBbn9M= +github.com/bradleyjkemp/cupaloy/v2 v2.8.0/go.mod h1:bm7JXdkRd4BHJk9HpwqAI8BoAY1lps46Enkdqw6aRX0= +github.com/bshuster-repo/logrus-logstash-hook v1.0.0 h1:e+C0SB5R1pu//O4MQ3f9cFuPGoOVeF2fE4Og9otCc70= +github.com/bshuster-repo/logrus-logstash-hook v1.0.0/go.mod h1:zsTqEiSzDgAa/8GZR7E1qaXrhYNDKBYy5/dWPTIflbk= +github.com/buger/jsonparser v1.1.1 h1:2PnMjfWD7wBILjqQbt530v576A/cAbQvEW9gGIpYMUs= +github.com/buger/jsonparser v1.1.1/go.mod h1:6RYKKt7H4d4+iWqouImQ9R2FZql3VbhNgx27UK13J/0= +github.com/c-bata/go-prompt v0.2.6 h1:POP+nrHE+DfLYx370bedwNhsqmpCUynWPxuHi0C5vZI= +github.com/c-bata/go-prompt v0.2.6/go.mod h1:/LMAke8wD2FsNu9EXNdHxNLbd9MedkPnCdfpU9wwHfY= +github.com/cenkalti/backoff/v4 v4.3.0 h1:MyRJ/UdXutAwSAT+s3wNd7MfTIcy71VQueUuFK343L8= +github.com/cenkalti/backoff/v4 v4.3.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE= +github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= +github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= +github.com/chzyer/logex v1.2.1 h1:XHDu3E6q+gdHgsdTPH6ImJMIp436vR6MPtH8gP05QzM= +github.com/chzyer/logex v1.2.1/go.mod h1:JLbx6lG2kDbNRFnfkgvh4eRJRPX1QCoOIWomwysCBrQ= +github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= +github.com/chzyer/readline v1.5.1 h1:upd/6fQk4src78LMRzh5vItIt361/o4uq553V8B5sGI= +github.com/chzyer/readline v1.5.1/go.mod h1:Eh+b79XXUwfKfcPLepksvw2tcLE/Ct21YObkaSkeBlk= +github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= +github.com/chzyer/test v1.0.0 h1:p3BQDXSxOhOG0P9z6/hGnII4LGiEPOYBhs8asl/fC04= +github.com/chzyer/test v1.0.0/go.mod h1:2JlltgoNkt4TW/z9V/IzDdFaMTM2JPIi26O1pF38GC8= +github.com/clipperhouse/stringish v0.1.1 h1:+NSqMOr3GR6k1FdRhhnXrLfztGzuG+VuFDfatpWHKCs= +github.com/clipperhouse/stringish v0.1.1/go.mod h1:v/WhFtE1q0ovMta2+m+UbpZ+2/HEXNWYXQgCt4hdOzA= +github.com/clipperhouse/uax29/v2 v2.3.0 h1:SNdx9DVUqMoBuBoW3iLOj4FQv3dN5mDtuqwuhIGpJy4= +github.com/clipperhouse/uax29/v2 v2.3.0/go.mod h1:Wn1g7MK6OoeDT0vL+Q0SQLDz/KpfsVRgg6W7ihQeh4g= +github.com/cloudflare/circl v1.6.1 h1:zqIqSPIndyBh1bjLVVDHMPpVKqp8Su/V+6MeDzzQBQ0= +github.com/cloudflare/circl v1.6.1/go.mod h1:uddAzsPgqdMAYatqJ0lsjX1oECcQLIlRpzZh3pJrofs= +github.com/containerd/containerd v1.7.29 h1:90fWABQsaN9mJhGkoVnuzEY+o1XDPbg9BTC9QTAHnuE= +github.com/containerd/containerd v1.7.29/go.mod h1:azUkWcOvHrWvaiUjSQH0fjzuHIwSPg1WL5PshGP4Szs= +github.com/containerd/errdefs v1.0.0 h1:tg5yIfIlQIrxYtu9ajqY42W3lpS19XqdxRQeEwYG8PI= +github.com/containerd/errdefs v1.0.0/go.mod h1:+YBYIdtsnF4Iw6nWZhJcqGSg/dwvV7tyJ/kCkyJ2k+M= +github.com/containerd/log v0.1.0 h1:TCJt7ioM2cr/tfR8GPbGf9/VRAX8D2B4PjzCpfX540I= +github.com/containerd/log v0.1.0/go.mod h1:VRRf09a7mHDIRezVKTRCrOq78v577GXq3bSa3EhrzVo= +github.com/containerd/platforms v0.2.1 h1:zvwtM3rz2YHPQsF2CHYM8+KtB5dvhISiXh5ZpSBQv6A= +github.com/containerd/platforms v0.2.1/go.mod h1:XHCb+2/hzowdiut9rkudds9bE5yJ7npe7dG/wG+uFPw= +github.com/containerd/stargz-snapshotter/estargz v0.18.1 h1:cy2/lpgBXDA3cDKSyEfNOFMA/c10O1axL69EU7iirO8= +github.com/containerd/stargz-snapshotter/estargz v0.18.1/go.mod h1:ALIEqa7B6oVDsrF37GkGN20SuvG/pIMm7FwP7ZmRb0Q= +github.com/coreos/go-systemd/v22 v22.5.0 h1:RrqgGjYQKalulkV8NGVIfkXQf6YYmOyiJKk8iXXhfZs= +github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= +github.com/cpuguy83/go-md2man/v2 v2.0.7 h1:zbFlGlXEAKlwXpmvle3d8Oe3YnkKIK4xSRTd3sHPnBo= +github.com/cpuguy83/go-md2man/v2 v2.0.7/go.mod h1:oOW0eioCTA6cOiMLiUPZOpcVxMig6NIQQ7OS05n1F4g= +github.com/cyphar/filepath-securejoin v0.6.0 h1:BtGB77njd6SVO6VztOHfPxKitJvd/VPT+OFBFMOi1Is= +github.com/cyphar/filepath-securejoin v0.6.0/go.mod h1:A8hd4EnAeyujCJRrICiOWqjS1AX0a9kM5XL+NwKoYSc= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78= +github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc= +github.com/distribution/distribution/v3 v3.0.0 h1:q4R8wemdRQDClzoNNStftB2ZAfqOiN6UX90KJc4HjyM= +github.com/distribution/distribution/v3 v3.0.0/go.mod h1:tRNuFoZsUdyRVegq8xGNeds4KLjwLCRin/tTo6i1DhU= +github.com/distribution/reference v0.6.0 h1:0IXCQ5g4/QMHHkarYzh5l+u8T3t73zM5QvfrDyIgxBk= +github.com/distribution/reference v0.6.0/go.mod h1:BbU0aIcezP1/5jX/8MP0YiH4SdvB5Y4f/wlDRiLyi3E= +github.com/docker/cli v29.0.3+incompatible h1:8J+PZIcF2xLd6h5sHPsp5pvvJA+Sr2wGQxHkRl53a1E= +github.com/docker/cli v29.0.3+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= +github.com/docker/distribution v2.8.3+incompatible h1:AtKxIZ36LoNK51+Z6RpzLpddBirtxJnzDrHLEKxTAYk= +github.com/docker/distribution v2.8.3+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= +github.com/docker/docker-credential-helpers v0.9.3 h1:gAm/VtF9wgqJMoxzT3Gj5p4AqIjCBS4wrsOh9yRqcz8= +github.com/docker/docker-credential-helpers v0.9.3/go.mod h1:x+4Gbw9aGmChi3qTLZj8Dfn0TD20M/fuWy0E5+WDeCo= +github.com/docker/go-events v0.0.0-20190806004212-e31b211e4f1c h1:+pKlWGMw7gf6bQ+oDZB4KHQFypsfjYlq/C4rfL7D3g8= +github.com/docker/go-events v0.0.0-20190806004212-e31b211e4f1c/go.mod h1:Uw6UezgYA44ePAFQYUehOuCzmy5zmg/+nl2ZfMWGkpA= +github.com/docker/go-metrics v0.0.1 h1:AgB/0SvBxihN0X8OR4SjsblXkbMvalQ8cjmtKQ2rQV8= +github.com/docker/go-metrics v0.0.1/go.mod h1:cG1hvH2utMXtqgqqYE9plW6lDxS3/5ayHzueweSI3Vw= +github.com/dsnet/compress v0.0.2-0.20210315054119-f66993602bf5 h1:iFaUwBSo5Svw6L7HYpRu/0lE3e0BaElwnNO1qkNQxBY= +github.com/dsnet/compress v0.0.2-0.20210315054119-f66993602bf5/go.mod h1:qssHWj60/X5sZFNxpG4HBPDHVqxNm4DfnCKgrbZOT+s= +github.com/dsnet/golib v0.0.0-20171103203638-1ea166775780/go.mod h1:Lj+Z9rebOhdfkVLjJ8T6VcRQv3SXugXy999NBtR9aFY= +github.com/elazarl/goproxy v1.7.2 h1:Y2o6urb7Eule09PjlhQRGNsqRfPmYI3KKQLFpCAV3+o= +github.com/elazarl/goproxy v1.7.2/go.mod h1:82vkLNir0ALaW14Rc399OTTjyNREgmdL2cVoIbS6XaE= +github.com/emirpasic/gods v1.18.1 h1:FXtiHYKDGKCW2KzwZKx0iC0PQmdlorYgdFG9jPXJ1Bc= +github.com/emirpasic/gods v1.18.1/go.mod h1:8tpGGwCnJ5H4r6BWwaV6OrWmMoPhUl5jm/FMNAnJvWQ= +github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= +github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= +github.com/forPelevin/gomoji v1.4.1 h1:7U+Bl8o6RV/dOQz7coQFWj/jX6Ram6/cWFOuFDEPEUo= +github.com/forPelevin/gomoji v1.4.1/go.mod h1:mM6GtmCgpoQP2usDArc6GjbXrti5+FffolyQfGgPboQ= +github.com/foxcpp/go-mockdns v1.1.0 h1:jI0rD8M0wuYAxL7r/ynTrCQQq0BVqfB99Vgk7DlmewI= +github.com/foxcpp/go-mockdns v1.1.0/go.mod h1:IhLeSFGed3mJIAXPH2aiRQB+kqz7oqu8ld2qVbOu7Wk= +github.com/frankban/quicktest v1.14.6 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHkI4W8= +github.com/frankban/quicktest v1.14.6/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0= +github.com/fsnotify/fsnotify v1.9.0 h1:2Ml+OJNzbYCTzsxtv8vKSFD9PbJjmhYF14k/jKC7S9k= +github.com/fsnotify/fsnotify v1.9.0/go.mod h1:8jBTzvmWwFyi3Pb8djgCCO5IBqzKJ/Jwo8TRcHyHii0= +github.com/gliderlabs/ssh v0.3.8 h1:a4YXD1V7xMF9g5nTkdfnja3Sxy1PVDCj1Zg4Wb8vY6c= +github.com/gliderlabs/ssh v0.3.8/go.mod h1:xYoytBv1sV0aL3CavoDuJIQNURXkkfPA/wxQ1pL1fAU= +github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376 h1:+zs/tPmkDkHx3U66DAb0lQFJrpS6731Oaa12ikc+DiI= +github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376/go.mod h1:an3vInlBmSxCcxctByoQdvwPiA7DTK7jaaFDBTtu0ic= +github.com/go-git/go-billy/v5 v5.6.2 h1:6Q86EsPXMa7c3YZ3aLAQsMA0VlWmy43r6FHqa/UNbRM= +github.com/go-git/go-billy/v5 v5.6.2/go.mod h1:rcFC2rAsp/erv7CMz9GczHcuD0D32fWzH+MJAU+jaUU= +github.com/go-git/go-git-fixtures/v4 v4.3.2-0.20231010084843-55a94097c399 h1:eMje31YglSBqCdIqdhKBW8lokaMrL3uTkpGYlE2OOT4= +github.com/go-git/go-git-fixtures/v4 v4.3.2-0.20231010084843-55a94097c399/go.mod h1:1OCfN199q1Jm3HZlxleg+Dw/mwps2Wbk9frAWm+4FII= +github.com/go-git/go-git/v5 v5.16.3 h1:Z8BtvxZ09bYm/yYNgPKCzgWtaRqDTgIKRgIRHBfU6Z8= +github.com/go-git/go-git/v5 v5.16.3/go.mod h1:4Ge4alE/5gPs30F2H1esi2gPd69R0C39lolkucHBOp8= +github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI= +github.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= +github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= +github.com/go-viper/mapstructure/v2 v2.4.0 h1:EBsztssimR/CONLSZZ04E8qAkxNYq4Qp9LvH92wZUgs= +github.com/go-viper/mapstructure/v2 v2.4.0/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= +github.com/gocarina/gocsv v0.0.0-20240520201108-78e41c74b4b1 h1:FWNFq4fM1wPfcK40yHE5UO3RUdSNPaBC+j3PokzA6OQ= +github.com/gocarina/gocsv v0.0.0-20240520201108-78e41c74b4b1/go.mod h1:5YoVOkjYAQumqlV356Hj3xeYh4BdZuLE0/nRkf2NKkI= +github.com/golang-jwt/jwt/v4 v4.5.2 h1:YtQM7lnr8iZ+j5q71MGKkNw9Mn7AjHM68uc9g5fXeUI= +github.com/golang-jwt/jwt/v4 v4.5.2/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= +github.com/golang/groupcache v0.0.0-20241129210726-2c02b8208cf8 h1:f+oWsMOmNPc8JmEHVZIycC7hBoQxHH9pNKQORJNozsQ= +github.com/golang/groupcache v0.0.0-20241129210726-2c02b8208cf8/go.mod h1:wcDNUvekVysuuOpQKo3191zZyTpiI6se1N1ULghS0sw= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= +github.com/golang/snappy v1.0.0 h1:Oy607GVXHs7RtbggtPBnr2RmDArIsAefDwvrdWvRhGs= +github.com/golang/snappy v1.0.0/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= +github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= +github.com/google/go-containerregistry v0.20.7 h1:24VGNpS0IwrOZ2ms2P1QE3Xa5X9p4phx0aUgzYzHW6I= +github.com/google/go-containerregistry v0.20.7/go.mod h1:Lx5LCZQjLH1QBaMPeGwsME9biPeo1lPx6lbGj/UmzgM= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/gookit/assert v0.1.1 h1:lh3GcawXe/p+cU7ESTZ5Ui3Sm/x8JWpIis4/1aF0mY0= +github.com/gookit/assert v0.1.1/go.mod h1:jS5bmIVQZTIwk42uXl4lyj4iaaxx32tqH16CFj0VX2E= +github.com/gookit/color v1.6.0 h1:JjJXBTk1ETNyqyilJhkTXJYYigHG24TM9Xa2M1xAhRA= +github.com/gookit/color v1.6.0/go.mod h1:9ACFc7/1IpHGBW8RwuDm/0YEnhg3dwwXpoMsmtyHfjs= +github.com/gorilla/handlers v1.5.2 h1:cLTUSsNkgcwhgRqvCNmdbRWG0A3N4F+M2nWKdScwyEE= +github.com/gorilla/handlers v1.5.2/go.mod h1:dX+xVpaxdSw+q0Qek8SSsl3dfMk3jNddUkMzo0GtH0w= +github.com/gorilla/mux v1.8.1 h1:TuBL49tXwgrFYWhqrNgrUNEY92u81SPhu7sTdzQEiWY= +github.com/gorilla/mux v1.8.1/go.mod h1:AKf9I4AEqPTmMytcMc0KkNouC66V3BtZ4qD5fmWSiMQ= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.26.3 h1:5ZPtiqj0JL5oKWmcsq4VMaAW5ukBEgSGXEN89zeH1Jo= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.26.3/go.mod h1:ndYquD05frm2vACXE1nsccT4oJzjhw2arTS2cpUD1PI= +github.com/hashicorp/golang-lru/arc/v2 v2.0.5 h1:l2zaLDubNhW4XO3LnliVj0GXO3+/CGNJAg1dcN2Fpfw= +github.com/hashicorp/golang-lru/arc/v2 v2.0.5/go.mod h1:ny6zBSQZi2JxIeYcv7kt2sH2PXJtirBN7RDhRpxPkxU= +github.com/hashicorp/golang-lru/v2 v2.0.5 h1:wW7h1TG88eUIJ2i69gaE3uNVtEPIagzhGvHgwfx2Vm4= +github.com/hashicorp/golang-lru/v2 v2.0.5/go.mod h1:QeFd9opnmA6QUJc5vARoKUSoFhyfM2/ZepoAG6RGpeM= +github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= +github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= +github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 h1:BQSFePA1RWJOlocH6Fxy8MmwDt+yVQYULKfN0RoTN8A= +github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99/go.mod h1:1lJo3i6rXxKeerYnT8Nvf0QmHCRC1n8sfWVwXF2Frvo= +github.com/jedib0t/go-pretty/v6 v6.7.5 h1:9dJSWTJnsXJVVAbvxIFxeHf/JxoJd7GUl5o3UzhtuiM= +github.com/jedib0t/go-pretty/v6 v6.7.5/go.mod h1:YwC5CE4fJ1HFUDeivSV1r//AmANFHyqczZk+U6BDALU= +github.com/jfrog/archiver/v3 v3.6.1 h1:LOxnkw9pOn45DzCbZNFV6K0+6dCsQ0L8mR3ZcujO5eI= +github.com/jfrog/archiver/v3 v3.6.1/go.mod h1:VgR+3WZS4N+i9FaDwLZbq+jeU4B4zctXL+gL4EMzfLw= +github.com/jfrog/build-info-go v1.8.9-0.20251223092904-9e9460642431 h1:HyGqdD957CrW6T1Xst0CxTR0XqJ0baIo/uL4I5lhyuo= +github.com/jfrog/build-info-go v1.8.9-0.20251223092904-9e9460642431/go.mod h1:9W4U440fdTHwW1HiB/R0VQvz/5q8ZHsms9MWcq+JrdY= +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.60.1-0.20251223102649-e659f6937251 h1:WTyDOaYJUwY6zQujZuL9JQ9Q9+QWj9p31tLb4bJnu4U= +github.com/jfrog/jfrog-cli-core/v2 v2.60.1-0.20251223102649-e659f6937251/go.mod h1:REkU0OfnLYZbQIjD2Cg85DAVP0SRZuV/PxiDfCJiJOc= +github.com/jfrog/jfrog-client-go v1.55.1-0.20251223101502-1a13a993b0c7 h1:5JUiqmBV9ikFOZEH+ZgvJLHshT1aAuw08bfdJOLHbzQ= +github.com/jfrog/jfrog-client-go v1.55.1-0.20251223101502-1a13a993b0c7/go.mod h1:USb7bfWSE7bGKsJ4nR0lxGILvmtnCcR5OO4biSUItMs= +github.com/kevinburke/ssh_config v1.2.0 h1:x584FjTGwHzMwvHx18PXxbBVzfnxogHaAReU4gf13a4= +github.com/kevinburke/ssh_config v1.2.0/go.mod h1:CT57kijsi8u/K/BOFA39wgDQJ9CxiF4nAY/ojJ6r6mM= +github.com/klauspost/compress v1.4.1/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= +github.com/klauspost/compress v1.18.1 h1:bcSGx7UbpBqMChDtsF28Lw6v/G94LPrrbMbdC3JH2co= +github.com/klauspost/compress v1.18.1/go.mod h1:ZQFFVG+MdnR0P+l6wpXgIL4NTtwiKIdBnrBd8Nrxr+0= +github.com/klauspost/cpuid v1.2.0/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek= +github.com/klauspost/cpuid/v2 v2.3.0 h1:S4CRMLnYUhGeDFDqkGriYKdfoFlDnMtqTiI/sFzhA9Y= +github.com/klauspost/cpuid/v2 v2.3.0/go.mod h1:hqwkgyIinND0mEev00jJYCxPNVRVXFQeu1XKlok6oO0= +github.com/klauspost/pgzip v1.2.6 h1:8RXeL5crjEUFnR2/Sn6GJNWtSQ3Dk8pq4CL3jvdDyjU= +github.com/klauspost/pgzip v1.2.6/go.mod h1:Ch1tH69qFZu15pkjo5kYi6mth2Zzwzt50oCQKQE9RUs= +github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= +github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= +github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/magiconair/properties v1.8.10 h1:s31yESBquKXCV9a/ScB3ESkOjUYYv+X0rg8SYxI99mE= +github.com/magiconair/properties v1.8.10/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0= +github.com/manifoldco/promptui v0.9.0 h1:3V4HzJk1TtXW1MTZMP7mdlwbBpIinw3HztaIlYthEiA= +github.com/manifoldco/promptui v0.9.0/go.mod h1:ka04sppxSGFAtxX0qhlYQjISsg9mR4GWtQEhdbn6Pgg= +github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= +github.com/mattn/go-colorable v0.1.7/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= +github.com/mattn/go-colorable v0.1.14 h1:9A9LHSqF/7dyVVX6g0U9cwm9pG3kP9gSzcuIPHPsaIE= +github.com/mattn/go-colorable v0.1.14/go.mod h1:6LmQG8QLFO4G5z1gPvYEzlUgJ2wF+stgPZH1UqBm1s8= +github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= +github.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84= +github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= +github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= +github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= +github.com/mattn/go-runewidth v0.0.6/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= +github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= +github.com/mattn/go-runewidth v0.0.19 h1:v++JhqYnZuu5jSKrk9RbgF5v4CGUjqRfBm05byFGLdw= +github.com/mattn/go-runewidth v0.0.19/go.mod h1:XBkDxAl56ILZc9knddidhrOlY5R/pDhgLpndooCuJAs= +github.com/mattn/go-tty v0.0.3/go.mod h1:ihxohKRERHTVzN+aSVRwACLCeqIoZAWpoICkkvrWyR0= +github.com/mattn/go-tty v0.0.7 h1:KJ486B6qI8+wBO7kQxYgmmEFDaFEE96JMBQ7h400N8Q= +github.com/mattn/go-tty v0.0.7/go.mod h1:f2i5ZOvXBU/tCABmLmOfzLz9azMo5wdAaElRNnJKr+k= +github.com/miekg/dns v1.1.57 h1:Jzi7ApEIzwEPLHWRcafCN9LZSBbqQpxjt/wpgvg7wcM= +github.com/miekg/dns v1.1.57/go.mod h1:uqRjCRUuEAA6qsOiJvDd+CFo/vW+y5WR6SNmHE55hZk= +github.com/minio/sha256-simd v1.0.1 h1:6kaan5IFmwTNynnKKpDHe6FWHohJOHhCPchzK49dzMM= +github.com/minio/sha256-simd v1.0.1/go.mod h1:Pz6AKMiUdngCLpeTL/RJY1M9rUuPMYujV5xJjtbRSN8= +github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= +github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= +github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA= +github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= +github.com/nwaples/rardecode v1.1.3 h1:cWCaZwfM5H7nAD6PyEdcVnczzV8i/JtotnyW/dD9lEc= +github.com/nwaples/rardecode v1.1.3/go.mod h1:5DzqNKiOdpKKBH87u8VlvAnPZMXcGRhxWkRpHbbfGS0= +github.com/onsi/gomega v1.38.2 h1:eZCjf2xjZAqe+LeWvKb5weQ+NcPwX84kqJ0cZNxok2A= +github.com/onsi/gomega v1.38.2/go.mod h1:W2MJcYxRGV63b418Ai34Ud0hEdTVXq9NW9+Sx6uXf3k= +github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U= +github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= +github.com/opencontainers/image-spec v1.1.1 h1:y0fUlFfIZhPF1W537XOLg0/fcx6zcHCJwooC2xJA040= +github.com/opencontainers/image-spec v1.1.1/go.mod h1:qpqAh3Dmcf36wStyyWU+kCeDgrGnAve2nCC8+7h8Q0M= +github.com/pelletier/go-toml/v2 v2.2.4 h1:mye9XuhQ6gvn5h28+VilKrrPoQVanw5PMw/TB0t5Ec4= +github.com/pelletier/go-toml/v2 v2.2.4/go.mod h1:2gIqNv+qfxSVS7cM2xJQKtLSTLUE9V8t9Stt+h56mCY= +github.com/phayes/freeport v0.0.0-20220201140144-74d24b5ae9f5 h1:Ii+DKncOVM8Cu1Hc+ETb5K+23HdAMvESYE3ZJ5b5cMI= +github.com/phayes/freeport v0.0.0-20220201140144-74d24b5ae9f5/go.mod h1:iIss55rKnNBTvrwdmkUpLnDpZoAHvWaiq5+iMmen4AE= +github.com/pierrec/lz4/v4 v4.1.22 h1:cKFw6uJDK+/gfw5BcDL0JL5aBsAFdsIT18eRtLj7VIU= +github.com/pierrec/lz4/v4 v4.1.22/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= +github.com/pjbgf/sha1cd v0.3.2 h1:a9wb0bp1oC2TGwStyn0Umc/IGKQnEgF0vVaZ8QF8eo4= +github.com/pjbgf/sha1cd v0.3.2/go.mod h1:zQWigSxVmsHEZow5qaLtPYxpcKMMQpa09ixqBxuCS6A= +github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c h1:+mdjkGKdHQG3305AYmdv1U2eRNDiU2ErMBj1gwrq8eQ= +github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c/go.mod h1:7rwL4CYBLnjLxUqIJNnCWiEdr3bn6IUYi15bNlnbCCU= +github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/term v1.2.0-beta.2 h1:L3y/h2jkuBVFdWiJvNfYfKmzcCnILw7mJWm2JQuMppw= +github.com/pkg/term v1.2.0-beta.2/go.mod h1:E25nymQcrSllhX42Ok8MRm1+hyBdHY0dCeiKZ9jpNGw= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/prometheus/client_golang v1.23.0 h1:ust4zpdl9r4trLY/gSjlm07PuiBq2ynaXXlptpfy8Uc= +github.com/prometheus/client_golang v1.23.0/go.mod h1:i/o0R9ByOnHX0McrTMTyhYvKE4haaf2mW08I+jGAjEE= +github.com/prometheus/client_model v0.6.2 h1:oBsgwpGs7iVziMvrGhE53c/GrLUsZdHnqNwqPLxwZyk= +github.com/prometheus/client_model v0.6.2/go.mod h1:y3m2F6Gdpfy6Ut/GBsUqTWZqCUvMVzSfMLjcu6wAwpE= +github.com/prometheus/common v0.65.0 h1:QDwzd+G1twt//Kwj/Ww6E9FQq1iVMmODnILtW1t2VzE= +github.com/prometheus/common v0.65.0/go.mod h1:0gZns+BLRQ3V6NdaerOhMbwwRbNh9hkGINtQAsP5GS8= +github.com/prometheus/procfs v0.17.0 h1:FuLQ+05u4ZI+SS/w9+BWEM2TXiHKsUQ9TADiRH7DuK0= +github.com/prometheus/procfs v0.17.0/go.mod h1:oPQLaDAMRbA+u8H5Pbfq+dl3VDAvHxMUOVhe0wYB2zw= +github.com/redis/go-redis/extra/rediscmd/v9 v9.0.5 h1:EaDatTxkdHG+U3Bk4EUr+DZ7fOGwTfezUiUJMaIcaho= +github.com/redis/go-redis/extra/rediscmd/v9 v9.0.5/go.mod h1:fyalQWdtzDBECAQFBJuQe5bzQ02jGd5Qcbgb97Flm7U= +github.com/redis/go-redis/extra/redisotel/v9 v9.0.5 h1:EfpWLLCyXw8PSM2/XNJLjI3Pb27yVE+gIAfeqp8LUCc= +github.com/redis/go-redis/extra/redisotel/v9 v9.0.5/go.mod h1:WZjPDy7VNzn77AAfnAfVjZNvfJTYfPetfZk5yoSTLaQ= +github.com/redis/go-redis/v9 v9.7.3 h1:YpPyAayJV+XErNsatSElgRZZVCwXX9QzkKYNvO7x0wM= +github.com/redis/go-redis/v9 v9.7.3/go.mod h1:bGUrSggJ9X9GUmZpZNEOQKaANxSGgOEBRltRTZHSvrA= +github.com/rivo/uniseg v0.4.7 h1:WUdvkW8uEhrYfLC4ZzdpI2ztxP1I582+49Oc5Mq64VQ= +github.com/rivo/uniseg v0.4.7/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= +github.com/rogpeppe/go-internal v1.14.1 h1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0tI/otEQ= +github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc= +github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk= +github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/sagikazarmark/locafero v0.12.0 h1:/NQhBAkUb4+fH1jivKHWusDYFjMOOKU88eegjfxfHb4= +github.com/sagikazarmark/locafero v0.12.0/go.mod h1:sZh36u/YSZ918v0Io+U9ogLYQJ9tLLBmM4eneO6WwsI= +github.com/sergi/go-diff v1.3.2-0.20230802210424-5b0b94c5c0d3 h1:n661drycOFuPLCN3Uc8sB6B/s6Z4t2xvBgU1htSHuq8= +github.com/sergi/go-diff v1.3.2-0.20230802210424-5b0b94c5c0d3/go.mod h1:A0bzQcvG0E7Rwjx0REVgAGH58e96+X0MeOfepqsbeW4= +github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= +github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= +github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= +github.com/skeema/knownhosts v1.3.1 h1:X2osQ+RAjK76shCbvhHHHVl3ZlgDm8apHEHFqRjnBY8= +github.com/skeema/knownhosts v1.3.1/go.mod h1:r7KTdC8l4uxWRyK2TpQZ/1o5HaSzh06ePQNxPwTcfiY= +github.com/spf13/afero v1.15.0 h1:b/YBCLWAJdFWJTN9cLhiXXcD7mzKn9Dm86dNnfyQw1I= +github.com/spf13/afero v1.15.0/go.mod h1:NC2ByUVxtQs4b3sIUphxK0NioZnmxgyCrfzeuq8lxMg= +github.com/spf13/cast v1.10.0 h1:h2x0u2shc1QuLHfxi+cTJvs30+ZAHOGRic8uyGTDWxY= +github.com/spf13/cast v1.10.0/go.mod h1:jNfB8QC9IA6ZuY2ZjDp0KtFO2LZZlg4S/7bzP6qqeHo= +github.com/spf13/cobra v1.10.1 h1:lJeBwCfmrnXthfAupyUTzJ/J4Nc1RsHC/mSRU2dll/s= +github.com/spf13/cobra v1.10.1/go.mod h1:7SmJGaTHFVBY0jW4NXGluQoLvhqFQM+6XSKD+P4XaB0= +github.com/spf13/pflag v1.0.10 h1:4EBh2KAYBwaONj6b2Ye1GiHfwjqyROoF4RwYO+vPwFk= +github.com/spf13/pflag v1.0.10/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= +github.com/spf13/viper v1.21.0 h1:x5S+0EU27Lbphp4UKm1C+1oQO+rKx36vfCoaVebLFSU= +github.com/spf13/viper v1.21.0/go.mod h1:P0lhsswPGWD/1lZJ9ny3fYnVqxiegrlNrEmgLjbTCAY= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= +github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= +github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY= +github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= +github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= +github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= +github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U= +github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= +github.com/subosito/gotenv v1.6.0 h1:9NlTDc1FTs4qu0DDq7AEtTPNw6SVm7uBMsUCUjABIf8= +github.com/subosito/gotenv v1.6.0/go.mod h1:Dk4QP5c2W3ibzajGcXpNraDfq2IrhjMIvMSWPKKo0FU= +github.com/terminalstatic/go-xsd-validate v0.1.6 h1:TenYeQ3eY631qNi1/cTmLH/s2slHPRKTTHT+XSHkepo= +github.com/terminalstatic/go-xsd-validate v0.1.6/go.mod h1:18lsvYFofBflqCrvo1umpABZ99+GneNTw2kEEc8UPJw= +github.com/ulikunitz/xz v0.5.8/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14= +github.com/ulikunitz/xz v0.5.15 h1:9DNdB5s+SgV3bQ2ApL10xRc35ck0DuIX/isZvIk+ubY= +github.com/ulikunitz/xz v0.5.15/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14= +github.com/urfave/cli v1.22.17 h1:SYzXoiPfQjHBbkYxbew5prZHS1TOLT3ierW8SYLqtVQ= +github.com/urfave/cli v1.22.17/go.mod h1:b0ht0aqgH/6pBYzzxURyrM4xXNgsoT/n2ZzwQiEhNVo= +github.com/vbatts/tar-split v0.12.2 h1:w/Y6tjxpeiFMR47yzZPlPj/FcPLpXbTUi/9H7d3CPa4= +github.com/vbatts/tar-split v0.12.2/go.mod h1:eF6B6i6ftWQcDqEn3/iGFRFRo8cBIMSJVOpnNdfTMFA= +github.com/vbauerster/mpb/v8 v8.10.2 h1:2uBykSHAYHekE11YvJhKxYmLATKHAGorZwFlyNw4hHM= +github.com/vbauerster/mpb/v8 v8.10.2/go.mod h1:+Ja4P92E3/CorSZgfDtK46D7AVbDqmBQRTmyTqPElo0= +github.com/xanzy/ssh-agent v0.3.3 h1:+/15pJfg/RsTxqYcX6fHqOXZwwMP+2VyYWJeWM2qQFM= +github.com/xanzy/ssh-agent v0.3.3/go.mod h1:6dzNDKs0J9rVPHPhaGCukekBHKqfl+L3KghI1Bc68Uw= +github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb h1:zGWFAtiMcyryUHoUjUJX0/lt1H2+i2Ka2n+D3DImSNo= +github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= +github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 h1:EzJWgHovont7NscjpAxXsDA8S8BMYve8Y5+7cuRE7R0= +github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ= +github.com/xeipuuv/gojsonschema v1.2.0 h1:LhYJRs+L4fBtjZUfuSZIKGeVu0QRy8e5Xi7D17UxZ74= +github.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQluxsYJ78Id3Y= +github.com/xi2/xz v0.0.0-20171230120015-48954b6210f8 h1:nIPpBwaJSVYIxUFsDv3M8ofmx9yWTog9BfvIu0q41lo= +github.com/xi2/xz v0.0.0-20171230120015-48954b6210f8/go.mod h1:HUYIGzjTL3rfEspMxjDjgmT5uz5wzYJKVo23qUhYTos= +github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e h1:JVG44RsyaB9T2KIHavMF/ppJZNG9ZpyihvCd0w101no= +github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e/go.mod h1:RbqR21r5mrJuqunuUZ/Dhy/avygyECGrLceyNeo4LiM= +github.com/xyproto/randomstring v1.0.5 h1:YtlWPoRdgMu3NZtP45drfy1GKoojuR7hmRcnhZqKjWU= +github.com/xyproto/randomstring v1.0.5/go.mod h1:rgmS5DeNXLivK7YprL0pY+lTuhNQW3iGxZ18UQApw/E= +go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJySYA= +go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A= +go.opentelemetry.io/contrib/bridges/prometheus v0.57.0 h1:UW0+QyeyBVhn+COBec3nGhfnFe5lwB0ic1JBVjzhk0w= +go.opentelemetry.io/contrib/bridges/prometheus v0.57.0/go.mod h1:ppciCHRLsyCio54qbzQv0E4Jyth/fLWDTJYfvWpcSVk= +go.opentelemetry.io/contrib/exporters/autoexport v0.57.0 h1:jmTVJ86dP60C01K3slFQa2NQ/Aoi7zA+wy7vMOKD9H4= +go.opentelemetry.io/contrib/exporters/autoexport v0.57.0/go.mod h1:EJBheUMttD/lABFyLXhce47Wr6DPWYReCzaZiXadH7g= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.62.0 h1:Hf9xI/XLML9ElpiHVDNwvqI0hIFlzV8dgIr35kV1kRU= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.62.0/go.mod h1:NfchwuyNoMcZ5MLHwPrODwUF1HWCXWrL31s8gSAdIKY= +go.opentelemetry.io/otel v1.37.0 h1:9zhNfelUvx0KBfu/gb+ZgeAfAgtWrfHJZcAqFC228wQ= +go.opentelemetry.io/otel v1.37.0/go.mod h1:ehE/umFRLnuLa/vSccNq9oS1ErUlkkK71gMcN34UG8I= +go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.8.0 h1:WzNab7hOOLzdDF/EoWCt4glhrbMPVMOO5JYTmpz36Ls= +go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.8.0/go.mod h1:hKvJwTzJdp90Vh7p6q/9PAOd55dI6WA6sWj62a/JvSs= +go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.8.0 h1:S+LdBGiQXtJdowoJoQPEtI52syEP/JYBUpjO49EQhV8= +go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.8.0/go.mod h1:5KXybFvPGds3QinJWQT7pmXf+TN5YIa7CNYObWRkj50= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.32.0 h1:j7ZSD+5yn+lo3sGV69nW04rRR0jhYnBwjuX3r0HvnK0= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.32.0/go.mod h1:WXbYJTUaZXAbYd8lbgGuvih0yuCfOFC5RJoYnoLcGz8= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.32.0 h1:t/Qur3vKSkUCcDVaSumWF2PKHt85pc7fRvFuoVT8qFU= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.32.0/go.mod h1:Rl61tySSdcOJWoEgYZVtmnKdA0GeKrSqkHC1t+91CH8= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.34.0 h1:OeNbIYk/2C15ckl7glBlOBp5+WlYsOElzTNmiPW/x60= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.34.0/go.mod h1:7Bept48yIeqxP2OZ9/AqIpYS94h2or0aB4FypJTc8ZM= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.34.0 h1:tgJ0uaNS4c98WRNUEx5U3aDlrDOI5Rs+1Vifcw4DJ8U= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.34.0/go.mod h1:U7HYyW0zt/a9x5J1Kjs+r1f/d4ZHnYFclhYY2+YbeoE= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.33.0 h1:wpMfgF8E1rkrT1Z6meFh1NDtownE9Ii3n3X2GJYjsaU= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.33.0/go.mod h1:wAy0T/dUbs468uOlkT31xjvqQgEVXv58BRFWEgn5v/0= +go.opentelemetry.io/otel/exporters/prometheus v0.54.0 h1:rFwzp68QMgtzu9PgP3jm9XaMICI6TsofWWPcBDKwlsU= +go.opentelemetry.io/otel/exporters/prometheus v0.54.0/go.mod h1:QyjcV9qDP6VeK5qPyKETvNjmaaEc7+gqjh4SS0ZYzDU= +go.opentelemetry.io/otel/exporters/stdout/stdoutlog v0.8.0 h1:CHXNXwfKWfzS65yrlB2PVds1IBZcdsX8Vepy9of0iRU= +go.opentelemetry.io/otel/exporters/stdout/stdoutlog v0.8.0/go.mod h1:zKU4zUgKiaRxrdovSS2amdM5gOc59slmo/zJwGX+YBg= +go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.32.0 h1:SZmDnHcgp3zwlPBS2JX2urGYe/jBKEIT6ZedHRUyCz8= +go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.32.0/go.mod h1:fdWW0HtZJ7+jNpTKUR0GpMEDP69nR8YBJQxNiVCE3jk= +go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.32.0 h1:cC2yDI3IQd0Udsux7Qmq8ToKAx1XCilTQECZ0KDZyTw= +go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.32.0/go.mod h1:2PD5Ex6z8CFzDbTdOlwyNIUywRr1DN0ospafJM1wJ+s= +go.opentelemetry.io/otel/log v0.8.0 h1:egZ8vV5atrUWUbnSsHn6vB8R21G2wrKqNiDt3iWertk= +go.opentelemetry.io/otel/log v0.8.0/go.mod h1:M9qvDdUTRCopJcGRKg57+JSQ9LgLBrwwfC32epk5NX8= +go.opentelemetry.io/otel/metric v1.37.0 h1:mvwbQS5m0tbmqML4NqK+e3aDiO02vsf/WgbsdpcPoZE= +go.opentelemetry.io/otel/metric v1.37.0/go.mod h1:04wGrZurHYKOc+RKeye86GwKiTb9FKm1WHtO+4EVr2E= +go.opentelemetry.io/otel/sdk v1.37.0 h1:ItB0QUqnjesGRvNcmAcU0LyvkVyGJ2xftD29bWdDvKI= +go.opentelemetry.io/otel/sdk v1.37.0/go.mod h1:VredYzxUvuo2q3WRcDnKDjbdvmO0sCzOvVAiY+yUkAg= +go.opentelemetry.io/otel/sdk/log v0.8.0 h1:zg7GUYXqxk1jnGF/dTdLPrK06xJdrXgqgFLnI4Crxvs= +go.opentelemetry.io/otel/sdk/log v0.8.0/go.mod h1:50iXr0UVwQrYS45KbruFrEt4LvAdCaWWgIrsN3ZQggo= +go.opentelemetry.io/otel/sdk/metric v1.37.0 h1:90lI228XrB9jCMuSdA0673aubgRobVZFhbjxHHspCPc= +go.opentelemetry.io/otel/sdk/metric v1.37.0/go.mod h1:cNen4ZWfiD37l5NhS+Keb5RXVWZWpRE+9WyVCpbo5ps= +go.opentelemetry.io/otel/trace v1.37.0 h1:HLdcFNbRQBE2imdSEgm/kwqmQj1Or1l/7bW6mxVK7z4= +go.opentelemetry.io/otel/trace v1.37.0/go.mod h1:TlgrlQ+PtQO5XFerSPUYG0JSgGyryXewPGyayAWSBS0= +go.opentelemetry.io/proto/otlp v1.5.0 h1:xJvq7gMzB31/d406fB8U5CBdyQGw4P399D1aQWU/3i4= +go.opentelemetry.io/proto/otlp v1.5.0/go.mod h1:keN8WnHxOy8PG0rQZjJJ5A2ebUoafqWp0eVQ4yIXvJ4= +go.yaml.in/yaml/v2 v2.4.2 h1:DzmwEr2rDGHl7lsFgAHxmNz/1NlQ7xLIrlN2h5d1eGI= +go.yaml.in/yaml/v2 v2.4.2/go.mod h1:081UH+NErpNdqlCXm3TtEran0rJZGxAYx9hb/ELlsPU= +go.yaml.in/yaml/v3 v3.0.4 h1:tfq32ie2Jv2UxXFdLJdh3jXuOzWiL1fo0bu/FbuKpbc= +go.yaml.in/yaml/v3 v3.0.4/go.mod h1:DhzuOOF2ATzADvBadXxruRBLzYTpT36CKvDb3+aBEFg= +golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/crypto v0.45.0 h1:jMBrvKuj23MTlT0bQEOBcAE0mjg8mK9RXFhRH6nyF3Q= +golang.org/x/crypto v0.45.0/go.mod h1:XTGrrkGJve7CYK7J8PEww4aY7gM3qMCElcJQ8n8JdX4= +golang.org/x/exp v0.0.0-20251125195548-87e1e737ad39 h1:DHNhtq3sNNzrvduZZIiFyXWOL9IWaDPHqTnLJp+rCBY= +golang.org/x/exp v0.0.0-20251125195548-87e1e737ad39/go.mod h1:46edojNIoXTNOhySWIWdix628clX9ODXwPsQuG6hsK0= +golang.org/x/mod v0.30.0 h1:fDEXFVZ/fmCKProc/yAXXUijritrDzahmwwefnjoPFk= +golang.org/x/mod v0.30.0/go.mod h1:lAsf5O2EvJeSFMiBxXDki7sCgAxEUcZHXoXMKT4GJKc= +golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.47.0 h1:Mx+4dIFzqraBXUugkia1OOvlD6LemFo1ALMHjrXDOhY= +golang.org/x/net v0.47.0/go.mod h1:/jNxtkgq5yWUGYkaZGqo27cfGZ1c5Nen03aYrrKpVRU= +golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.18.0 h1:kr88TuHDroi+UVf+0hZnirlk8o8T+4MrK6mr60WkH/I= +golang.org/x/sync v0.18.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI= +golang.org/x/sys v0.0.0-20181122145206-62eef0e2fa9b/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200909081042-eff7692f9009/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200918174421-af09f7315aff/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220310020820-b874c991c1a5/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.38.0 h1:3yZWxaJjBmCWXqhN1qh02AkOnCQ1poK6oF+a7xWL6Gc= +golang.org/x/sys v0.38.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/term v0.37.0 h1:8EGAD0qCmHYZg6J17DvsMy9/wJ7/D/4pV/wfnld5lTU= +golang.org/x/term v0.37.0/go.mod h1:5pB4lxRNYYVZuTLmy8oR2BH8dflOR+IbTYFD8fi3254= +golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.31.0 h1:aC8ghyu4JhP8VojJ2lEHBnochRno1sgL6nEi9WGFGMM= +golang.org/x/text v0.31.0/go.mod h1:tKRAlv61yKIjGGHX/4tP1LTbc13YSec1pxVEWXzfoeM= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.39.0 h1:ik4ho21kwuQln40uelmciQPp9SipgNDdrafrYA4TmQQ= +golang.org/x/tools v0.39.0/go.mod h1:JnefbkDPyD8UU2kI5fuf8ZX4/yUeh9W877ZeBONxUqQ= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +google.golang.org/genproto v0.0.0-20231211222908-989df2bf70f3 h1:1hfbdAfFbkmpg41000wDVqr7jUpK/Yo+LPnIxxGzmkg= +google.golang.org/genproto/googleapis/api v0.0.0-20250303144028-a0af3efb3deb h1:p31xT4yrYrSM/G4Sn2+TNUkVhFCbG9y8itM2S6Th950= +google.golang.org/genproto/googleapis/api v0.0.0-20250303144028-a0af3efb3deb/go.mod h1:jbe3Bkdp+Dh2IrslsFCklNhweNTBgSYanP1UXhJDhKg= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250303144028-a0af3efb3deb h1:TLPQVbx1GJ8VKZxz52VAxl1EBgKXXbTiU9Fc5fZeLn4= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250303144028-a0af3efb3deb/go.mod h1:LuRYeWDFV6WOn90g357N17oMCaxpgCnbi/44qJvDn2I= +google.golang.org/grpc v1.72.1 h1:HR03wO6eyZ7lknl75XlxABNVLLFc2PAb6mHlYh756mA= +google.golang.org/grpc v1.72.1/go.mod h1:wH5Aktxcg25y1I3w7H69nHfXdOG3UiadoBtjh3izSDM= +google.golang.org/protobuf v1.36.8 h1:xHScyCOEuuwZEc6UtSOvPbAT4zRh0xcNRYekJwfqyMc= +google.golang.org/protobuf v1.36.8/go.mod h1:fuxRtAxBytpl4zzqUh6/eyUujkJdNiuEkXntxiD/uRU= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= +gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= +gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/warnings.v0 v0.1.2 h1:wFXVbFY8DY5/xOe1ECiWdKCzZlxgshcYVNkBHstARME= +gopkg.in/warnings.v0 v0.1.2/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRNI= +gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= +gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gotest.tools/v3 v3.0.3 h1:4AuOwCGf4lLR9u3YOe2awrHygurzhO/HeQ6laiA6Sx0= +gotest.tools/v3 v3.0.3/go.mod h1:Z7Lb0S5l+klDB31fvDQX8ss/FlKDxtlFlw3Oa8Ymbl8= +helm.sh/helm/v3 v3.19.2 h1:psQjaM8aIWrSVEly6PgYtLu/y6MRSmok4ERiGhZmtUY= +helm.sh/helm/v3 v3.19.2/go.mod h1:gX10tB5ErM+8fr7bglUUS/UfTOO8UUTYWIBH1IYNnpE= +k8s.io/client-go v0.34.0 h1:YoWv5r7bsBfb0Hs2jh8SOvFbKzzxyNo0nSb0zC19KZo= +k8s.io/client-go v0.34.0/go.mod h1:ozgMnEKXkRjeMvBZdV1AijMHLTh3pbACPvK7zFR+QQY= +oras.land/oras-go/v2 v2.6.0 h1:X4ELRsiGkrbeox69+9tzTu492FMUu7zJQW6eJU+I2oc= +oras.land/oras-go/v2 v2.6.0/go.mod h1:magiQDfG6H1O9APp+rOsvCPcW1GD2MM7vgnKY0Y+u1o= +sigs.k8s.io/yaml v1.6.0 h1:G8fkbMSAFqgEFgh4b1wmtzDnioxFCUgTZhlbj5P9QYs= +sigs.k8s.io/yaml v1.6.0/go.mod h1:796bPqUfzR/0jLAl6XjHl3Ck7MiyVv8dbTdyT3/pMf4=