This is an automated email from the ASF dual-hosted git repository. cstamas pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/maven.git
The following commit(s) were added to refs/heads/master by this push: new ad5e085ebe [MNG-7959] User controlled rewrite (#1351) ad5e085ebe is described below commit ad5e085ebe72d5799122d7da575fd1fce36a6965 Author: Tamas Cservenak <ta...@cservenak.net> AuthorDate: Mon Dec 18 16:31:24 2023 +0100 [MNG-7959] User controlled rewrite (#1351) Extra handling if redirection happens within same GAV. --- https://issues.apache.org/jira/browse/MNG-7959 --- .../internal/ArtifactDescriptorUtils.java | 11 +++++++++++ .../internal/DefaultArtifactDescriptorReader.java | 22 ++++++++++++++++------ 2 files changed, 27 insertions(+), 6 deletions(-) diff --git a/maven-resolver-provider/src/main/java/org/apache/maven/repository/internal/ArtifactDescriptorUtils.java b/maven-resolver-provider/src/main/java/org/apache/maven/repository/internal/ArtifactDescriptorUtils.java index 244bd6b984..d01265f43d 100644 --- a/maven-resolver-provider/src/main/java/org/apache/maven/repository/internal/ArtifactDescriptorUtils.java +++ b/maven-resolver-provider/src/main/java/org/apache/maven/repository/internal/ArtifactDescriptorUtils.java @@ -43,6 +43,17 @@ public class ArtifactDescriptorUtils { return pomArtifact; } + /** + * Creates POM artifact out of passed in artifact by dropping classifier (if exists) and rewriting extension to + * "pom". Unconditionally, unlike {@link #toPomArtifact(Artifact)} that does this only for artifacts without + * classifiers. + * + * @since 4.0.0 + */ + public static Artifact toPomArtifactUnconditionally(Artifact artifact) { + return new DefaultArtifact(artifact.getGroupId(), artifact.getArtifactId(), "pom", artifact.getVersion()); + } + public static RemoteRepository toRemoteRepository(Repository repository) { RemoteRepository.Builder builder = new RemoteRepository.Builder(repository.getId(), repository.getLayout(), repository.getUrl()); diff --git a/maven-resolver-provider/src/main/java/org/apache/maven/repository/internal/DefaultArtifactDescriptorReader.java b/maven-resolver-provider/src/main/java/org/apache/maven/repository/internal/DefaultArtifactDescriptorReader.java index 31660e2799..a8c61693fa 100644 --- a/maven-resolver-provider/src/main/java/org/apache/maven/repository/internal/DefaultArtifactDescriptorReader.java +++ b/maven-resolver-provider/src/main/java/org/apache/maven/repository/internal/DefaultArtifactDescriptorReader.java @@ -26,7 +26,6 @@ import java.util.LinkedHashSet; import java.util.Map; import java.util.Objects; import java.util.Properties; -import java.util.Set; import org.apache.maven.model.Model; import org.apache.maven.model.building.ArtifactModelSource; @@ -129,9 +128,9 @@ public class DefaultArtifactDescriptorReader implements ArtifactDescriptorReader throws ArtifactDescriptorException { RequestTrace trace = RequestTrace.newChild(request.getTrace(), request); - Set<String> visited = new LinkedHashSet<>(); + LinkedHashSet<String> visited = new LinkedHashSet<>(); for (Artifact a = request.getArtifact(); ; ) { - Artifact pomArtifact = ArtifactDescriptorUtils.toPomArtifact(a); + Artifact pomArtifact = ArtifactDescriptorUtils.toPomArtifactUnconditionally(a); try { VersionRequest versionRequest = new VersionRequest(a, request.getRepositories(), request.getRequestContext()); @@ -239,15 +238,26 @@ public class DefaultArtifactDescriptorReader implements ArtifactDescriptorReader Artifact relocatedArtifact = getRelocation(session, result, model); if (relocatedArtifact != null) { - result.addRelocation(a); - a = relocatedArtifact; - result.setArtifact(a); + if (withinSameGav(relocatedArtifact, a)) { + result.setArtifact(relocatedArtifact); + return model; // they share same model + } else { + result.addRelocation(a); + a = relocatedArtifact; + result.setArtifact(a); + } } else { return model; } } } + private boolean withinSameGav(Artifact a1, Artifact a2) { + return Objects.equals(a1.getGroupId(), a2.getGroupId()) + && Objects.equals(a1.getArtifactId(), a2.getArtifactId()) + && Objects.equals(a1.getVersion(), a2.getVersion()); + } + private Properties toProperties(Map<String, String> dominant, Map<String, String> recessive) { Properties props = new Properties(); if (recessive != null) {