From a22fe193ab4a0129bd1f53d5f661f3fb472722c1 Mon Sep 17 00:00:00 2001 From: nik Date: Thu, 29 Nov 2012 14:45:57 +0400 Subject: [PATCH] external build: honor 'exclude output' option --- .../indices/impl/ModuleExcludeIndexImpl.java | 29 ++++++-- .../jps/indices/ModuleExcludeIndexTest.java | 70 +++++++++++++++++++ .../model/JpsDependenciesEnumeratorTest.java | 8 +-- .../jps/model/JpsJavaExtensionTest.java | 10 +-- .../jps/model/JpsJavaModelTestCase.java | 5 ++ 5 files changed, 109 insertions(+), 13 deletions(-) create mode 100644 jps/jps-builders/testSrc/org/jetbrains/jps/indices/ModuleExcludeIndexTest.java diff --git a/jps/jps-builders/src/org/jetbrains/jps/indices/impl/ModuleExcludeIndexImpl.java b/jps/jps-builders/src/org/jetbrains/jps/indices/impl/ModuleExcludeIndexImpl.java index e0371973ddd4..65ff5d893e47 100644 --- a/jps/jps-builders/src/org/jetbrains/jps/indices/impl/ModuleExcludeIndexImpl.java +++ b/jps/jps-builders/src/org/jetbrains/jps/indices/impl/ModuleExcludeIndexImpl.java @@ -5,6 +5,9 @@ import gnu.trove.THashMap; import gnu.trove.THashSet; import org.jetbrains.jps.indices.ModuleExcludeIndex; import org.jetbrains.jps.model.JpsModel; +import org.jetbrains.jps.model.java.JpsJavaExtensionService; +import org.jetbrains.jps.model.java.JpsJavaModuleExtension; +import org.jetbrains.jps.model.java.JpsJavaProjectExtension; import org.jetbrains.jps.model.module.JpsModule; import org.jetbrains.jps.util.JpsPathUtil; @@ -24,11 +27,29 @@ public class ModuleExcludeIndexImpl implements ModuleExcludeIndex { final Collection allModules = model.getProject().getModules(); for (final JpsModule module : allModules) { final List moduleExcludes = new ArrayList(); - myModuleToExcludesMap.put(module, moduleExcludes); for (String url : module.getExcludeRootsList().getUrls()) { - final File root = JpsPathUtil.urlToFile(url); - myExcludedRoots.add(root); - moduleExcludes.add(root); + moduleExcludes.add(JpsPathUtil.urlToFile(url)); + } + JpsJavaModuleExtension moduleExtension = JpsJavaExtensionService.getInstance().getModuleExtension(module); + if (moduleExtension != null && !moduleExtension.isInheritOutput() && moduleExtension.isExcludeOutput()) { + String outputUrl = moduleExtension.getOutputUrl(); + if (outputUrl != null) { + moduleExcludes.add(JpsPathUtil.urlToFile(outputUrl)); + } + String testOutputUrl = moduleExtension.getTestOutputUrl(); + if (testOutputUrl != null) { + moduleExcludes.add(JpsPathUtil.urlToFile(testOutputUrl)); + } + } + myModuleToExcludesMap.put(module, moduleExcludes); + myExcludedRoots.addAll(moduleExcludes); + } + + JpsJavaProjectExtension projectExtension = JpsJavaExtensionService.getInstance().getProjectExtension(model.getProject()); + if (projectExtension != null) { + String url = projectExtension.getOutputUrl(); + if (url != null) { + myExcludedRoots.add(JpsPathUtil.urlToFile(url)); } } diff --git a/jps/jps-builders/testSrc/org/jetbrains/jps/indices/ModuleExcludeIndexTest.java b/jps/jps-builders/testSrc/org/jetbrains/jps/indices/ModuleExcludeIndexTest.java new file mode 100644 index 000000000000..3ed91ebd4bb6 --- /dev/null +++ b/jps/jps-builders/testSrc/org/jetbrains/jps/indices/ModuleExcludeIndexTest.java @@ -0,0 +1,70 @@ +package org.jetbrains.jps.indices; + +import com.intellij.openapi.util.io.FileUtil; +import org.jetbrains.jps.indices.impl.ModuleExcludeIndexImpl; +import org.jetbrains.jps.model.JpsJavaModelTestCase; +import org.jetbrains.jps.model.java.JpsJavaModuleExtension; +import org.jetbrains.jps.model.module.JpsModule; +import org.jetbrains.jps.util.JpsPathUtil; + +import java.io.File; +import java.io.IOException; +import java.util.Collection; + +/** + * @author nik + */ +public class ModuleExcludeIndexTest extends JpsJavaModelTestCase { + private File myRoot; + + @Override + public void setUp() throws Exception { + super.setUp(); + myRoot = FileUtil.createTempDirectory("excludes", null); + } + + public void testExcludeProjectOutput() throws IOException { + File out = new File(myRoot, "out"); + getJavaService().getOrCreateProjectExtension(myProject).setOutputUrl(JpsPathUtil.pathToUrl(out.getAbsolutePath())); + assertNotExcluded(myRoot); + assertExcluded(out); + } + + public void testExcludeModuleOutput() { + File out = new File(myRoot, "out"); + JpsModule module = addModule(); + JpsJavaModuleExtension extension = getJavaService().getOrCreateModuleExtension(module); + extension.setExcludeOutput(true); + extension.setOutputUrl(JpsPathUtil.pathToUrl(out.getAbsolutePath())); + + assertNotExcluded(myRoot); + assertExcluded(out); + assertSameElements(getModuleExcludes(module), out); + + extension.setExcludeOutput(false); + assertNotExcluded(out); + assertEmpty(getModuleExcludes(module)); + } + + public void testExcludeExcludedFolder() { + File exc = new File(myRoot, "exc"); + JpsModule module = addModule(); + module.getExcludeRootsList().addUrl(JpsPathUtil.pathToUrl(exc.getAbsolutePath())); + + assertNotExcluded(myRoot); + assertExcluded(exc); + assertSameElements(getModuleExcludes(module), exc); + } + + private Collection getModuleExcludes(JpsModule module) { + return new ModuleExcludeIndexImpl(myModel).getModuleExcludes(module); + } + + private void assertExcluded(File file) { + assertTrue(new ModuleExcludeIndexImpl(myModel).isExcluded(file)); + } + + private void assertNotExcluded(File file) { + assertFalse(new ModuleExcludeIndexImpl(myModel).isExcluded(file)); + } +} diff --git a/jps/model-impl/testSrc/org/jetbrains/jps/model/JpsDependenciesEnumeratorTest.java b/jps/model-impl/testSrc/org/jetbrains/jps/model/JpsDependenciesEnumeratorTest.java index 648b4ea9696c..120fdf18d9ac 100644 --- a/jps/model-impl/testSrc/org/jetbrains/jps/model/JpsDependenciesEnumeratorTest.java +++ b/jps/model-impl/testSrc/org/jetbrains/jps/model/JpsDependenciesEnumeratorTest.java @@ -95,7 +95,7 @@ public class JpsDependenciesEnumeratorTest extends JpsJavaModelTestCase { public void testLibraryScope() throws Exception { JpsLibraryDependency dependency = myModule.getDependenciesList().addLibraryDependency(createJDomLibrary()); - JpsJavaExtensionService.getInstance().getOrCreateDependencyExtension(dependency).setScope(JpsJavaDependencyScope.RUNTIME); + getJavaService().getOrCreateDependencyExtension(dependency).setScope(JpsJavaDependencyScope.RUNTIME); JpsModuleRootModificationUtil.addDependency(myModule, createJDomLibrary(), JpsJavaDependencyScope.RUNTIME, false); assertClassRoots(orderEntries(myModule).withoutSdk(), getJDomJar()); @@ -190,16 +190,16 @@ public class JpsDependenciesEnumeratorTest extends JpsJavaModelTestCase { final String output = setModuleOutput(myModule, false); final String testOutput = setModuleOutput(myModule, true); - assertClassRoots(JpsJavaExtensionService.getInstance().enumerateDependencies(Arrays.asList(myModule)).withoutSdk(), + assertClassRoots(getJavaService().enumerateDependencies(Arrays.asList(myModule)).withoutSdk(), testOutput, output, getJDomJar()); - assertSourceRoots(JpsJavaExtensionService.getInstance().enumerateDependencies(Arrays.asList(myModule)).withoutSdk(), + assertSourceRoots(getJavaService().enumerateDependencies(Arrays.asList(myModule)).withoutSdk(), srcRoot, testRoot, getJDomSources()); } private String setModuleOutput(JpsModule module, boolean tests) { try { File file = FileUtil.createTempDirectory(module.getName(), tests ? "testSrc" : "src"); - JpsJavaModuleExtension extension = JpsJavaExtensionService.getInstance().getOrCreateModuleExtension(module); + JpsJavaModuleExtension extension = getJavaService().getOrCreateModuleExtension(module); String url = JpsPathUtil.getLibraryRootUrl(file); if (tests) { extension.setTestOutputUrl(url); diff --git a/jps/model-impl/testSrc/org/jetbrains/jps/model/JpsJavaExtensionTest.java b/jps/model-impl/testSrc/org/jetbrains/jps/model/JpsJavaExtensionTest.java index a027f11cc0d8..ab5fc4b9f3ac 100644 --- a/jps/model-impl/testSrc/org/jetbrains/jps/model/JpsJavaExtensionTest.java +++ b/jps/model-impl/testSrc/org/jetbrains/jps/model/JpsJavaExtensionTest.java @@ -14,9 +14,9 @@ import java.util.List; public class JpsJavaExtensionTest extends JpsJavaModelTestCase { public void testModule() { final JpsModule module = addModule(); - final JpsJavaModuleExtension extension = JpsJavaExtensionService.getInstance().getOrCreateModuleExtension(module); + final JpsJavaModuleExtension extension = getJavaService().getOrCreateModuleExtension(module); extension.setOutputUrl("file://path"); - JpsJavaModuleExtension moduleExtension = JpsJavaExtensionService.getInstance().getModuleExtension(module); + JpsJavaModuleExtension moduleExtension = getJavaService().getModuleExtension(module); assertNotNull(moduleExtension); assertEquals("file://path", moduleExtension.getOutputUrl()); } @@ -26,14 +26,14 @@ public class JpsJavaExtensionTest extends JpsJavaModelTestCase { final JpsModule module = model.getProject().addModule("m", JpsJavaModuleType.INSTANCE); final JpsLibrary library = model.getProject().addLibrary("l", JpsJavaLibraryType.INSTANCE); final JpsLibraryDependency dependency = module.getDependenciesList().addLibraryDependency(library); - JpsJavaExtensionService.getInstance().getOrCreateDependencyExtension(dependency).setScope(JpsJavaDependencyScope.TEST); - JpsJavaExtensionService.getInstance().getOrCreateDependencyExtension(dependency).setExported(true); + getJavaService().getOrCreateDependencyExtension(dependency).setScope(JpsJavaDependencyScope.TEST); + getJavaService().getOrCreateDependencyExtension(dependency).setExported(true); model.commit(); List dependencies = assertOneElement(myProject.getModules()).getDependenciesList().getDependencies(); assertEquals(2, dependencies.size()); final JpsDependencyElement dep = dependencies.get(1); - final JpsJavaDependencyExtension extension = JpsJavaExtensionService.getInstance().getDependencyExtension(dep); + final JpsJavaDependencyExtension extension = getJavaService().getDependencyExtension(dep); assertNotNull(extension); assertTrue(extension.isExported()); assertSame(JpsJavaDependencyScope.TEST, extension.getScope()); diff --git a/jps/model-impl/testSrc/org/jetbrains/jps/model/JpsJavaModelTestCase.java b/jps/model-impl/testSrc/org/jetbrains/jps/model/JpsJavaModelTestCase.java index 7071b4043eb0..a1cb6d38855c 100644 --- a/jps/model-impl/testSrc/org/jetbrains/jps/model/JpsJavaModelTestCase.java +++ b/jps/model-impl/testSrc/org/jetbrains/jps/model/JpsJavaModelTestCase.java @@ -1,5 +1,6 @@ package org.jetbrains.jps.model; +import org.jetbrains.jps.model.java.JpsJavaExtensionService; import org.jetbrains.jps.model.java.JpsJavaLibraryType; import org.jetbrains.jps.model.java.JpsJavaModuleType; import org.jetbrains.jps.model.library.JpsLibrary; @@ -24,4 +25,8 @@ public abstract class JpsJavaModelTestCase extends JpsModelTestCase { protected JpsLibrary addLibrary(final String name) { return myProject.addLibrary(name, JpsJavaLibraryType.INSTANCE); } + + protected JpsJavaExtensionService getJavaService() { + return JpsJavaExtensionService.getInstance(); + } }