11import $ivy .`com.lihaoyi::mill-contrib-jmh:$MILL_VERSION`
2- import $ivy .`io.chris-kipp:: mill-ci-release ::0.1.9 `
2+ import $ivy .`de.tototec::de.tobiasroeser. mill.vcs.version ::0.4.0 `
33import $ivy .`io.github.alexarchambault.mill::mill-native-image::0.1.21`
44import $ivy .`io.github.alexarchambault.mill::mill-native-image-upload:0.1.21`
55
6+ import de .tobiasroeser .mill .vcs .version ._
67import io .github .alexarchambault .millnativeimage .NativeImage
78import io .github .alexarchambault .millnativeimage .upload .Upload
8- import io .kipp .mill .ci .release .CiReleaseModule
99import mill ._
1010import mill .contrib .jmh .JmhModule
1111import mill .scalalib ._
1212import mill .scalalib .publish .PublishInfo
1313
1414import java .io .File
1515
16+ import scala .concurrent .duration .{Duration , DurationInt }
17+
1618object Dependencies {
1719 def scala212 = " 2.12.18"
1820 def scala213 = " 2.13.12"
@@ -83,8 +85,138 @@ object Dependencies {
8385 def graalVmId = s " graalvm-java17: $graalvmVersion"
8486}
8587
86- trait PublishModule extends CiReleaseModule with PublishLocalNoFluff {
87- import io .kipp .mill .ci .release .SonatypeHost
88+ object internal extends Module {
89+ private def computePublishVersion (state : VcsState , simple : Boolean ): String =
90+ if (state.commitsSinceLastTag > 0 )
91+ if (simple) {
92+ val versionOrEmpty = state.lastTag
93+ .filter(_ != " latest" )
94+ .filter(_ != " nightly" )
95+ .map(_.stripPrefix(" v" ))
96+ .flatMap { tag =>
97+ if (simple) {
98+ val idx = tag.lastIndexOf(" ." )
99+ if (idx >= 0 ) {
100+ val (num, rest) = {
101+ val incrPart = tag.drop(idx + 1 )
102+ val idx0 = incrPart.indexWhere(! _.isDigit)
103+ assert(idx0 > 0 )
104+ (incrPart.take(idx0).toInt, incrPart.drop(idx0))
105+ }
106+ Some (tag.take(idx + 1 ) + (num + 1 ).toString + rest + " -SNAPSHOT" )
107+ }
108+ else
109+ None
110+ }
111+ else {
112+ val idx = tag.indexOf(" -" )
113+ if (idx >= 0 ) Some (tag.take(idx) + " +" + tag.drop(idx + 1 ) + " -SNAPSHOT" )
114+ else None
115+ }
116+ }
117+ .getOrElse(" 0.0.1-SNAPSHOT" )
118+ Some (versionOrEmpty)
119+ .filter(_.nonEmpty)
120+ .getOrElse(state.format())
121+ }
122+ else {
123+ val rawVersion = os.proc(" git" , " describe" , " --tags" ).call().out.text().trim
124+ .stripPrefix(" v" )
125+ .replace(" latest" , " 0.0.0" )
126+ .replace(" nightly" , " 0.0.0" )
127+ val idx = rawVersion.indexOf(" -" )
128+ if (idx >= 0 ) rawVersion.take(idx) + " +" + rawVersion.drop(idx + 1 ) + " -SNAPSHOT"
129+ else rawVersion
130+ }
131+ else {
132+ val fromTag = state
133+ .lastTag
134+ .getOrElse(state.format())
135+ .stripPrefix(" v" )
136+ if (fromTag == " 0.0.0" ) " 0.0.1-SNAPSHOT"
137+ else fromTag
138+ }
139+
140+ def finalPublishVersion = {
141+ val isCI = System .getenv(" CI" ) != null
142+ if (isCI)
143+ T .persistent {
144+ val state = VcsVersion .vcsState()
145+ computePublishVersion(state, simple = false )
146+ }
147+ else
148+ T {
149+ val state = VcsVersion .vcsState()
150+ computePublishVersion(state, simple = true )
151+ }
152+ }
153+
154+ def publishSonatype (tasks : mill.main.Tasks [PublishModule .PublishData ]) =
155+ T .command {
156+ val timeout = 10 .minutes
157+ val credentials = sys.env(" SONATYPE_USERNAME" ) + " :" + sys.env(" SONATYPE_PASSWORD" )
158+ val pgpPassword = sys.env(" PGP_PASSWORD" )
159+ val data = define.Target .sequence(tasks.value)()
160+
161+ doPublishSonatype(
162+ credentials = credentials,
163+ pgpPassword = pgpPassword,
164+ data = data,
165+ timeout = timeout,
166+ log = T .ctx().log
167+ )
168+ }
169+
170+ private def doPublishSonatype (
171+ credentials : String ,
172+ pgpPassword : String ,
173+ data : Seq [PublishModule .PublishData ],
174+ timeout : Duration ,
175+ log : mill.api.Logger
176+ ): Unit = {
177+
178+ val artifacts = data.map {
179+ case PublishModule .PublishData (a, s) =>
180+ (s.map { case (p, f) => (p.path, f) }, a)
181+ }
182+
183+ val isRelease = {
184+ val versions = artifacts.map(_._2.version).toSet
185+ val set = versions.map(! _.endsWith(" -SNAPSHOT" ))
186+ assert(
187+ set.size == 1 ,
188+ s " Found both snapshot and non-snapshot versions: ${versions.toVector.sorted.mkString(" , " )}"
189+ )
190+ set.head
191+ }
192+ val publisher = new publish.SonatypePublisher (
193+ uri = " https://oss.sonatype.org/service/local" ,
194+ snapshotUri = " https://oss.sonatype.org/content/repositories/snapshots" ,
195+ credentials = credentials,
196+ signed = true ,
197+ gpgArgs = Seq (
198+ " --detach-sign" ,
199+ " --batch=true" ,
200+ " --yes" ,
201+ " --pinentry-mode" ,
202+ " loopback" ,
203+ " --passphrase" ,
204+ pgpPassword,
205+ " --armor" ,
206+ " --use-agent"
207+ ),
208+ readTimeout = timeout.toMillis.toInt,
209+ connectTimeout = timeout.toMillis.toInt,
210+ log = log,
211+ awaitTimeout = timeout.toMillis.toInt,
212+ stagingRelease = isRelease
213+ )
214+
215+ publisher.publishAll(isRelease, artifacts : _* )
216+ }
217+ }
218+
219+ trait BloopPublish extends PublishModule with PublishLocalNoFluff {
88220 import mill .scalalib .publish ._
89221 def pomSettings = PomSettings (
90222 description = artifactName(),
@@ -96,7 +228,8 @@ trait PublishModule extends CiReleaseModule with PublishLocalNoFluff {
96228 Developer (" alexarchambault" , " Alex Archambault" , " https://github.com/alexarchambault" )
97229 )
98230 )
99- override def sonatypeHost = Some (SonatypeHost .s01)
231+ def publishVersion =
232+ internal.finalPublishVersion()
100233}
101234
102235trait BloopCrossSbtModule extends CrossSbtModule {
@@ -150,7 +283,7 @@ trait PublishLocalNoFluff extends mill.scalalib.PublishModule {
150283}
151284
152285object shared extends Cross [Shared ](Dependencies .scalaVersions: _* )
153- class Shared (val crossScalaVersion : String ) extends BloopCrossSbtModule with PublishModule {
286+ class Shared (val crossScalaVersion : String ) extends BloopCrossSbtModule with BloopPublish {
154287 def artifactName = " bloop-shared"
155288 def compileIvyDeps = super .compileIvyDeps() ++ Agg (
156289 Dependencies .jsoniterMacros
@@ -175,7 +308,7 @@ class Shared(val crossScalaVersion: String) extends BloopCrossSbtModule with Pub
175308}
176309
177310object backend extends Cross [Backend ](Dependencies .scalaVersions: _* )
178- class Backend (val crossScalaVersion : String ) extends BloopCrossSbtModule with PublishModule {
311+ class Backend (val crossScalaVersion : String ) extends BloopCrossSbtModule with BloopPublish {
179312 def artifactName = " bloop-backend"
180313 def moduleDeps = super .moduleDeps ++ Seq (
181314 shared()
@@ -231,7 +364,7 @@ def escapePath(path: os.Path): String =
231364 path.toString.replace(" \\ " , " \\\\ " )
232365
233366object frontend extends Cross [Frontend ](Dependencies .scalaVersions: _* )
234- class Frontend (val crossScalaVersion : String ) extends BloopCrossSbtModule with PublishModule {
367+ class Frontend (val crossScalaVersion : String ) extends BloopCrossSbtModule with BloopPublish {
235368 def artifactName = " bloop-frontend"
236369 def moduleDeps = super .moduleDeps ++ Seq (
237370 backend()
@@ -358,7 +491,7 @@ class Frontend(val crossScalaVersion: String) extends BloopCrossSbtModule with P
358491object `buildpress-config` extends Cross [BuildpressConfig ](Dependencies .scalaVersions: _* )
359492class BuildpressConfig (val crossScalaVersion : String )
360493 extends BloopCrossSbtModule
361- with PublishModule {
494+ with BloopPublish {
362495 def compileIvyDeps = super .compileIvyDeps() ++ Agg (
363496 Dependencies .jsoniterMacros
364497 )
@@ -377,7 +510,7 @@ class BuildpressConfig(val crossScalaVersion: String)
377510
378511object bridges extends Module {
379512 object `scalajs-1` extends Cross [Scalajs1 ](Dependencies .scalaVersions: _* )
380- class Scalajs1 (val crossScalaVersion : String ) extends BloopCrossSbtModule with PublishModule {
513+ class Scalajs1 (val crossScalaVersion : String ) extends BloopCrossSbtModule with BloopPublish {
381514 def artifactName = " bloop-js-bridge-1"
382515 def compileModuleDeps = super .compileModuleDeps ++ Seq (
383516 frontend(),
@@ -408,7 +541,7 @@ object bridges extends Module {
408541 object `scala-native-04` extends Cross [ScalaNative04 ](Dependencies .scalaVersions: _* )
409542 class ScalaNative04 (val crossScalaVersion : String )
410543 extends BloopCrossSbtModule
411- with PublishModule {
544+ with BloopPublish {
412545 def artifactName = " bloop-native-bridge-0-4"
413546
414547 private def updateSources (originalSources : Seq [PathRef ]): Seq [PathRef ] =
@@ -507,7 +640,7 @@ class Benchmarks(val crossScalaVersion: String) extends BloopCrossSbtModule with
507640 }
508641}
509642
510- trait BloopCliModule extends ScalaModule with PublishModule {
643+ trait BloopCliModule extends ScalaModule with BloopPublish {
511644 def javacOptions = super .javacOptions() ++ Seq (
512645 " --release" ,
513646 " 16"
0 commit comments