This is an automated email from the ASF dual-hosted git repository. sjaranowski pushed a commit to branch MNG-7612 in repository https://gitbox.apache.org/repos/asf/maven.git
commit cfe503f58a2b34a1d58a549bba0e066605a9805e Author: Tamas Cservenak <ta...@cservenak.net> AuthorDate: Thu Dec 1 19:53:00 2022 +0100 [MNG-7612] Chained LRM Adds new feature: Chained Local Repository Manager. Cherry-pick f8f56b33c0585638723a20d71eb848d40a1f44e0 --- https://issues.apache.org/jira/browse/MNG-7612 --- .../DefaultRepositorySystemSessionFactory.java | 41 +++++++++++++++++++++- 1 file changed, 40 insertions(+), 1 deletion(-) diff --git a/maven-core/src/main/java/org/apache/maven/internal/aether/DefaultRepositorySystemSessionFactory.java b/maven-core/src/main/java/org/apache/maven/internal/aether/DefaultRepositorySystemSessionFactory.java index c7d04734a..73b351458 100644 --- a/maven-core/src/main/java/org/apache/maven/internal/aether/DefaultRepositorySystemSessionFactory.java +++ b/maven-core/src/main/java/org/apache/maven/internal/aether/DefaultRepositorySystemSessionFactory.java @@ -18,10 +18,13 @@ */ package org.apache.maven.internal.aether; +import static java.util.stream.Collectors.toList; + import java.io.File; import java.io.IOException; import java.io.InputStream; import java.util.ArrayList; +import java.util.Arrays; import java.util.Collection; import java.util.Collections; import java.util.HashMap; @@ -60,6 +63,7 @@ import org.eclipse.aether.RepositorySystem; import org.eclipse.aether.SessionData; import org.eclipse.aether.artifact.Artifact; import org.eclipse.aether.repository.LocalRepository; +import org.eclipse.aether.repository.LocalRepositoryManager; import org.eclipse.aether.repository.NoLocalRepositoryManagerException; import org.eclipse.aether.repository.RepositoryPolicy; import org.eclipse.aether.repository.WorkspaceReader; @@ -67,7 +71,9 @@ import org.eclipse.aether.resolution.ResolutionErrorPolicy; import org.eclipse.aether.spi.localrepo.LocalRepositoryManagerFactory; import org.eclipse.aether.transform.FileTransformer; import org.eclipse.aether.transform.TransformException; +import org.eclipse.aether.util.ConfigUtils; import org.eclipse.aether.util.repository.AuthenticationBuilder; +import org.eclipse.aether.util.repository.ChainedLocalRepositoryManager; import org.eclipse.aether.util.repository.DefaultAuthenticationSelector; import org.eclipse.aether.util.repository.DefaultMirrorSelector; import org.eclipse.aether.util.repository.DefaultProxySelector; @@ -81,6 +87,23 @@ import org.slf4j.LoggerFactory; */ @Named public class DefaultRepositorySystemSessionFactory { + /** + * User property for chained LRM: list of "tail" local repository paths (separated by comma), to be used with + * {@link ChainedLocalRepositoryManager}. + * Default value: {@code null}, no chained LRM is used. + * + * @since 3.9.0 + */ + private static final String MAVEN_REPO_LOCAL_TAIL = "maven.repo.local.tail"; + + /** + * User property for chained LRM: should artifact availability be ignored in tail local repositories or not. + * Default: {@code true}, will ignore availability from tail local repositories. + * + * @since 3.9.0 + */ + private static final String MAVEN_REPO_LOCAL_TAIL_IGNORE_AVAILABILITY = "maven.repo.local.tail.ignoreAvailability"; + private static final String MAVEN_RESOLVER_TRANSPORT_KEY = "maven.resolver.transport"; private static final String MAVEN_RESOLVER_TRANSPORT_DEFAULT = "default"; @@ -356,7 +379,23 @@ public class DefaultRepositorySystemSessionFactory { session.setLocalRepositoryManager(repoSystem.newLocalRepositoryManager(session, localRepo)); } } else { - session.setLocalRepositoryManager(repoSystem.newLocalRepositoryManager(session, localRepo)); + LocalRepositoryManager lrm = repoSystem.newLocalRepositoryManager(session, localRepo); + + String localRepoTail = ConfigUtils.getString(session, null, MAVEN_REPO_LOCAL_TAIL); + if (localRepoTail != null) { + boolean ignoreTailAvailability = + ConfigUtils.getBoolean(session, true, MAVEN_REPO_LOCAL_TAIL_IGNORE_AVAILABILITY); + List<LocalRepositoryManager> tail = new ArrayList<>(); + List<String> paths = Arrays.stream(localRepoTail.split(",")) + .filter(p -> p != null && !p.trim().isEmpty()) + .collect(toList()); + for (String path : paths) { + tail.add(repoSystem.newLocalRepositoryManager(session, new LocalRepository(path))); + } + session.setLocalRepositoryManager(new ChainedLocalRepositoryManager(lrm, tail, ignoreTailAvailability)); + } else { + session.setLocalRepositoryManager(lrm); + } } }