diff --git a/modules/cli-options/src/main/scala/scala/cli/commands/AboutOptions.scala b/modules/cli-options/src/main/scala/scala/cli/commands/AboutOptions.scala index 9654af62ef..cd68cddc76 100644 --- a/modules/cli-options/src/main/scala/scala/cli/commands/AboutOptions.scala +++ b/modules/cli-options/src/main/scala/scala/cli/commands/AboutOptions.scala @@ -1,23 +1,23 @@ package scala.cli.commands -import caseapp._ +import caseapp.* +import scala.cli.commands.common.HasLoggingOptions import scala.cli.signing.shared.PasswordOption -import scala.cli.signing.util.ArgParsers._ +import scala.cli.signing.util.ArgParsers.* // format: off @HelpMessage("Print details about this application") final case class AboutOptions( @Recurse - verbosity: VerbosityOptions = VerbosityOptions(), + logging: LoggingOptions = LoggingOptions(), @Hidden @HelpMessage(HelpMessages.passwordOption) ghToken: Option[PasswordOption] = None -) +) extends HasLoggingOptions // format: on - object AboutOptions { implicit lazy val parser: Parser[AboutOptions] = Parser.derive - implicit lazy val help: Help[AboutOptions] = Help.derive + implicit lazy val help: Help[AboutOptions] = Help.derive } diff --git a/modules/cli-options/src/main/scala/scala/cli/commands/AddPathOptions.scala b/modules/cli-options/src/main/scala/scala/cli/commands/AddPathOptions.scala index f9103b222d..bbd42c7f2f 100644 --- a/modules/cli-options/src/main/scala/scala/cli/commands/AddPathOptions.scala +++ b/modules/cli-options/src/main/scala/scala/cli/commands/AddPathOptions.scala @@ -1,19 +1,16 @@ package scala.cli.commands -import caseapp._ +import caseapp.* + +import scala.cli.commands.common.HasLoggingOptions // format: off final case class AddPathOptions( @Recurse - verbosityOptions: VerbosityOptions = VerbosityOptions(), - @Group("Logging") - @Name("q") - quiet: Boolean = false, + logging: LoggingOptions = LoggingOptions(), title: String = "" -) { - // format: on - lazy val verbosity = verbosityOptions.verbosity - (if (quiet) 1 else 0) -} +) extends HasLoggingOptions +// format: on object AddPathOptions { implicit lazy val parser: Parser[AddPathOptions] = Parser.derive diff --git a/modules/cli-options/src/main/scala/scala/cli/commands/BenchmarkingOptions.scala b/modules/cli-options/src/main/scala/scala/cli/commands/BenchmarkingOptions.scala index 2f10d7ef40..ff2ff234f4 100644 --- a/modules/cli-options/src/main/scala/scala/cli/commands/BenchmarkingOptions.scala +++ b/modules/cli-options/src/main/scala/scala/cli/commands/BenchmarkingOptions.scala @@ -1,6 +1,6 @@ package scala.cli.commands -import caseapp._ +import caseapp.* // format: off final case class BenchmarkingOptions( diff --git a/modules/cli-options/src/main/scala/scala/cli/commands/BloopExitOptions.scala b/modules/cli-options/src/main/scala/scala/cli/commands/BloopExitOptions.scala index 07d27ee559..ba41b0326e 100644 --- a/modules/cli-options/src/main/scala/scala/cli/commands/BloopExitOptions.scala +++ b/modules/cli-options/src/main/scala/scala/cli/commands/BloopExitOptions.scala @@ -1,6 +1,8 @@ package scala.cli.commands -import caseapp._ +import caseapp.* + +import scala.cli.commands.common.HasLoggingOptions // format: off @@ -13,7 +15,7 @@ final case class BloopExitOptions( directories: SharedDirectoriesOptions = SharedDirectoriesOptions(), @Recurse coursier: CoursierOptions = CoursierOptions() -) +) extends HasLoggingOptions // format: on object BloopExitOptions { diff --git a/modules/cli-options/src/main/scala/scala/cli/commands/BloopStartOptions.scala b/modules/cli-options/src/main/scala/scala/cli/commands/BloopStartOptions.scala index 8ef0990916..df32884e75 100644 --- a/modules/cli-options/src/main/scala/scala/cli/commands/BloopStartOptions.scala +++ b/modules/cli-options/src/main/scala/scala/cli/commands/BloopStartOptions.scala @@ -1,6 +1,8 @@ package scala.cli.commands -import caseapp._ +import caseapp.* + +import scala.cli.commands.common.HasLoggingOptions // format: off final case class BloopStartOptions( @@ -16,11 +18,10 @@ final case class BloopStartOptions( coursier: CoursierOptions = CoursierOptions(), @Name("f") force: Boolean = false -) +) extends HasLoggingOptions // format: on object BloopStartOptions { - implicit lazy val parser: Parser[BloopStartOptions] = Parser.derive implicit lazy val help: Help[BloopStartOptions] = Help.derive } diff --git a/modules/cli-options/src/main/scala/scala/cli/commands/BspOptions.scala b/modules/cli-options/src/main/scala/scala/cli/commands/BspOptions.scala index 2e9b6d6e6d..0d738e9d68 100644 --- a/modules/cli-options/src/main/scala/scala/cli/commands/BspOptions.scala +++ b/modules/cli-options/src/main/scala/scala/cli/commands/BspOptions.scala @@ -1,6 +1,8 @@ package scala.cli.commands -import caseapp._ +import caseapp.* + +import scala.cli.commands.common.HasSharedOptions // format: off @HelpMessage("Start BSP server") @@ -8,12 +10,12 @@ final case class BspOptions( // FIXME There might be too many options in SharedOptions for the bsp command… @Recurse shared: SharedOptions = SharedOptions(), - + @HelpMessage("Command-line options JSON file") @ValueDescription("path") @Hidden jsonOptions: Option[String] = None -) { +) extends HasSharedOptions { // format: on } diff --git a/modules/cli-options/src/main/scala/scala/cli/commands/CleanOptions.scala b/modules/cli-options/src/main/scala/scala/cli/commands/CleanOptions.scala index e75aa7a901..b48798a8b4 100644 --- a/modules/cli-options/src/main/scala/scala/cli/commands/CleanOptions.scala +++ b/modules/cli-options/src/main/scala/scala/cli/commands/CleanOptions.scala @@ -1,6 +1,8 @@ package scala.cli.commands -import caseapp._ +import caseapp.* + +import scala.cli.commands.common.HasLoggingOptions // format: off @HelpMessage("Clean the workspace") @@ -13,7 +15,7 @@ final case class CleanOptions( bspFile: SharedBspFileOptions = SharedBspFileOptions(), @Recurse workspace: SharedWorkspaceOptions = SharedWorkspaceOptions() -) +) extends HasLoggingOptions // format: on object CleanOptions { diff --git a/modules/cli-options/src/main/scala/scala/cli/commands/CompileOptions.scala b/modules/cli-options/src/main/scala/scala/cli/commands/CompileOptions.scala index 9741fd0b8b..417fbcae6b 100644 --- a/modules/cli-options/src/main/scala/scala/cli/commands/CompileOptions.scala +++ b/modules/cli-options/src/main/scala/scala/cli/commands/CompileOptions.scala @@ -1,8 +1,10 @@ package scala.cli.commands -import caseapp._ +import caseapp.* import caseapp.core.help.Help +import scala.cli.commands.common.HasSharedOptions + // format: off @HelpMessage("Compile Scala code") final case class CompileOptions( @@ -20,7 +22,7 @@ final case class CompileOptions( @HelpMessage("Compile test scope") test: Boolean = false -) +) extends HasSharedOptions // format: on object CompileOptions { diff --git a/modules/cli-options/src/main/scala/scala/cli/commands/CoursierOptions.scala b/modules/cli-options/src/main/scala/scala/cli/commands/CoursierOptions.scala index 17691b20b6..3e8fd51874 100644 --- a/modules/cli-options/src/main/scala/scala/cli/commands/CoursierOptions.scala +++ b/modules/cli-options/src/main/scala/scala/cli/commands/CoursierOptions.scala @@ -1,8 +1,8 @@ package scala.cli.commands -import caseapp._ -import com.github.plokhotnyuk.jsoniter_scala.core._ -import com.github.plokhotnyuk.jsoniter_scala.macros._ +import caseapp.* +import com.github.plokhotnyuk.jsoniter_scala.core.* +import com.github.plokhotnyuk.jsoniter_scala.macros.* // format: off final case class CoursierOptions( diff --git a/modules/cli-options/src/main/scala/scala/cli/commands/CrossOptions.scala b/modules/cli-options/src/main/scala/scala/cli/commands/CrossOptions.scala index 3560fb65f7..db588178d9 100644 --- a/modules/cli-options/src/main/scala/scala/cli/commands/CrossOptions.scala +++ b/modules/cli-options/src/main/scala/scala/cli/commands/CrossOptions.scala @@ -1,6 +1,6 @@ package scala.cli.commands -import caseapp._ +import caseapp.* // format: off final case class CrossOptions( diff --git a/modules/cli-options/src/main/scala/scala/cli/commands/DefaultOptions.scala b/modules/cli-options/src/main/scala/scala/cli/commands/DefaultOptions.scala index 8d22e16d5e..dc2d5e2806 100644 --- a/modules/cli-options/src/main/scala/scala/cli/commands/DefaultOptions.scala +++ b/modules/cli-options/src/main/scala/scala/cli/commands/DefaultOptions.scala @@ -1,6 +1,8 @@ package scala.cli.commands -import caseapp._ +import caseapp.* + +import scala.cli.commands.common.HasSharedOptions // format: off case class DefaultOptions( @@ -12,7 +14,7 @@ case class DefaultOptions( sharedRepl: SharedReplOptions = SharedReplOptions(), @Name("-version") version: Boolean = false -) +) extends HasSharedOptions // format: on object DefaultOptions { diff --git a/modules/cli-options/src/main/scala/scala/cli/commands/DependencyUpdateOptions.scala b/modules/cli-options/src/main/scala/scala/cli/commands/DependencyUpdateOptions.scala index c0fe8b5fa0..adb6acf996 100644 --- a/modules/cli-options/src/main/scala/scala/cli/commands/DependencyUpdateOptions.scala +++ b/modules/cli-options/src/main/scala/scala/cli/commands/DependencyUpdateOptions.scala @@ -1,8 +1,10 @@ package scala.cli.commands -import caseapp._ +import caseapp.* import caseapp.core.help.Help +import scala.cli.commands.common.HasSharedOptions + // format: off @HelpMessage("Update dependencies in project") final case class DependencyUpdateOptions( @@ -11,7 +13,7 @@ final case class DependencyUpdateOptions( @Group("DependencyUpdate") @HelpMessage("Update all dependencies if newer version was released") all: Boolean = false, -) +) extends HasSharedOptions // format: on object DependencyUpdateOptions { diff --git a/modules/cli-options/src/main/scala/scala/cli/commands/DirectoriesOptions.scala b/modules/cli-options/src/main/scala/scala/cli/commands/DirectoriesOptions.scala index 6af9833b4e..8a8c210dbb 100644 --- a/modules/cli-options/src/main/scala/scala/cli/commands/DirectoriesOptions.scala +++ b/modules/cli-options/src/main/scala/scala/cli/commands/DirectoriesOptions.scala @@ -1,6 +1,8 @@ package scala.cli.commands -import caseapp._ +import caseapp.* + +import scala.cli.commands.common.HasLoggingOptions // format: off @HelpMessage("Prints directories used by `scala-cli`") @@ -8,8 +10,8 @@ final case class DirectoriesOptions( @Recurse directories: SharedDirectoriesOptions = SharedDirectoriesOptions(), @Recurse - verbosity: VerbosityOptions = VerbosityOptions() -) + logging: LoggingOptions = LoggingOptions() +) extends HasLoggingOptions // format: on object DirectoriesOptions { diff --git a/modules/cli-options/src/main/scala/scala/cli/commands/DocOptions.scala b/modules/cli-options/src/main/scala/scala/cli/commands/DocOptions.scala index 2e090e50c6..7e2199f8c8 100644 --- a/modules/cli-options/src/main/scala/scala/cli/commands/DocOptions.scala +++ b/modules/cli-options/src/main/scala/scala/cli/commands/DocOptions.scala @@ -1,8 +1,10 @@ package scala.cli.commands -import caseapp._ +import caseapp.* import caseapp.core.help.Help +import scala.cli.commands.common.HasSharedOptions + // format: off @HelpMessage("Generate Scaladoc documentation", "By default, Scala CLI sets common scaladoc options and this mechanism can be disabled by using `--default-scaladoc-opts:false`.") final case class DocOptions( @@ -20,7 +22,7 @@ final case class DocOptions( @HelpMessage("Control if scala CLI should use default options for scaladoc, true by default. Use `--default-scaladoc-opts:false` to not include default options.") @ExtraName("defaultScaladocOpts") defaultScaladocOptions: Option[Boolean] = None, -) +) extends HasSharedOptions // format: on object DocOptions { diff --git a/modules/cli-options/src/main/scala/scala/cli/commands/DoctorOptions.scala b/modules/cli-options/src/main/scala/scala/cli/commands/DoctorOptions.scala index bb21dd3bbc..8b0c722e19 100644 --- a/modules/cli-options/src/main/scala/scala/cli/commands/DoctorOptions.scala +++ b/modules/cli-options/src/main/scala/scala/cli/commands/DoctorOptions.scala @@ -1,19 +1,20 @@ package scala.cli.commands -import caseapp._ +import caseapp.* +import scala.cli.commands.common.HasLoggingOptions import scala.cli.signing.shared.PasswordOption -import scala.cli.signing.util.ArgParsers._ +import scala.cli.signing.util.ArgParsers.* // format: off @HelpMessage("Print details about this application") final case class DoctorOptions( @Recurse - verbosity: VerbosityOptions = VerbosityOptions(), + logging: LoggingOptions = LoggingOptions(), @Hidden @HelpMessage(HelpMessages.passwordOption) ghToken: Option[PasswordOption] = None -) +) extends HasLoggingOptions // format: on object DoctorOptions { diff --git a/modules/cli-options/src/main/scala/scala/cli/commands/ExportOptions.scala b/modules/cli-options/src/main/scala/scala/cli/commands/ExportOptions.scala index 947d1db8bb..3996bf8203 100644 --- a/modules/cli-options/src/main/scala/scala/cli/commands/ExportOptions.scala +++ b/modules/cli-options/src/main/scala/scala/cli/commands/ExportOptions.scala @@ -1,6 +1,8 @@ package scala.cli.commands -import caseapp._ +import caseapp.* + +import scala.cli.commands.common.HasSharedOptions // format: off @HelpMessage("Export current project to sbt or Mill") @@ -24,7 +26,7 @@ final case class ExportOptions( @Name("o") @Group("Build Tool export options") output: Option[String] = None -) +) extends HasSharedOptions // format: on object ExportOptions { implicit lazy val parser: Parser[ExportOptions] = Parser.derive diff --git a/modules/cli-options/src/main/scala/scala/cli/commands/FmtOptions.scala b/modules/cli-options/src/main/scala/scala/cli/commands/FmtOptions.scala index 820d51aef8..4e0117cc08 100644 --- a/modules/cli-options/src/main/scala/scala/cli/commands/FmtOptions.scala +++ b/modules/cli-options/src/main/scala/scala/cli/commands/FmtOptions.scala @@ -1,6 +1,8 @@ package scala.cli.commands -import caseapp._ +import caseapp.* + +import scala.cli.commands.common.HasSharedOptions // format: off @HelpMessage("Format Scala code") @@ -58,7 +60,7 @@ final case class FmtOptions( @HelpMessage("Pass scalafmt version before running it. This overrides whatever value is configured in the .scalafmt.conf file.") @Name("fmtVersion") scalafmtVersion: Option[String] = None -) +) extends HasSharedOptions // format: on object FmtOptions { implicit lazy val parser: Parser[FmtOptions] = Parser.derive diff --git a/modules/cli-options/src/main/scala/scala/cli/commands/HelpGroupOptions.scala b/modules/cli-options/src/main/scala/scala/cli/commands/HelpGroupOptions.scala index f60c3b18da..5c368a2d26 100644 --- a/modules/cli-options/src/main/scala/scala/cli/commands/HelpGroupOptions.scala +++ b/modules/cli-options/src/main/scala/scala/cli/commands/HelpGroupOptions.scala @@ -1,9 +1,9 @@ package scala.cli.commands -import caseapp._ +import caseapp.* import caseapp.core.help.{Help, HelpFormat} -import com.github.plokhotnyuk.jsoniter_scala.core._ -import com.github.plokhotnyuk.jsoniter_scala.macros._ +import com.github.plokhotnyuk.jsoniter_scala.core.* +import com.github.plokhotnyuk.jsoniter_scala.macros.* @HelpMessage("Print help message") case class HelpGroupOptions( diff --git a/modules/cli-options/src/main/scala/scala/cli/commands/HelpOptions.scala b/modules/cli-options/src/main/scala/scala/cli/commands/HelpOptions.scala index 7e57105328..3830e8f0eb 100644 --- a/modules/cli-options/src/main/scala/scala/cli/commands/HelpOptions.scala +++ b/modules/cli-options/src/main/scala/scala/cli/commands/HelpOptions.scala @@ -1,9 +1,16 @@ package scala.cli.commands -import caseapp._ +import caseapp.* +import scala.cli.commands.common.HasLoggingOptions + +// format: off @HelpMessage("Print help message") -case class HelpOptions() +case class HelpOptions( + @Recurse + logging: LoggingOptions = LoggingOptions() +) extends HasLoggingOptions +// format: on object HelpOptions { implicit lazy val parser: Parser[HelpOptions] = Parser.derive diff --git a/modules/cli-options/src/main/scala/scala/cli/commands/InstallCompletionsOptions.scala b/modules/cli-options/src/main/scala/scala/cli/commands/InstallCompletionsOptions.scala index d3f8265c97..1957aac903 100644 --- a/modules/cli-options/src/main/scala/scala/cli/commands/InstallCompletionsOptions.scala +++ b/modules/cli-options/src/main/scala/scala/cli/commands/InstallCompletionsOptions.scala @@ -1,6 +1,8 @@ package scala.cli.commands -import caseapp._ +import caseapp.* + +import scala.cli.commands.common.HasLoggingOptions // format: off @HelpMessage("Installs completions into your shell") @@ -31,7 +33,7 @@ final case class InstallCompletionsOptions( @HelpMessage("Print completions to stdout") env: Boolean = false, -) +) extends HasLoggingOptions // format: on object InstallCompletionsOptions { diff --git a/modules/cli-options/src/main/scala/scala/cli/commands/InstallHomeOptions.scala b/modules/cli-options/src/main/scala/scala/cli/commands/InstallHomeOptions.scala index 8b89aca7fa..b2af25e5c0 100644 --- a/modules/cli-options/src/main/scala/scala/cli/commands/InstallHomeOptions.scala +++ b/modules/cli-options/src/main/scala/scala/cli/commands/InstallHomeOptions.scala @@ -1,12 +1,14 @@ package scala.cli.commands -import caseapp._ +import caseapp.* + +import scala.cli.commands.common.HasLoggingOptions // format: off @HelpMessage("Install `scala-cli` in a sub-directory of the home directory") final case class InstallHomeOptions( @Recurse - verbosity: VerbosityOptions = VerbosityOptions(), + logging: LoggingOptions = LoggingOptions(), @Group("InstallHome") scalaCliBinaryPath: String, @Group("InstallHome") @@ -21,7 +23,7 @@ final case class InstallHomeOptions( @Hidden @HelpMessage("Binary directory") binDir: Option[String] = None -) { +) extends HasLoggingOptions { // format: on lazy val binDirPath = binDir.map(os.Path(_, os.pwd)) } diff --git a/modules/cli-options/src/main/scala/scala/cli/commands/LoggingOptions.scala b/modules/cli-options/src/main/scala/scala/cli/commands/LoggingOptions.scala index 39d44098cf..adae9705a4 100644 --- a/modules/cli-options/src/main/scala/scala/cli/commands/LoggingOptions.scala +++ b/modules/cli-options/src/main/scala/scala/cli/commands/LoggingOptions.scala @@ -1,8 +1,8 @@ package scala.cli.commands -import caseapp._ -import com.github.plokhotnyuk.jsoniter_scala.core._ -import com.github.plokhotnyuk.jsoniter_scala.macros._ +import caseapp.* +import com.github.plokhotnyuk.jsoniter_scala.core.* +import com.github.plokhotnyuk.jsoniter_scala.macros.* // format: off final case class LoggingOptions( diff --git a/modules/cli-options/src/main/scala/scala/cli/commands/MainClassOptions.scala b/modules/cli-options/src/main/scala/scala/cli/commands/MainClassOptions.scala index 4837afc353..83d25e3355 100644 --- a/modules/cli-options/src/main/scala/scala/cli/commands/MainClassOptions.scala +++ b/modules/cli-options/src/main/scala/scala/cli/commands/MainClassOptions.scala @@ -1,6 +1,6 @@ package scala.cli.commands -import caseapp._ +import caseapp.* // format: off final case class MainClassOptions( diff --git a/modules/cli-options/src/main/scala/scala/cli/commands/MetabrowseOptions.scala b/modules/cli-options/src/main/scala/scala/cli/commands/MetabrowseOptions.scala index a8472a9536..1ac3f0edbc 100644 --- a/modules/cli-options/src/main/scala/scala/cli/commands/MetabrowseOptions.scala +++ b/modules/cli-options/src/main/scala/scala/cli/commands/MetabrowseOptions.scala @@ -1,6 +1,8 @@ package scala.cli.commands -import caseapp._ +import caseapp.* + +import scala.cli.commands.common.HasSharedOptions // format: off @HelpMessage("Browse Scala code and its dependencies in the browser") @@ -32,7 +34,7 @@ final case class MetabrowseOptions( metabrowseLauncher: Option[String] = None, @Hidden metabrowseDialect: Option[String] = None -) { +) extends HasSharedOptions { // format: on } diff --git a/modules/cli-options/src/main/scala/scala/cli/commands/PackageOptions.scala b/modules/cli-options/src/main/scala/scala/cli/commands/PackageOptions.scala index 1522902c46..847dde569b 100644 --- a/modules/cli-options/src/main/scala/scala/cli/commands/PackageOptions.scala +++ b/modules/cli-options/src/main/scala/scala/cli/commands/PackageOptions.scala @@ -1,8 +1,10 @@ package scala.cli.commands -import caseapp._ +import caseapp.* import caseapp.core.help.Help +import scala.cli.commands.common.HasSharedOptions + // format: off @HelpMessage("Compile and package Scala code") final case class PackageOptions( @@ -90,7 +92,7 @@ final case class PackageOptions( @HelpMessage("Build GraalVM native image") @ExtraName("graal") nativeImage: Boolean = false -) +) extends HasSharedOptions // format: on object PackageOptions { diff --git a/modules/cli-options/src/main/scala/scala/cli/commands/ReplOptions.scala b/modules/cli-options/src/main/scala/scala/cli/commands/ReplOptions.scala index 699c73b7c0..c0e29424c7 100644 --- a/modules/cli-options/src/main/scala/scala/cli/commands/ReplOptions.scala +++ b/modules/cli-options/src/main/scala/scala/cli/commands/ReplOptions.scala @@ -1,6 +1,8 @@ package scala.cli.commands -import caseapp._ +import caseapp.* + +import scala.cli.commands.common.HasSharedOptions // format: off @HelpMessage("Fire-up a Scala REPL") @@ -9,7 +11,7 @@ final case class ReplOptions( shared: SharedOptions = SharedOptions(), @Recurse sharedRepl: SharedReplOptions = SharedReplOptions() -) +) extends HasSharedOptions // format: on object ReplOptions { diff --git a/modules/cli-options/src/main/scala/scala/cli/commands/RunOptions.scala b/modules/cli-options/src/main/scala/scala/cli/commands/RunOptions.scala index 2286f0f67d..0972f35bb6 100644 --- a/modules/cli-options/src/main/scala/scala/cli/commands/RunOptions.scala +++ b/modules/cli-options/src/main/scala/scala/cli/commands/RunOptions.scala @@ -1,8 +1,10 @@ package scala.cli.commands -import caseapp._ +import caseapp.* import caseapp.core.help.Help +import scala.cli.commands.common.HasSharedOptions + // format: off @HelpMessage("""|Compile and run Scala code. | @@ -16,7 +18,7 @@ final case class RunOptions( shared: SharedOptions = SharedOptions(), @Recurse sharedRun: SharedRunOptions = SharedRunOptions() -) +) extends HasSharedOptions // format: on object RunOptions { diff --git a/modules/cli-options/src/main/scala/scala/cli/commands/ScalaJsOptions.scala b/modules/cli-options/src/main/scala/scala/cli/commands/ScalaJsOptions.scala index e6b1451832..986069f4c5 100644 --- a/modules/cli-options/src/main/scala/scala/cli/commands/ScalaJsOptions.scala +++ b/modules/cli-options/src/main/scala/scala/cli/commands/ScalaJsOptions.scala @@ -1,8 +1,8 @@ package scala.cli.commands -import caseapp._ -import com.github.plokhotnyuk.jsoniter_scala.core._ -import com.github.plokhotnyuk.jsoniter_scala.macros._ +import caseapp.* +import com.github.plokhotnyuk.jsoniter_scala.core.* +import com.github.plokhotnyuk.jsoniter_scala.macros.* // format: off final case class ScalaJsOptions( diff --git a/modules/cli-options/src/main/scala/scala/cli/commands/ScalaNativeOptions.scala b/modules/cli-options/src/main/scala/scala/cli/commands/ScalaNativeOptions.scala index 367fd3a3c9..15be3df83a 100644 --- a/modules/cli-options/src/main/scala/scala/cli/commands/ScalaNativeOptions.scala +++ b/modules/cli-options/src/main/scala/scala/cli/commands/ScalaNativeOptions.scala @@ -1,8 +1,8 @@ package scala.cli.commands -import caseapp._ -import com.github.plokhotnyuk.jsoniter_scala.core._ -import com.github.plokhotnyuk.jsoniter_scala.macros._ +import caseapp.* +import com.github.plokhotnyuk.jsoniter_scala.core.* +import com.github.plokhotnyuk.jsoniter_scala.macros.* // format: off final case class ScalaNativeOptions( diff --git a/modules/cli-options/src/main/scala/scala/cli/commands/ScalacOptions.scala b/modules/cli-options/src/main/scala/scala/cli/commands/ScalacOptions.scala index ed129a51ab..9fbd093af0 100644 --- a/modules/cli-options/src/main/scala/scala/cli/commands/ScalacOptions.scala +++ b/modules/cli-options/src/main/scala/scala/cli/commands/ScalacOptions.scala @@ -1,11 +1,11 @@ package scala.cli.commands -import caseapp._ +import caseapp.* import caseapp.core.{Arg, Error} import caseapp.core.parser.{Argument, NilParser, StandardArgument} import caseapp.core.util.Formatter -import com.github.plokhotnyuk.jsoniter_scala.core._ -import com.github.plokhotnyuk.jsoniter_scala.macros._ +import com.github.plokhotnyuk.jsoniter_scala.core.* +import com.github.plokhotnyuk.jsoniter_scala.macros.* // format: off final case class ScalacOptions( diff --git a/modules/cli-options/src/main/scala/scala/cli/commands/SetupIdeOptions.scala b/modules/cli-options/src/main/scala/scala/cli/commands/SetupIdeOptions.scala index 5d8b044daa..bb151fad9d 100644 --- a/modules/cli-options/src/main/scala/scala/cli/commands/SetupIdeOptions.scala +++ b/modules/cli-options/src/main/scala/scala/cli/commands/SetupIdeOptions.scala @@ -1,6 +1,8 @@ package scala.cli.commands -import caseapp._ +import caseapp.* + +import scala.cli.commands.common.HasSharedOptions // format: off @HelpMessage("Generate a BSP file that you can import into your IDE") @@ -11,7 +13,7 @@ final case class SetupIdeOptions( bspFile: SharedBspFileOptions = SharedBspFileOptions(), @Hidden charset: Option[String] = None -) +) extends HasSharedOptions // format: on object SetupIdeOptions { diff --git a/modules/cli-options/src/main/scala/scala/cli/commands/SharedBspFileOptions.scala b/modules/cli-options/src/main/scala/scala/cli/commands/SharedBspFileOptions.scala index 1361ec24b4..c08ca5ab80 100644 --- a/modules/cli-options/src/main/scala/scala/cli/commands/SharedBspFileOptions.scala +++ b/modules/cli-options/src/main/scala/scala/cli/commands/SharedBspFileOptions.scala @@ -1,6 +1,6 @@ package scala.cli.commands -import caseapp._ +import caseapp.* // format: off final case class SharedBspFileOptions( diff --git a/modules/cli-options/src/main/scala/scala/cli/commands/SharedCompilationServerOptions.scala b/modules/cli-options/src/main/scala/scala/cli/commands/SharedCompilationServerOptions.scala index 6634a97df6..aed147f039 100644 --- a/modules/cli-options/src/main/scala/scala/cli/commands/SharedCompilationServerOptions.scala +++ b/modules/cli-options/src/main/scala/scala/cli/commands/SharedCompilationServerOptions.scala @@ -1,8 +1,8 @@ package scala.cli.commands -import caseapp._ -import com.github.plokhotnyuk.jsoniter_scala.core._ -import com.github.plokhotnyuk.jsoniter_scala.macros._ +import caseapp.* +import com.github.plokhotnyuk.jsoniter_scala.core.* +import com.github.plokhotnyuk.jsoniter_scala.macros.* // format: off diff --git a/modules/cli-options/src/main/scala/scala/cli/commands/SharedDependencyOptions.scala b/modules/cli-options/src/main/scala/scala/cli/commands/SharedDependencyOptions.scala index 618995df12..bdf1296f25 100644 --- a/modules/cli-options/src/main/scala/scala/cli/commands/SharedDependencyOptions.scala +++ b/modules/cli-options/src/main/scala/scala/cli/commands/SharedDependencyOptions.scala @@ -1,8 +1,8 @@ package scala.cli.commands -import caseapp._ -import com.github.plokhotnyuk.jsoniter_scala.core._ -import com.github.plokhotnyuk.jsoniter_scala.macros._ +import caseapp.* +import com.github.plokhotnyuk.jsoniter_scala.core.* +import com.github.plokhotnyuk.jsoniter_scala.macros.* // format: off final case class SharedDependencyOptions( diff --git a/modules/cli-options/src/main/scala/scala/cli/commands/SharedDirectoriesOptions.scala b/modules/cli-options/src/main/scala/scala/cli/commands/SharedDirectoriesOptions.scala index 01fa6aad24..dcb4203035 100644 --- a/modules/cli-options/src/main/scala/scala/cli/commands/SharedDirectoriesOptions.scala +++ b/modules/cli-options/src/main/scala/scala/cli/commands/SharedDirectoriesOptions.scala @@ -1,8 +1,8 @@ package scala.cli.commands -import caseapp._ -import com.github.plokhotnyuk.jsoniter_scala.core._ -import com.github.plokhotnyuk.jsoniter_scala.macros._ +import caseapp.* +import com.github.plokhotnyuk.jsoniter_scala.core.* +import com.github.plokhotnyuk.jsoniter_scala.macros.* // format: off final case class SharedDirectoriesOptions( diff --git a/modules/cli-options/src/main/scala/scala/cli/commands/SharedInputOptions.scala b/modules/cli-options/src/main/scala/scala/cli/commands/SharedInputOptions.scala index 943f048207..f320208913 100644 --- a/modules/cli-options/src/main/scala/scala/cli/commands/SharedInputOptions.scala +++ b/modules/cli-options/src/main/scala/scala/cli/commands/SharedInputOptions.scala @@ -1,6 +1,6 @@ package scala.cli.commands -import caseapp._ +import caseapp.* // format: off final case class SharedInputOptions( diff --git a/modules/cli-options/src/main/scala/scala/cli/commands/SharedJavaOptions.scala b/modules/cli-options/src/main/scala/scala/cli/commands/SharedJavaOptions.scala index b4d6cf0eaf..824eed763e 100644 --- a/modules/cli-options/src/main/scala/scala/cli/commands/SharedJavaOptions.scala +++ b/modules/cli-options/src/main/scala/scala/cli/commands/SharedJavaOptions.scala @@ -1,6 +1,6 @@ package scala.cli.commands -import caseapp._ +import caseapp.* // format: off final case class SharedJavaOptions( diff --git a/modules/cli-options/src/main/scala/scala/cli/commands/SharedJvmOptions.scala b/modules/cli-options/src/main/scala/scala/cli/commands/SharedJvmOptions.scala index 36350d2aa1..f592d15d31 100644 --- a/modules/cli-options/src/main/scala/scala/cli/commands/SharedJvmOptions.scala +++ b/modules/cli-options/src/main/scala/scala/cli/commands/SharedJvmOptions.scala @@ -1,8 +1,8 @@ package scala.cli.commands -import caseapp._ -import com.github.plokhotnyuk.jsoniter_scala.core._ -import com.github.plokhotnyuk.jsoniter_scala.macros._ +import caseapp.* +import com.github.plokhotnyuk.jsoniter_scala.core.* +import com.github.plokhotnyuk.jsoniter_scala.macros.* // format: off final case class SharedJvmOptions( diff --git a/modules/cli-options/src/main/scala/scala/cli/commands/SharedOptions.scala b/modules/cli-options/src/main/scala/scala/cli/commands/SharedOptions.scala index 185ed868e9..d511db7254 100644 --- a/modules/cli-options/src/main/scala/scala/cli/commands/SharedOptions.scala +++ b/modules/cli-options/src/main/scala/scala/cli/commands/SharedOptions.scala @@ -1,9 +1,11 @@ package scala.cli.commands -import caseapp._ +import caseapp.* import caseapp.core.help.Help -import com.github.plokhotnyuk.jsoniter_scala.core._ -import com.github.plokhotnyuk.jsoniter_scala.macros._ +import com.github.plokhotnyuk.jsoniter_scala.core.* +import com.github.plokhotnyuk.jsoniter_scala.macros.* + +import scala.cli.commands.common.HasLoggingOptions // format: off final case class SharedOptions( @@ -129,7 +131,7 @@ final case class SharedOptions( @HelpMessage("Copy compilation results to output directory using either relative or absolute path") @ValueDescription("/example/path") compilationOutput: Option[String] = None, -) +) extends HasLoggingOptions // format: on object SharedOptions { diff --git a/modules/cli-options/src/main/scala/scala/cli/commands/SharedPythonOptions.scala b/modules/cli-options/src/main/scala/scala/cli/commands/SharedPythonOptions.scala index f8d2685ea3..951c94e46e 100644 --- a/modules/cli-options/src/main/scala/scala/cli/commands/SharedPythonOptions.scala +++ b/modules/cli-options/src/main/scala/scala/cli/commands/SharedPythonOptions.scala @@ -1,6 +1,6 @@ package scala.cli.commands -import caseapp._ +import caseapp.* // format: off final case class SharedPythonOptions( diff --git a/modules/cli-options/src/main/scala/scala/cli/commands/SharedUninstallCompletionsOptions.scala b/modules/cli-options/src/main/scala/scala/cli/commands/SharedUninstallCompletionsOptions.scala index e3e98d23aa..90a423fbb5 100644 --- a/modules/cli-options/src/main/scala/scala/cli/commands/SharedUninstallCompletionsOptions.scala +++ b/modules/cli-options/src/main/scala/scala/cli/commands/SharedUninstallCompletionsOptions.scala @@ -1,6 +1,6 @@ package scala.cli.commands -import caseapp._ +import caseapp.* // format: off final case class SharedUninstallCompletionsOptions( diff --git a/modules/cli-options/src/main/scala/scala/cli/commands/SharedWatchOptions.scala b/modules/cli-options/src/main/scala/scala/cli/commands/SharedWatchOptions.scala index 759015823e..28ad41da1b 100644 --- a/modules/cli-options/src/main/scala/scala/cli/commands/SharedWatchOptions.scala +++ b/modules/cli-options/src/main/scala/scala/cli/commands/SharedWatchOptions.scala @@ -1,6 +1,6 @@ package scala.cli.commands -import caseapp._ +import caseapp.* // format: off final case class SharedWatchOptions( @@ -9,7 +9,7 @@ final case class SharedWatchOptions( @Name("w") watch: Boolean = false, @HelpMessage("Run your application in background and automatically restart if sources have been changed") - @Name("revolver") + @Name("revolver") restart: Boolean = false ) { // format: on diff --git a/modules/cli-options/src/main/scala/scala/cli/commands/SharedWorkspaceOptions.scala b/modules/cli-options/src/main/scala/scala/cli/commands/SharedWorkspaceOptions.scala index e04e86f8e6..96d1a1a515 100644 --- a/modules/cli-options/src/main/scala/scala/cli/commands/SharedWorkspaceOptions.scala +++ b/modules/cli-options/src/main/scala/scala/cli/commands/SharedWorkspaceOptions.scala @@ -1,8 +1,8 @@ package scala.cli.commands -import caseapp._ -import com.github.plokhotnyuk.jsoniter_scala.core._ -import com.github.plokhotnyuk.jsoniter_scala.macros._ +import caseapp.* +import com.github.plokhotnyuk.jsoniter_scala.core.* +import com.github.plokhotnyuk.jsoniter_scala.macros.* // format: off final case class SharedWorkspaceOptions( diff --git a/modules/cli-options/src/main/scala/scala/cli/commands/ShebangOptions.scala b/modules/cli-options/src/main/scala/scala/cli/commands/ShebangOptions.scala index 3b3d84f668..3f499402ee 100644 --- a/modules/cli-options/src/main/scala/scala/cli/commands/ShebangOptions.scala +++ b/modules/cli-options/src/main/scala/scala/cli/commands/ShebangOptions.scala @@ -1,6 +1,8 @@ package scala.cli.commands -import caseapp._ +import caseapp.* + +import scala.cli.commands.common.HasSharedOptions @HelpMessage( """|Like `run`, but more handy from shebang scripts @@ -32,7 +34,9 @@ import caseapp._ final case class ShebangOptions( @Recurse runOptions: RunOptions = RunOptions() -) +) extends HasSharedOptions { + override def shared: SharedOptions = runOptions.shared +} object ShebangOptions { implicit lazy val parser: Parser[ShebangOptions] = Parser.derive diff --git a/modules/cli-options/src/main/scala/scala/cli/commands/SnippetOptions.scala b/modules/cli-options/src/main/scala/scala/cli/commands/SnippetOptions.scala index 70797c2d5e..1c8831e92c 100644 --- a/modules/cli-options/src/main/scala/scala/cli/commands/SnippetOptions.scala +++ b/modules/cli-options/src/main/scala/scala/cli/commands/SnippetOptions.scala @@ -1,6 +1,6 @@ package scala.cli.commands -import caseapp._ +import caseapp.* // format: off final case class SnippetOptions( diff --git a/modules/cli-options/src/main/scala/scala/cli/commands/TestOptions.scala b/modules/cli-options/src/main/scala/scala/cli/commands/TestOptions.scala index 379d8ceb8e..5fe97188af 100644 --- a/modules/cli-options/src/main/scala/scala/cli/commands/TestOptions.scala +++ b/modules/cli-options/src/main/scala/scala/cli/commands/TestOptions.scala @@ -1,8 +1,10 @@ package scala.cli.commands -import caseapp._ +import caseapp.* import caseapp.core.help.Help +import scala.cli.commands.common.HasSharedOptions + // format: off @HelpMessage("Compile and test Scala code") final case class TestOptions( @@ -23,7 +25,7 @@ final case class TestOptions( @Group("Test") @HelpMessage("Fail if no test suites were run") requireTests: Boolean = false -) +) extends HasSharedOptions // format: on object TestOptions { diff --git a/modules/cli-options/src/main/scala/scala/cli/commands/UninstallCompletionsOptions.scala b/modules/cli-options/src/main/scala/scala/cli/commands/UninstallCompletionsOptions.scala index cec878a9d6..3326472307 100644 --- a/modules/cli-options/src/main/scala/scala/cli/commands/UninstallCompletionsOptions.scala +++ b/modules/cli-options/src/main/scala/scala/cli/commands/UninstallCompletionsOptions.scala @@ -1,6 +1,8 @@ package scala.cli.commands -import caseapp._ +import caseapp.* + +import scala.cli.commands.common.HasLoggingOptions // format: off @HelpMessage("Uninstalls completions from your shell") @@ -9,7 +11,7 @@ final case class UninstallCompletionsOptions( shared: SharedUninstallCompletionsOptions = SharedUninstallCompletionsOptions(), @Recurse logging: LoggingOptions = LoggingOptions() -) +) extends HasLoggingOptions // format: on object UninstallCompletionsOptions { diff --git a/modules/cli-options/src/main/scala/scala/cli/commands/UninstallOptions.scala b/modules/cli-options/src/main/scala/scala/cli/commands/UninstallOptions.scala index 366cffeb64..6b0e67ede3 100644 --- a/modules/cli-options/src/main/scala/scala/cli/commands/UninstallOptions.scala +++ b/modules/cli-options/src/main/scala/scala/cli/commands/UninstallOptions.scala @@ -1,8 +1,9 @@ package scala.cli.commands -import caseapp._ +import caseapp.* import java.nio.file.Path +import scala.cli.commands.common.HasLoggingOptions // format: off @HelpMessage("Uninstall scala-cli - only works when installed by the installation script") @@ -24,7 +25,8 @@ final case class UninstallOptions( @Hidden @HelpMessage("Binary directory") binDir: Option[String] = None -) { +) extends HasLoggingOptions { + override def logging: LoggingOptions = bloopExit.logging // format: on lazy val binDirPath = binDir.map(os.Path(_, os.pwd)) } diff --git a/modules/cli-options/src/main/scala/scala/cli/commands/UpdateOptions.scala b/modules/cli-options/src/main/scala/scala/cli/commands/UpdateOptions.scala index 3c1bda0248..7229d6dac8 100644 --- a/modules/cli-options/src/main/scala/scala/cli/commands/UpdateOptions.scala +++ b/modules/cli-options/src/main/scala/scala/cli/commands/UpdateOptions.scala @@ -1,15 +1,16 @@ package scala.cli.commands -import caseapp._ +import caseapp.* +import scala.cli.commands.common.HasLoggingOptions import scala.cli.signing.shared.PasswordOption -import scala.cli.signing.util.ArgParsers._ +import scala.cli.signing.util.ArgParsers.* // format: off @HelpMessage("Update scala-cli - only works when installed by the installation script") final case class UpdateOptions( @Recurse - verbosity: VerbosityOptions = VerbosityOptions(), + logging: LoggingOptions = LoggingOptions(), @Hidden @Group("Update") @HelpMessage("Binary name") @@ -26,7 +27,7 @@ final case class UpdateOptions( @Hidden @HelpMessage(HelpMessages.passwordOption) ghToken: Option[PasswordOption] = None -) +) extends HasLoggingOptions // format: on object UpdateOptions { diff --git a/modules/cli-options/src/main/scala/scala/cli/commands/VerbosityOptions.scala b/modules/cli-options/src/main/scala/scala/cli/commands/VerbosityOptions.scala index b94479bec9..7a31494c19 100644 --- a/modules/cli-options/src/main/scala/scala/cli/commands/VerbosityOptions.scala +++ b/modules/cli-options/src/main/scala/scala/cli/commands/VerbosityOptions.scala @@ -1,8 +1,8 @@ package scala.cli.commands -import caseapp._ -import com.github.plokhotnyuk.jsoniter_scala.core._ -import com.github.plokhotnyuk.jsoniter_scala.macros._ +import caseapp.* +import com.github.plokhotnyuk.jsoniter_scala.core.* +import com.github.plokhotnyuk.jsoniter_scala.macros.* // format: off final case class VerbosityOptions( diff --git a/modules/cli-options/src/main/scala/scala/cli/commands/VersionOptions.scala b/modules/cli-options/src/main/scala/scala/cli/commands/VersionOptions.scala index 1963e0ce36..d3523b2d74 100644 --- a/modules/cli-options/src/main/scala/scala/cli/commands/VersionOptions.scala +++ b/modules/cli-options/src/main/scala/scala/cli/commands/VersionOptions.scala @@ -1,19 +1,21 @@ package scala.cli.commands -import caseapp._ +import caseapp.* + +import scala.cli.commands.common.HasLoggingOptions // format: off @HelpMessage("Print `scala-cli` version") final case class VersionOptions( @Recurse - verbosity: VerbosityOptions = VerbosityOptions(), + logging: LoggingOptions = LoggingOptions(), @HelpMessage("Show only plain scala-cli version") @Name("cli") cliVersion: Boolean = false, @HelpMessage("Show only plain scala version") @Name("scala") scalaVersion: Boolean = false -) +) extends HasLoggingOptions // format: on object VersionOptions { diff --git a/modules/cli-options/src/main/scala/scala/cli/commands/bloop/BloopOptions.scala b/modules/cli-options/src/main/scala/scala/cli/commands/bloop/BloopOptions.scala index 7a6fc0387e..d4aadccb8e 100644 --- a/modules/cli-options/src/main/scala/scala/cli/commands/bloop/BloopOptions.scala +++ b/modules/cli-options/src/main/scala/scala/cli/commands/bloop/BloopOptions.scala @@ -1,7 +1,8 @@ package scala.cli.commands.bloop -import caseapp._ +import caseapp.* +import scala.cli.commands.common.HasLoggingOptions import scala.cli.commands.{CoursierOptions, LoggingOptions, SharedCompilationServerOptions, SharedDirectoriesOptions, SharedJvmOptions} // format: off @@ -20,7 +21,7 @@ final case class BloopOptions( @ExtraName("workingDir") @ExtraName("dir") workingDirectory: Option[String] = None -) { +) extends HasLoggingOptions { // format: on def workDirOpt: Option[os.Path] = diff --git a/modules/cli-options/src/main/scala/scala/cli/commands/bloop/BloopOutputOptions.scala b/modules/cli-options/src/main/scala/scala/cli/commands/bloop/BloopOutputOptions.scala index 3800728b02..ade354ff9e 100644 --- a/modules/cli-options/src/main/scala/scala/cli/commands/bloop/BloopOutputOptions.scala +++ b/modules/cli-options/src/main/scala/scala/cli/commands/bloop/BloopOutputOptions.scala @@ -1,7 +1,8 @@ package scala.cli.commands.bloop -import caseapp._ +import caseapp.* +import scala.cli.commands.common.HasLoggingOptions import scala.cli.commands.{LoggingOptions, SharedCompilationServerOptions, SharedDirectoriesOptions} // format: off @@ -12,7 +13,7 @@ final case class BloopOutputOptions( compilationServer: SharedCompilationServerOptions = SharedCompilationServerOptions(), @Recurse directories: SharedDirectoriesOptions = SharedDirectoriesOptions() -) +) extends HasLoggingOptions // format: on object BloopOutputOptions { diff --git a/modules/cli-options/src/main/scala/scala/cli/commands/common/HasLoggingOptions.scala b/modules/cli-options/src/main/scala/scala/cli/commands/common/HasLoggingOptions.scala new file mode 100644 index 0000000000..33d9a67c23 --- /dev/null +++ b/modules/cli-options/src/main/scala/scala/cli/commands/common/HasLoggingOptions.scala @@ -0,0 +1,7 @@ +package scala.cli.commands.common + +import scala.cli.commands.LoggingOptions + +trait HasLoggingOptions { + def logging: LoggingOptions +} diff --git a/modules/cli-options/src/main/scala/scala/cli/commands/common/HasSharedOptions.scala b/modules/cli-options/src/main/scala/scala/cli/commands/common/HasSharedOptions.scala new file mode 100644 index 0000000000..7310577edf --- /dev/null +++ b/modules/cli-options/src/main/scala/scala/cli/commands/common/HasSharedOptions.scala @@ -0,0 +1,8 @@ +package scala.cli.commands.common + +import scala.cli.commands.{LoggingOptions, SharedOptions} + +trait HasSharedOptions extends HasLoggingOptions { + def shared: SharedOptions + override def logging: LoggingOptions = shared.logging +} diff --git a/modules/cli-options/src/main/scala/scala/cli/commands/config/ConfigOptions.scala b/modules/cli-options/src/main/scala/scala/cli/commands/config/ConfigOptions.scala index bca1e20bf4..4493aa7127 100644 --- a/modules/cli-options/src/main/scala/scala/cli/commands/config/ConfigOptions.scala +++ b/modules/cli-options/src/main/scala/scala/cli/commands/config/ConfigOptions.scala @@ -1,7 +1,8 @@ package scala.cli.commands.config -import caseapp._ +import caseapp.* +import scala.cli.commands.common.HasLoggingOptions import scala.cli.commands.{ CoursierOptions, LoggingOptions, @@ -52,7 +53,7 @@ final case class ConfigOptions( @Group("Config") @HelpMessage("For repository.credentials, whether to use these credentials should be passed upon redirection") passOnRedirect: Option[Boolean] = None -) +) extends HasLoggingOptions // format: on object ConfigOptions { diff --git a/modules/cli-options/src/main/scala/scala/cli/commands/default/DefaultFileOptions.scala b/modules/cli-options/src/main/scala/scala/cli/commands/default/DefaultFileOptions.scala index 993e7b2711..411e1112ce 100644 --- a/modules/cli-options/src/main/scala/scala/cli/commands/default/DefaultFileOptions.scala +++ b/modules/cli-options/src/main/scala/scala/cli/commands/default/DefaultFileOptions.scala @@ -1,8 +1,9 @@ package scala.cli.commands.default -import caseapp._ +import caseapp.* import scala.cli.commands.LoggingOptions +import scala.cli.commands.common.HasLoggingOptions // format: off final case class DefaultFileOptions( @@ -21,7 +22,7 @@ final case class DefaultFileOptions( @HelpMessage("Force overwriting destination files") @ExtraName("f") force: Boolean = false -) +) extends HasLoggingOptions // format: on object DefaultFileOptions { diff --git a/modules/cli-options/src/main/scala/scala/cli/commands/github/HasSharedSecretOptions.scala b/modules/cli-options/src/main/scala/scala/cli/commands/github/HasSharedSecretOptions.scala new file mode 100644 index 0000000000..1b0f04512a --- /dev/null +++ b/modules/cli-options/src/main/scala/scala/cli/commands/github/HasSharedSecretOptions.scala @@ -0,0 +1,9 @@ +package scala.cli.commands.github + +import scala.cli.commands.LoggingOptions +import scala.cli.commands.common.HasLoggingOptions + +trait HasSharedSecretOptions extends HasLoggingOptions { + def shared: SharedSecretOptions + override def logging: LoggingOptions = shared.logging +} diff --git a/modules/cli-options/src/main/scala/scala/cli/commands/github/SecretListOptions.scala b/modules/cli-options/src/main/scala/scala/cli/commands/github/ListSecretsOptions.scala similarity index 86% rename from modules/cli-options/src/main/scala/scala/cli/commands/github/SecretListOptions.scala rename to modules/cli-options/src/main/scala/scala/cli/commands/github/ListSecretsOptions.scala index f4fae4da98..5a222707cc 100644 --- a/modules/cli-options/src/main/scala/scala/cli/commands/github/SecretListOptions.scala +++ b/modules/cli-options/src/main/scala/scala/cli/commands/github/ListSecretsOptions.scala @@ -1,12 +1,12 @@ package scala.cli.commands.github -import caseapp._ +import caseapp.* // format: off final case class ListSecretsOptions( @Recurse shared: SharedSecretOptions -) +) extends HasSharedSecretOptions // format: on object ListSecretsOptions { diff --git a/modules/cli-options/src/main/scala/scala/cli/commands/github/SecretCreateOptions.scala b/modules/cli-options/src/main/scala/scala/cli/commands/github/SecretCreateOptions.scala index 258e439412..db67202800 100644 --- a/modules/cli-options/src/main/scala/scala/cli/commands/github/SecretCreateOptions.scala +++ b/modules/cli-options/src/main/scala/scala/cli/commands/github/SecretCreateOptions.scala @@ -1,6 +1,6 @@ package scala.cli.commands.github -import caseapp._ +import caseapp.* import scala.cli.commands.CoursierOptions @@ -16,7 +16,7 @@ final case class SecretCreateOptions( dummy: Boolean = false, @Hidden printRequest: Boolean = false -) +) extends HasSharedSecretOptions // format: on object SecretCreateOptions { diff --git a/modules/cli-options/src/main/scala/scala/cli/commands/github/SharedSecretOptions.scala b/modules/cli-options/src/main/scala/scala/cli/commands/github/SharedSecretOptions.scala index 67cad68e2b..0b7c43e515 100644 --- a/modules/cli-options/src/main/scala/scala/cli/commands/github/SharedSecretOptions.scala +++ b/modules/cli-options/src/main/scala/scala/cli/commands/github/SharedSecretOptions.scala @@ -1,10 +1,11 @@ package scala.cli.commands.github -import caseapp._ +import caseapp.* import scala.cli.signing.shared.PasswordOption -import scala.cli.signing.util.ArgParsers._ +import scala.cli.signing.util.ArgParsers.* import scala.cli.commands.LoggingOptions +import scala.cli.commands.common.HasLoggingOptions import scala.cli.signing.shared.Secret // format: off @@ -14,7 +15,7 @@ final case class SharedSecretOptions( token: PasswordOption = PasswordOption.Value(Secret("")), @ExtraName("repo") repository: String = "" -) { +) extends HasLoggingOptions { // format: on lazy val (repoOrg, repoName) = diff --git a/modules/cli-options/src/main/scala/scala/cli/commands/pgp/DummyOptions.scala b/modules/cli-options/src/main/scala/scala/cli/commands/pgp/DummyOptions.scala index fd1fbdff31..ea1dabcbd0 100644 --- a/modules/cli-options/src/main/scala/scala/cli/commands/pgp/DummyOptions.scala +++ b/modules/cli-options/src/main/scala/scala/cli/commands/pgp/DummyOptions.scala @@ -1,6 +1,6 @@ package scala.cli.commands.pgp -import caseapp._ +import caseapp.* final case class DummyOptions() diff --git a/modules/cli-options/src/main/scala/scala/cli/commands/pgp/PgpExternalOptions.scala b/modules/cli-options/src/main/scala/scala/cli/commands/pgp/PgpExternalOptions.scala index cf45641d71..ab30ae7f6f 100644 --- a/modules/cli-options/src/main/scala/scala/cli/commands/pgp/PgpExternalOptions.scala +++ b/modules/cli-options/src/main/scala/scala/cli/commands/pgp/PgpExternalOptions.scala @@ -1,9 +1,10 @@ package scala.cli.commands.pgp -import caseapp._ +import caseapp.* import scala.cli.commands.{CoursierOptions, LoggingOptions} import scala.cli.commands.SharedJvmOptions +import scala.cli.commands.common.HasLoggingOptions // format: off final case class PgpExternalOptions( @@ -15,7 +16,7 @@ final case class PgpExternalOptions( coursier: CoursierOptions = CoursierOptions(), @Hidden signingCliVersion: Option[String] = None -) +) extends HasLoggingOptions // format: on object PgpExternalOptions { diff --git a/modules/cli-options/src/main/scala/scala/cli/commands/pgp/PgpPullOptions.scala b/modules/cli-options/src/main/scala/scala/cli/commands/pgp/PgpPullOptions.scala index 0346870da4..8d2d4d1565 100644 --- a/modules/cli-options/src/main/scala/scala/cli/commands/pgp/PgpPullOptions.scala +++ b/modules/cli-options/src/main/scala/scala/cli/commands/pgp/PgpPullOptions.scala @@ -1,8 +1,9 @@ package scala.cli.commands.pgp -import caseapp._ +import caseapp.* import scala.cli.commands.LoggingOptions +import scala.cli.commands.common.HasLoggingOptions // format: off final case class PgpPullOptions( @@ -13,7 +14,7 @@ final case class PgpPullOptions( @Group("PGP") @HelpMessage("Whether to exit with code 0 if no key is passed") allowEmpty: Boolean = false -) +) extends HasLoggingOptions // format: on object PgpPullOptions { diff --git a/modules/cli-options/src/main/scala/scala/cli/commands/pgp/PgpPushOptions.scala b/modules/cli-options/src/main/scala/scala/cli/commands/pgp/PgpPushOptions.scala index d633b0fece..6a3c0be55b 100644 --- a/modules/cli-options/src/main/scala/scala/cli/commands/pgp/PgpPushOptions.scala +++ b/modules/cli-options/src/main/scala/scala/cli/commands/pgp/PgpPushOptions.scala @@ -1,7 +1,8 @@ package scala.cli.commands.pgp -import caseapp._ +import caseapp.* +import scala.cli.commands.common.HasLoggingOptions import scala.cli.commands.{CoursierOptions, LoggingOptions, SharedJvmOptions} // format: off @@ -25,7 +26,7 @@ final case class PgpPushOptions( @Group("PGP") @Hidden forceSigningBinary: Boolean = false -) +) extends HasLoggingOptions // format: on object PgpPushOptions { diff --git a/modules/cli-options/src/main/scala/scala/cli/commands/pgp/SharedPgpPushPullOptions.scala b/modules/cli-options/src/main/scala/scala/cli/commands/pgp/SharedPgpPushPullOptions.scala index ab3d237345..f1b0f191f0 100644 --- a/modules/cli-options/src/main/scala/scala/cli/commands/pgp/SharedPgpPushPullOptions.scala +++ b/modules/cli-options/src/main/scala/scala/cli/commands/pgp/SharedPgpPushPullOptions.scala @@ -1,6 +1,6 @@ package scala.cli.commands.pgp -import caseapp._ +import caseapp.* import scala.cli.commands.LoggingOptions diff --git a/modules/cli-options/src/main/scala/scala/cli/commands/publish/PublishLocalOptions.scala b/modules/cli-options/src/main/scala/scala/cli/commands/publish/PublishLocalOptions.scala index fa262cf95c..cdb065ffaf 100644 --- a/modules/cli-options/src/main/scala/scala/cli/commands/publish/PublishLocalOptions.scala +++ b/modules/cli-options/src/main/scala/scala/cli/commands/publish/PublishLocalOptions.scala @@ -1,7 +1,8 @@ package scala.cli.commands.publish -import caseapp._ +import caseapp.* +import scala.cli.commands.common.HasSharedOptions import scala.cli.commands.{ CrossOptions, MainClassOptions, @@ -26,7 +27,7 @@ final case class PublishLocalOptions( sharedPublish: SharedPublishOptions = SharedPublishOptions(), @Recurse sharedPython: SharedPythonOptions = SharedPythonOptions() -) +) extends HasSharedOptions // format: on object PublishLocalOptions { diff --git a/modules/cli-options/src/main/scala/scala/cli/commands/publish/PublishOptions.scala b/modules/cli-options/src/main/scala/scala/cli/commands/publish/PublishOptions.scala index f7c76cb721..8159a2d247 100644 --- a/modules/cli-options/src/main/scala/scala/cli/commands/publish/PublishOptions.scala +++ b/modules/cli-options/src/main/scala/scala/cli/commands/publish/PublishOptions.scala @@ -1,7 +1,8 @@ package scala.cli.commands.publish -import caseapp._ +import caseapp.* +import scala.cli.commands.common.HasSharedOptions import scala.cli.commands.{ CrossOptions, MainClassOptions, @@ -37,7 +38,7 @@ final case class PublishOptions( @Group("Publishing") @Hidden parallelUpload: Option[Boolean] = None -) +) extends HasSharedOptions // format: on object PublishOptions { diff --git a/modules/cli-options/src/main/scala/scala/cli/commands/publish/PublishParamsOptions.scala b/modules/cli-options/src/main/scala/scala/cli/commands/publish/PublishParamsOptions.scala index d51d7daed7..2f300ad234 100644 --- a/modules/cli-options/src/main/scala/scala/cli/commands/publish/PublishParamsOptions.scala +++ b/modules/cli-options/src/main/scala/scala/cli/commands/publish/PublishParamsOptions.scala @@ -1,9 +1,9 @@ package scala.cli.commands.publish -import caseapp._ +import caseapp.* import scala.cli.signing.shared.PasswordOption -import scala.cli.signing.util.ArgParsers._ -import scala.cli.util.ArgParsers._ +import scala.cli.signing.util.ArgParsers.* +import scala.cli.util.ArgParsers.* // format: off final case class PublishParamsOptions( diff --git a/modules/cli-options/src/main/scala/scala/cli/commands/publish/PublishRepositoryOptions.scala b/modules/cli-options/src/main/scala/scala/cli/commands/publish/PublishRepositoryOptions.scala index 89aa599b37..78be6ddb05 100644 --- a/modules/cli-options/src/main/scala/scala/cli/commands/publish/PublishRepositoryOptions.scala +++ b/modules/cli-options/src/main/scala/scala/cli/commands/publish/PublishRepositoryOptions.scala @@ -1,9 +1,9 @@ package scala.cli.commands.publish -import caseapp._ +import caseapp.* import scala.cli.signing.shared.PasswordOption -import scala.cli.signing.util.ArgParsers._ +import scala.cli.signing.util.ArgParsers.* // format: off final case class PublishRepositoryOptions( diff --git a/modules/cli-options/src/main/scala/scala/cli/commands/publish/PublishSetupOptions.scala b/modules/cli-options/src/main/scala/scala/cli/commands/publish/PublishSetupOptions.scala index 54d4feda73..fddf63d60f 100644 --- a/modules/cli-options/src/main/scala/scala/cli/commands/publish/PublishSetupOptions.scala +++ b/modules/cli-options/src/main/scala/scala/cli/commands/publish/PublishSetupOptions.scala @@ -1,7 +1,8 @@ package scala.cli.commands.publish -import caseapp._ +import caseapp.* +import scala.cli.commands.common.HasLoggingOptions import scala.cli.commands.pgp.SharedPgpPushPullOptions import scala.cli.commands.{ CoursierOptions, @@ -12,7 +13,7 @@ import scala.cli.commands.{ SharedWorkspaceOptions } import scala.cli.signing.shared.PasswordOption -import scala.cli.signing.util.ArgParsers._ +import scala.cli.signing.util.ArgParsers.* // format: off final case class PublishSetupOptions( @@ -60,7 +61,7 @@ final case class PublishSetupOptions( @Group("Publishing") @HelpMessage("Dummy mode - don't upload any secret to GitHub") dummy: Boolean = false -) +) extends HasLoggingOptions // format: on object PublishSetupOptions { diff --git a/modules/cli-options/src/main/scala/scala/cli/commands/publish/SharedPublishOptions.scala b/modules/cli-options/src/main/scala/scala/cli/commands/publish/SharedPublishOptions.scala index bb56852771..ffc1c3086e 100644 --- a/modules/cli-options/src/main/scala/scala/cli/commands/publish/SharedPublishOptions.scala +++ b/modules/cli-options/src/main/scala/scala/cli/commands/publish/SharedPublishOptions.scala @@ -1,6 +1,6 @@ package scala.cli.commands.publish -import caseapp._ +import caseapp.* // format: off final case class SharedPublishOptions( diff --git a/modules/cli-options/src/main/scala/scala/cli/doc/InternalDocOptions.scala b/modules/cli-options/src/main/scala/scala/cli/doc/InternalDocOptions.scala index 0b4db013c4..1ed1dd0353 100644 --- a/modules/cli-options/src/main/scala/scala/cli/doc/InternalDocOptions.scala +++ b/modules/cli-options/src/main/scala/scala/cli/doc/InternalDocOptions.scala @@ -1,6 +1,6 @@ package scala.cli.doc -import caseapp._ +import caseapp.* final case class InternalDocOptions( outputDir: String = "website/docs/reference", diff --git a/modules/cli-options/src/main/scala/scala/cli/lanuncher/LauncherOptions.scala b/modules/cli-options/src/main/scala/scala/cli/lanuncher/LauncherOptions.scala index 7a159ded1a..5d4dcb7b5d 100644 --- a/modules/cli-options/src/main/scala/scala/cli/lanuncher/LauncherOptions.scala +++ b/modules/cli-options/src/main/scala/scala/cli/lanuncher/LauncherOptions.scala @@ -1,6 +1,6 @@ package scala.cli.launcher -import caseapp._ +import caseapp.* @HelpMessage("Run another Scala CLI version") final case class LauncherOptions( diff --git a/modules/cli/src/main/java/scala/cli/commands/pgp/PgpCommandsSubst.java b/modules/cli/src/main/java/scala/cli/commands/pgp/PgpCommandsSubst.java index 52303a5580..5a4e1d889f 100644 --- a/modules/cli/src/main/java/scala/cli/commands/pgp/PgpCommandsSubst.java +++ b/modules/cli/src/main/java/scala/cli/commands/pgp/PgpCommandsSubst.java @@ -2,14 +2,14 @@ import com.oracle.svm.core.annotate.Substitute; import com.oracle.svm.core.annotate.TargetClass; -import scala.cli.commands.ScalaCommand; import scala.cli.commands.pgp.ExternalCommand; +import scala.cli.commands.pgp.PgpCommand; @TargetClass(className = "scala.cli.commands.pgp.PgpCommands") public final class PgpCommandsSubst { @Substitute - public ScalaCommand[] allScalaCommands() { - return new ScalaCommand[0]; + public PgpCommand[] allScalaCommands() { + return new PgpCommand[0]; } @Substitute public ExternalCommand[] allExternalCommands() { diff --git a/modules/cli/src/main/scala/scala/cli/commands/About.scala b/modules/cli/src/main/scala/scala/cli/commands/About.scala index ea246e1f85..3a675f7853 100644 --- a/modules/cli/src/main/scala/scala/cli/commands/About.scala +++ b/modules/cli/src/main/scala/scala/cli/commands/About.scala @@ -2,22 +2,20 @@ package scala.cli.commands import caseapp.* +import scala.build.Logger import scala.build.internal.Constants import scala.cli.CurrentParams +import scala.cli.commands.util.CommonOps.* class About(isSipScala: Boolean) extends ScalaCommand[AboutOptions] { - override def group = "Miscellaneous" - override def verbosity(options: AboutOptions): Option[Int] = Some(options.verbosity.verbosity) - override def runCommand(options: AboutOptions, args: RemainingArgs): Unit = { + override def group = "Miscellaneous" + override def runCommand(options: AboutOptions, args: RemainingArgs, logger: Logger): Unit = { println(Version.versionInfo(isSipScala)) val newestScalaCliVersion = Update.newestScalaCliVersion(options.ghToken.map(_.get())) - val isOutdated = CommandUtils.isOutOfDateVersion( - newestScalaCliVersion, - Constants.version - ) + val isOutdated = CommandUtils.isOutOfDateVersion(newestScalaCliVersion, Constants.version) if (isOutdated) - println( + logger.message( s"""Your Scala CLI version is outdated. The newest version is $newestScalaCliVersion |It is recommended that you update Scala CLI through the same tool or method you used for its initial installation for avoiding the creation of outdated duplicates.""".stripMargin ) diff --git a/modules/cli/src/main/scala/scala/cli/commands/AddPath.scala b/modules/cli/src/main/scala/scala/cli/commands/AddPath.scala index eb86352df0..f3a4c53a46 100644 --- a/modules/cli/src/main/scala/scala/cli/commands/AddPath.scala +++ b/modules/cli/src/main/scala/scala/cli/commands/AddPath.scala @@ -5,18 +5,16 @@ import coursier.env.{EnvironmentUpdate, ProfileUpdater} import java.io.File +import scala.build.Logger import scala.cli.CurrentParams +import scala.cli.commands.util.CommonOps.* import scala.util.Properties object AddPath extends ScalaCommand[AddPathOptions] { - override def hidden = true - override def isRestricted = true - override def verbosity(options: AddPathOptions): Option[Int] = Some(options.verbosity) - override def runCommand(options: AddPathOptions, args: RemainingArgs): Unit = { - if (args.all.isEmpty) { - if (!options.quiet) - System.err.println("Nothing to do") - } + override def hidden = true + override def isRestricted = true + override def runCommand(options: AddPathOptions, args: RemainingArgs, logger: Logger): Unit = { + if args.all.isEmpty then logger.error("Nothing to do") else { val update = EnvironmentUpdate(Nil, Seq("PATH" -> args.all.mkString(File.pathSeparator))) val didUpdate = @@ -28,8 +26,7 @@ object AddPath extends ScalaCommand[AddPathOptions] { val updater = ProfileUpdater() updater.applyUpdate(update, Some(options.title).filter(_.nonEmpty)) } - if (!didUpdate && !options.quiet) - System.err.println("Everything up-to-date") + if !didUpdate then logger.log("Everything up-to-date") } } } diff --git a/modules/cli/src/main/scala/scala/cli/commands/BloopExit.scala b/modules/cli/src/main/scala/scala/cli/commands/BloopExit.scala index 3c5e74a56d..b534f9883d 100644 --- a/modules/cli/src/main/scala/scala/cli/commands/BloopExit.scala +++ b/modules/cli/src/main/scala/scala/cli/commands/BloopExit.scala @@ -2,8 +2,8 @@ package scala.cli.commands import caseapp.* -import scala.build.Os import scala.build.blooprifle.{BloopRifle, BloopRifleConfig} +import scala.build.{Logger, Os} import scala.cli.CurrentParams import scala.cli.commands.util.CommonOps.* import scala.cli.commands.util.SharedCompilationServerOptionsUtil.* @@ -26,12 +26,8 @@ object BloopExit extends ScalaCommand[BloopExitOptions] { ) } - override def loggingOptions(options: BloopExitOptions): Option[LoggingOptions] = - Some(options.logging) - - override def runCommand(options: BloopExitOptions, args: RemainingArgs): Unit = { + override def runCommand(options: BloopExitOptions, args: RemainingArgs, logger: Logger): Unit = { val bloopRifleConfig = mkBloopRifleConfig(options) - val logger = options.logging.logger val isRunning = BloopRifle.check(bloopRifleConfig, logger.bloopRifleLogger) diff --git a/modules/cli/src/main/scala/scala/cli/commands/BloopStart.scala b/modules/cli/src/main/scala/scala/cli/commands/BloopStart.scala index 7fc688d66c..3ec80dd6cb 100644 --- a/modules/cli/src/main/scala/scala/cli/commands/BloopStart.scala +++ b/modules/cli/src/main/scala/scala/cli/commands/BloopStart.scala @@ -2,11 +2,11 @@ package scala.cli.commands import caseapp.* -import scala.build.Os import scala.build.bloop.BloopThreads import scala.build.blooprifle.internal.Constants import scala.build.blooprifle.{BloopRifle, BloopRifleConfig} import scala.build.options.{BuildOptions, InternalOptions} +import scala.build.{Logger, Os} import scala.cli.CurrentParams import scala.cli.commands.util.CommonOps.* import scala.cli.commands.util.JvmUtils @@ -39,13 +39,9 @@ object BloopStart extends ScalaCommand[BloopStartOptions] { ) } - override def loggingOptions(options: BloopStartOptions): Option[LoggingOptions] = - Some(options.logging) - - override def runCommand(options: BloopStartOptions, args: RemainingArgs): Unit = { + override def runCommand(options: BloopStartOptions, args: RemainingArgs, logger: Logger): Unit = { val threads = BloopThreads.create() val bloopRifleConfig = mkBloopRifleConfig(options) - val logger = options.logging.logger val isRunning = BloopRifle.check(bloopRifleConfig, logger.bloopRifleLogger) diff --git a/modules/cli/src/main/scala/scala/cli/commands/Bsp.scala b/modules/cli/src/main/scala/scala/cli/commands/Bsp.scala index 4766c19c09..fa7e05ebe1 100644 --- a/modules/cli/src/main/scala/scala/cli/commands/Bsp.scala +++ b/modules/cli/src/main/scala/scala/cli/commands/Bsp.scala @@ -28,7 +28,7 @@ object Bsp extends ScalaCommand[BspOptions] { Option(latestSharedOptions(options)) // not reusing buildOptions here, since they should be reloaded live instead - override def runCommand(options: BspOptions, args: RemainingArgs): Unit = { + override def runCommand(options: BspOptions, args: RemainingArgs, logger: Logger): Unit = { if (options.shared.logging.verbosity >= 3) pprint.err.log(args) @@ -44,8 +44,8 @@ object Bsp extends ScalaCommand[BspOptions] { pprint.err.log(initialInputs) val buildOptions0 = buildOptions(sharedOptions) - val logger = sharedOptions.logging.logger - val persistentLogger = new PersistentDiagnosticLogger(logger) + val latestLogger = sharedOptions.logging.logger + val persistentLogger = new PersistentDiagnosticLogger(latestLogger) val allInputs = CrossSources.forInputs( @@ -72,7 +72,6 @@ object Bsp extends ScalaCommand[BspOptions] { ) } - val logger = getSharedOptions().logging.logger val inputs = argsToInputs(args.all).orExit(logger) CurrentParams.workspaceOpt = Some(inputs.workspace) val configDb = options.shared.configDb diff --git a/modules/cli/src/main/scala/scala/cli/commands/Clean.scala b/modules/cli/src/main/scala/scala/cli/commands/Clean.scala index 11158a5251..864a719b00 100644 --- a/modules/cli/src/main/scala/scala/cli/commands/Clean.scala +++ b/modules/cli/src/main/scala/scala/cli/commands/Clean.scala @@ -3,15 +3,13 @@ package scala.cli.commands import caseapp.* import scala.build.internal.Constants -import scala.build.{Inputs, Os} +import scala.build.{Inputs, Logger, Os} import scala.cli.commands.util.CommonOps.* import scala.cli.{CurrentParams, ScalaCli} object Clean extends ScalaCommand[CleanOptions] { override def group = "Main" - override def loggingOptions(options: CleanOptions): Option[LoggingOptions] = - Some(options.logging) - override def runCommand(options: CleanOptions, args: RemainingArgs): Unit = { + override def runCommand(options: CleanOptions, args: RemainingArgs, logger: Logger): Unit = { val inputs = Inputs( args.all, Os.pwd, @@ -30,7 +28,6 @@ object Clean extends ScalaCommand[CleanOptions] { val workDir = inputs.workspace / Constants.workspaceDirName val (_, bspEntry) = SetupIde.bspDetails(inputs.workspace, options.bspFile) - val logger = options.logging.logger if (os.exists(workDir)) { logger.debug(s"Working directory: $workDir") if (os.isDir(workDir)) { diff --git a/modules/cli/src/main/scala/scala/cli/commands/Compile.scala b/modules/cli/src/main/scala/scala/cli/commands/Compile.scala index 1d7c017c8e..90aa8137f0 100644 --- a/modules/cli/src/main/scala/scala/cli/commands/Compile.scala +++ b/modules/cli/src/main/scala/scala/cli/commands/Compile.scala @@ -5,7 +5,7 @@ import caseapp.* import java.io.File import scala.build.options.{BuildOptions, Scope} -import scala.build.{Build, BuildThreads, Builds, Os} +import scala.build.{Build, BuildThreads, Builds, Logger, Os} import scala.cli.CurrentParams import scala.cli.commands.publish.ConfigUtil.* import scala.cli.commands.util.BuildCommandHelpers @@ -16,8 +16,7 @@ import scala.cli.config.{ConfigDb, Keys} object Compile extends ScalaCommand[CompileOptions] with BuildCommandHelpers { override def group = "Main" override def sharedOptions(options: CompileOptions): Option[SharedOptions] = Some(options.shared) - override def runCommand(options: CompileOptions, args: RemainingArgs): Unit = { - val logger = options.shared.logger + override def runCommand(options: CompileOptions, args: RemainingArgs, logger: Logger): Unit = { val buildOptions = buildOptionsOrExit(options) val inputs = options.shared.inputs(args.all).orExit(logger) CurrentParams.workspaceOpt = Some(inputs.workspace) diff --git a/modules/cli/src/main/scala/scala/cli/commands/Default.scala b/modules/cli/src/main/scala/scala/cli/commands/Default.scala index c1d04ac598..c27b0e96c2 100644 --- a/modules/cli/src/main/scala/scala/cli/commands/Default.scala +++ b/modules/cli/src/main/scala/scala/cli/commands/Default.scala @@ -3,6 +3,7 @@ package scala.cli.commands import caseapp.core.help.RuntimeCommandsHelp import caseapp.core.{Error, RemainingArgs} +import scala.build.Logger import scala.build.internal.Constants import scala.build.options.BuildOptions import scala.cli.commands.util.SharedOptionsUtil.* @@ -28,7 +29,7 @@ class Default( sys.exit(0) } - override def runCommand(options: DefaultOptions, args: RemainingArgs): Unit = { + override def runCommand(options: DefaultOptions, args: RemainingArgs, logger: Logger): Unit = { if options.version then println(Version.versionInfo(isSipScala)) else { @@ -39,7 +40,7 @@ class Default( if shouldDefaultToRun then RunOptions.parser else ReplOptions.parser }.parse(rawArgs) match case Left(e) => error(e) - case Right((replOptions: ReplOptions, _)) => Repl.runCommand(replOptions, args) - case Right((runOptions: RunOptions, _)) => Run.runCommand(runOptions, args) + case Right((replOptions: ReplOptions, _)) => Repl.runCommand(replOptions, args, logger) + case Right((runOptions: RunOptions, _)) => Run.runCommand(runOptions, args, logger) } } diff --git a/modules/cli/src/main/scala/scala/cli/commands/DependencyUpdate.scala b/modules/cli/src/main/scala/scala/cli/commands/DependencyUpdate.scala index 91eb378a7f..eb814dc118 100644 --- a/modules/cli/src/main/scala/scala/cli/commands/DependencyUpdate.scala +++ b/modules/cli/src/main/scala/scala/cli/commands/DependencyUpdate.scala @@ -15,11 +15,14 @@ object DependencyUpdate extends ScalaCommand[DependencyUpdateOptions] { override def group = "Main" override def sharedOptions(options: DependencyUpdateOptions): Option[SharedOptions] = Some(options.shared) - override def runCommand(options: DependencyUpdateOptions, args: RemainingArgs): Unit = { + override def runCommand( + options: DependencyUpdateOptions, + args: RemainingArgs, + logger: Logger + ): Unit = { val verbosity = options.shared.logging.verbosity val buildOptions = buildOptionsOrExit(options) - val logger = options.shared.logger val inputs = options.shared.inputs(args.all).orExit(logger) val (crossSources, _) = diff --git a/modules/cli/src/main/scala/scala/cli/commands/Directories.scala b/modules/cli/src/main/scala/scala/cli/commands/Directories.scala index f0a6a769ab..ba6e454986 100644 --- a/modules/cli/src/main/scala/scala/cli/commands/Directories.scala +++ b/modules/cli/src/main/scala/scala/cli/commands/Directories.scala @@ -2,17 +2,20 @@ package scala.cli.commands import caseapp.* +import scala.build.Logger import scala.cli.CurrentParams import scala.cli.commands.util.CommonOps.* object Directories extends ScalaCommand[DirectoriesOptions] { override def hidden: Boolean = true override def isRestricted = true - override def verbosity(options: DirectoriesOptions): Option[Int] = - Some(options.verbosity.verbosity) - override def runCommand(options: DirectoriesOptions, args: RemainingArgs): Unit = { + override def runCommand( + options: DirectoriesOptions, + args: RemainingArgs, + logger: Logger + ): Unit = { if (args.all.nonEmpty) { - System.err.println("The directories command doesn't accept arguments.") + logger.error("The directories command doesn't accept arguments.") sys.exit(1) } diff --git a/modules/cli/src/main/scala/scala/cli/commands/Doc.scala b/modules/cli/src/main/scala/scala/cli/commands/Doc.scala index 12a501c9b7..57ce7ee296 100644 --- a/modules/cli/src/main/scala/scala/cli/commands/Doc.scala +++ b/modules/cli/src/main/scala/scala/cli/commands/Doc.scala @@ -23,9 +23,8 @@ import scala.util.Properties object Doc extends ScalaCommand[DocOptions] { override def group = "Main" override def sharedOptions(options: DocOptions): Option[SharedOptions] = Some(options.shared) - override def runCommand(options: DocOptions, args: RemainingArgs): Unit = { + override def runCommand(options: DocOptions, args: RemainingArgs, logger: Logger): Unit = { val initialBuildOptions = buildOptionsOrExit(options) - val logger = options.shared.logger val inputs = options.shared.inputs(args.remaining).orExit(logger) CurrentParams.workspaceOpt = Some(inputs.workspace) val threads = BuildThreads.create() diff --git a/modules/cli/src/main/scala/scala/cli/commands/Doctor.scala b/modules/cli/src/main/scala/scala/cli/commands/Doctor.scala index 3ddb9bb07b..df82ac178c 100644 --- a/modules/cli/src/main/scala/scala/cli/commands/Doctor.scala +++ b/modules/cli/src/main/scala/scala/cli/commands/Doctor.scala @@ -2,6 +2,7 @@ package scala.cli.commands import caseapp.core.RemainingArgs +import scala.build.Logger import scala.build.internal.Constants import scala.cli.ScalaCli import scala.cli.internal.ProcUtil @@ -29,7 +30,7 @@ import scala.cli.signing.shared.Secret object Doctor extends ScalaCommand[DoctorOptions] { override def group = "Doctor" - override def runCommand(options: DoctorOptions, args: RemainingArgs): Unit = { + override def runCommand(options: DoctorOptions, args: RemainingArgs, logger: Logger): Unit = { checkIsVersionOutdated(options.ghToken.map(_.get())) checkBloopStatus() checkDuplicatesOnPath() diff --git a/modules/cli/src/main/scala/scala/cli/commands/Export.scala b/modules/cli/src/main/scala/scala/cli/commands/Export.scala index 091b11acf3..e03b737f43 100644 --- a/modules/cli/src/main/scala/scala/cli/commands/Export.scala +++ b/modules/cli/src/main/scala/scala/cli/commands/Export.scala @@ -75,9 +75,8 @@ object Export extends ScalaCommand[ExportOptions] { override def sharedOptions(opts: ExportOptions): Option[SharedOptions] = Some(opts.shared) - override def runCommand(options: ExportOptions, args: RemainingArgs): Unit = { + override def runCommand(options: ExportOptions, args: RemainingArgs, logger: Logger): Unit = { val initialBuildOptions = buildOptionsOrExit(options) - val logger = options.shared.logger val output = options.output.getOrElse("dest") val dest = os.Path(output, os.pwd) diff --git a/modules/cli/src/main/scala/scala/cli/commands/Fmt.scala b/modules/cli/src/main/scala/scala/cli/commands/Fmt.scala index 8310c92ee8..b83ea9131f 100644 --- a/modules/cli/src/main/scala/scala/cli/commands/Fmt.scala +++ b/modules/cli/src/main/scala/scala/cli/commands/Fmt.scala @@ -22,9 +22,8 @@ object Fmt extends ScalaCommand[FmtOptions] { List("scalafmt") ) - override def runCommand(options: FmtOptions, args: RemainingArgs): Unit = { + override def runCommand(options: FmtOptions, args: RemainingArgs, logger: Logger): Unit = { val buildOptions = buildOptionsOrExit(options) - val logger = options.shared.logger // TODO If no input is given, just pass '.' to scalafmt? val (sourceFiles, workspace, _) = diff --git a/modules/cli/src/main/scala/scala/cli/commands/HelpCmd.scala b/modules/cli/src/main/scala/scala/cli/commands/HelpCmd.scala index 45a477baa7..d0df266fb4 100644 --- a/modules/cli/src/main/scala/scala/cli/commands/HelpCmd.scala +++ b/modules/cli/src/main/scala/scala/cli/commands/HelpCmd.scala @@ -3,11 +3,12 @@ package scala.cli.commands import caseapp.* import caseapp.core.help.RuntimeCommandsHelp +import scala.build.Logger import scala.cli.ScalaCliHelp class HelpCmd(actualHelp: => RuntimeCommandsHelp) extends ScalaCommand[HelpOptions] { override def names = List(List("help")) - override def runCommand(options: HelpOptions, args: RemainingArgs) = + override def runCommand(options: HelpOptions, args: RemainingArgs, logger: Logger): Unit = println(actualHelp.help(ScalaCliHelp.helpFormat)) } diff --git a/modules/cli/src/main/scala/scala/cli/commands/InstallCompletions.scala b/modules/cli/src/main/scala/scala/cli/commands/InstallCompletions.scala index 4d08b5741d..11bf14e83d 100644 --- a/modules/cli/src/main/scala/scala/cli/commands/InstallCompletions.scala +++ b/modules/cli/src/main/scala/scala/cli/commands/InstallCompletions.scala @@ -7,6 +7,7 @@ import java.io.File import java.nio.charset.Charset import java.util +import scala.build.Logger import scala.cli.CurrentParams import scala.cli.commands.util.CommonOps.* import scala.cli.commands.util.VerbosityOptionsUtil.* @@ -17,17 +18,18 @@ object InstallCompletions extends ScalaCommand[InstallCompletionsOptions] { List("install", "completions"), List("install-completions") ) - override def loggingOptions(options: InstallCompletionsOptions): Option[LoggingOptions] = - Some(options.logging) - override def runCommand(options: InstallCompletionsOptions, args: RemainingArgs): Unit = { + override def runCommand( + options: InstallCompletionsOptions, + args: RemainingArgs, + logger: Logger + ): Unit = { val interactive = options.logging.verbosityOptions.interactiveInstance() lazy val completionsDir = options.output .map(os.Path(_, os.pwd)) .getOrElse(options.directories.directories.completionsDir) - val logger = options.logging.logger - val name = getName(options.name) + val name = getName(options.name) val format = getFormat(options.format).getOrElse { val msg = "Cannot determine current shell. Which would you like to use?" interactive.chooseOne(msg, List("zsh", "bash")).getOrElse { diff --git a/modules/cli/src/main/scala/scala/cli/commands/InstallHome.scala b/modules/cli/src/main/scala/scala/cli/commands/InstallHome.scala index eff2f1c538..fb3869367a 100644 --- a/modules/cli/src/main/scala/scala/cli/commands/InstallHome.scala +++ b/modules/cli/src/main/scala/scala/cli/commands/InstallHome.scala @@ -3,7 +3,9 @@ package scala.cli.commands import caseapp.* import coursier.env.{EnvironmentUpdate, ProfileUpdater} +import scala.build.Logger import scala.cli.CurrentParams +import scala.cli.commands.util.CommonOps.* import scala.io.StdIn.readLine import scala.util.Properties @@ -11,41 +13,50 @@ object InstallHome extends ScalaCommand[InstallHomeOptions] { override def hidden: Boolean = true override def isRestricted = true - private def logEqual(version: String) = { - System.err.println( - s"Scala CLI $version is already installed and up-to-date." - ) + private def logEqual(version: String, logger: Logger) = { + logger.message(s"Scala CLI $version is already installed and up-to-date.") sys.exit(0) } - private def logUpdate(env: Boolean, newVersion: String, oldVersion: String): Unit = - if (!env) println( + private def logUpdate( + env: Boolean, + newVersion: String, + oldVersion: String, + logger: Logger + ): Unit = + if (!env) logger.message( s"""scala-cli $oldVersion is already installed and out-of-date. |scala-cli will be updated to version $newVersion |""".stripMargin ) - private def logDowngrade(env: Boolean, newVersion: String, oldVersion: String): Unit = + private def logDowngrade( + env: Boolean, + newVersion: String, + oldVersion: String, + logger: Logger + ): Unit = if (!env && coursier.paths.Util.useAnsiOutput()) { - println(s"scala-cli $oldVersion is already installed and up-to-date.") - println(s"Do you want to downgrade scala-cli to version $newVersion [Y/n]") + logger.message(s"scala-cli $oldVersion is already installed and up-to-date.") + logger.error(s"Do you want to downgrade scala-cli to version $newVersion [Y/n]") val response = readLine() if (response != "Y") { - System.err.println("Abort") + logger.message("Abort") sys.exit(1) } } else { - System.err.println( + logger.error( s"Error: scala-cli is already installed $oldVersion and up-to-date. Downgrade to $newVersion pass -f or --force." ) sys.exit(1) } - override def verbosity(options: InstallHomeOptions): Option[Int] = - Some(options.verbosity.verbosity) - - override def runCommand(options: InstallHomeOptions, args: RemainingArgs): Unit = { + override def runCommand( + options: InstallHomeOptions, + args: RemainingArgs, + logger: Logger + ): Unit = { val binDirPath = options.binDirPath.getOrElse(scala.build.Directories.default().binRepoDir / "scala-cli") val destBinPath = binDirPath / options.binaryName @@ -69,10 +80,10 @@ object InstallHome extends ScalaCommand[InstallHomeOptions] { if (os.exists(binDirPath)) if (options.force) () // skip logging - else if (newVersion == oldVersion) logEqual(newVersion) + else if (newVersion == oldVersion) logEqual(newVersion, logger) else if (CommandUtils.isOutOfDateVersion(newVersion, oldVersion)) - logUpdate(options.env, newVersion, oldVersion) - else logDowngrade(options.env, newVersion, oldVersion) + logUpdate(options.env, newVersion, oldVersion, logger) + else logDowngrade(options.env, newVersion, oldVersion, logger) if (os.exists(destBinPath)) os.remove(destBinPath) diff --git a/modules/cli/src/main/scala/scala/cli/commands/Metabrowse.scala b/modules/cli/src/main/scala/scala/cli/commands/Metabrowse.scala index 1451563772..5ec7614698 100644 --- a/modules/cli/src/main/scala/scala/cli/commands/Metabrowse.scala +++ b/modules/cli/src/main/scala/scala/cli/commands/Metabrowse.scala @@ -56,9 +56,8 @@ object Metabrowse extends ScalaCommand[MetabrowseOptions] { ) } - override def runCommand(options: MetabrowseOptions, args: RemainingArgs): Unit = { + override def runCommand(options: MetabrowseOptions, args: RemainingArgs, logger: Logger): Unit = { val initialBuildOptions = buildOptionsOrExit(options) - val logger = options.shared.logger val inputs = options.shared.inputs(args.all).orExit(logger) CurrentParams.workspaceOpt = Some(inputs.workspace) val threads = BuildThreads.create() diff --git a/modules/cli/src/main/scala/scala/cli/commands/Package.scala b/modules/cli/src/main/scala/scala/cli/commands/Package.scala index d13d5c0978..1cef122197 100644 --- a/modules/cli/src/main/scala/scala/cli/commands/Package.scala +++ b/modules/cli/src/main/scala/scala/cli/commands/Package.scala @@ -48,8 +48,7 @@ object Package extends ScalaCommand[PackageOptions] with BuildCommandHelpers { override def sharedOptions(options: PackageOptions): Option[SharedOptions] = Some(options.shared) override def buildOptions(options: PackageOptions): Option[BuildOptions] = Some(options.baseBuildOptions.orExit(options.shared.logger)) - override def runCommand(options: PackageOptions, args: RemainingArgs): Unit = { - val logger = options.shared.logger + override def runCommand(options: PackageOptions, args: RemainingArgs, logger: Logger): Unit = { val inputs = options.shared.inputs(args.remaining).orExit(logger) CurrentParams.workspaceOpt = Some(inputs.workspace) diff --git a/modules/cli/src/main/scala/scala/cli/commands/Repl.scala b/modules/cli/src/main/scala/scala/cli/commands/Repl.scala index 1e07ef6820..4cfe9aced8 100644 --- a/modules/cli/src/main/scala/scala/cli/commands/Repl.scala +++ b/modules/cli/src/main/scala/scala/cli/commands/Repl.scala @@ -88,12 +88,11 @@ object Repl extends ScalaCommand[ReplOptions] { private def runMode(options: ReplOptions): RunMode.HasRepl = RunMode.Default - override def runCommand(options: ReplOptions, args: RemainingArgs): Unit = { + override def runCommand(options: ReplOptions, args: RemainingArgs, logger: Logger): Unit = { val initialBuildOptions = buildOptionsOrExit(options) def default = Inputs.default().getOrElse { Inputs.empty(Os.pwd, options.shared.markdown.enableMarkdown) } - val logger = options.shared.logger val inputs = options.shared.inputs(args.remaining, defaultInputs = () => Some(default)).orExit(logger) val programArgs = args.unparsed diff --git a/modules/cli/src/main/scala/scala/cli/commands/RestrictableCommand.scala b/modules/cli/src/main/scala/scala/cli/commands/RestrictableCommand.scala new file mode 100644 index 0000000000..124d8e8cf4 --- /dev/null +++ b/modules/cli/src/main/scala/scala/cli/commands/RestrictableCommand.scala @@ -0,0 +1,10 @@ +package scala.cli.commands + +import caseapp.core.app.Command +import caseapp.core.parser.Parser + +trait RestrictableCommand[T](implicit myParser: Parser[T]) { + self: Command[T] => + def isRestricted: Boolean = false + override def parser: Parser[T] = RestrictedCommandsParser(myParser) +} diff --git a/modules/cli/src/main/scala/scala/cli/commands/Run.scala b/modules/cli/src/main/scala/scala/cli/commands/Run.scala index 834b839295..fd2ae6580f 100644 --- a/modules/cli/src/main/scala/scala/cli/commands/Run.scala +++ b/modules/cli/src/main/scala/scala/cli/commands/Run.scala @@ -45,12 +45,13 @@ object Run extends ScalaCommand[RunOptions] with BuildCommandHelpers { .filter(_.trim.nonEmpty) .map(os.Path(_, os.pwd)) - override def runCommand(options: RunOptions, args: RemainingArgs): Unit = - scalaCliRun( + override def runCommand(options: RunOptions, args: RemainingArgs, logger: Logger): Unit = + runCommand( options, args.remaining, args.unparsed, - () => Inputs.default() + () => Inputs.default(), + logger ) override def buildOptions(options: RunOptions): Some[BuildOptions] = Some { @@ -99,15 +100,15 @@ object Run extends ScalaCommand[RunOptions] with BuildCommandHelpers { ) } - def scalaCliRun( + def runCommand( options: RunOptions, inputArgs: Seq[String], programArgs: Seq[String], - defaultInputs: () => Option[Inputs] + defaultInputs: () => Option[Inputs], + logger: Logger ): Unit = { val initialBuildOptions = buildOptionsOrExit(options) - val logger = options.shared.logger val inputs = options.shared.inputs(inputArgs, defaultInputs = defaultInputs).orExit(logger) CurrentParams.workspaceOpt = Some(inputs.workspace) val threads = BuildThreads.create() diff --git a/modules/cli/src/main/scala/scala/cli/commands/ScalaCommand.scala b/modules/cli/src/main/scala/scala/cli/commands/ScalaCommand.scala index eae33d8a00..80322d73ad 100644 --- a/modules/cli/src/main/scala/scala/cli/commands/ScalaCommand.scala +++ b/modules/cli/src/main/scala/scala/cli/commands/ScalaCommand.scala @@ -15,25 +15,23 @@ import scala.build.compiler.SimpleScalaCompiler import scala.build.errors.BuildException import scala.build.internal.{Constants, Runner} import scala.build.options.{BuildOptions, Scope} -import scala.build.{Artifacts, Positioned, ReplArtifacts} +import scala.build.{Artifacts, Logger, Positioned, ReplArtifacts} +import scala.cli.commands.common.HasLoggingOptions +import scala.cli.commands.util.CommonOps.* import scala.cli.commands.util.ScalacOptionsUtil.* import scala.cli.commands.util.SharedOptionsUtil.* import scala.cli.commands.util.{CommandHelpers, FmtOptionsUtil} import scala.cli.{CurrentParams, ScalaCli} import scala.util.{Properties, Try} -abstract class ScalaCommand[T](implicit myParser: Parser[T], help: Help[T]) - extends Command()(myParser, help) with NeedsArgvCommand with CommandHelpers { +abstract class ScalaCommand[T <: HasLoggingOptions](implicit myParser: Parser[T], help: Help[T]) + extends Command()(myParser, help) + with NeedsArgvCommand with CommandHelpers with RestrictableCommand[T] { def sharedOptions(t: T): Option[SharedOptions] = // hello borked unused warning None override def hasFullHelp = true - override def parser: Parser[T] = - RestrictedCommandsParser(myParser) - - def isRestricted: Boolean = false - protected var argvOpt = Option.empty[Array[String]] override def setArgv(argv: Array[String]): Unit = { argvOpt = Some(argv) @@ -290,22 +288,6 @@ abstract class ScalaCommand[T](implicit myParser: Parser[T], help: Help[T]) sys.exit(1) } - /** @param options - * command-specific [[T]] options - * @return - * by default [[sharedOptions]].logging, override to adjust. - */ - def loggingOptions(options: T): Option[LoggingOptions] = - sharedOptions(options).map(_.logging) - - /** @param options - * command-specific [[T]] options - * @return - * by default [[loggingOptions]].verbosity, override to adjust. - */ - def verbosity(options: T): Option[Int] = - loggingOptions(options).map(_.verbosity) - /** This should be overridden instead of [[run]] when extending [[ScalaCommand]]. * * @param options @@ -313,19 +295,18 @@ abstract class ScalaCommand[T](implicit myParser: Parser[T], help: Help[T]) * @param remainingArgs * arguments remaining after parsing options */ - def runCommand(options: T, remainingArgs: RemainingArgs): Unit + def runCommand(options: T, remainingArgs: RemainingArgs, logger: Logger): Unit /** This implementation is final. Override [[runCommand]] instead. This logic is invoked at the * start of running every [[ScalaCommand]]. */ final override def run(options: T, remainingArgs: RemainingArgs): Unit = { - for (v <- verbosity(options)) - CurrentParams.verbosity = v + CurrentParams.verbosity = options.logging.verbosity maybePrintGroupHelp(options) buildOptions(options).foreach { bo => maybePrintSimpleScalacOutput(options, bo) maybePrintToolsHelp(options, bo) } - runCommand(options, remainingArgs) + runCommand(options, remainingArgs, options.logging.logger) } } diff --git a/modules/cli/src/main/scala/scala/cli/commands/SetupIde.scala b/modules/cli/src/main/scala/scala/cli/commands/SetupIde.scala index cc1f3ccf0a..0f4bfb8476 100644 --- a/modules/cli/src/main/scala/scala/cli/commands/SetupIde.scala +++ b/modules/cli/src/main/scala/scala/cli/commands/SetupIde.scala @@ -52,9 +52,8 @@ object SetupIde extends ScalaCommand[SetupIdeOptions] { joinedBuildOpts.artifacts(logger, Scope.Main) } - override def runCommand(options: SetupIdeOptions, args: RemainingArgs): Unit = { + override def runCommand(options: SetupIdeOptions, args: RemainingArgs, logger: Logger): Unit = { val buildOptions = buildOptionsOrExit(options) - val logger = options.shared.logging.logger val inputs = options.shared.inputs(args.all).orExit(logger) CurrentParams.workspaceOpt = Some(inputs.workspace) diff --git a/modules/cli/src/main/scala/scala/cli/commands/Shebang.scala b/modules/cli/src/main/scala/scala/cli/commands/Shebang.scala index 3d4273442e..408d09d7c2 100644 --- a/modules/cli/src/main/scala/scala/cli/commands/Shebang.scala +++ b/modules/cli/src/main/scala/scala/cli/commands/Shebang.scala @@ -2,6 +2,7 @@ package scala.cli.commands import caseapp.RemainingArgs +import scala.build.Logger import scala.build.options.BuildOptions import scala.cli.CurrentParams @@ -9,11 +10,12 @@ object Shebang extends ScalaCommand[ShebangOptions] { override def stopAtFirstUnrecognized: Boolean = true override def sharedOptions(options: ShebangOptions): Option[SharedOptions] = Run.sharedOptions(options.runOptions) - override def runCommand(options: ShebangOptions, args: RemainingArgs): Unit = - Run.scalaCliRun( + override def runCommand(options: ShebangOptions, args: RemainingArgs, logger: Logger): Unit = + Run.runCommand( options.runOptions, args.remaining.headOption.toSeq, args.remaining.drop(1), - () => None + () => None, + logger ) } diff --git a/modules/cli/src/main/scala/scala/cli/commands/Test.scala b/modules/cli/src/main/scala/scala/cli/commands/Test.scala index 17ee1569d6..af8528d860 100644 --- a/modules/cli/src/main/scala/scala/cli/commands/Test.scala +++ b/modules/cli/src/main/scala/scala/cli/commands/Test.scala @@ -42,9 +42,8 @@ object Test extends ScalaCommand[TestOptions] { ) } - override def runCommand(options: TestOptions, args: RemainingArgs): Unit = { + override def runCommand(options: TestOptions, args: RemainingArgs, logger: Logger): Unit = { val initialBuildOptions = buildOptionsOrExit(options) - val logger = options.shared.logger val inputs = options.shared.inputs(args.remaining).orExit(logger) CurrentParams.workspaceOpt = Some(inputs.workspace) SetupIde.runSafe( diff --git a/modules/cli/src/main/scala/scala/cli/commands/Uninstall.scala b/modules/cli/src/main/scala/scala/cli/commands/Uninstall.scala index ecc3216d13..e4d1494d7f 100644 --- a/modules/cli/src/main/scala/scala/cli/commands/Uninstall.scala +++ b/modules/cli/src/main/scala/scala/cli/commands/Uninstall.scala @@ -2,17 +2,15 @@ package scala.cli.commands import caseapp.* +import scala.build.Logger import scala.cli.CurrentParams import scala.cli.commands.util.CommonOps.* import scala.cli.commands.util.VerbosityOptionsUtil.* object Uninstall extends ScalaCommand[UninstallOptions] { - override def loggingOptions(options: UninstallOptions): Option[LoggingOptions] = - Some(options.bloopExit.logging) - override def runCommand(options: UninstallOptions, args: RemainingArgs): Unit = { + override def runCommand(options: UninstallOptions, args: RemainingArgs, logger: Logger): Unit = { val interactive = options.bloopExit.logging.verbosityOptions.interactiveInstance(forceEnable = true) - val logger = options.bloopExit.logging.logger val binDirPath = options.binDirPath.getOrElse(scala.build.Directories.default().binRepoDir / "scala-cli") diff --git a/modules/cli/src/main/scala/scala/cli/commands/UninstallCompletions.scala b/modules/cli/src/main/scala/scala/cli/commands/UninstallCompletions.scala index 7a31ecb9b1..f361ee346f 100644 --- a/modules/cli/src/main/scala/scala/cli/commands/UninstallCompletions.scala +++ b/modules/cli/src/main/scala/scala/cli/commands/UninstallCompletions.scala @@ -4,6 +4,7 @@ import caseapp.* import java.nio.charset.Charset +import scala.build.Logger import scala.cli.CurrentParams import scala.cli.commands.util.CommonOps.* import scala.cli.internal.ProfileFileUpdater @@ -13,11 +14,12 @@ object UninstallCompletions extends ScalaCommand[UninstallCompletionsOptions] { List("uninstall", "completions"), List("uninstall-completions") ) - override def loggingOptions(options: UninstallCompletionsOptions): Option[LoggingOptions] = - Some(options.logging) - override def runCommand(options: UninstallCompletionsOptions, args: RemainingArgs): Unit = { - val logger = options.logging.logger - val name = InstallCompletions.getName(options.shared.name) + override def runCommand( + options: UninstallCompletionsOptions, + args: RemainingArgs, + logger: Logger + ): Unit = { + val name = InstallCompletions.getName(options.shared.name) val zDotDir = Option(System.getenv("ZDOTDIR")) .map(os.Path(_, os.pwd)) diff --git a/modules/cli/src/main/scala/scala/cli/commands/Update.scala b/modules/cli/src/main/scala/scala/cli/commands/Update.scala index 028b4952bd..351f300f1f 100644 --- a/modules/cli/src/main/scala/scala/cli/commands/Update.scala +++ b/modules/cli/src/main/scala/scala/cli/commands/Update.scala @@ -8,6 +8,7 @@ import coursier.core import scala.build.Logger import scala.build.internal.Constants.{ghName, ghOrg, version as scalaCliVersion} import scala.cli.CurrentParams +import scala.cli.commands.util.CommonOps.* import scala.cli.commands.util.VerbosityOptionsUtil.* import scala.cli.internal.ProcUtil import scala.cli.signing.shared.Secret @@ -59,11 +60,11 @@ object Update extends ScalaCommand[UpdateOptions] { scala.build.Directories.default().binRepoDir / options.binaryName ) - private def updateScalaCli(options: UpdateOptions, newVersion: String): Unit = { - val interactive = options.verbosity.interactiveInstance(forceEnable = true) + private def updateScalaCli(options: UpdateOptions, newVersion: String, logger: Logger): Unit = { + val interactive = options.logging.verbosityOptions.interactiveInstance(forceEnable = true) if (!options.force) { val fallbackAction = () => { - System.err.println(s"To update scala-cli to $newVersion pass -f or --force") + logger.error(s"To update scala-cli to $newVersion pass -f or --force") sys.exit(1) } val msg = s"Do you want to update scala-cli to version $newVersion?" @@ -90,7 +91,7 @@ object Update extends ScalaCommand[UpdateOptions] { // format: on val output = res.out.trim() if (res.exitCode != 0) { - System.err.println(s"Error during updating scala-cli: $output") + logger.error(s"Error during updating scala-cli: $output") sys.exit(1) } } @@ -103,14 +104,14 @@ object Update extends ScalaCommand[UpdateOptions] { "0.0.0" } - private def update(options: UpdateOptions, currentVersion: String): Unit = { + private def update(options: UpdateOptions, currentVersion: String, logger: Logger): Unit = { val newestScalaCliVersion0 = newestScalaCliVersion(options.ghToken.map(_.get())) val isOutdated = CommandUtils.isOutOfDateVersion(newestScalaCliVersion0, currentVersion) if (!options.isInternalRun) if (isOutdated) - updateScalaCli(options, newestScalaCliVersion0) + updateScalaCli(options, newestScalaCliVersion0, logger) else println("Scala CLI is up-to-date") else if (isOutdated) println( @@ -119,8 +120,14 @@ object Update extends ScalaCommand[UpdateOptions] { ) } - def checkUpdate(options: UpdateOptions): Unit = { + override def runCommand( + options: UpdateOptions, + remainingArgs: RemainingArgs, + logger: Logger + ): Unit = + checkUpdate(options, logger) + def checkUpdate(options: UpdateOptions, logger: Logger): Unit = { val scalaCliBinPath = installDirPath(options) / options.binaryName val programName = argvOpt.flatMap(_.headOption).getOrElse { @@ -134,7 +141,7 @@ object Update extends ScalaCommand[UpdateOptions] { if (!os.exists(scalaCliBinPath) || !isScalaCliInPath) { if (!options.isInternalRun) { - System.err.println( + logger.error( "Scala CLI was not installed by the installation script, please use your package manager to update scala-cli." ) sys.exit(1) @@ -142,23 +149,20 @@ object Update extends ScalaCommand[UpdateOptions] { } else if (Properties.isWin) { if (!options.isInternalRun) { - System.err.println("Scala CLI update is not supported on Windows.") + logger.error("Scala CLI update is not supported on Windows.") sys.exit(1) } } - else if (options.binaryName == "scala-cli") update(options, scalaCliVersion) + else if (options.binaryName == "scala-cli") update(options, scalaCliVersion, logger) else - update(options, getCurrentVersion(scalaCliBinPath)) + update(options, getCurrentVersion(scalaCliBinPath), logger) } - override def verbosity(options: UpdateOptions): Option[Int] = Some(options.verbosity.verbosity) - override def runCommand(options: UpdateOptions, args: RemainingArgs): Unit = checkUpdate(options) - def checkUpdateSafe(logger: Logger): Unit = try // log about update only if scala-cli was installed from installation script if (isScalaCLIInstalledByInstallationScript) - checkUpdate(UpdateOptions(isInternalRun = true)) + checkUpdate(UpdateOptions(isInternalRun = true), logger) catch { case NonFatal(ex) => logger.debug(s"Ignoring error during checking update: $ex") diff --git a/modules/cli/src/main/scala/scala/cli/commands/Version.scala b/modules/cli/src/main/scala/scala/cli/commands/Version.scala index a1772039c3..a9958bc998 100644 --- a/modules/cli/src/main/scala/scala/cli/commands/Version.scala +++ b/modules/cli/src/main/scala/scala/cli/commands/Version.scala @@ -2,14 +2,13 @@ package scala.cli.commands import caseapp.* +import scala.build.Logger import scala.build.internal.Constants import scala.cli.CurrentParams class Version(isSipScala: Boolean) extends ScalaCommand[VersionOptions] { override def group = "Miscellaneous" - override def verbosity(options: VersionOptions): Option[Int] = - Some(options.verbosity.verbosity) - override def runCommand(options: VersionOptions, args: RemainingArgs): Unit = { + override def runCommand(options: VersionOptions, args: RemainingArgs, logger: Logger): Unit = { if (options.cliVersion) println(Constants.version) else if (options.scalaVersion) diff --git a/modules/cli/src/main/scala/scala/cli/commands/bloop/Bloop.scala b/modules/cli/src/main/scala/scala/cli/commands/bloop/Bloop.scala index ab3634e72a..6d9dd9ce09 100644 --- a/modules/cli/src/main/scala/scala/cli/commands/bloop/Bloop.scala +++ b/modules/cli/src/main/scala/scala/cli/commands/bloop/Bloop.scala @@ -58,11 +58,8 @@ object Bloop extends ScalaCommand[BloopOptions] { ) } - override def loggingOptions(options: BloopOptions): Option[LoggingOptions] = - Some(options.logging) - override def runCommand(options: BloopOptions, args: RemainingArgs): Unit = { + override def runCommand(options: BloopOptions, args: RemainingArgs, logger: Logger): Unit = { val threads = BloopThreads.create() - val logger = options.logging.logger val bloopRifleConfig = bloopRifleConfig0(options) val isRunning = BloopRifle.check(bloopRifleConfig, logger.bloopRifleLogger) diff --git a/modules/cli/src/main/scala/scala/cli/commands/bloop/BloopOutput.scala b/modules/cli/src/main/scala/scala/cli/commands/bloop/BloopOutput.scala index 247074e063..6814ecf572 100644 --- a/modules/cli/src/main/scala/scala/cli/commands/bloop/BloopOutput.scala +++ b/modules/cli/src/main/scala/scala/cli/commands/bloop/BloopOutput.scala @@ -2,6 +2,7 @@ package scala.cli.commands.bloop import caseapp.core.RemainingArgs +import scala.build.Logger import scala.build.blooprifle.BloopRifleConfig import scala.cli.CurrentParams import scala.cli.commands.util.CommonOps.* @@ -14,10 +15,7 @@ object BloopOutput extends ScalaCommand[BloopOutputOptions] { override def names: List[List[String]] = List( List("bloop", "output") ) - override def loggingOptions(options: BloopOutputOptions): Option[LoggingOptions] = - Some(options.logging) - override def runCommand(options: BloopOutputOptions, args: RemainingArgs): Unit = { - val logger = options.logging.logger + override def runCommand(options: BloopOutputOptions, args: RemainingArgs, logger: Logger): Unit = { val bloopRifleConfig = options.compilationServer.bloopRifleConfig( logger, CoursierOptions().coursierCache(logger.coursierLogger("Downloading Bloop")), // unused here diff --git a/modules/cli/src/main/scala/scala/cli/commands/config/Config.scala b/modules/cli/src/main/scala/scala/cli/commands/config/Config.scala index eefd286962..558fa3d52b 100644 --- a/modules/cli/src/main/scala/scala/cli/commands/config/Config.scala +++ b/modules/cli/src/main/scala/scala/cli/commands/config/Config.scala @@ -5,6 +5,7 @@ import coursier.cache.ArchiveCache import java.util.Base64 +import scala.build.Logger import scala.build.Ops.* import scala.build.errors.{BuildException, CompositeBuildException, MalformedCliInputError} import scala.cli.commands.ScalaCommand @@ -17,9 +18,7 @@ object Config extends ScalaCommand[ConfigOptions] { override def hidden = true override def isRestricted = true - override def runCommand(options: ConfigOptions, args: RemainingArgs): Unit = { - - val logger = options.logging.logger + override def runCommand(options: ConfigOptions, args: RemainingArgs, logger: Logger): Unit = { val directories = options.directories.directories if (options.dump) { diff --git a/modules/cli/src/main/scala/scala/cli/commands/default/DefaultFile.scala b/modules/cli/src/main/scala/scala/cli/commands/default/DefaultFile.scala index 76afcfd8b5..506922dac9 100644 --- a/modules/cli/src/main/scala/scala/cli/commands/default/DefaultFile.scala +++ b/modules/cli/src/main/scala/scala/cli/commands/default/DefaultFile.scala @@ -56,10 +56,11 @@ object DefaultFile extends ScalaCommand[DefaultFileOptions] { sys.exit(1) } - override def runCommand(options: DefaultFileOptions, args: RemainingArgs): Unit = { - - val logger = options.logging.logger - + override def runCommand( + options: DefaultFileOptions, + args: RemainingArgs, + logger: Logger + ): Unit = { lazy val allArgs = { val l = args.all if (l.isEmpty) { diff --git a/modules/cli/src/main/scala/scala/cli/commands/github/SecretCreate.scala b/modules/cli/src/main/scala/scala/cli/commands/github/SecretCreate.scala index 261e6cca18..c8a90d9a5a 100644 --- a/modules/cli/src/main/scala/scala/cli/commands/github/SecretCreate.scala +++ b/modules/cli/src/main/scala/scala/cli/commands/github/SecretCreate.scala @@ -132,10 +132,11 @@ object SecretCreate extends ScalaCommand[SecretCreateOptions] { } } - override def runCommand(options: SecretCreateOptions, args: RemainingArgs): Unit = { - - val logger = options.shared.logging.logger - + override def runCommand( + options: SecretCreateOptions, + args: RemainingArgs, + logger: Logger + ): Unit = { val secrets = args.all.map(parseSecretKv) val backend = ScalaCliSttpBackend.httpURLConnection(logger) diff --git a/modules/cli/src/main/scala/scala/cli/commands/github/SecretList.scala b/modules/cli/src/main/scala/scala/cli/commands/github/SecretList.scala index 935835da61..e96e1fee74 100644 --- a/modules/cli/src/main/scala/scala/cli/commands/github/SecretList.scala +++ b/modules/cli/src/main/scala/scala/cli/commands/github/SecretList.scala @@ -55,10 +55,11 @@ object SecretList extends ScalaCommand[ListSecretsOptions] { readFromString(body)(GitHubApi.secretListCodec) } - override def runCommand(options: ListSecretsOptions, args: RemainingArgs): Unit = { - - val logger = options.shared.logging.logger - + override def runCommand( + options: ListSecretsOptions, + args: RemainingArgs, + logger: Logger + ): Unit = { val backend = ScalaCliSttpBackend.httpURLConnection(logger) val list0 = list( diff --git a/modules/cli/src/main/scala/scala/cli/commands/pgp/ExternalCommand.scala b/modules/cli/src/main/scala/scala/cli/commands/pgp/ExternalCommand.scala index 84387cfa30..4965d99192 100644 --- a/modules/cli/src/main/scala/scala/cli/commands/pgp/ExternalCommand.scala +++ b/modules/cli/src/main/scala/scala/cli/commands/pgp/ExternalCommand.scala @@ -1,6 +1,6 @@ package scala.cli.commands.pgp -import caseapp._ +import caseapp.* import scala.cli.commands.util.CommandHelpers diff --git a/modules/cli/src/main/scala/scala/cli/commands/pgp/PgpCommand.scala b/modules/cli/src/main/scala/scala/cli/commands/pgp/PgpCommand.scala new file mode 100644 index 0000000000..e80538e521 --- /dev/null +++ b/modules/cli/src/main/scala/scala/cli/commands/pgp/PgpCommand.scala @@ -0,0 +1,16 @@ +package scala.cli.commands.pgp + +import caseapp.core.app.Command +import caseapp.core.complete.{Completer, CompletionItem} +import caseapp.core.help.{Help, HelpFormat} +import caseapp.core.parser.Parser + +import scala.cli.commands.RestrictableCommand +import scala.cli.commands.util.CommandHelpers + +abstract class PgpCommand[T](implicit myParser: Parser[T], help: Help[T]) + extends Command()(myParser, help) + with CommandHelpers with RestrictableCommand[T] { + override def isRestricted = true + override def hidden = true +} diff --git a/modules/cli/src/main/scala/scala/cli/commands/pgp/PgpCommands.scala b/modules/cli/src/main/scala/scala/cli/commands/pgp/PgpCommands.scala index a8c8c1d514..ce4cdb274d 100644 --- a/modules/cli/src/main/scala/scala/cli/commands/pgp/PgpCommands.scala +++ b/modules/cli/src/main/scala/scala/cli/commands/pgp/PgpCommands.scala @@ -1,9 +1,9 @@ package scala.cli.commands.pgp -import scala.cli.commands.ScalaCommand +import caseapp.core.app.Command class PgpCommands { - def allScalaCommands: Array[ScalaCommand[_]] = + def allScalaCommands: Array[PgpCommand[_]] = Array(PgpCreate, PgpKeyId, PgpSign, PgpVerify) def allExternalCommands: Array[ExternalCommand] = Array.empty diff --git a/modules/cli/src/main/scala/scala/cli/commands/pgp/PgpCreate.scala b/modules/cli/src/main/scala/scala/cli/commands/pgp/PgpCreate.scala index f793fcbfea..3668b4c2fd 100644 --- a/modules/cli/src/main/scala/scala/cli/commands/pgp/PgpCreate.scala +++ b/modules/cli/src/main/scala/scala/cli/commands/pgp/PgpCreate.scala @@ -1,16 +1,13 @@ package scala.cli.commands.pgp import caseapp.core.RemainingArgs +import caseapp.core.app.Command -import scala.cli.commands.ScalaCommand import scala.cli.signing.commands.{PgpCreate => OriginalPgpCreate, PgpCreateOptions} -object PgpCreate extends ScalaCommand[PgpCreateOptions] { +object PgpCreate extends PgpCommand[PgpCreateOptions] { + override def names = PgpCommandNames.pgpCreate - override def isRestricted = true - override def hidden = true - override def names = PgpCommandNames.pgpCreate - - override def runCommand(options: PgpCreateOptions, args: RemainingArgs): Unit = + override def run(options: PgpCreateOptions, args: RemainingArgs): Unit = OriginalPgpCreate.run(options, args) } diff --git a/modules/cli/src/main/scala/scala/cli/commands/pgp/PgpKeyId.scala b/modules/cli/src/main/scala/scala/cli/commands/pgp/PgpKeyId.scala index fa39a6d002..8fdedefbeb 100644 --- a/modules/cli/src/main/scala/scala/cli/commands/pgp/PgpKeyId.scala +++ b/modules/cli/src/main/scala/scala/cli/commands/pgp/PgpKeyId.scala @@ -1,16 +1,13 @@ package scala.cli.commands.pgp import caseapp.core.RemainingArgs +import caseapp.core.app.Command -import scala.cli.commands.ScalaCommand import scala.cli.signing.commands.{PgpKeyId => OriginalPgpKeyId, PgpKeyIdOptions} -object PgpKeyId extends ScalaCommand[PgpKeyIdOptions] { - - override def isRestricted = true - override def hidden = true +object PgpKeyId extends PgpCommand[PgpKeyIdOptions] { override def names: List[List[String]] = PgpCommandNames.pgpKeyId - override def runCommand(options: PgpKeyIdOptions, args: RemainingArgs): Unit = + override def run(options: PgpKeyIdOptions, args: RemainingArgs): Unit = OriginalPgpKeyId.run(options, args) } diff --git a/modules/cli/src/main/scala/scala/cli/commands/pgp/PgpPull.scala b/modules/cli/src/main/scala/scala/cli/commands/pgp/PgpPull.scala index 7ca0c67c3e..1d7f6d46b1 100644 --- a/modules/cli/src/main/scala/scala/cli/commands/pgp/PgpPull.scala +++ b/modules/cli/src/main/scala/scala/cli/commands/pgp/PgpPull.scala @@ -2,6 +2,7 @@ package scala.cli.commands.pgp import caseapp.core.RemainingArgs +import scala.build.Logger import scala.cli.commands.ScalaCommand import scala.cli.commands.pgp.KeyServer import scala.cli.commands.util.CommonOps.* @@ -15,9 +16,7 @@ object PgpPull extends ScalaCommand[PgpPullOptions] { List("pgp", "pull") ) - override def runCommand(options: PgpPullOptions, args: RemainingArgs): Unit = { - - val logger = options.logging.logger + override def runCommand(options: PgpPullOptions, args: RemainingArgs, logger: Logger): Unit = { val backend = ScalaCliSttpBackend.httpURLConnection(logger) val keyServerUri = options.shared.keyServerUriOptOrExit(logger).getOrElse { diff --git a/modules/cli/src/main/scala/scala/cli/commands/pgp/PgpPush.scala b/modules/cli/src/main/scala/scala/cli/commands/pgp/PgpPush.scala index 8bf60eb996..cee2fbf0cb 100644 --- a/modules/cli/src/main/scala/scala/cli/commands/pgp/PgpPush.scala +++ b/modules/cli/src/main/scala/scala/cli/commands/pgp/PgpPush.scala @@ -3,6 +3,7 @@ package scala.cli.commands.pgp import caseapp.core.RemainingArgs import coursier.cache.ArchiveCache +import scala.build.Logger import scala.cli.commands.ScalaCommand import scala.cli.commands.pgp.{KeyServer, PgpProxyMaker} import scala.cli.commands.util.CommonOps.* @@ -17,9 +18,7 @@ object PgpPush extends ScalaCommand[PgpPushOptions] { List("pgp", "push") ) - override def runCommand(options: PgpPushOptions, args: RemainingArgs): Unit = { - - val logger = options.logging.logger + override def runCommand(options: PgpPushOptions, args: RemainingArgs, logger: Logger): Unit = { val backend = ScalaCliSttpBackend.httpURLConnection(logger) val keyServerUri = options.shared.keyServerUriOptOrExit(logger).getOrElse { diff --git a/modules/cli/src/main/scala/scala/cli/commands/pgp/PgpSign.scala b/modules/cli/src/main/scala/scala/cli/commands/pgp/PgpSign.scala index 2f65addc6f..9a1ee6c19e 100644 --- a/modules/cli/src/main/scala/scala/cli/commands/pgp/PgpSign.scala +++ b/modules/cli/src/main/scala/scala/cli/commands/pgp/PgpSign.scala @@ -1,16 +1,13 @@ package scala.cli.commands.pgp import caseapp.core.RemainingArgs +import caseapp.core.app.Command -import scala.cli.commands.ScalaCommand import scala.cli.signing.commands.{PgpSign => OriginalPgpSign, PgpSignOptions} -object PgpSign extends ScalaCommand[PgpSignOptions] { +object PgpSign extends PgpCommand[PgpSignOptions] { + override def names = PgpCommandNames.pgpSign - override def isRestricted = true - override def hidden = true - override def names = PgpCommandNames.pgpSign - - override def runCommand(options: PgpSignOptions, args: RemainingArgs): Unit = + override def run(options: PgpSignOptions, args: RemainingArgs): Unit = OriginalPgpSign.run(options, args) } diff --git a/modules/cli/src/main/scala/scala/cli/commands/pgp/PgpVerify.scala b/modules/cli/src/main/scala/scala/cli/commands/pgp/PgpVerify.scala index c7693725f1..0838c60ff1 100644 --- a/modules/cli/src/main/scala/scala/cli/commands/pgp/PgpVerify.scala +++ b/modules/cli/src/main/scala/scala/cli/commands/pgp/PgpVerify.scala @@ -1,16 +1,13 @@ package scala.cli.commands.pgp import caseapp.core.RemainingArgs +import caseapp.core.app.Command -import scala.cli.commands.ScalaCommand import scala.cli.signing.commands.{PgpVerify => OriginalPgpVerify, PgpVerifyOptions} -object PgpVerify extends ScalaCommand[PgpVerifyOptions] { +object PgpVerify extends PgpCommand[PgpVerifyOptions] { + override def names = PgpCommandNames.pgpVerify - override def isRestricted = true - override def hidden = true - override def names = PgpCommandNames.pgpVerify - - override def runCommand(options: PgpVerifyOptions, args: RemainingArgs): Unit = + override def run(options: PgpVerifyOptions, args: RemainingArgs): Unit = OriginalPgpVerify.run(options, args) } diff --git a/modules/cli/src/main/scala/scala/cli/commands/publish/Publish.scala b/modules/cli/src/main/scala/scala/cli/commands/publish/Publish.scala index 9ef3712e86..3c8c35d0bf 100644 --- a/modules/cli/src/main/scala/scala/cli/commands/publish/Publish.scala +++ b/modules/cli/src/main/scala/scala/cli/commands/publish/Publish.scala @@ -173,12 +173,11 @@ object Publish extends ScalaCommand[PublishOptions] with BuildCommandHelpers { sys.exit(0) } - override def runCommand(options: PublishOptions, args: RemainingArgs): Unit = { + override def runCommand(options: PublishOptions, args: RemainingArgs, logger: Logger): Unit = { maybePrintLicensesAndExit(options.publishParams) maybePrintChecksumsAndExit(options.sharedPublish) val baseOptions = buildOptionsOrExit(options) - val logger = options.shared.logger val inputs = options.shared.inputs(args.all).orExit(logger) CurrentParams.workspaceOpt = Some(inputs.workspace) diff --git a/modules/cli/src/main/scala/scala/cli/commands/publish/PublishLocal.scala b/modules/cli/src/main/scala/scala/cli/commands/publish/PublishLocal.scala index ba2ae289c3..b799a0a8b9 100644 --- a/modules/cli/src/main/scala/scala/cli/commands/publish/PublishLocal.scala +++ b/modules/cli/src/main/scala/scala/cli/commands/publish/PublishLocal.scala @@ -2,8 +2,8 @@ package scala.cli.commands.publish import caseapp.core.RemainingArgs -import scala.build.BuildThreads import scala.build.options.BuildOptions +import scala.build.{BuildThreads, Logger} import scala.cli.CurrentParams import scala.cli.commands.util.SharedOptionsUtil.* import scala.cli.commands.{ScalaCommand, SharedOptions} @@ -20,12 +20,15 @@ object PublishLocal extends ScalaCommand[PublishLocalOptions] { List("publish", "local") ) - override def runCommand(options: PublishLocalOptions, args: RemainingArgs): Unit = { + override def runCommand( + options: PublishLocalOptions, + args: RemainingArgs, + logger: Logger + ): Unit = { Publish.maybePrintLicensesAndExit(options.publishParams) Publish.maybePrintChecksumsAndExit(options.sharedPublish) val baseOptions = buildOptionsOrExit(options) - val logger = options.shared.logger val inputs = options.shared.inputs(args.all).orExit(logger) CurrentParams.workspaceOpt = Some(inputs.workspace) diff --git a/modules/cli/src/main/scala/scala/cli/commands/publish/PublishSetup.scala b/modules/cli/src/main/scala/scala/cli/commands/publish/PublishSetup.scala index f5c3ef7dd7..7a5f9c9d82 100644 --- a/modules/cli/src/main/scala/scala/cli/commands/publish/PublishSetup.scala +++ b/modules/cli/src/main/scala/scala/cli/commands/publish/PublishSetup.scala @@ -5,15 +5,15 @@ import coursier.cache.ArchiveCache import java.nio.charset.StandardCharsets -import scala.build.Ops._ +import scala.build.Ops.* import scala.build.errors.CompositeBuildException import scala.build.internal.CustomCodeWrapper import scala.build.options.{BuildOptions, InternalOptions, Scope} -import scala.build.{CrossSources, Sources} +import scala.build.{CrossSources, Logger, Sources} import scala.cli.ScalaCli import scala.cli.commands.github.{LibSodiumJni, SecretCreate, SecretList} -import scala.cli.commands.publish.ConfigUtil._ -import scala.cli.commands.util.CommonOps._ +import scala.cli.commands.publish.ConfigUtil.* +import scala.cli.commands.util.CommonOps.* import scala.cli.commands.util.{ScalaCliSttpBackend, SharedOptionsUtil} import scala.cli.commands.{CommandUtils, ScalaCommand} import scala.cli.config.{ConfigDb, Keys} @@ -28,11 +28,13 @@ object PublishSetup extends ScalaCommand[PublishSetupOptions] { List("publish", "setup") ) - override def runCommand(options: PublishSetupOptions, args: RemainingArgs): Unit = { - + override def runCommand( + options: PublishSetupOptions, + args: RemainingArgs, + logger: Logger + ): Unit = { Publish.maybePrintLicensesAndExit(options.publishParams) - val logger = options.logging.logger val coursierCache = options.coursier.coursierCache(logger.coursierLogger("")) lazy val configDb = ConfigDb.open(options.directories.directories.dbPath.toNIO) diff --git a/modules/generate-reference-doc/src/main/scala/scala/cli/doc/GenerateReferenceDoc.scala b/modules/generate-reference-doc/src/main/scala/scala/cli/doc/GenerateReferenceDoc.scala index 43177da83e..8b79bf4f30 100644 --- a/modules/generate-reference-doc/src/main/scala/scala/cli/doc/GenerateReferenceDoc.scala +++ b/modules/generate-reference-doc/src/main/scala/scala/cli/doc/GenerateReferenceDoc.scala @@ -1,6 +1,6 @@ package scala.cli.doc -import caseapp._ +import caseapp.* import caseapp.core.Arg import caseapp.core.util.Formatter import munit.internal.difflib.Diff diff --git a/modules/integration/src/test/scala/scala/cli/integration/DirectoriesTests.scala b/modules/integration/src/test/scala/scala/cli/integration/DirectoriesTests.scala new file mode 100644 index 0000000000..2bad294b4f --- /dev/null +++ b/modules/integration/src/test/scala/scala/cli/integration/DirectoriesTests.scala @@ -0,0 +1,33 @@ +package scala.cli.integration + +import com.eed3si9n.expecty.Expecty.expect + +import scala.util.Properties + +class DirectoriesTests extends ScalaCliSuite { + test("running directories with args should fail") { + TestInputs(os.rel / "s.sc" -> """println("Hello")""").fromRoot { root => + val r = os.proc(TestUtil.cli, "directories", "s.sc") + .call(cwd = root, stderr = os.Pipe, check = false) + expect(r.exitCode == 1) + expect(r.err.trim() == "The directories command doesn't accept arguments.") + } + } + + if (Properties.isMac) + test("running directories on Mac with no args should give valid results") { + TestInputs.empty.fromRoot { root => + val r = os.proc(TestUtil.cli, "directories").call(cwd = root) + val cachesPath = os.home / "Library" / "Caches" / "ScalaCli" + val appSupportPath = os.home / "Library" / "Application Support" / "ScalaCli" + val expectedOutput = + s"""Local repository: ${cachesPath / "local-repo"} + |Completions: ${appSupportPath / "completions"} + |Virtual projects: ${cachesPath / "virtual-projects"} + |BSP sockets: ${cachesPath / "bsp-sockets"} + |Bloop daemon directory: ${cachesPath / "bloop" / "daemon"} + |Secrets directory: ${appSupportPath / "secrets"}""".stripMargin + expect(r.out.trim() == expectedOutput) + } + } +} diff --git a/website/docs/reference/cli-options.md b/website/docs/reference/cli-options.md index 996e139c5f..7b656788a0 100644 --- a/website/docs/reference/cli-options.md +++ b/website/docs/reference/cli-options.md @@ -486,7 +486,7 @@ Port for BSP debugging Available in commands: -[`bloop`](./commands.md#bloop), [`bloop exit`](./commands.md#bloop-exit), [`bloop output`](./commands.md#bloop-output), [`bloop start`](./commands.md#bloop-start), [`bsp`](./commands.md#bsp), [`clean`](./commands.md#clean), [`compile`](./commands.md#compile), [`config`](./commands.md#config), [`default-file`](./commands.md#default-file), [`dependency-update`](./commands.md#dependency-update), [`doc`](./commands.md#doc), [`export`](./commands.md#export), [`fmt` , `format` , `scalafmt`](./commands.md#fmt), [`install completions` , `install-completions`](./commands.md#install-completions), [`github secret list` , `gh secret list`](./commands.md#github-secret-list), [`browse` , `metabrowse`](./commands.md#browse), [`package`](./commands.md#package), [`pgp pull`](./commands.md#pgp-pull), [`pgp push`](./commands.md#pgp-push), [`publish`](./commands.md#publish), [`publish local`](./commands.md#publish-local), [`publish setup`](./commands.md#publish-setup), [`repl` , `console`](./commands.md#repl), [`run`](./commands.md#run), [`github secret create` , `gh secret create`](./commands.md#github-secret-create), [`setup-ide`](./commands.md#setup-ide), [`shebang`](./commands.md#shebang), [`test`](./commands.md#test), [`uninstall`](./commands.md#uninstall), [`uninstall completions` , `uninstall-completions`](./commands.md#uninstall-completions) +[`about`](./commands.md#about), [`add-path`](./commands.md#add-path), [`bloop`](./commands.md#bloop), [`bloop exit`](./commands.md#bloop-exit), [`bloop output`](./commands.md#bloop-output), [`bloop start`](./commands.md#bloop-start), [`bsp`](./commands.md#bsp), [`clean`](./commands.md#clean), [`compile`](./commands.md#compile), [`config`](./commands.md#config), [`default-file`](./commands.md#default-file), [`dependency-update`](./commands.md#dependency-update), [`directories`](./commands.md#directories), [`doc`](./commands.md#doc), [`doctor`](./commands.md#doctor), [`export`](./commands.md#export), [`fmt` , `format` , `scalafmt`](./commands.md#fmt), [`help`](./commands.md#help), [`install completions` , `install-completions`](./commands.md#install-completions), [`install-home`](./commands.md#install-home), [`github secret list` , `gh secret list`](./commands.md#github-secret-list), [`browse` , `metabrowse`](./commands.md#browse), [`package`](./commands.md#package), [`pgp pull`](./commands.md#pgp-pull), [`pgp push`](./commands.md#pgp-push), [`publish`](./commands.md#publish), [`publish local`](./commands.md#publish-local), [`publish setup`](./commands.md#publish-setup), [`repl` , `console`](./commands.md#repl), [`run`](./commands.md#run), [`github secret create` , `gh secret create`](./commands.md#github-secret-create), [`setup-ide`](./commands.md#setup-ide), [`shebang`](./commands.md#shebang), [`test`](./commands.md#test), [`uninstall`](./commands.md#uninstall), [`uninstall completions` , `uninstall-completions`](./commands.md#uninstall-completions), [`update`](./commands.md#update), [`version`](./commands.md#version) @@ -1492,7 +1492,7 @@ A github token used to access GitHub. Not needed in most cases. Available in commands: -[`about`](./commands.md#about), [`add-path`](./commands.md#add-path), [`bloop`](./commands.md#bloop), [`bloop exit`](./commands.md#bloop-exit), [`bloop output`](./commands.md#bloop-output), [`bloop start`](./commands.md#bloop-start), [`bsp`](./commands.md#bsp), [`clean`](./commands.md#clean), [`compile`](./commands.md#compile), [`config`](./commands.md#config), [`default-file`](./commands.md#default-file), [`dependency-update`](./commands.md#dependency-update), [`directories`](./commands.md#directories), [`doc`](./commands.md#doc), [`doctor`](./commands.md#doctor), [`export`](./commands.md#export), [`fmt` , `format` , `scalafmt`](./commands.md#fmt), [`install completions` , `install-completions`](./commands.md#install-completions), [`install-home`](./commands.md#install-home), [`github secret list` , `gh secret list`](./commands.md#github-secret-list), [`browse` , `metabrowse`](./commands.md#browse), [`package`](./commands.md#package), [`pgp pull`](./commands.md#pgp-pull), [`pgp push`](./commands.md#pgp-push), [`publish`](./commands.md#publish), [`publish local`](./commands.md#publish-local), [`publish setup`](./commands.md#publish-setup), [`repl` , `console`](./commands.md#repl), [`run`](./commands.md#run), [`github secret create` , `gh secret create`](./commands.md#github-secret-create), [`setup-ide`](./commands.md#setup-ide), [`shebang`](./commands.md#shebang), [`test`](./commands.md#test), [`uninstall`](./commands.md#uninstall), [`uninstall completions` , `uninstall-completions`](./commands.md#uninstall-completions), [`update`](./commands.md#update), [`version`](./commands.md#version) +[`about`](./commands.md#about), [`add-path`](./commands.md#add-path), [`bloop`](./commands.md#bloop), [`bloop exit`](./commands.md#bloop-exit), [`bloop output`](./commands.md#bloop-output), [`bloop start`](./commands.md#bloop-start), [`bsp`](./commands.md#bsp), [`clean`](./commands.md#clean), [`compile`](./commands.md#compile), [`config`](./commands.md#config), [`default-file`](./commands.md#default-file), [`dependency-update`](./commands.md#dependency-update), [`directories`](./commands.md#directories), [`doc`](./commands.md#doc), [`doctor`](./commands.md#doctor), [`export`](./commands.md#export), [`fmt` , `format` , `scalafmt`](./commands.md#fmt), [`help`](./commands.md#help), [`install completions` , `install-completions`](./commands.md#install-completions), [`install-home`](./commands.md#install-home), [`github secret list` , `gh secret list`](./commands.md#github-secret-list), [`browse` , `metabrowse`](./commands.md#browse), [`package`](./commands.md#package), [`pgp pull`](./commands.md#pgp-pull), [`pgp push`](./commands.md#pgp-push), [`publish`](./commands.md#publish), [`publish local`](./commands.md#publish-local), [`publish setup`](./commands.md#publish-setup), [`repl` , `console`](./commands.md#repl), [`run`](./commands.md#run), [`github secret create` , `gh secret create`](./commands.md#github-secret-create), [`setup-ide`](./commands.md#setup-ide), [`shebang`](./commands.md#shebang), [`test`](./commands.md#test), [`uninstall`](./commands.md#uninstall), [`uninstall completions` , `uninstall-completions`](./commands.md#uninstall-completions), [`update`](./commands.md#update), [`version`](./commands.md#version) @@ -1574,11 +1574,6 @@ Available in commands: -### `--quiet` - -Aliases: `-q` - -[Internal] ### `--title` [Internal] diff --git a/website/docs/reference/commands.md b/website/docs/reference/commands.md index c2173e55fd..6b9d011fac 100644 --- a/website/docs/reference/commands.md +++ b/website/docs/reference/commands.md @@ -10,7 +10,7 @@ sidebar_position: 3 Print details about this application -Accepts option groups: [about](./cli-options.md#about-options), [verbosity](./cli-options.md#verbosity-options) +Accepts option groups: [about](./cli-options.md#about-options), [logging](./cli-options.md#logging-options), [verbosity](./cli-options.md#verbosity-options) ## clean @@ -40,7 +40,7 @@ Accepts option groups: [compilation server](./cli-options.md#compilation-server- Print details about this application -Accepts option groups: [doctor](./cli-options.md#doctor-options), [verbosity](./cli-options.md#verbosity-options) +Accepts option groups: [doctor](./cli-options.md#doctor-options), [logging](./cli-options.md#logging-options), [verbosity](./cli-options.md#verbosity-options) ## export @@ -60,6 +60,8 @@ Accepts option groups: [compilation server](./cli-options.md#compilation-server- Print help message +Accepts option groups: [logging](./cli-options.md#logging-options), [verbosity](./cli-options.md#verbosity-options) + ## install completions Aliases: `install-completions` @@ -178,19 +180,19 @@ Accepts option groups: [logging](./cli-options.md#logging-options), [uninstall c Update scala-cli - only works when installed by the installation script -Accepts option groups: [update](./cli-options.md#update-options), [verbosity](./cli-options.md#verbosity-options) +Accepts option groups: [logging](./cli-options.md#logging-options), [update](./cli-options.md#update-options), [verbosity](./cli-options.md#verbosity-options) ## version Print `scala-cli` version -Accepts option groups: [verbosity](./cli-options.md#verbosity-options), [version](./cli-options.md#version-options) +Accepts option groups: [logging](./cli-options.md#logging-options), [verbosity](./cli-options.md#verbosity-options), [version](./cli-options.md#version-options) ## Hidden commands ### add-path -Accepts option groups: [add path](./cli-options.md#add-path-options), [verbosity](./cli-options.md#verbosity-options) +Accepts option groups: [add path](./cli-options.md#add-path-options), [logging](./cli-options.md#logging-options), [verbosity](./cli-options.md#verbosity-options) ### bloop @@ -226,13 +228,13 @@ Accepts option groups: [default file](./cli-options.md#default-file-options), [l Prints directories used by `scala-cli` -Accepts option groups: [directories](./cli-options.md#directories-options), [verbosity](./cli-options.md#verbosity-options) +Accepts option groups: [directories](./cli-options.md#directories-options), [logging](./cli-options.md#logging-options), [verbosity](./cli-options.md#verbosity-options) ### install-home Install `scala-cli` in a sub-directory of the home directory -Accepts option groups: [install home](./cli-options.md#install-home-options), [verbosity](./cli-options.md#verbosity-options) +Accepts option groups: [install home](./cli-options.md#install-home-options), [logging](./cli-options.md#logging-options), [verbosity](./cli-options.md#verbosity-options) ### browse diff --git a/website/docs/reference/scala-command/cli-options.md b/website/docs/reference/scala-command/cli-options.md index caedc3c50e..c14accfd0f 100644 --- a/website/docs/reference/scala-command/cli-options.md +++ b/website/docs/reference/scala-command/cli-options.md @@ -436,7 +436,7 @@ Port for BSP debugging Available in commands: -[`bsp`](./commands.md#bsp), [`clean`](./commands.md#clean), [`compile`](./commands.md#compile), [`dependency-update`](./commands.md#dependency-update), [`doc`](./commands.md#doc), [`fmt` , `format` , `scalafmt`](./commands.md#fmt), [`install completions` , `install-completions`](./commands.md#install-completions), [`repl` , `console`](./commands.md#repl), [`run`](./commands.md#run), [`setup-ide`](./commands.md#setup-ide), [`shebang`](./commands.md#shebang), [`test`](./commands.md#test), [`uninstall`](./commands.md#uninstall), [`uninstall completions` , `uninstall-completions`](./commands.md#uninstall-completions) +[`about`](./commands.md#about), [`bsp`](./commands.md#bsp), [`clean`](./commands.md#clean), [`compile`](./commands.md#compile), [`dependency-update`](./commands.md#dependency-update), [`doc`](./commands.md#doc), [`doctor`](./commands.md#doctor), [`fmt` , `format` , `scalafmt`](./commands.md#fmt), [`help`](./commands.md#help), [`install completions` , `install-completions`](./commands.md#install-completions), [`repl` , `console`](./commands.md#repl), [`run`](./commands.md#run), [`setup-ide`](./commands.md#setup-ide), [`shebang`](./commands.md#shebang), [`test`](./commands.md#test), [`uninstall`](./commands.md#uninstall), [`uninstall completions` , `uninstall-completions`](./commands.md#uninstall-completions), [`update`](./commands.md#update), [`version`](./commands.md#version) @@ -885,7 +885,7 @@ A github token used to access GitHub. Not needed in most cases. Available in commands: -[`about`](./commands.md#about), [`bsp`](./commands.md#bsp), [`clean`](./commands.md#clean), [`compile`](./commands.md#compile), [`dependency-update`](./commands.md#dependency-update), [`doc`](./commands.md#doc), [`doctor`](./commands.md#doctor), [`fmt` , `format` , `scalafmt`](./commands.md#fmt), [`install completions` , `install-completions`](./commands.md#install-completions), [`repl` , `console`](./commands.md#repl), [`run`](./commands.md#run), [`setup-ide`](./commands.md#setup-ide), [`shebang`](./commands.md#shebang), [`test`](./commands.md#test), [`uninstall`](./commands.md#uninstall), [`uninstall completions` , `uninstall-completions`](./commands.md#uninstall-completions), [`update`](./commands.md#update), [`version`](./commands.md#version) +[`about`](./commands.md#about), [`bsp`](./commands.md#bsp), [`clean`](./commands.md#clean), [`compile`](./commands.md#compile), [`dependency-update`](./commands.md#dependency-update), [`doc`](./commands.md#doc), [`doctor`](./commands.md#doctor), [`fmt` , `format` , `scalafmt`](./commands.md#fmt), [`help`](./commands.md#help), [`install completions` , `install-completions`](./commands.md#install-completions), [`repl` , `console`](./commands.md#repl), [`run`](./commands.md#run), [`setup-ide`](./commands.md#setup-ide), [`shebang`](./commands.md#shebang), [`test`](./commands.md#test), [`uninstall`](./commands.md#uninstall), [`uninstall completions` , `uninstall-completions`](./commands.md#uninstall-completions), [`update`](./commands.md#update), [`version`](./commands.md#version) diff --git a/website/docs/reference/scala-command/commands.md b/website/docs/reference/scala-command/commands.md index ca24a84b0d..352c88adfb 100644 --- a/website/docs/reference/scala-command/commands.md +++ b/website/docs/reference/scala-command/commands.md @@ -10,7 +10,7 @@ sidebar_position: 3 Print details about this application -Accepts option groups: [about](./cli-options.md#about-options), [verbosity](./cli-options.md#verbosity-options) +Accepts option groups: [about](./cli-options.md#about-options), [logging](./cli-options.md#logging-options), [verbosity](./cli-options.md#verbosity-options) ## clean @@ -40,7 +40,7 @@ Accepts option groups: [compilation server](./cli-options.md#compilation-server- Print details about this application -Accepts option groups: [doctor](./cli-options.md#doctor-options), [verbosity](./cli-options.md#verbosity-options) +Accepts option groups: [doctor](./cli-options.md#doctor-options), [logging](./cli-options.md#logging-options), [verbosity](./cli-options.md#verbosity-options) ## fmt @@ -54,6 +54,8 @@ Accepts option groups: [compilation server](./cli-options.md#compilation-server- Print help message +Accepts option groups: [logging](./cli-options.md#logging-options), [verbosity](./cli-options.md#verbosity-options) + ## install completions Aliases: `install-completions` @@ -142,13 +144,13 @@ Accepts option groups: [logging](./cli-options.md#logging-options), [uninstall c Update scala-cli - only works when installed by the installation script -Accepts option groups: [update](./cli-options.md#update-options), [verbosity](./cli-options.md#verbosity-options) +Accepts option groups: [logging](./cli-options.md#logging-options), [update](./cli-options.md#update-options), [verbosity](./cli-options.md#verbosity-options) ## version Print `scala-cli` version -Accepts option groups: [verbosity](./cli-options.md#verbosity-options), [version](./cli-options.md#version-options) +Accepts option groups: [logging](./cli-options.md#logging-options), [verbosity](./cli-options.md#verbosity-options), [version](./cli-options.md#version-options) ## Hidden commands