This is an automated email from the ASF dual-hosted git repository.

sjaranowski pushed a commit to branch MNG-7612-3.9
in repository https://gitbox.apache.org/repos/asf/maven.git

commit 3bda1cff385e31795601a43086773cfd0f1a332a
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.
    
    ---
    
    https://issues.apache.org/jira/browse/MNG-7612
---
 .../DefaultRepositorySystemSessionFactory.java     | 49 +++++++++++++++++++++-
 1 file changed, 48 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 681d641ad..42007e252 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
@@ -41,12 +41,15 @@ import org.eclipse.aether.ConfigurationProperties;
 import org.eclipse.aether.DefaultRepositorySystemSession;
 import org.eclipse.aether.RepositorySystem;
 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;
 import org.eclipse.aether.resolution.ResolutionErrorPolicy;
 import org.eclipse.aether.spi.localrepo.LocalRepositoryManagerFactory;
+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;
@@ -56,17 +59,38 @@ import org.eclipse.sisu.Nullable;
 import javax.inject.Inject;
 import javax.inject.Named;
 
+import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.stream.Collectors;
 
+import static java.util.stream.Collectors.toList;
+
 /**
  * @since 3.3.0
  */
 @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";
@@ -308,7 +332,30 @@ public class DefaultRepositorySystemSessionFactory
         }
         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 );
+            }
         }
     }
 

Reply via email to