Skip to content

Commit 0dfad59

Browse files
committed
Implement recursive option for xmvn-resolve CLI
1 parent 8357581 commit 0dfad59

2 files changed

Lines changed: 90 additions & 8 deletions

File tree

xmvn-tools/xmvn-resolve/src/main/java/org/fedoraproject/xmvn/tools/resolve/ResolverCli.java

Lines changed: 67 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -17,11 +17,23 @@
1717

1818
import io.kojan.xml.XMLException;
1919
import java.io.IOException;
20+
import java.util.ArrayDeque;
2021
import java.util.ArrayList;
22+
import java.util.LinkedHashSet;
2123
import java.util.List;
24+
import java.util.Queue;
25+
import java.util.Set;
2226
import java.util.stream.Collectors;
2327
import org.fedoraproject.xmvn.artifact.Artifact;
28+
import org.fedoraproject.xmvn.config.Configuration;
29+
import org.fedoraproject.xmvn.config.Configurator;
30+
import org.fedoraproject.xmvn.config.ResolverSettings;
2431
import org.fedoraproject.xmvn.logging.Logger;
32+
import org.fedoraproject.xmvn.metadata.ArtifactMetadata;
33+
import org.fedoraproject.xmvn.metadata.Dependency;
34+
import org.fedoraproject.xmvn.metadata.MetadataRequest;
35+
import org.fedoraproject.xmvn.metadata.MetadataResolver;
36+
import org.fedoraproject.xmvn.metadata.MetadataResult;
2537
import org.fedoraproject.xmvn.resolver.ResolutionRequest;
2638
import org.fedoraproject.xmvn.resolver.ResolutionResult;
2739
import org.fedoraproject.xmvn.resolver.Resolver;
@@ -41,12 +53,19 @@
4153
*/
4254
public class ResolverCli {
4355
private final Logger logger;
44-
4556
private final Resolver resolver;
46-
47-
public ResolverCli(Logger logger, Resolver resolver) {
57+
private final Configurator configurator;
58+
private final MetadataResolver metadataResolver;
59+
60+
public ResolverCli(
61+
Logger logger,
62+
Resolver resolver,
63+
Configurator configurator,
64+
MetadataResolver metadataResolver) {
4865
this.logger = logger;
4966
this.resolver = resolver;
67+
this.configurator = configurator;
68+
this.metadataResolver = metadataResolver;
5069
}
5170

5271
private List<ResolutionRequest> parseRequests(ResolverCliRequest cli)
@@ -92,16 +111,59 @@ public int run(ResolverCliRequest cliRequest) throws IOException, XMLException {
92111
try {
93112
boolean error = false;
94113

95-
List<ResolutionRequest> requests = parseRequests(cliRequest);
114+
Queue<ResolutionRequest> requestsQueue = new ArrayDeque<>(parseRequests(cliRequest));
96115
List<ResolutionResult> results = new ArrayList<>();
97116

98-
for (ResolutionRequest request : requests) {
117+
Set<Artifact> requestedArtifacts = new LinkedHashSet<>();
118+
for (ResolutionRequest request : requestsQueue) {
119+
requestedArtifacts.add(request.getArtifact());
120+
}
121+
122+
MetadataResult metadataResult = null;
123+
if (cliRequest.isRecursive()) {
124+
Configuration configuration = configurator.getConfiguration();
125+
ResolverSettings resolverSettings = configuration.getResolverSettings();
126+
List<String> metadataRepositories = resolverSettings.getMetadataRepositories();
127+
MetadataRequest metadataRequest = new MetadataRequest(metadataRepositories);
128+
metadataResult = metadataResolver.resolveMetadata(metadataRequest);
129+
}
130+
131+
while (!requestsQueue.isEmpty()) {
132+
ResolutionRequest request = requestsQueue.remove();
99133
ResolutionResult result = resolver.resolve(request);
100134
results.add(result);
101135

102136
if (result.getArtifactPath() == null) {
103137
error = true;
104138
logger.error("Unable to resolve artifact {}", request.getArtifact());
139+
continue;
140+
}
141+
142+
if (cliRequest.isRecursive()) {
143+
Artifact requestedArtifact = request.getArtifact();
144+
String resolvedVersion = result.getCompatVersion();
145+
Artifact resolvedArtifact = requestedArtifact.withVersion(resolvedVersion);
146+
ArtifactMetadata artifactMetadata =
147+
metadataResult.getMetadataFor(resolvedArtifact);
148+
for (Dependency dependency : artifactMetadata.getDependencies()) {
149+
Artifact dependencyArtifact =
150+
Artifact.of(
151+
dependency.getGroupId(),
152+
dependency.getArtifactId(),
153+
dependency.getExtension(),
154+
dependency.getClassifier(),
155+
dependency.getResolvedVersion());
156+
logger.debug(
157+
"Also resolving artifact {} as a dependency of {}",
158+
dependencyArtifact,
159+
requestedArtifact);
160+
if (requestedArtifacts.add(dependencyArtifact)) {
161+
ResolutionRequest dependencyRequest =
162+
new ResolutionRequest(dependencyArtifact);
163+
dependencyRequest.setPersistentFileNeeded(true);
164+
requestsQueue.add(dependencyRequest);
165+
}
166+
}
105167
}
106168
}
107169

xmvn-tools/xmvn-resolve/src/main/java/org/fedoraproject/xmvn/tools/resolve/ResolverCliRequest.java

Lines changed: 23 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,9 +22,11 @@
2222
import java.util.Properties;
2323
import java.util.TreeMap;
2424
import java.util.concurrent.Callable;
25+
import org.fedoraproject.xmvn.config.Configurator;
2526
import org.fedoraproject.xmvn.locator.ServiceLocator;
2627
import org.fedoraproject.xmvn.locator.ServiceLocatorFactory;
2728
import org.fedoraproject.xmvn.logging.Logger;
29+
import org.fedoraproject.xmvn.metadata.MetadataResolver;
2830
import org.fedoraproject.xmvn.resolver.Resolver;
2931
import picocli.CommandLine.Command;
3032
import picocli.CommandLine.IVersionProvider;
@@ -53,6 +55,12 @@ final class ResolverCliRequest implements Callable<Integer>, IVersionProvider {
5355
description = "Use colon instead of new line to separate resolved artifacts.")
5456
private boolean classpath;
5557

58+
@Option(
59+
names = {"-r", "--recursive"},
60+
description =
61+
"Also include all runtime dependencies of specified artifacts, recursively.")
62+
private boolean recursive;
63+
5664
@Option(
5765
names = {"--raw-request"},
5866
description =
@@ -85,17 +93,21 @@ public Integer call() {
8593
System.setProperty("xmvn.debug", "true");
8694
}
8795

88-
if (raw && (classpath || !parameters.isEmpty())) {
96+
if (raw && (classpath || !parameters.isEmpty() || recursive)) {
8997
throw new IllegalArgumentException("--raw-request must be used alone");
9098
}
9199

92-
for (String param : defines.keySet()) System.setProperty(param, defines.get(param));
100+
for (String param : defines.keySet()) {
101+
System.setProperty(param, defines.get(param));
102+
}
93103

94104
ServiceLocator locator = new ServiceLocatorFactory().createServiceLocator();
95105
Logger logger = locator.getService(Logger.class);
96106
Resolver resolver = locator.getService(Resolver.class);
107+
Configurator configurator = locator.getService(Configurator.class);
108+
MetadataResolver metadataResolver = locator.getService(MetadataResolver.class);
97109

98-
ResolverCli cli = new ResolverCli(logger, resolver);
110+
ResolverCli cli = new ResolverCli(logger, resolver, configurator, metadataResolver);
99111

100112
try {
101113
return cli.run(this);
@@ -130,6 +142,14 @@ public void setClasspath(boolean classpath) {
130142
this.classpath = classpath;
131143
}
132144

145+
public boolean isRecursive() {
146+
return recursive;
147+
}
148+
149+
public void setRecursive(boolean recursive) {
150+
this.recursive = recursive;
151+
}
152+
133153
public boolean isRaw() {
134154
return raw;
135155
}

0 commit comments

Comments
 (0)