external build: honor 'exclude output' option

This commit is contained in:
nik
2012-11-29 14:46:59 +04:00
parent 997cf0b695
commit a22fe193ab
5 changed files with 109 additions and 13 deletions
@@ -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<JpsModule> allModules = model.getProject().getModules();
for (final JpsModule module : allModules) {
final List<File> moduleExcludes = new ArrayList<File>();
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));
}
}
@@ -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<File> 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));
}
}
@@ -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);
@@ -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<JpsDependencyElement> 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());
@@ -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();
}
}