[gradle] deduplicate project dependencies using configuration names, not only files. IDEA-221699

GitOrigin-RevId: 21f9a0d622aeac6505ec070e09c5769c01924756
This commit is contained in:
Nikita Skvortsov
2019-10-16 22:04:26 +00:00
committed by intellij-monorepo-bot
parent c4d4a3f899
commit fa7df15fc1
2 changed files with 65 additions and 1 deletions
@@ -549,4 +549,53 @@ public class GradleCompositeImportingTest extends GradleImportingTestCase {
assertModuleModuleDeps("root-project.sub-project.main", "myId.main");
}
@Test
@TargetVersions("3.1+")
public void testScopeUpdateForSubstituteDependency() throws Exception {
createSettingsFile("rootProject.name = 'pA'\n" +
"include 'pA-1', 'pA-2'\n" +
"includeBuild('pB')\n" +
"includeBuild('pC')");
createProjectSubFile("pB/settings.gradle");
createProjectSubFile("pC/settings.gradle");
createProjectSubFile("pA-1/build.gradle",
new GradleBuildScriptBuilderEx()
.applyPlugin("'java-library'")
.addDependency("implementation 'group:pC'")
.generate());
createProjectSubFile("pA-2/build.gradle",
new GradleBuildScriptBuilderEx()
.applyPlugin("'java-library'")
.addDependency("implementation project(':pA-1')")
.addDependency("implementation 'group:pB'")
.generate());
createProjectSubFile("pB/build.gradle",
new GradleBuildScriptBuilderEx()
.addPostfix("group = 'group'")
.applyPlugin("'java-library'")
.addDependency("api 'group:pC'")
.generate());
createProjectSubFile("pC/build.gradle",
new GradleBuildScriptBuilderEx()
.addPostfix("group = 'group'")
.applyPlugin("'java-library'")
.generate());
//enableGradleDebugWithSuspend();
importProject("");
assertModules("pA",
"pA.pA-1", "pA.pA-1.main", "pA.pA-1.test",
"pA.pA-2", "pA.pA-2.main", "pA.pA-2.test",
"pB", "pB.main", "pB.test",
"pC", "pC.main", "pC.test");
assertModuleModuleDepScope("pA.pA-2.main", "pC.main", COMPILE);
}
}
@@ -527,9 +527,24 @@ public class DependencyResolverImpl implements DependencyResolver {
@NotNull ExternalDependency nextDependency) {
Collection<File> seenFiles = getFiles(seenDependency);
Collection<File> nextFiles = getFiles(nextDependency);
return seenFiles.containsAll(nextFiles);
boolean filesSeen = seenFiles.containsAll(nextFiles);
boolean projectDependencySeen = compareAsProjectDependencies(seenDependency, nextDependency);
return filesSeen || projectDependencySeen;
}
private static boolean compareAsProjectDependencies(@NotNull ExternalDependency seenDependency,
@NotNull ExternalDependency newDependency) {
if (seenDependency instanceof ExternalProjectDependency
&& newDependency instanceof ExternalProjectDependency) {
String seenConfiguration = ((ExternalProjectDependency)seenDependency).getConfigurationName();
String newConfiguration = ((ExternalProjectDependency)newDependency).getConfigurationName();
return
seenDependency.getId().equals(newDependency.getId())
&& ((seenConfiguration == newConfiguration) || (seenConfiguration != null && seenConfiguration.equals(newConfiguration)));
}
return false;
}
private static void upgradeScopeIfNeeded(@NotNull ExternalDependency targetDependency, @NotNull String newScope) {
if (targetDependency.getScope().equals(COMPILE_SCOPE) || !(targetDependency instanceof AbstractExternalDependency)) {