Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -151,6 +151,12 @@ private ResolutionResult parseDependencies(
throws GradleDependencyResolutionException {
MutableGraph<Coordinates> graph = GraphBuilder.directed().allowsSelfLoops(true).build();

// Create lookup cache for requested dependencies
Set<String> requestedDepKeys =
requestedDeps.stream()
.map(dep -> makeDepKey(dep.getGroup(), dep.getArtifact(), dep.getVersion()))
.collect(Collectors.toSet());

Set<Conflict> conflicts = new HashSet<>();
List<GradleResolvedDependency> implementationDependencies = resolved.getResolvedDependencies();
List<GradleUnresolvedDependency> unresolvedDependencies = resolved.getUnresolvedDependencies();
Expand Down Expand Up @@ -180,10 +186,12 @@ private ResolutionResult parseDependencies(
extension,
classifier,
gradleCoordinates.getVersion());
addDependency(graph, coordinates, dependency, conflicts, requestedDeps, visited);
addDependency(graph, coordinates, dependency, conflicts, requestedDepKeys, visited);
// if there's a conflict and the conflicting version isn't one that's actually requested
// then it's an actual conflict we want to report
if (dependency.isConflict() && !isRequestedDep(requestedDeps, dependency)) {
if (dependency.isConflict()
&& !requestedDepKeys.contains(
makeDepKey(dependency.getGroup(), dependency.getName(), dependency.getVersion()))) {
String conflictingVersion =
dependency.getRequestedVersions().stream()
.filter(x -> !x.equals(coordinates.getVersion()))
Expand Down Expand Up @@ -232,40 +240,27 @@ private ResolutionResult parseDependencies(
// behavior here as well
List<GradleUnresolvedDependency> unresolvedRequestedDeps =
unresolvedDependencies.stream()
.filter(dep -> isRequestedDep(requestedDeps, dep))
.filter(
dep ->
requestedDepKeys.contains(
makeDepKey(dep.getGroup(), dep.getName(), dep.getVersion())))
.collect(Collectors.toList());
if (!unresolvedRequestedDeps.isEmpty()) {
throw new GradleDependencyResolutionException(unresolvedRequestedDeps);
}
return new ResolutionResult(graph, conflicts);
}

private boolean isRequestedDep(
List<GradleDependency> requestedDeps, GradleResolvedDependency resolved) {
return requestedDeps.stream()
.anyMatch(
dep ->
dep.getArtifact().equals(resolved.getName())
&& dep.getGroup().equals(resolved.getGroup())
&& dep.getVersion().equals(resolved.getVersion()));
}

private boolean isRequestedDep(
List<GradleDependency> requestedDeps, GradleUnresolvedDependency unresolved) {
return requestedDeps.stream()
.anyMatch(
dep ->
dep.getArtifact().equals(unresolved.getName())
&& dep.getGroup().equals(unresolved.getGroup())
&& dep.getVersion().equals(unresolved.getVersion()));
private String makeDepKey(String group, String artifact, String version) {
return group + ":" + artifact + ":" + version;
}

private void addDependency(
MutableGraph<Coordinates> graph,
Coordinates parent,
GradleResolvedDependency parentInfo,
Set<Conflict> conflicts,
List<GradleDependency> requestedDeps,
Set<String> requestedDepKeys,
Set<Coordinates> visited) {
if (visited.contains(parent)) {
return;
Expand Down Expand Up @@ -298,7 +293,9 @@ private void addDependency(
graph.putEdge(parent, child);
// if there's a conflict and the conflicting version isn't one that's actually requested
// then it's an actual conflict we want to report
if (childInfo.isConflict() && !isRequestedDep(requestedDeps, childInfo)) {
if (childInfo.isConflict()
&& !requestedDepKeys.contains(
makeDepKey(childInfo.getGroup(), childInfo.getName(), childInfo.getVersion()))) {
String conflictingVersion =
childInfo.getRequestedVersions().stream()
.filter(x -> !x.equals(child.getVersion()))
Expand All @@ -325,7 +322,7 @@ private void addDependency(
child,
childInfo,
conflicts,
requestedDeps,
requestedDepKeys,
visited); // recursively traverse the graph
}
}
Expand Down