IDEA-177683 Gradle import uses wrong source/javadoc artifact for dependencies with multiple artifacts

This commit is contained in:
Vladislav.Soroka
2017-08-17 14:17:18 +03:00
parent 0ddef47489
commit b8970e7cb4
2 changed files with 88 additions and 15 deletions
@@ -1243,6 +1243,69 @@ public class GradleDependenciesImportingTest extends GradleImportingTestCase {
assertModuleLibDepScope("project2_test", "Gradle: org.hamcrest:hamcrest-core:1.3", DependencyScope.COMPILE);
}
@TargetVersions("2.0+")
@Test
public void testJavadocAndSourcesForDependencyWithMultipleArtifacts() throws Exception {
createProjectSubFile("repo/depGroup/depArtifact/1.0-SNAPSHOT/ivy-1.0-SNAPSHOT.xml",
"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" +
"<ivy-module version=\"2.0\" xmlns:m=\"http://ant.apache.org/ivy/maven\">\n" +
" <info organisation=\"depGroup\" module=\"depArtifact\" revision=\"1.0-SNAPSHOT\" status=\"integration\" publication=\"20170817121528\"/>\n" +
" <configurations>\n" +
" <conf name=\"compile\" visibility=\"public\"/>\n" +
" <conf name=\"default\" visibility=\"public\" extends=\"compile\"/>\n" +
" <conf name=\"sources\" visibility=\"public\"/>\n" +
" <conf name=\"javadoc\" visibility=\"public\"/>\n" +
" </configurations>\n" +
" <publications>\n" +
" <artifact name=\"depArtifact\" type=\"jar\" ext=\"jar\" conf=\"compile\"/>\n" +
" <artifact name=\"depArtifact-api\" type=\"javadoc\" ext=\"jar\" conf=\"javadoc\" m:classifier=\"javadoc\"/>\n" +
" <artifact name=\"depArtifact-api\" type=\"source\" ext=\"jar\" conf=\"sources\" m:classifier=\"sources\"/>\n" +
" <artifact name=\"depArtifact\" type=\"source\" ext=\"jar\" conf=\"sources\" m:classifier=\"sources\"/>\n" +
" <artifact name=\"depArtifact\" type=\"javadoc\" ext=\"jar\" conf=\"javadoc\" m:classifier=\"javadoc\"/>\n" +
" </publications>\n" +
" <dependencies/>\n" +
"</ivy-module>\n");
VirtualFile classesJar = createProjectJarSubFile("repo/depGroup/depArtifact/1.0-SNAPSHOT/depArtifact-1.0-SNAPSHOT.jar");
VirtualFile javadocJar = createProjectJarSubFile("repo/depGroup/depArtifact/1.0-SNAPSHOT/depArtifact-1.0-SNAPSHOT-javadoc.jar");
VirtualFile sourcesJar = createProjectJarSubFile("repo/depGroup/depArtifact/1.0-SNAPSHOT/depArtifact-1.0-SNAPSHOT-sources.jar");
createProjectJarSubFile("repo/depGroup/depArtifact/1.0-SNAPSHOT/depArtifact-api-1.0-SNAPSHOT.jar");
createProjectJarSubFile("repo/depGroup/depArtifact/1.0-SNAPSHOT/depArtifact-api-1.0-SNAPSHOT-javadoc.jar");
createProjectJarSubFile("repo/depGroup/depArtifact/1.0-SNAPSHOT/depArtifact-api-1.0-SNAPSHOT-sources.jar");
importProject(
"apply plugin: 'java'\n" +
"\n" +
"repositories {\n" +
" ivy { url file('repo') }\n" +
"}\n" +
"\n" +
"dependencies {\n" +
" compile 'depGroup:depArtifact:1.0-SNAPSHOT'\n" +
"}\n" +
"apply plugin: 'idea'\n" +
"idea.module.downloadJavadoc true"
);
assertModules("project", "project_main", "project_test");
assertModuleModuleDepScope("project_test", "project_main", DependencyScope.COMPILE);
final String depName = "Gradle: depGroup:depArtifact:1.0-SNAPSHOT";
assertModuleLibDep("project_main", depName, classesJar.getUrl(), sourcesJar.getUrl(), javadocJar.getUrl());
assertModuleLibDepScope("project_main", depName, DependencyScope.COMPILE);
assertModuleLibDep("project_test", depName, classesJar.getUrl(), sourcesJar.getUrl(), javadocJar.getUrl());
assertModuleLibDepScope("project_test", depName, DependencyScope.COMPILE);
importProjectUsingSingeModulePerGradleProject();
assertModules("project");
// Gradle built-in models has been fixed since 2.3 version, https://issues.gradle.org/browse/GRADLE-3170
if(GradleVersion.version(gradleVersion).compareTo(GradleVersion.version("2.3")) >= 0) {
assertModuleLibDep("project", depName, classesJar.getUrl(), sourcesJar.getUrl(), javadocJar.getUrl());
}
assertMergedModuleCompileLibDepScope("project", depName);
}
private void assertMergedModuleCompileLibDepScope(String moduleName, String depName) {
if (isGradleOlderThen_3_4()) {
assertModuleLibDepScope(moduleName, depName, DependencyScope.COMPILE);
@@ -19,11 +19,11 @@ package org.jetbrains.plugins.gradle.tooling.util;
import com.google.common.base.Function;
import com.google.common.base.Predicate;
import com.google.common.base.Predicates;
import com.google.common.collect.ArrayListMultimap;
import com.google.common.collect.Lists;
import com.google.common.collect.Multimap;
import com.google.common.collect.Sets;
import com.google.common.io.Files;
import groovy.lang.MetaMethod;
import groovy.lang.MetaProperty;
import org.codehaus.groovy.runtime.DefaultGroovyMethods;
@@ -65,7 +65,6 @@ import java.util.regex.Pattern;
import static com.google.common.base.Predicates.isNull;
import static com.google.common.base.Predicates.not;
import static com.google.common.collect.Iterables.filter;
import static com.google.common.collect.Iterables.find;
import static org.codehaus.groovy.runtime.StringGroovyMethods.capitalize;
/**
@@ -1181,21 +1180,14 @@ public class DependencyResolverImpl implements DependencyResolver {
ComponentArtifactsResult artifactsResult = componentResultsMap.get(componentIdentifier);
if (artifactsResult != null) {
final Set<ArtifactResult> sourceArtifacts = artifactsResult.getArtifacts(SourcesArtifact.class);
ResolvedArtifactResult sourcesResult = sourceArtifacts != null && !sourceArtifacts.isEmpty()
? (ResolvedArtifactResult)find(sourceArtifacts, Predicates.instanceOf(ResolvedArtifactResult.class))
: null;
if (sourcesResult != null) {
((DefaultExternalLibraryDependency)dependency).setSource(sourcesResult.getFile());
ArtifactResult sourcesResult = findMatchingArtifact(artifact, artifactsResult, SourcesArtifact.class);
if (sourcesResult instanceof ResolvedArtifactResult) {
((DefaultExternalLibraryDependency)dependency).setSource(((ResolvedArtifactResult)sourcesResult).getFile());
}
final Set<ArtifactResult> javadocArtifacts = artifactsResult.getArtifacts(JavadocArtifact.class);
ResolvedArtifactResult javadocResult = javadocArtifacts != null && !javadocArtifacts.isEmpty()
? (ResolvedArtifactResult)find(javadocArtifacts, Predicates.instanceOf(ResolvedArtifactResult.class))
: null;
if (javadocResult != null) {
((DefaultExternalLibraryDependency)dependency).setJavadoc(javadocResult.getFile());
ArtifactResult javadocResult = findMatchingArtifact(artifact, artifactsResult, JavadocArtifact.class);
if (javadocResult instanceof ResolvedArtifactResult) {
((DefaultExternalLibraryDependency)dependency).setJavadoc(((ResolvedArtifactResult)javadocResult).getFile());
}
}
}
@@ -1235,6 +1227,24 @@ public class DependencyResolverImpl implements DependencyResolver {
}
}
private static ArtifactResult findMatchingArtifact(ResolvedArtifact artifact,
ComponentArtifactsResult componentArtifacts,
Class<? extends Artifact> artifactType) {
String baseName = Files.getNameWithoutExtension(artifact.getFile().getName());
Set<ArtifactResult> artifactResults = componentArtifacts.getArtifacts(artifactType);
if (artifactResults.size() == 1) {
return artifactResults.iterator().next();
}
for (ArtifactResult result : artifactResults) {
if (result instanceof ResolvedArtifactResult && ((ResolvedArtifactResult)result).getFile().getName().startsWith(baseName)) {
return result;
}
}
return null;
}
private static boolean isProjectDependencyArtifact(ResolvedArtifact artifact) {
return isDependencySubstitutionsSupported && artifact.getId().getComponentIdentifier() instanceof ProjectComponentIdentifier;
}