Skip to content

Commit 8906b39

Browse files
committed
Make 'export --json' print to stdout by default
1 parent 2476332 commit 8906b39

File tree

3 files changed

+85
-30
lines changed

3 files changed

+85
-30
lines changed

modules/cli/src/main/scala/scala/cli/commands/export0/Export.scala

Lines changed: 30 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -104,17 +104,19 @@ object Export extends ScalaCommand[ExportOptions] {
104104
override def runCommand(options: ExportOptions, args: RemainingArgs, logger: Logger): Unit = {
105105
val initialBuildOptions = buildOptionsOrExit(options)
106106

107-
val output = options.output.getOrElse("dest")
108-
val dest = os.Path(output, os.pwd)
109-
if (os.exists(dest)) {
107+
val output = options.output.getOrElse("dest")
108+
val dest = os.Path(output, os.pwd)
109+
val shouldExportToJson = options.json.getOrElse(false)
110+
val shouldExportJsonToStdout = shouldExportToJson && options.output.isEmpty
111+
112+
if (!shouldExportJsonToStdout && os.exists(dest)) {
110113
logger.error(
111114
s"""Error: $dest already exists.
112115
|To change the destination output directory pass --output path or remove the destination directory first.""".stripMargin
113116
)
114117
sys.exit(1)
115118
}
116119

117-
val shouldExportToJson = options.json.getOrElse(false)
118120
val shouldExportToMill = options.mill.getOrElse(false)
119121
val shouldExportToSbt = options.sbt.getOrElse(false)
120122
if (shouldExportToMill && shouldExportToSbt) {
@@ -128,8 +130,8 @@ object Export extends ScalaCommand[ExportOptions] {
128130
val buildToolName = if (shouldExportToMill) "mill" else "sbt"
129131
logger.message(s"Exporting to a $buildToolName project...")
130132
}
131-
else
132-
logger.message(s"Exporting to JSON...")
133+
else if (!shouldExportJsonToStdout)
134+
logger.message(s"Exporting to a JSON...")
133135

134136
val inputs = options.shared.inputs(args.all).orExit(logger)
135137
CurrentParams.workspaceOpt = Some(inputs.workspace)
@@ -176,23 +178,31 @@ object Export extends ScalaCommand[ExportOptions] {
176178
sys.exit(1)
177179
}
178180

179-
val sbtVersion = options.sbtVersion.getOrElse("1.6.1")
181+
if (shouldExportJsonToStdout) {
182+
val project = jsonProjectDescriptor(options.project, logger)
183+
.`export`(optionsMain0, optionsTest0, sourcesMain, sourcesTest)
184+
185+
project.print(System.out)
186+
}
187+
else {
188+
val sbtVersion = options.sbtVersion.getOrElse("1.6.1")
180189

181-
def sbtProjectDescriptor0 =
182-
sbtProjectDescriptor(options.sbtSetting.map(_.trim).filter(_.nonEmpty), sbtVersion, logger)
190+
def sbtProjectDescriptor0 =
191+
sbtProjectDescriptor(options.sbtSetting.map(_.trim).filter(_.nonEmpty), sbtVersion, logger)
183192

184-
val projectDescriptor =
185-
if (shouldExportToMill)
186-
millProjectDescriptor(options.shared.coursierCache, options.project, logger)
187-
else if (shouldExportToJson)
188-
jsonProjectDescriptor(options.project, logger)
189-
else // shouldExportToSbt isn't checked, as it's treated as default
190-
sbtProjectDescriptor0
193+
val projectDescriptor =
194+
if (shouldExportToMill)
195+
millProjectDescriptor(options.shared.coursierCache, options.project, logger)
196+
else if (shouldExportToJson)
197+
jsonProjectDescriptor(options.project, logger)
198+
else // shouldExportToSbt isn't checked, as it's treated as default
199+
sbtProjectDescriptor0
191200

192-
val project = projectDescriptor.`export`(optionsMain0, optionsTest0, sourcesMain, sourcesTest)
201+
val project = projectDescriptor.`export`(optionsMain0, optionsTest0, sourcesMain, sourcesTest)
193202

194-
os.makeDir.all(dest)
195-
project.writeTo(dest)
196-
logger.message(s"Exported to: $dest")
203+
os.makeDir.all(dest)
204+
project.writeTo(dest)
205+
logger.message(s"Exported to: $dest")
206+
}
197207
}
198208
}

modules/cli/src/main/scala/scala/cli/exportCmd/JsonProject.scala

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import coursier.Dependency
66
import coursier.util.Artifact
77
import dependency.AnyDependency
88

9+
import java.io.PrintStream
910
import java.nio.charset.StandardCharsets
1011

1112
import scala.build.options.ConfigMonoid
@@ -48,6 +49,16 @@ final case class JsonProject(
4849
)
4950
}
5051
}
52+
53+
def print(printStream: PrintStream): Unit = {
54+
val config = WriterConfig.withIndentionStep(1)
55+
56+
writeToStream(
57+
this,
58+
printStream,
59+
config
60+
)
61+
}
5162
}
5263

5364
final case class ScopedJsonProject(

modules/integration/src/test/scala/scala/cli/integration/ExportJsonTestDefinitions.scala

Lines changed: 44 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,10 @@ import com.eed3si9n.expecty.Expecty.expect
55
abstract class ExportJsonTestDefinitions(val scalaVersionOpt: Option[String])
66
extends ScalaCliSuite with TestScalaVersionArgs {
77
private def readJson(path: os.ReadablePath): String =
8-
os.read(path)
8+
readJson(os.read(path))
9+
10+
private def readJson(json: String): String =
11+
json
912
.replaceAll("\\s", "")
1013
.replaceAll(
1114
"ivy:file:[^\"]*(scalacli|ScalaCli)[^\"]*/local-repo[^\"]*",
@@ -29,12 +32,13 @@ abstract class ExportJsonTestDefinitions(val scalaVersionOpt: Option[String])
2932
)
3033

3134
inputs.fromRoot { root =>
32-
os.proc(TestUtil.cli, "--power", "export", "--json", ".", "--jvm", "adopt:11")
33-
.call(cwd = root)
35+
val exportJsonProc =
36+
os.proc(TestUtil.cli, "--power", "export", "--json", ".", "--jvm", "adopt:11")
37+
.call(cwd = root)
3438

35-
val fileContents = readJson(root / "dest" / "export.json")
39+
val jsonContents = readJson(exportJsonProc.out.text())
3640

37-
expect(fileContents ==
41+
expect(jsonContents ==
3842
"""{
3943
|"scalaVersion":"3.2.2",
4044
|"platform":"JVM",
@@ -84,10 +88,10 @@ abstract class ExportJsonTestDefinitions(val scalaVersionOpt: Option[String])
8488
)
8589

8690
inputs.fromRoot { root =>
87-
os.proc(TestUtil.cli, "--power", "export", "--json", ".", "--native")
91+
val exportJsonProc = os.proc(TestUtil.cli, "--power", "export", "--json", ".", "--native")
8892
.call(cwd = root)
8993

90-
val fileContents = readJson(root / "dest" / "export.json")
94+
val jsonContents = readJson(exportJsonProc.out.text())
9195
.replaceAll(
9296
"\"resourcesDirs\":\\[\"[^\"]*resources\"\\]",
9397
"\"resourcesDirs\":[\"./resources\"]"
@@ -97,7 +101,7 @@ abstract class ExportJsonTestDefinitions(val scalaVersionOpt: Option[String])
97101
"\"customJarsDecls\":[\"./TEST.jar\"]"
98102
)
99103

100-
expect(fileContents ==
104+
expect(jsonContents ==
101105
s"""{
102106
|"scalaVersion":"3.2.2",
103107
|"platform":"Native",
@@ -187,10 +191,22 @@ abstract class ExportJsonTestDefinitions(val scalaVersionOpt: Option[String])
187191
)
188192

189193
inputs.fromRoot { root =>
190-
os.proc(TestUtil.cli, "--power", "export", "--json", ".", "--js-es-version", "es2015")
194+
val exportJsonProc = os.proc(
195+
TestUtil.cli,
196+
"--power",
197+
"export",
198+
"--json",
199+
"--output",
200+
"json_dir",
201+
".",
202+
"--js-es-version",
203+
"es2015"
204+
)
191205
.call(cwd = root)
192206

193-
val fileContents = readJson(root / "dest" / "export.json")
207+
expect(exportJsonProc.out.text().isEmpty)
208+
209+
val fileContents = readJson(root / "json_dir" / "export.json")
194210

195211
expect(fileContents ==
196212
s"""{
@@ -231,6 +247,24 @@ abstract class ExportJsonTestDefinitions(val scalaVersionOpt: Option[String])
231247
|}
232248
|}
233249
|""".replaceAll("\\s|\\|", ""))
250+
251+
val exportToExistingProc = os.proc(
252+
TestUtil.cli,
253+
"--power",
254+
"export",
255+
"--json",
256+
"--output",
257+
"json_dir",
258+
".",
259+
"--js-es-version",
260+
"es2015"
261+
)
262+
.call(cwd = root, check = false, mergeErrIntoOut = true)
263+
264+
expect(exportToExistingProc.exitCode != 0)
265+
expect(
266+
exportToExistingProc.out.text().contains(s"Error: ${root / "json_dir"} already exists.")
267+
)
234268
}
235269
}
236270

0 commit comments

Comments
 (0)