From de54d378abc33e666bd88656391289401d43805c Mon Sep 17 00:00:00 2001 From: Eugene Zhuravlev Date: Fri, 16 Mar 2018 14:04:19 +0100 Subject: [PATCH] include exported dependencies in build target configuration fingerprint => recompile build target on indirect dependency change (IDEA-188330) --- ...recompileTargetOnExportedLibraryChange.log | 6 +++ .../moduleA/lib/util.jar | Bin 0 -> 651 bytes .../moduleA/lib/util_new.jar | Bin 0 -> 676 bytes .../moduleA/src/qqq/MainA.java | 4 ++ .../moduleB/src/ppp/MainB.java | 7 +++ .../jps/incremental/ModuleBuildTarget.java | 5 +- .../jetbrains/ether/IncrementalTestCase.java | 32 +++++++++++++ .../org/jetbrains/ether/Java9Test.java | 43 ++---------------- .../org/jetbrains/ether/MarkDirtyTest.java | 37 +++++++++++++++ 9 files changed, 92 insertions(+), 42 deletions(-) create mode 100644 java/java-tests/testData/compileServer/incremental/markDirty/recompileTargetOnExportedLibraryChange.log create mode 100644 java/java-tests/testData/compileServer/incremental/markDirty/recompileTargetOnExportedLibraryChange/moduleA/lib/util.jar create mode 100644 java/java-tests/testData/compileServer/incremental/markDirty/recompileTargetOnExportedLibraryChange/moduleA/lib/util_new.jar create mode 100644 java/java-tests/testData/compileServer/incremental/markDirty/recompileTargetOnExportedLibraryChange/moduleA/src/qqq/MainA.java create mode 100644 java/java-tests/testData/compileServer/incremental/markDirty/recompileTargetOnExportedLibraryChange/moduleB/src/ppp/MainB.java diff --git a/java/java-tests/testData/compileServer/incremental/markDirty/recompileTargetOnExportedLibraryChange.log b/java/java-tests/testData/compileServer/incremental/markDirty/recompileTargetOnExportedLibraryChange.log new file mode 100644 index 000000000000..ec084368e36d --- /dev/null +++ b/java/java-tests/testData/compileServer/incremental/markDirty/recompileTargetOnExportedLibraryChange.log @@ -0,0 +1,6 @@ +Compiling files: +moduleA/src/qqq/MainA.java +End of files +Compiling files: +moduleB/src/ppp/MainB.java +End of files \ No newline at end of file diff --git a/java/java-tests/testData/compileServer/incremental/markDirty/recompileTargetOnExportedLibraryChange/moduleA/lib/util.jar b/java/java-tests/testData/compileServer/incremental/markDirty/recompileTargetOnExportedLibraryChange/moduleA/lib/util.jar new file mode 100644 index 0000000000000000000000000000000000000000..daa8bf7739e9f2883e268e11ef1cf39ffba3715f GIT binary patch literal 651 zcmWIWW@h1HVBlb2IJGz5hXDz&Ft9Kb6cp(HJH@~d08}Nyz`?=6(1xap52ypADzqds zM=v=ivADQ4DAr%fQN;Ez6Zh@4@(Z>Fg#5|aedE=)h56fRFC3YYl018XiXET9EydIC z(qeu7M80KK%YDTE!F}ev-4iB=J+iqoyZYVE^m8>fHvjgqe-M<{v2kA7p%piCMWjK1 zX2RUhZ0){$rQFds%r+(`g)98`WViaMlwi@j&EcEH8_h;nfA&`;7B5!(@F}Zt@`}4L zwJ!SDtk;|~eCu9hGoJ2Vbi&quOT9*do7O&_$BdIa=!zMxUH>)VWm)F~R`fyYjz{LnVs5&pOJjJ$++`H5*o%1>4+ z&rlX|)9@43J+&rC@$Jei(bW-)efnn`#s6as@Mh=GtB*2@M4J6M5ghfD_8R!ZI1^_0V=%xSw literal 0 HcmV?d00001 diff --git a/java/java-tests/testData/compileServer/incremental/markDirty/recompileTargetOnExportedLibraryChange/moduleA/lib/util_new.jar b/java/java-tests/testData/compileServer/incremental/markDirty/recompileTargetOnExportedLibraryChange/moduleA/lib/util_new.jar new file mode 100644 index 0000000000000000000000000000000000000000..5424aaa03f9139aca64318cd0906e644db9ae461 GIT binary patch literal 676 zcmWIWW@h1HVBlb2__jCShXDz&Ft9Kb6cp(HJH@~d08}Nyz`?=6@ET1OA5aHKRcJ|O zj$U$3VsUY9&~3ll4g$8bXD445keYN!NH6o{QAJkfSJ9gMA*)(a7=vzk*yK%8jeT-s z+T)N{@mp&-g0#Of|5&lg*e@htqx`vwv~zQ2&b>R^-oBo>qM4bS|AN7WG{tr|$=5mN z5@wRK)aE^!*{W+}{^8I8@5W0D`AUjZCX`3THXiz2uz*Et9^aLhDOZ9&y5Ib)8T9qg zzAw9tuDv^_&c{&4o zQgk%+{Z_oruu1vIGwUj+dSQI+g*zuxzQ(5A+^|t$!>9VAA6uMVyTk0;hVy5B-eB_HUX;F9`>KD2u~AoufxwNzcm3u66F&bl`4M$( zXa41Yn{K(S-~l)VY#U3X^+8umg>3#<`WB> z^!BpW>HT@CP_ee9`^nA})|-#MnI8FW604}Q^q|c&j<=GG{DG?3Ns?PDKeBEtPPtyM zSYFs$v(>=0u(a!vNZWVjr{6@UzciZ+4CVr>m=WF)}cGU;@QDBNG<`?$m*lSfHr@l2#a*L>LgM1=&PUYC!-sAQLt1 V1bDNuf#jKhun0)Y0A0br0055;{Ph3; literal 0 HcmV?d00001 diff --git a/java/java-tests/testData/compileServer/incremental/markDirty/recompileTargetOnExportedLibraryChange/moduleA/src/qqq/MainA.java b/java/java-tests/testData/compileServer/incremental/markDirty/recompileTargetOnExportedLibraryChange/moduleA/src/qqq/MainA.java new file mode 100644 index 000000000000..e1c4f64c5cfe --- /dev/null +++ b/java/java-tests/testData/compileServer/incremental/markDirty/recompileTargetOnExportedLibraryChange/moduleA/src/qqq/MainA.java @@ -0,0 +1,4 @@ +package qqq; + +public class MainA { +} \ No newline at end of file diff --git a/java/java-tests/testData/compileServer/incremental/markDirty/recompileTargetOnExportedLibraryChange/moduleB/src/ppp/MainB.java b/java/java-tests/testData/compileServer/incremental/markDirty/recompileTargetOnExportedLibraryChange/moduleB/src/ppp/MainB.java new file mode 100644 index 000000000000..21477d71ff68 --- /dev/null +++ b/java/java-tests/testData/compileServer/incremental/markDirty/recompileTargetOnExportedLibraryChange/moduleB/src/ppp/MainB.java @@ -0,0 +1,7 @@ +package ppp; + +public class MainB { + public static void main(String[] args) { + ppp.Util.perform(10); + } +} \ No newline at end of file diff --git a/jps/jps-builders/src/org/jetbrains/jps/incremental/ModuleBuildTarget.java b/jps/jps-builders/src/org/jetbrains/jps/incremental/ModuleBuildTarget.java index bebbc5ecae2d..5e0fe4da40fa 100644 --- a/jps/jps-builders/src/org/jetbrains/jps/incremental/ModuleBuildTarget.java +++ b/jps/jps-builders/src/org/jetbrains/jps/incremental/ModuleBuildTarget.java @@ -16,10 +16,8 @@ package org.jetbrains.jps.incremental; import com.intellij.openapi.util.io.FileUtil; -import com.intellij.util.Consumer; import com.intellij.util.SmartList; import com.intellij.util.containers.ContainerUtil; -import gnu.trove.THashSet; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.jps.ProjectPaths; @@ -42,7 +40,6 @@ import org.jetbrains.jps.model.java.compiler.ProcessorConfigProfile; import org.jetbrains.jps.model.module.JpsModule; import org.jetbrains.jps.model.module.JpsTypedModuleSourceRoot; import org.jetbrains.jps.service.JpsServiceManager; -import org.jetbrains.jps.util.JpsPathUtil; import java.io.File; import java.io.PrintWriter; @@ -206,7 +203,7 @@ public final class ModuleBuildTarget extends JVMModuleBuildTarget setupModules() { + final File projectDir = getOrCreateProjectDir(); + final File[] moduleDirs = projectDir.listFiles((dir, name) -> name.startsWith(MODULE_DIR_PREFIX)); + + if (moduleDirs != null && moduleDirs.length > 0) { + final Map modules = new HashMap<>(); + final List moduleNames = new ArrayList<>(); + for (File moduleDir : moduleDirs) { + final String name = moduleDir.getName().substring(MODULE_DIR_PREFIX.length()); + final JpsModule m = addModule(name, moduleDir.getName() + "/src"); + modules.put(name, m); + moduleNames.add(name); + } + Collections.sort(moduleNames, Collections.reverseOrder()); + // set dependencies in alphabet reverse order + JpsModule from = null; + for (String name : moduleNames) { + final JpsModule mod = modules.get(name); + if (from != null) { + JpsModuleRootModificationUtil.addDependency(from, mod); + } + from = mod; + } + return modules; + } + return Collections.emptyMap(); + } + private static class StringProjectBuilderLogger extends ProjectBuilderLoggerBase { private final String myRoot; private final StringBuilder myLog; diff --git a/jps/jps-builders/testSrc/org/jetbrains/ether/Java9Test.java b/jps/jps-builders/testSrc/org/jetbrains/ether/Java9Test.java index 5751ba912567..773904df79cb 100644 --- a/jps/jps-builders/testSrc/org/jetbrains/ether/Java9Test.java +++ b/jps/jps-builders/testSrc/org/jetbrains/ether/Java9Test.java @@ -4,19 +4,12 @@ package org.jetbrains.ether; import com.intellij.openapi.util.SystemInfo; import org.jetbrains.jps.builders.BuildResult; import org.jetbrains.jps.builders.CompileScopeTestBuilder; -import org.jetbrains.jps.model.JpsModuleRootModificationUtil; -import org.jetbrains.jps.model.module.JpsModule; - -import java.io.File; -import java.util.*; /** * @author Eugene Zhuravlev */ public class Java9Test extends IncrementalTestCase { - private static final String MODULE_DIR_PREFIX = "module"; - public Java9Test() { super("java9-features"); } @@ -29,6 +22,11 @@ public class Java9Test extends IncrementalTestCase { return super.shouldRunTest(); } + protected BuildResult doTestBuild(int makesCount) { + setupModules(); + return super.doTestBuild(makesCount); + } + public void testModuleInfoAdded() { // expected result: the whole target is recompiled after the module-info.java file was newly added // because necessary 'require' directives may be missing from the newly added module-info file @@ -101,35 +99,4 @@ public class Java9Test extends IncrementalTestCase { modify(1); doBuild(CompileScopeTestBuilder.make().allModules()).assertFailed(); } - - protected BuildResult doTestBuild(int makesCount) { - setupModules(); - return super.doTestBuild(makesCount); - } - - private void setupModules() { - final File projectDir = getOrCreateProjectDir(); - final File[] moduleDirs = projectDir.listFiles((dir, name) -> name.startsWith(MODULE_DIR_PREFIX)); - - if (moduleDirs != null && moduleDirs.length > 0) { - final Map modules = new HashMap<>(); - final List moduleNames = new ArrayList<>(); - for (File moduleDir : moduleDirs) { - final String name = moduleDir.getName().substring(MODULE_DIR_PREFIX.length()); - final JpsModule m = addModule(name, moduleDir.getName() + "/src"); - modules.put(name, m); - moduleNames.add(name); - } - Collections.sort(moduleNames, Collections.reverseOrder()); - // set dependencies in alphabet reverse order - JpsModule from = null; - for (String name : moduleNames) { - final JpsModule mod = modules.get(name); - if (from != null) { - JpsModuleRootModificationUtil.addDependency(from, mod); - } - from = mod; - } - } - } } diff --git a/jps/jps-builders/testSrc/org/jetbrains/ether/MarkDirtyTest.java b/jps/jps-builders/testSrc/org/jetbrains/ether/MarkDirtyTest.java index 327f68b33a30..67f9319f9497 100644 --- a/jps/jps-builders/testSrc/org/jetbrains/ether/MarkDirtyTest.java +++ b/jps/jps-builders/testSrc/org/jetbrains/ether/MarkDirtyTest.java @@ -15,11 +15,18 @@ */ package org.jetbrains.ether; +import org.jetbrains.jps.model.JpsDummyElement; import org.jetbrains.jps.model.JpsModuleRootModificationUtil; import org.jetbrains.jps.model.java.JpsJavaDependencyScope; +import org.jetbrains.jps.model.java.JpsJavaLibraryType; import org.jetbrains.jps.model.library.JpsLibrary; +import org.jetbrains.jps.model.library.JpsOrderRootType; +import org.jetbrains.jps.model.library.JpsTypedLibrary; import org.jetbrains.jps.model.module.JpsModule; +import java.io.File; +import java.util.Map; + /** * @author: db */ @@ -40,6 +47,36 @@ public class MarkDirtyTest extends IncrementalTestCase { doTestBuild(1).assertSuccessful(); } + protected boolean useCachedProjectDescriptorOnEachMake() { + return !"recompileTargetOnExportedLibraryChange".equals(getTestName(true)); + } + + protected void modify(int stage) { + if (stage == 0 && "recompileTargetOnExportedLibraryChange".equals(getTestName(true))) { + final JpsTypedLibrary library = myProject.getLibraryCollection().findLibrary("l", JpsJavaLibraryType.INSTANCE); + assertNotNull(library); + for (String url : library.getRootUrls(JpsOrderRootType.COMPILED)) { + library.removeUrl(url, JpsOrderRootType.COMPILED); + } + library.addRoot(new File(getAbsolutePath("moduleA/lib/util_new.jar")), JpsOrderRootType.COMPILED); + } + else { + super.modify(stage); + } + } + + public void testRecompileTargetOnExportedLibraryChange() { + setupInitialProject(); + final Map modules = setupModules(); + final JpsModule moduleA = modules.get("A"); + assertNotNull(moduleA); + + JpsLibrary library = addLibrary("moduleA/lib/util.jar"); + JpsModuleRootModificationUtil.addDependency(moduleA, library, JpsJavaDependencyScope.COMPILE, true); + + doTestBuild(1).assertSuccessful(); + } + public void testTransitiveRecompile() { JpsModule module = addModule(); addTestRoot(module, "testSrc");