Skip to content

Commit c461b0d

Browse files
Merge branch 'main' into feat/watch-clear-screen
2 parents 7f689d0 + e017d40 commit c461b0d

32 files changed

Lines changed: 918 additions & 313 deletions

.github/workflows/publish-docker.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,7 @@ jobs:
8181
touch "/tmp/digests/${digest#sha256:}"
8282
8383
- name: Upload digest
84-
uses: actions/upload-artifact@v5
84+
uses: actions/upload-artifact@v6
8585
with:
8686
name: digests-${{ matrix.os }}
8787
path: /tmp/digests/*
@@ -99,7 +99,7 @@ jobs:
9999
if: github.event_name != 'pull_request' && (startsWith(github.ref, 'refs/tags/v') || github.ref == 'refs/heads/main')
100100
steps:
101101
- name: Download digests
102-
uses: actions/download-artifact@v6
102+
uses: actions/download-artifact@v7
103103
with:
104104
pattern: digests-*
105105
path: /tmp/digests

build.mill.scala

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ import java.util.Locale
3636
import de.tobiasroeser.mill.vcs.version.VcsVersion
3737
import io.github.alexarchambault.millnativeimage.upload.Upload
3838
import mill._
39-
import mill.api.{BuildCtx, Loose}
39+
import mill.api.{BuildCtx, BuildInfo, Loose}
4040
import scalalib.{publish => _, _}
4141
import mill.contrib.bloop.Bloop
4242
import mill.define.Task.Simple
@@ -492,7 +492,7 @@ trait Core extends ScalaCliCrossSbtModule
492492
|
493493
| def ammoniteVersion = "${Deps.Versions.ammonite}"
494494
| def ammoniteVersionForScala3Lts = "${Deps.Versions.ammoniteForScala3Lts}"
495-
| def millVersion = "${_root_.mill.main.BuildInfo.millVersion}"
495+
| def millVersion = "${BuildInfo.millVersion}"
496496
| def maxScalaNativeForMillExport = "${Deps.Versions.maxScalaNativeForMillExport}"
497497
|
498498
| def scalafmtOrganization = "${Deps.scalafmtCli.dep.module.organization.value}"
@@ -841,6 +841,13 @@ trait Cli extends CrossSbtModule with ProtoBuildModule with CliLaunchers
841841
| def defaultGraalVMVersion = "${deps.graalVmVersion}"
842842
| def scalaPyVersion = "${Deps.scalaPy.dep.versionConstraint.asString}"
843843
| def signingCliJvmVersion = ${Deps.Versions.signingCliJvmVersion}
844+
| def defaultMillVersion = "${BuildInfo.millVersion}"
845+
| def mill012Version = "${Deps.Versions.mill012Version}"
846+
| def mill10Version = "${Deps.Versions.mill10Version}"
847+
| def defaultSbtVersion = "${Deps.Versions.sbtVersion}"
848+
| def defaultMavenVersion = "${Deps.Versions.mavenVersion}"
849+
| def defaultMavenScalaCompilerPluginVersion = "${Deps.Versions.mavenScalaCompilerPluginVersion}"
850+
| def defaultMavenExecPluginVersion = "${Deps.Versions.mavenExecPluginVersion}"
844851
|}
845852
|""".stripMargin
846853
if (!os.isFile(dest) || os.read(dest) != code)
@@ -1089,6 +1096,9 @@ trait CliIntegration extends SbtModule with ScalaCliPublishModule with HasTests
10891096
| def jmhOrg = "${Deps.jmhCore.dep.module.organization.value}"
10901097
| def jmhCoreModule = "${Deps.jmhCore.dep.module.name.value}"
10911098
| def jmhGeneratorBytecodeModule = "${Deps.jmhGeneratorBytecode.dep.module.name.value}"
1099+
| def defaultMillVersion = "${BuildInfo.millVersion}"
1100+
| def mill012Version = "${Deps.Versions.mill012Version}"
1101+
| def mill10Version = "${Deps.Versions.mill10Version}"
10921102
|}
10931103
|""".stripMargin
10941104
if (!os.isFile(dest) || os.read(dest) != code)

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

Lines changed: 31 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -98,11 +98,12 @@ object Export extends ScalaCommand[ExportOptions] {
9898
def millProjectDescriptor(
9999
cache: FileCache[Task],
100100
projectName: Option[String],
101+
millVersion: String,
101102
logger: Logger
102103
): MillProjectDescriptor = {
103104
val launcherArtifacts = Seq(
104-
os.rel / "mill" -> s"https://github.com/com-lihaoyi/mill/raw/${Constants.millVersion}/mill",
105-
os.rel / "mill.bat" -> s"https://github.com/com-lihaoyi/mill/raw/${Constants.millVersion}/mill.bat"
105+
os.rel / "mill" -> s"https://github.com/com-lihaoyi/mill/raw/$millVersion/mill",
106+
os.rel / "mill.bat" -> s"https://github.com/com-lihaoyi/mill/raw/$millVersion/mill.bat"
106107
)
107108
val launcherTasks = launcherArtifacts.map {
108109
case (path, url) =>
@@ -117,7 +118,12 @@ object Export extends ScalaCommand[ExportOptions] {
117118
}
118119
val launchersTask = cache.logger.using(Task.gather.gather(launcherTasks))
119120
val launchers = launchersTask.unsafeRun()(using cache.ec)
120-
MillProjectDescriptor(Constants.millVersion, projectName, launchers, logger)
121+
MillProjectDescriptor(
122+
millVersion = millVersion,
123+
projectName = projectName,
124+
launchers = launchers,
125+
logger = logger
126+
)
121127
}
122128

123129
def jsonProjectDescriptor(
@@ -261,21 +267,30 @@ object Export extends ScalaCommand[ExportOptions] {
261267
sbtProjectDescriptor(options.sbtSetting.map(_.trim).filter(_.nonEmpty), sbtVersion, logger)
262268

263269
val projectDescriptor =
264-
if (shouldExportToMill)
265-
millProjectDescriptor(options.shared.coursierCache, options.project, logger)
266-
else if (shouldExportToMaven)
270+
if shouldExportToMill then
271+
millProjectDescriptor(
272+
cache = options.shared.coursierCache,
273+
projectName = options.project,
274+
millVersion = options.millVersion.getOrElse(Constants.millVersion),
275+
logger = logger
276+
)
277+
else if shouldExportToMaven then
267278
mavenProjectDescriptor(
268-
defaultMavenCompilerVersion,
269-
defaultScalaMavenCompilerVersion,
270-
defaultMavenExecPluginVersion,
271-
Nil,
272-
defaultMavenGroupId,
273-
defaultMavenArtifactId,
274-
defaultMavenVersion,
275-
logger
279+
mavenPluginVersion = defaultMavenCompilerVersion,
280+
mavenScalaPluginVersion = defaultScalaMavenCompilerVersion,
281+
mavenExecPluginVersion = defaultMavenExecPluginVersion,
282+
extraSettings = Nil,
283+
mavenGroupId = defaultMavenGroupId,
284+
mavenArtifactId = defaultMavenArtifactId,
285+
mavenVersion = defaultMavenVersion,
286+
logger = logger
287+
)
288+
else if shouldExportToJson then
289+
jsonProjectDescriptor(
290+
projectName = options.project,
291+
workspace = inputs.workspace,
292+
logger = logger
276293
)
277-
else if (shouldExportToJson)
278-
jsonProjectDescriptor(options.project, inputs.workspace, logger)
279294
else // shouldExportToSbt isn't checked, as it's treated as default
280295
sbtProjectDescriptor0
281296

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

Lines changed: 30 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -10,63 +10,74 @@ import scala.cli.commands.shared.{
1010
MainClassOptions,
1111
SharedOptions
1212
}
13-
import scala.cli.commands.tags
13+
import scala.cli.commands.{Constants, tags}
1414

15-
// format: off
1615
@HelpMessage(ExportOptions.helpMessage, "", ExportOptions.detailedHelpMessage)
1716
final case class ExportOptions(
1817
// FIXME There might be too many options for 'scala-cli export' there
1918
@Recurse
20-
shared: SharedOptions = SharedOptions(),
19+
shared: SharedOptions = SharedOptions(),
2120
@Recurse
22-
mainClass: MainClassOptions = MainClassOptions(),
23-
21+
mainClass: MainClassOptions = MainClassOptions(),
2422
@Group(HelpGroup.BuildToolExport.toString)
2523
@Tag(tags.restricted)
2624
@Tag(tags.inShortHelp)
2725
@HelpMessage("Sets the export format to SBT")
28-
sbt: Option[Boolean] = None,
26+
sbt: Option[Boolean] = None,
2927
@Group(HelpGroup.BuildToolExport.toString)
3028
@Tag(tags.experimental)
3129
@Tag(tags.inShortHelp)
3230
@HelpMessage("Sets the export format to Maven")
3331
@Name("mvn")
34-
maven: Option[Boolean] = None,
32+
maven: Option[Boolean] = None,
3533
@Group(HelpGroup.BuildToolExport.toString)
3634
@Tag(tags.restricted)
3735
@Tag(tags.inShortHelp)
3836
@HelpMessage("Sets the export format to Mill")
39-
mill: Option[Boolean] = None,
37+
mill: Option[Boolean] = None,
4038
@Tag(tags.restricted)
4139
@Tag(tags.inShortHelp)
4240
@Group(HelpGroup.BuildToolExport.toString)
4341
@HelpMessage("Sets the export format to Json")
44-
json: Option[Boolean] = None,
45-
42+
json: Option[Boolean] = None,
4643
@Name("setting")
4744
@Group(HelpGroup.BuildToolExport.toString)
4845
@Tag(tags.restricted)
49-
sbtSetting: List[String] = Nil,
46+
sbtSetting: List[String] = Nil,
5047
@Name("p")
5148
@Group(HelpGroup.BuildToolExport.toString)
5249
@Tag(tags.restricted)
5350
@HelpMessage("Project name to be used on Mill build file")
54-
project: Option[String] = None,
51+
project: Option[String] = None,
52+
@Group(HelpGroup.BuildToolExport.toString)
53+
@Tag(tags.restricted)
54+
@HelpMessage(
55+
s"Version of SBT to be used for the export (${Constants.defaultSbtVersion} by default)"
56+
)
57+
sbtVersion: Option[String] = None,
5558
@Group(HelpGroup.BuildToolExport.toString)
5659
@Tag(tags.restricted)
57-
@HelpMessage("Version of SBT to be used for the export")
58-
sbtVersion: Option[String] = None,
60+
@HelpMessage(
61+
s"Version of Mill to be used for the export (${Constants.defaultMillVersion} by default)"
62+
)
63+
millVersion: Option[String] = None,
5964
@Group(HelpGroup.BuildToolExport.toString)
6065
@Tag(tags.experimental)
61-
@HelpMessage("Version of Maven Compiler Plugin to be used for the export")
62-
mvnVersion: Option[String] = None,
66+
@HelpMessage(
67+
s"Version of Maven Compiler Plugin to be used for the export (${Constants.defaultMavenVersion} by default)"
68+
)
69+
mvnVersion: Option[String] = None,
6370
@Group(HelpGroup.BuildToolExport.toString)
6471
@Tag(tags.experimental)
65-
@HelpMessage("Version of Maven Scala Plugin to be used for the export")
72+
@HelpMessage(
73+
s"Version of Maven Scala Plugin to be used for the export (${Constants.defaultMavenScalaCompilerPluginVersion} by default)"
74+
)
6675
mvnScalaVersion: Option[String] = None,
6776
@Group(HelpGroup.BuildToolExport.toString)
6877
@Tag(tags.experimental)
69-
@HelpMessage("Version of Maven Exec Plugin to be used for the export")
78+
@HelpMessage(
79+
s"Version of Maven Exec Plugin to be used for the export (${Constants.defaultMavenExecPluginVersion} by default)"
80+
)
7081
mvnExecPluginVersion: Option[String] = None,
7182
@Group(HelpGroup.BuildToolExport.toString)
7283
@Tag(tags.experimental)
@@ -83,9 +94,8 @@ final case class ExportOptions(
8394
@Name("o")
8495
@Group(HelpGroup.BuildToolExport.toString)
8596
@Tag(tags.restricted)
86-
output: Option[String] = None,
97+
output: Option[String] = None
8798
) extends HasSharedOptions
88-
// format: on
8999
object ExportOptions {
90100
implicit lazy val parser: Parser[ExportOptions] = Parser.derive
91101
implicit lazy val help: Help[ExportOptions] = Help.derive

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

Lines changed: 30 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ final case class MillProject(
2727
extraTestDecls: Seq[String] = Nil,
2828
mainClass: Option[String] = None
2929
) extends Project {
30+
private lazy val isMill1OrNewer: Boolean = !millVersion.exists(_.startsWith("0."))
3031

3132
def +(other: MillProject): MillProject =
3233
MillProject.monoid.orElse(this, other)
@@ -82,24 +83,37 @@ final case class MillProject(
8283
Some(s"""def scalacOptions = super.scalacOptions() ++ Seq($optsString)""")
8384
}
8485
def maybeDeps(deps: Seq[String], isCompileOnly: Boolean = false) = {
85-
val depsDefinition = if (isCompileOnly)
86-
Seq("def compileIvyDeps = super.compileIvyDeps() ++ Seq(")
87-
else Seq("def ivyDeps = super.ivyDeps() ++ Seq(")
88-
if (deps.isEmpty) Seq.empty[String]
86+
val depsDefinition = isCompileOnly -> isMill1OrNewer match {
87+
case (true, true) => Seq("def compileMvnDeps = super.compileMvnDeps() ++ Seq(")
88+
case (true, false) => Seq("def compileIvyDeps = super.compileIvyDeps() ++ Seq(")
89+
case (false, true) => Seq("def mvnDeps = super.mvnDeps() ++ Seq(")
90+
case (false, false) => Seq("def ivyDeps = super.ivyDeps() ++ Seq(")
91+
}
92+
if deps.isEmpty then Seq.empty[String]
8993
else
9094
depsDefinition ++
9195
deps
92-
.map(dep => """ ivy"""" + dep + "\"")
96+
.map {
97+
case dep if isMill1OrNewer => s""" mvn"$dep""""
98+
case dep => s""" ivy"$dep""""
99+
}
93100
.appendOnInit(",") ++
94101
Seq(")")
95102
}
96103

97104
val maybeScalaCompilerPlugins =
98-
if (scalaCompilerPlugins.isEmpty) Seq.empty
105+
if scalaCompilerPlugins.isEmpty then Seq.empty
99106
else
100-
Seq("def scalacPluginIvyDeps = super.scalacPluginIvyDeps() ++ Seq(") ++
107+
Seq(
108+
if isMill1OrNewer
109+
then "def scalacPluginMvnDeps = super.scalacPluginMvnDeps() ++ Seq("
110+
else "def scalacPluginIvyDeps = super.scalacPluginIvyDeps() ++ Seq("
111+
) ++
101112
scalaCompilerPlugins
102-
.map(dep => s" ivy\"$dep\"")
113+
.map {
114+
case dep if isMill1OrNewer => s" mvn\"$dep\""
115+
case dep => s" ivy\"$dep\""
116+
}
103117
.appendOnInit(",")
104118
++ Seq(")")
105119

@@ -110,7 +124,11 @@ final case class MillProject(
110124
if (resourcesDirs.isEmpty) Nil
111125
else {
112126
val resources =
113-
resourcesDirs.map(p => s"""T.workspace / os.RelPath("${p.relativeTo(dir)}")""")
127+
resourcesDirs.map {
128+
case p if isMill1OrNewer =>
129+
s"""mill.api.BuildCtx.workspaceRoot / os.RelPath("${p.relativeTo(dir)}")"""
130+
case p => s"""T.workspace / os.RelPath("${p.relativeTo(dir)}")"""
131+
}
114132
Seq("def runClasspath = super.runClasspath() ++ Seq(") ++
115133
resources.map(resource => s" $resource").appendOnInit(",") ++
116134
Seq(").map(PathRef(_))")
@@ -128,7 +146,7 @@ final case class MillProject(
128146
extraTestDecls.map(s => s" $s") ++ Seq(" }")
129147
else Seq.empty
130148

131-
val buildSc: String = {
149+
val buildFileContent: String = {
132150
val parts: Seq[String] = Seq(
133151
"import mill._",
134152
"import mill.scalalib._"
@@ -158,7 +176,8 @@ final case class MillProject(
158176
os.write(path0, content, createFolders = true)
159177
}
160178

161-
os.write(dir / "build.sc", buildSc.getBytes(charSet))
179+
val outputBuildFile = if isMill1OrNewer then dir / "build.mill.scala" else dir / "build.sc"
180+
os.write(outputBuildFile, buildFileContent.getBytes(charSet))
162181
}
163182
}
164183

0 commit comments

Comments
 (0)