From b72472035378eaa71edb01999dad3791ec942633 Mon Sep 17 00:00:00 2001 From: Eugene Zhuravlev Date: Tue, 17 Sep 2013 13:06:51 +0400 Subject: [PATCH] delete outputs corresponding to changed files for each target before running builders on it --- .../jps/incremental/IncProjectBuilder.java | 19 ++++++++++++++++++- .../resources/ResourcesBuilder.java | 11 ++++------- .../jps/builders/JpsBuildTestCase.java | 16 ++++++++++++++++ .../resources/ResourceCopyingTest.java | 10 ++++++++++ .../artifacts/ArtifactBuilderTestCase.java | 16 ---------------- .../maven/compiler/MavenResourcesBuilder.java | 8 -------- 6 files changed, 48 insertions(+), 32 deletions(-) diff --git a/jps/jps-builders/src/org/jetbrains/jps/incremental/IncProjectBuilder.java b/jps/jps-builders/src/org/jetbrains/jps/incremental/IncProjectBuilder.java index 718dc8c1ca4f..1a5047df7042 100644 --- a/jps/jps-builders/src/org/jetbrains/jps/incremental/IncProjectBuilder.java +++ b/jps/jps-builders/src/org/jetbrains/jps/incremental/IncProjectBuilder.java @@ -774,7 +774,7 @@ public class IncProjectBuilder { return false; } - private boolean runBuildersForChunk(CompileContext context, final BuildTargetChunk chunk) throws ProjectBuildException, IOException { + private boolean runBuildersForChunk(final CompileContext context, final BuildTargetChunk chunk) throws ProjectBuildException, IOException { Set> targets = chunk.getTargets(); if (targets.size() > 1) { Set moduleTargets = new HashSet(); @@ -798,6 +798,11 @@ public class IncProjectBuilder { return runModuleLevelBuilders(context, new ModuleChunk(Collections.singleton((ModuleBuildTarget)target))); } + // In general the set of files corresponding to changed source file may be different + // Need this for example, to keep up with case changes in file names for case-insensitive OSes: + // deleting the output before copying is the only way to ensure the case of the output file's name is exactly the same as source file's case + cleanOldOutputs(context, target); + final List> builders = BuilderRegistry.getInstance().getTargetBuilders(); for (TargetBuilder builder : builders) { BuildOperations.buildTarget(target, context, builder); @@ -806,6 +811,18 @@ public class IncProjectBuilder { return true; } + private static + void cleanOldOutputs(final CompileContext context, final BuildTarget target) throws ProjectBuildException, IOException { + if (!context.getScope().isBuildForced(target)) { + BuildOperations.cleanOutputsCorrespondingToChangedFiles(context, new DirtyFilesHolderBase>(context) { + public void processDirtyFiles(@NotNull FileProcessor> processor) throws IOException { + context.getProjectDescriptor().fsState.processFilesToRecompile(context, target, processor); + } + }); + } + } + + private void updateDoneFraction(CompileContext context, final float delta) { myTargetsProcessed += delta; float processed = myTargetsProcessed; diff --git a/jps/jps-builders/src/org/jetbrains/jps/incremental/resources/ResourcesBuilder.java b/jps/jps-builders/src/org/jetbrains/jps/incremental/resources/ResourcesBuilder.java index e73891f64ea6..809eafd5abc0 100644 --- a/jps/jps-builders/src/org/jetbrains/jps/incremental/resources/ResourcesBuilder.java +++ b/jps/jps-builders/src/org/jetbrains/jps/incremental/resources/ResourcesBuilder.java @@ -16,7 +16,6 @@ package org.jetbrains.jps.incremental.resources; import com.intellij.openapi.diagnostic.Logger; -import com.intellij.openapi.util.SystemInfo; import com.intellij.openapi.util.io.FileUtil; import org.jetbrains.annotations.NotNull; import org.jetbrains.jps.builders.BuildOutputConsumer; @@ -24,7 +23,10 @@ import org.jetbrains.jps.builders.DirtyFilesHolder; import org.jetbrains.jps.builders.FileProcessor; import org.jetbrains.jps.builders.java.ResourceRootDescriptor; import org.jetbrains.jps.builders.java.ResourcesTargetType; -import org.jetbrains.jps.incremental.*; +import org.jetbrains.jps.incremental.CompileContext; +import org.jetbrains.jps.incremental.ProjectBuildException; +import org.jetbrains.jps.incremental.ResourcesTarget; +import org.jetbrains.jps.incremental.TargetBuilder; import org.jetbrains.jps.incremental.messages.BuildMessage; import org.jetbrains.jps.incremental.messages.CompilerMessage; import org.jetbrains.jps.incremental.messages.ProgressMessage; @@ -60,11 +62,6 @@ public class ResourcesBuilder extends TargetBuilder() { diff --git a/jps/jps-builders/testSrc/org/jetbrains/jps/builders/JpsBuildTestCase.java b/jps/jps-builders/testSrc/org/jetbrains/jps/builders/JpsBuildTestCase.java index 6241b04e84d2..b2f654fb905a 100644 --- a/jps/jps-builders/testSrc/org/jetbrains/jps/builders/JpsBuildTestCase.java +++ b/jps/jps-builders/testSrc/org/jetbrains/jps/builders/JpsBuildTestCase.java @@ -75,6 +75,22 @@ public abstract class JpsBuildTestCase extends UsefulTestCase { protected Map myBuildParams; + protected static void rename(String path, String newName) { + try { + File file = new File(FileUtil.toSystemDependentName(path)); + assertTrue("File " + file.getAbsolutePath() + " doesn't exist", file.exists()); + final File tempFile = new File(file.getParentFile(), "__" + newName); + FileUtil.rename(file, tempFile); + File newFile = new File(file.getParentFile(), newName); + FileUtil.copyContent(tempFile, newFile); + FileUtil.delete(tempFile); + change(newFile.getPath()); + } + catch (IOException e) { + throw new RuntimeException(e); + } + } + @Override protected void setUp() throws Exception { super.setUp(); diff --git a/jps/jps-builders/testSrc/org/jetbrains/jps/builders/resources/ResourceCopyingTest.java b/jps/jps-builders/testSrc/org/jetbrains/jps/builders/resources/ResourceCopyingTest.java index ac124af91b49..d05df54a9ebe 100644 --- a/jps/jps-builders/testSrc/org/jetbrains/jps/builders/resources/ResourceCopyingTest.java +++ b/jps/jps-builders/testSrc/org/jetbrains/jps/builders/resources/ResourceCopyingTest.java @@ -46,6 +46,16 @@ public class ResourceCopyingTest extends JpsBuildTestCase { assertOutput(m, fs().file("a.xml")); } + public void testCaseChange() { + String file = createFile("src/a.xml"); + JpsModule m = addModule("m", PathUtil.getParentPath(file)); + rebuildAll(); + assertOutput(m, fs().file("a.xml")); + rename(file, "A.xml"); + makeAll(); + assertOutput(m, fs().file("A.xml")); + } + public void testPackagePrefix() { String file = createFile("src/a.xml"); JpsModule m = addModule("m", PathUtil.getParentPath(file)); diff --git a/jps/jps-builders/testSrc/org/jetbrains/jps/incremental/artifacts/ArtifactBuilderTestCase.java b/jps/jps-builders/testSrc/org/jetbrains/jps/incremental/artifacts/ArtifactBuilderTestCase.java index 96691d9a0a61..8c0c45e9319f 100644 --- a/jps/jps-builders/testSrc/org/jetbrains/jps/incremental/artifacts/ArtifactBuilderTestCase.java +++ b/jps/jps-builders/testSrc/org/jetbrains/jps/incremental/artifacts/ArtifactBuilderTestCase.java @@ -32,7 +32,6 @@ import org.jetbrains.jps.model.library.JpsOrderRootType; import org.jetbrains.jps.util.JpsPathUtil; import java.io.File; -import java.io.IOException; import java.util.Collection; import java.util.HashSet; import java.util.Set; @@ -136,19 +135,4 @@ public abstract class ArtifactBuilderTestCase extends JpsBuildTestCase { assertDeletedAndCopied(ArrayUtil.EMPTY_STRING_ARRAY); } - protected static void rename(String path, String newName) { - try { - File file = new File(FileUtil.toSystemDependentName(path)); - assertTrue("File " + file.getAbsolutePath() + " doesn't exist", file.exists()); - final File tempFile = new File(file.getParentFile(), "__" + newName); - FileUtil.rename(file, tempFile); - File newFile = new File(file.getParentFile(), newName); - FileUtil.copyContent(tempFile, newFile); - FileUtil.delete(tempFile); - change(newFile.getPath()); - } - catch (IOException e) { - throw new RuntimeException(e); - } - } } diff --git a/plugins/maven/jps-plugin/src/org/jetbrains/jps/maven/compiler/MavenResourcesBuilder.java b/plugins/maven/jps-plugin/src/org/jetbrains/jps/maven/compiler/MavenResourcesBuilder.java index 96434cbe52c9..8f9a7b85b9cc 100644 --- a/plugins/maven/jps-plugin/src/org/jetbrains/jps/maven/compiler/MavenResourcesBuilder.java +++ b/plugins/maven/jps-plugin/src/org/jetbrains/jps/maven/compiler/MavenResourcesBuilder.java @@ -1,6 +1,5 @@ package org.jetbrains.jps.maven.compiler; -import com.intellij.openapi.util.SystemInfo; import com.intellij.openapi.util.io.FileUtil; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -8,7 +7,6 @@ import org.jetbrains.jps.builders.BuildOutputConsumer; import org.jetbrains.jps.builders.DirtyFilesHolder; import org.jetbrains.jps.builders.FileProcessor; import org.jetbrains.jps.builders.storage.BuildDataPaths; -import org.jetbrains.jps.incremental.BuildOperations; import org.jetbrains.jps.incremental.CompileContext; import org.jetbrains.jps.incremental.ProjectBuildException; import org.jetbrains.jps.incremental.TargetBuilder; @@ -52,12 +50,6 @@ public class MavenResourcesBuilder extends TargetBuilder() {