From adf4a1cf05739879386f63f70bc7e5c3aa35f767 Mon Sep 17 00:00:00 2001 From: Pranav Gaikwad Date: Wed, 14 May 2025 08:14:05 -0400 Subject: [PATCH] :bug: MTA-5179 pass in maven local repo path to bundle (#825) Signed-off-by: Pranav Gaikwad Signed-off-by: Cherry Picker --- .../pkg/java_external_provider/dependency.go | 12 +++----- .../pkg/java_external_provider/provider.go | 28 +++++++++++++------ .../java_external_provider/service_client.go | 7 +++++ 3 files changed, 31 insertions(+), 16 deletions(-) diff --git a/external-providers/java-external-provider/pkg/java_external_provider/dependency.go b/external-providers/java-external-provider/pkg/java_external_provider/dependency.go index 2a6582ad..f2275f40 100644 --- a/external-providers/java-external-provider/pkg/java_external_provider/dependency.go +++ b/external-providers/java-external-provider/pkg/java_external_provider/dependency.go @@ -211,8 +211,6 @@ func getMavenLocalRepoPath(mvnSettingsFile string) string { func (p *javaServiceClient) GetDependenciesFallback(ctx context.Context, location string) (map[uri.URI][]*provider.Dep, error) { deps := []*provider.Dep{} - m2Repo := getMavenLocalRepoPath(p.mvnSettingsFile) - path, err := filepath.Abs(p.findPom()) if err != nil { return nil, err @@ -279,8 +277,8 @@ func (p *javaServiceClient) GetDependenciesFallback(ctx context.Context, locatio } else { dep.Version = *d.Version } - if m2Repo != "" && d.ArtifactID != nil && d.GroupID != nil { - dep.FileURIPrefix = fmt.Sprintf("file://%s", filepath.Join(m2Repo, + if p.mvnLocalRepo != "" && d.ArtifactID != nil && d.GroupID != nil { + dep.FileURIPrefix = fmt.Sprintf("file://%s", filepath.Join(p.mvnLocalRepo, strings.Replace(*d.GroupID, ".", "/", -1), *d.ArtifactID, dep.Version)) } } @@ -335,8 +333,6 @@ func (p *javaServiceClient) GetDependenciesDAG(ctx context.Context) (map[uri.URI } func (p *javaServiceClient) getDependenciesForMaven(_ context.Context) (map[uri.URI][]provider.DepDAGItem, error) { - localRepoPath := getMavenLocalRepoPath(p.mvnSettingsFile) - path := p.findPom() file := uri.File(path) @@ -369,7 +365,7 @@ func (p *javaServiceClient) getDependenciesForMaven(_ context.Context) (map[uri. var pomDeps []provider.DepDAGItem for _, tree := range submoduleTrees { - submoduleDeps, err := p.parseMavenDepLines(tree, localRepoPath, path) + submoduleDeps, err := p.parseMavenDepLines(tree, p.mvnLocalRepo, path) if err != nil { return nil, err } @@ -600,7 +596,7 @@ func (p *javaServiceClient) discoverDepsFromJars(path string, ll map[uri.URI][]k w := walker{ deps: ll, depToLabels: p.depToLabels, - m2RepoPath: getMavenLocalRepoPath(p.mvnSettingsFile), + m2RepoPath: p.mvnLocalRepo, seen: map[string]bool{}, initialPath: path, } diff --git a/external-providers/java-external-provider/pkg/java_external_provider/provider.go b/external-providers/java-external-provider/pkg/java_external_provider/provider.go index 687bcb47..036d2d03 100644 --- a/external-providers/java-external-provider/pkg/java_external_provider/provider.go +++ b/external-providers/java-external-provider/pkg/java_external_provider/provider.go @@ -491,6 +491,15 @@ func (p *javaProvider) Init(ctx context.Context, log logr.Logger, config provide } }() + m2Repo := getMavenLocalRepoPath(mavenSettingsFile) + + mavenIndexPath := "" + if val, ok := config.ProviderSpecificConfig[providerSpecificConfigOpenSourceDepListKey]; ok { + if strVal, ok := val.(string); ok { + mavenIndexPath = strVal + } + } + svcClient := javaServiceClient{ rpc: rpc, cancelFunc: cancelFunc, @@ -503,6 +512,8 @@ func (p *javaProvider) Init(ctx context.Context, log logr.Logger, config provide isLocationBinary: isBinary, mvnInsecure: mavenInsecure, mvnSettingsFile: mavenSettingsFile, + mvnLocalRepo: m2Repo, + mvnIndexPath: mavenIndexPath, globalSettings: globalSettingsFile, depsLocationCache: make(map[string]int), includedPaths: provider.GetIncludedPathsFromConfig(config, false), @@ -514,7 +525,7 @@ func (p *javaProvider) Init(ctx context.Context, log logr.Logger, config provide // we need to do this for jdtls to correctly recognize source attachment for dep switch svcClient.GetBuildTool() { case maven: - err := resolveSourcesJarsForMaven(ctx, log, fernflower, config.Location, mavenSettingsFile, mavenInsecure) + err := resolveSourcesJarsForMaven(ctx, log, fernflower, config.Location, mavenSettingsFile, m2Repo, mavenInsecure) if err != nil { // TODO (pgaikwad): should we ignore this failure? log.Error(err, "failed to resolve maven sources jar for location", "location", config.Location) @@ -790,11 +801,16 @@ func (j *javaProvider) GetLocation(ctx context.Context, dep konveyor.Dep, file s // resolveSourcesJarsForMaven for a given source code location, runs maven to find // deps that don't have sources attached and decompiles them -func resolveSourcesJarsForMaven(ctx context.Context, log logr.Logger, fernflower, location, mavenSettings string, mvnInsecure bool) error { +func resolveSourcesJarsForMaven(ctx context.Context, log logr.Logger, fernflower, location, mavenSettings, mavenLocalRepo string, mvnInsecure bool) error { // TODO (pgaikwad): when we move to external provider, inherit context from parent ctx, span := tracing.StartNewSpan(ctx, "resolve-sources") defer span.End() + if mavenLocalRepo == "" { + log.V(5).Info("unable to discover dependency sources as maven local repo path is unknown") + return nil + } + decompileJobs := []decompileJob{} log.Info("resolving dependency sources") @@ -824,10 +840,6 @@ func resolveSourcesJarsForMaven(ctx context.Context, log logr.Logger, fernflower return err } - m2Repo := getMavenLocalRepoPath(mavenSettings) - if m2Repo == "" { - return nil - } for _, artifact := range artifacts { log.WithValues("artifact", artifact).Info("sources for artifact not found, decompiling...") @@ -837,9 +849,9 @@ func resolveSourcesJarsForMaven(ctx context.Context, log logr.Logger, fernflower decompileJobs = append(decompileJobs, decompileJob{ artifact: artifact, inputPath: filepath.Join( - m2Repo, groupDirs, artifactDirs, artifact.Version, jarName), + mavenLocalRepo, groupDirs, artifactDirs, artifact.Version, jarName), outputPath: filepath.Join( - m2Repo, groupDirs, artifactDirs, artifact.Version, "decompiled", jarName), + mavenLocalRepo, groupDirs, artifactDirs, artifact.Version, "decompiled", jarName), }) } err = decompile(ctx, log, alwaysDecompileFilter(true), 10, decompileJobs, fernflower, "") diff --git a/external-providers/java-external-provider/pkg/java_external_provider/service_client.go b/external-providers/java-external-provider/pkg/java_external_provider/service_client.go index 86a33dfc..0b8b5f3d 100644 --- a/external-providers/java-external-provider/pkg/java_external_provider/service_client.go +++ b/external-providers/java-external-provider/pkg/java_external_provider/service_client.go @@ -34,6 +34,8 @@ type javaServiceClient struct { isLocationBinary bool mvnInsecure bool mvnSettingsFile string + mvnLocalRepo string + mvnIndexPath string globalSettings string depsMutex sync.RWMutex depsFileHash *string @@ -122,6 +124,11 @@ func (p *javaServiceClient) GetAllSymbols(ctx context.Context, c javaCondition, "location": fmt.Sprintf("%v", locationToCode[strings.ToLower(c.Referenced.Location)]), "analysisMode": string(p.config.AnalysisMode), "includeOpenSourceLibraries": true, + "mavenLocalRepo": p.mvnLocalRepo, + } + + if p.mvnIndexPath != "" { + argumentsMap["mavenIndexPath"] = p.mvnIndexPath } depLabelSelector, err := labels.NewLabelSelector[*openSourceLabels](condCTX.DepLabelSelector, nil)