package org.jetbrains.kotlin.maven; import com.intellij.openapi.util.io.FileUtil; import kotlin.io.TextStreamsKt; import kotlin.text.StringsKt; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.io.*; import java.util.*; import static org.jetbrains.kotlin.maven.MavenTestUtils.getNotNullSystemProperty; class MavenProject { @NotNull private final File workingDir; MavenProject(@NotNull String name) throws IOException { File originalProjectDir = new File("src/test/resources/" + name); workingDir = FileUtil.createTempDirectory("maven-test-" + name, null); File[] filesToCopy = originalProjectDir.listFiles(); for (File from : filesToCopy) { File to = new File(workingDir, from.getName()); FileUtil.copyFileOrDir(from, to); } } @NotNull File file(@NotNull String path) { return new File(workingDir, path); } MavenExecutionResult exec(String... targets) throws Exception { List<String> cmd = buildCmd(targets); ProcessBuilder processBuilder = new ProcessBuilder(cmd); setUpEnvVars(processBuilder.environment()); processBuilder.directory(workingDir); processBuilder.redirectErrorStream(true); Process process = processBuilder.start(); BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream())); String stdout = TextStreamsKt.readText(reader); int exitCode = process.waitFor(); return new MavenExecutionResult(stdout, workingDir, exitCode); } private void setUpEnvVars(Map<String, String> env) throws IOException { String mavenHome = getNotNullSystemProperty("maven.home"); env.put("M2_HOME", mavenHome); String mavenPath = mavenHome + File.separator + "bin"; env.put("PATH", env.get("PATH") + File.pathSeparator + mavenPath); } private List<String> buildCmd(String... args) { List<String> cmd = new ArrayList<String>(); String osName = getNotNullSystemProperty("os.name"); if (osName.contains("Windows")) { cmd.addAll(Arrays.asList("cmd", "/C")); } else { cmd.add("/bin/bash"); } cmd.add("mvn"); cmd.add("-Dkotlin.compiler.incremental.log.level=info"); String kotlinVersionProperty = "kotlin.version"; cmd.add("-D" + kotlinVersionProperty + "=" + getNotNullSystemProperty(kotlinVersionProperty)); String mavenRepoLocalProperty = "maven.repo.local"; String localRepoPath = System.getProperty(mavenRepoLocalProperty); try { if (localRepoPath != null && !StringsKt.isBlank(localRepoPath) && new File(localRepoPath).isDirectory()) { cmd.add("-D" + mavenRepoLocalProperty + "=" + localRepoPath); } } catch (SecurityException e) { e.printStackTrace(); } cmd.addAll(Arrays.asList(args)); return cmd; } }