diff --git a/modules/cli/src/main/scala/scala/cli/commands/util/BuildCommandHelpers.scala b/modules/cli/src/main/scala/scala/cli/commands/util/BuildCommandHelpers.scala index b10e854be6..794df8772b 100644 --- a/modules/cli/src/main/scala/scala/cli/commands/util/BuildCommandHelpers.scala +++ b/modules/cli/src/main/scala/scala/cli/commands/util/BuildCommandHelpers.scala @@ -24,8 +24,14 @@ trait BuildCommandHelpers { self: ScalaCommand[_] => sharedOptions.compilationOutput.filter(_.nonEmpty) .orElse(sharedOptions.scalac.scalacOption.getScalacOption("-d")) .filter(_.nonEmpty) - .map(os.Path(_, Os.pwd)).foreach(output => - os.copy.over(successfulBuild.output, output, createFolders = true) - ) + .map(os.Path(_, Os.pwd)).foreach { output => + os.copy( + successfulBuild.output, + output, + createFolders = true, + mergeFolders = true, + replaceExisting = true + ) + } } } diff --git a/modules/integration/src/test/scala/scala/cli/integration/RunScalacCompatTestDefinitions.scala b/modules/integration/src/test/scala/scala/cli/integration/RunScalacCompatTestDefinitions.scala index 825a426872..e0168c91ff 100644 --- a/modules/integration/src/test/scala/scala/cli/integration/RunScalacCompatTestDefinitions.scala +++ b/modules/integration/src/test/scala/scala/cli/integration/RunScalacCompatTestDefinitions.scala @@ -268,6 +268,47 @@ trait RunScalacCompatTestDefinitions { _: RunTestDefinitions => expect(runRes.out.trim() == expectedOutput) } } + test("dont clear output dir") { + val expectedOutput = "Hello" + val `lib.scala` = os.rel / "lib.scala" + val `utils.scala` = os.rel / "utils.scala" + TestInputs( + `lib.scala` -> s"""object lib { def foo = "$expectedOutput" }""", + `utils.scala` -> s"""object utils { def bar = lib.foo }""" + ).fromRoot { (root: os.Path) => + val compilationOutputDir = os.rel / "compilationOutput" + // first, precompile to an explicitly specified output directory with -d + os.proc( + TestUtil.cli, + "compile", + "-d", + compilationOutputDir, + `lib.scala`, + extraOptions + ).call(cwd = root) + + val outputFiles = os.list(root / compilationOutputDir) + expect(outputFiles.exists(_.endsWith(os.rel / "lib$.class"))) + expect(outputFiles.exists(_.endsWith(os.rel / "lib.class"))) + + os.proc( + TestUtil.cli, + "compile", + "-d", + compilationOutputDir, + "-cp", + compilationOutputDir, + `utils.scala`, + extraOptions + ).call(cwd = root) + + val outputFlies2 = os.list(root / compilationOutputDir) + expect(outputFlies2.exists(_.endsWith(os.rel / "utils$.class"))) + expect(outputFlies2.exists(_.endsWith(os.rel / "utils.class"))) + expect(outputFlies2.exists(_.endsWith(os.rel / "lib$.class"))) + expect(outputFlies2.exists(_.endsWith(os.rel / "lib.class"))) + } + } test("run main class from a jar even when no explicit inputs are passed") { val expectedOutput = "Hello"