diff --git a/jps/plugins/gwt/src/org/jetbrains/jps/gwt/GwtModuleBuilder.groovy b/jps/plugins/gwt/src/org/jetbrains/jps/gwt/GwtModuleBuilder.groovy index bbada4c85aa1..42d369a6a509 100644 --- a/jps/plugins/gwt/src/org/jetbrains/jps/gwt/GwtModuleBuilder.groovy +++ b/jps/plugins/gwt/src/org/jetbrains/jps/gwt/GwtModuleBuilder.groovy @@ -4,9 +4,8 @@ import org.jetbrains.jps.ModuleBuildState import org.jetbrains.jps.ModuleBuilder import org.jetbrains.jps.ModuleChunk import org.jetbrains.jps.Project -import org.jetbrains.jps.builders.BuildUtil -/** + /** * @author nik */ class GwtModuleBuilder implements ModuleBuilder { @@ -41,9 +40,7 @@ class GwtModuleBuilder implements ModuleBuilder { return } - String baseDir = project.targetFolder != null ? project.targetFolder : "." - String dirName = BuildUtil.suggestFileName(facet.module.name) - String outputDir = new File(baseDir, "__temp_gwt_output_$dirName").absolutePath + String outputDir = project.builder.getTempDirectoryPath("GWT_Output_$facet.module.name") facet.tempOutputDir = outputDir def ant = project.binding.ant diff --git a/jps/src/org/jetbrains/jps/Project.groovy b/jps/src/org/jetbrains/jps/Project.groovy index 7fd2da29b917..608b0774cbd7 100644 --- a/jps/src/org/jetbrains/jps/Project.groovy +++ b/jps/src/org/jetbrains/jps/Project.groovy @@ -173,6 +173,10 @@ class Project { builder.clean() } + def deleteTempFiles() { + builder.deleteTempFiles() + } + def ClasspathItem resolve(Object dep) { if (dep instanceof ClasspathItem) { return dep diff --git a/jps/src/org/jetbrains/jps/ProjectBuilder.groovy b/jps/src/org/jetbrains/jps/ProjectBuilder.groovy index 4fb0fbcf5b04..0e68549adc1b 100644 --- a/jps/src/org/jetbrains/jps/ProjectBuilder.groovy +++ b/jps/src/org/jetbrains/jps/ProjectBuilder.groovy @@ -34,9 +34,12 @@ class ProjectBuilder { boolean useInProcessJavac boolean compressJars = true + private final TempFileContainer tempFileContainer + def ProjectBuilder(GantBinding binding, Project project) { this.project = project this.binding = binding + tempFileContainer = new TempFileContainer(project, "__build_temp__") sourceGeneratingBuilders << new GroovyStubGenerator(project) translatingBuilders << new JavacBuilder() translatingBuilders << new GroovycBuilder(project) @@ -111,6 +114,14 @@ class ProjectBuilder { return makeModuleWithDependencies(module, true); } + def deleteTempFiles() { + tempFileContainer.clean() + } + + String getTempDirectoryPath(String name) { + return tempFileContainer.getTempDirPath(name) + } + private def makeModuleWithDependencies(Module module, boolean includeTests) { def chunk = chunkForModule(module, includeTests) Set dependencies = new HashSet() diff --git a/jps/src/org/jetbrains/jps/TempFileContainer.groovy b/jps/src/org/jetbrains/jps/TempFileContainer.groovy new file mode 100644 index 000000000000..69347f9a7051 --- /dev/null +++ b/jps/src/org/jetbrains/jps/TempFileContainer.groovy @@ -0,0 +1,49 @@ +package org.jetbrains.jps + +import org.jetbrains.jps.builders.BuildUtil + +/** + * @author nik + */ +class TempFileContainer { + private File baseDirectory + private final String tempDirectoryName + private final Project project + private final Set usedNames = [] as Set + + TempFileContainer(Project project, String tempDirectoryName) { + this.project = project + this.tempDirectoryName = tempDirectoryName + } + + private File getBaseDirectory() { + if (baseDirectory == null) { + def ant = project.binding.ant + baseDirectory = new File(project.targetFolder != null ? project.targetFolder : ".", tempDirectoryName) + ant.delete(dir: baseDirectory.absolutePath) + ant.mkdir(dir: baseDirectory.absolutePath) + } + return baseDirectory + } + + String getTempDirPath(String name) { + String baseName = BuildUtil.suggestFileName(name) + String dirName = baseName + int i = 2 + while (usedNames.contains(dirName)) { + dirName = baseName + i + i++ + } + usedNames << dirName + File tempDir = new File(getBaseDirectory(), dirName) + return tempDir.absolutePath + } + + def clean() { + if (baseDirectory != null) { + def ant = project.binding.ant + ant.delete(dir: baseDirectory.absolutePath) + } + + } +} diff --git a/jps/src/org/jetbrains/jps/artifacts/ArtifactBuilder.groovy b/jps/src/org/jetbrains/jps/artifacts/ArtifactBuilder.groovy index 59d115dcb352..70bd622c5104 100644 --- a/jps/src/org/jetbrains/jps/artifacts/ArtifactBuilder.groovy +++ b/jps/src/org/jetbrains/jps/artifacts/ArtifactBuilder.groovy @@ -106,8 +106,7 @@ class ArtifactBuilder { project.stage("Building '${artifact.name}' artifact") output = getArtifactOutputFolder(artifact) if (output == null) { - def dirName = BuildUtil.suggestFileName(artifact.name) - output = new File(project.targetFolder != null ? project.targetFolder : ".", "__temp_artifact_$dirName").absolutePath + output = project.builder.getTempDirectoryPath(artifact.name) project.info("Output path for artifact '$artifact.name' is not specified so it will be built to $output") } artifactOutputs[artifact] = output diff --git a/jps/testData/artifactWithoutOutput/artifactWithoutOutput.iml b/jps/testData/artifactWithoutOutput/artifactWithoutOutput.iml new file mode 100644 index 000000000000..d5c074327501 --- /dev/null +++ b/jps/testData/artifactWithoutOutput/artifactWithoutOutput.iml @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/jps/testData/artifactWithoutOutput/artifactWithoutOutput.ipr b/jps/testData/artifactWithoutOutput/artifactWithoutOutput.ipr new file mode 100644 index 000000000000..c05b3c3683aa --- /dev/null +++ b/jps/testData/artifactWithoutOutput/artifactWithoutOutput.ipr @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + $OUTPUT_DIR$/artifacts/main + + + + + + + + + + + + + + + + diff --git a/jps/testData/artifactWithoutOutput/data.txt b/jps/testData/artifactWithoutOutput/data.txt new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/jps/testSrc/org/jetbrains/jps/ArtifactWithoutOutputTest.groovy b/jps/testSrc/org/jetbrains/jps/ArtifactWithoutOutputTest.groovy new file mode 100644 index 000000000000..a468b45a1e2d --- /dev/null +++ b/jps/testSrc/org/jetbrains/jps/ArtifactWithoutOutputTest.groovy @@ -0,0 +1,24 @@ +package org.jetbrains.jps + +import org.jetbrains.jps.util.FileUtil + +/** + * @author nik + */ +class ArtifactWithoutOutputTest extends JpsBuildTestCase { + public void test() throws Exception { + def outDir = FileUtil.createTempDirectory("output").absolutePath + Project project = loadProject("testData/artifactWithoutOutput/artifactWithoutOutput.ipr", ["OUTPUT_DIR":outDir]) + project.clean() + project.buildArtifact("main") + project.deleteTempFiles() + assertOutput(project, outDir) { + dir("artifacts") { + dir("main") { + file("data.txt") + file("data2.txt") + } + } + } + } +} diff --git a/jps/testSrc/org/jetbrains/jps/JpsBuildTestCase.groovy b/jps/testSrc/org/jetbrains/jps/JpsBuildTestCase.groovy index 64e68f32d4d4..d3ff7d1f830c 100644 --- a/jps/testSrc/org/jetbrains/jps/JpsBuildTestCase.groovy +++ b/jps/testSrc/org/jetbrains/jps/JpsBuildTestCase.groovy @@ -17,17 +17,17 @@ abstract class JpsBuildTestCase extends TestCase { def doTest(String projectPath, Map pathVariables, Closure initProject, Closure expectedOutput) { Project project = buildAll(projectPath, pathVariables, initProject) + assertOutput(project, project.targetFolder, expectedOutput); + } + def protected assertOutput(Project project, String targetFolder, Closure expectedOutput) { def root = new FileSystemItem(name: "") initFileSystemItem(root, expectedOutput) - root.assertDirectoryEqual(new File(project.targetFolder), ""); + root.assertDirectoryEqual(new File(targetFolder), "") } def protected buildAll(String projectPath, Map pathVariables, Closure initProject) { - def binding = new GantBinding() - binding.includeTool << Jps - def project = new Project(binding) - IdeaProjectLoader.loadFromPath(project, projectPath, pathVariables) + Project project = loadProject(projectPath, pathVariables) initProject(project) def target = FileUtil.createTempDirectory("targetDir") project.targetFolder = target.absolutePath @@ -37,6 +37,14 @@ abstract class JpsBuildTestCase extends TestCase { return project } + protected Project loadProject(String projectPath, Map pathVariables) { + def binding = new GantBinding() + binding.includeTool << Jps + def project = new Project(binding) + IdeaProjectLoader.loadFromPath(project, projectPath, pathVariables) + return project + } + def initFileSystemItem(FileSystemItem item, Closure initializer) { def meta = new InitializingExpando() meta.dir = {String name, Closure content ->