1
1
import $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 `
3
3
import $ivy .`io.github.alexarchambault.mill::mill-native-image::0.1.21`
4
4
import $ivy .`io.github.alexarchambault.mill::mill-native-image-upload:0.1.21`
5
5
6
+ import de .tobiasroeser .mill .vcs .version ._
6
7
import io .github .alexarchambault .millnativeimage .NativeImage
7
8
import io .github .alexarchambault .millnativeimage .upload .Upload
8
- import io .kipp .mill .ci .release .CiReleaseModule
9
9
import mill ._
10
10
import mill .contrib .jmh .JmhModule
11
11
import mill .scalalib ._
12
12
import mill .scalalib .publish .PublishInfo
13
13
14
14
import java .io .File
15
15
16
+ import scala .concurrent .duration .{Duration , DurationInt }
17
+
16
18
object Dependencies {
17
19
def scala212 = " 2.12.18"
18
20
def scala213 = " 2.13.12"
@@ -83,8 +85,138 @@ object Dependencies {
83
85
def graalVmId = s " graalvm-java17: $graalvmVersion"
84
86
}
85
87
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 {
88
220
import mill .scalalib .publish ._
89
221
def pomSettings = PomSettings (
90
222
description = artifactName(),
@@ -96,7 +228,8 @@ trait PublishModule extends CiReleaseModule with PublishLocalNoFluff {
96
228
Developer (" alexarchambault" , " Alex Archambault" , " https://github.com/alexarchambault" )
97
229
)
98
230
)
99
- override def sonatypeHost = Some (SonatypeHost .s01)
231
+ def publishVersion =
232
+ internal.finalPublishVersion()
100
233
}
101
234
102
235
trait BloopCrossSbtModule extends CrossSbtModule {
@@ -150,7 +283,7 @@ trait PublishLocalNoFluff extends mill.scalalib.PublishModule {
150
283
}
151
284
152
285
object 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 {
154
287
def artifactName = " bloop-shared"
155
288
def compileIvyDeps = super .compileIvyDeps() ++ Agg (
156
289
Dependencies .jsoniterMacros
@@ -175,7 +308,7 @@ class Shared(val crossScalaVersion: String) extends BloopCrossSbtModule with Pub
175
308
}
176
309
177
310
object 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 {
179
312
def artifactName = " bloop-backend"
180
313
def moduleDeps = super .moduleDeps ++ Seq (
181
314
shared()
@@ -231,7 +364,7 @@ def escapePath(path: os.Path): String =
231
364
path.toString.replace(" \\ " , " \\\\ " )
232
365
233
366
object 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 {
235
368
def artifactName = " bloop-frontend"
236
369
def moduleDeps = super .moduleDeps ++ Seq (
237
370
backend()
@@ -358,7 +491,7 @@ class Frontend(val crossScalaVersion: String) extends BloopCrossSbtModule with P
358
491
object `buildpress-config` extends Cross [BuildpressConfig ](Dependencies .scalaVersions: _* )
359
492
class BuildpressConfig (val crossScalaVersion : String )
360
493
extends BloopCrossSbtModule
361
- with PublishModule {
494
+ with BloopPublish {
362
495
def compileIvyDeps = super .compileIvyDeps() ++ Agg (
363
496
Dependencies .jsoniterMacros
364
497
)
@@ -377,7 +510,7 @@ class BuildpressConfig(val crossScalaVersion: String)
377
510
378
511
object bridges extends Module {
379
512
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 {
381
514
def artifactName = " bloop-js-bridge-1"
382
515
def compileModuleDeps = super .compileModuleDeps ++ Seq (
383
516
frontend(),
@@ -408,7 +541,7 @@ object bridges extends Module {
408
541
object `scala-native-04` extends Cross [ScalaNative04 ](Dependencies .scalaVersions: _* )
409
542
class ScalaNative04 (val crossScalaVersion : String )
410
543
extends BloopCrossSbtModule
411
- with PublishModule {
544
+ with BloopPublish {
412
545
def artifactName = " bloop-native-bridge-0-4"
413
546
414
547
private def updateSources (originalSources : Seq [PathRef ]): Seq [PathRef ] =
@@ -507,7 +640,7 @@ class Benchmarks(val crossScalaVersion: String) extends BloopCrossSbtModule with
507
640
}
508
641
}
509
642
510
- trait BloopCliModule extends ScalaModule with PublishModule {
643
+ trait BloopCliModule extends ScalaModule with BloopPublish {
511
644
def javacOptions = super .javacOptions() ++ Seq (
512
645
" --release" ,
513
646
" 16"
0 commit comments