Skip to content

Commit 2dc7a35

Browse files
cstamasslawekjaranowski
authored andcommitted
[MNG-7612] Chained LRM
Adds new feature: Chained Local Repository Manager. --- https://issues.apache.org/jira/browse/MNG-7612
1 parent 573a3e1 commit 2dc7a35

File tree

1 file changed

+41
-1
lines changed

1 file changed

+41
-1
lines changed

maven-core/src/main/java/org/apache/maven/internal/aether/DefaultRepositorySystemSessionFactory.java

Lines changed: 41 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,10 @@
1818
*/
1919
package org.apache.maven.internal.aether;
2020

21+
import static java.util.stream.Collectors.toList;
22+
23+
import java.util.ArrayList;
24+
import java.util.Arrays;
2125
import java.util.HashMap;
2226
import java.util.LinkedHashMap;
2327
import java.util.List;
@@ -48,12 +52,15 @@
4852
import org.eclipse.aether.DefaultRepositorySystemSession;
4953
import org.eclipse.aether.RepositorySystem;
5054
import org.eclipse.aether.repository.LocalRepository;
55+
import org.eclipse.aether.repository.LocalRepositoryManager;
5156
import org.eclipse.aether.repository.NoLocalRepositoryManagerException;
5257
import org.eclipse.aether.repository.RepositoryPolicy;
5358
import org.eclipse.aether.repository.WorkspaceReader;
5459
import org.eclipse.aether.resolution.ResolutionErrorPolicy;
5560
import org.eclipse.aether.spi.localrepo.LocalRepositoryManagerFactory;
61+
import org.eclipse.aether.util.ConfigUtils;
5662
import org.eclipse.aether.util.repository.AuthenticationBuilder;
63+
import org.eclipse.aether.util.repository.ChainedLocalRepositoryManager;
5764
import org.eclipse.aether.util.repository.DefaultAuthenticationSelector;
5865
import org.eclipse.aether.util.repository.DefaultMirrorSelector;
5966
import org.eclipse.aether.util.repository.DefaultProxySelector;
@@ -65,6 +72,23 @@
6572
*/
6673
@Named
6774
public class DefaultRepositorySystemSessionFactory {
75+
/**
76+
* User property for chained LRM: list of "tail" local repository paths (separated by comma), to be used with
77+
* {@link ChainedLocalRepositoryManager}.
78+
* Default value: {@code null}, no chained LRM is used.
79+
*
80+
* @since 3.9.0
81+
*/
82+
private static final String MAVEN_REPO_LOCAL_TAIL = "maven.repo.local.tail";
83+
84+
/**
85+
* User property for chained LRM: should artifact availability be ignored in tail local repositories or not.
86+
* Default: {@code true}, will ignore availability from tail local repositories.
87+
*
88+
* @since 3.9.0
89+
*/
90+
private static final String MAVEN_REPO_LOCAL_TAIL_IGNORE_AVAILABILITY = "maven.repo.local.tail.ignoreAvailability";
91+
6892
private static final String MAVEN_RESOLVER_TRANSPORT_KEY = "maven.resolver.transport";
6993

7094
private static final String MAVEN_RESOLVER_TRANSPORT_DEFAULT = "default";
@@ -354,7 +378,23 @@ private void setUpLocalRepositoryManager(MavenExecutionRequest request, DefaultR
354378
session.setLocalRepositoryManager(repoSystem.newLocalRepositoryManager(session, localRepo));
355379
}
356380
} else {
357-
session.setLocalRepositoryManager(repoSystem.newLocalRepositoryManager(session, localRepo));
381+
LocalRepositoryManager lrm = repoSystem.newLocalRepositoryManager(session, localRepo);
382+
383+
String localRepoTail = ConfigUtils.getString(session, null, MAVEN_REPO_LOCAL_TAIL);
384+
if (localRepoTail != null) {
385+
boolean ignoreTailAvailability =
386+
ConfigUtils.getBoolean(session, true, MAVEN_REPO_LOCAL_TAIL_IGNORE_AVAILABILITY);
387+
List<LocalRepositoryManager> tail = new ArrayList<>();
388+
List<String> paths = Arrays.stream(localRepoTail.split(","))
389+
.filter(p -> p != null && !p.trim().isEmpty())
390+
.collect(toList());
391+
for (String path : paths) {
392+
tail.add(repoSystem.newLocalRepositoryManager(session, new LocalRepository(path)));
393+
}
394+
session.setLocalRepositoryManager(new ChainedLocalRepositoryManager(lrm, tail, ignoreTailAvailability));
395+
} else {
396+
session.setLocalRepositoryManager(lrm);
397+
}
358398
}
359399
}
360400

0 commit comments

Comments
 (0)