Skip to content

Commit 0b0a7b7

Browse files
authored
Merge pull request #120 from MasseGuillaume/latest-scala
Script to scrape the latest Scala 2.13 version from artifactory
2 parents cd2aaeb + a067305 commit 0b0a7b7

File tree

4 files changed

+84
-17
lines changed

4 files changed

+84
-17
lines changed

build.sbt

Lines changed: 26 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -29,9 +29,21 @@ lazy val root = project
2929

3030
lazy val junit = libraryDependencies += "com.novocode" % "junit-interface" % "0.11" % Test
3131

32-
lazy val scala211 = "2.11.12"
33-
lazy val scala212 = "2.12.6"
32+
lazy val scala211 = "2.11.12"
33+
lazy val scala212 = "2.12.6"
34+
lazy val scalaJs213 = "2.13.0-M4" // Scala.js does no have -pre
35+
36+
37+
3438
lazy val scala213 = "2.13.0-M4"
39+
// lazy val scala213 = "2.13.0-pre-3ae6282" // use the sbt command `latest-213` to fetch the latest version
40+
41+
42+
43+
lazy val scala213Settings = Seq(
44+
resolvers += "scala-pr" at "https://scala-ci.typesafe.com/artifactory/scala-integration/",
45+
scalaVersion := scala213
46+
)
3547

3648
lazy val compat = MultiScalaCrossProject(JSPlatform, JVMPlatform)("compat",
3749
_.settings(scalaModuleSettings)
@@ -82,7 +94,7 @@ lazy val compat = MultiScalaCrossProject(JSPlatform, JVMPlatform)("compat",
8294

8395
val compat211 = compat(scala211)
8496
val compat212 = compat(scala212)
85-
val compat213 = compat(scala213)
97+
val compat213 = compat(scala213, scalaJs213, _.jvmSettings(scala213Settings))
8698

8799
lazy val compat211JVM = compat211.jvm
88100
lazy val compat211JS = compat211.js
@@ -150,7 +162,7 @@ lazy val `scalafix-data` = MultiScalaProject("scalafix-data", "scalafix/data",
150162

151163
val `scalafix-data211` = `scalafix-data`(scala211, _.dependsOn(compat211JVM))
152164
val `scalafix-data212` = `scalafix-data`(scalafixScala212, _.dependsOn(compat212JVM))
153-
val `scalafix-data213` = `scalafix-data`(scala213, _.dependsOn(compat213JVM))
165+
val `scalafix-data213` = `scalafix-data`(scala213, _.settings(scala213Settings).dependsOn(compat213JVM))
154166

155167
lazy val `scalafix-input` = project
156168
.in(file("scalafix/input"))
@@ -176,7 +188,12 @@ lazy val addOutput213 = unmanagedSourceDirectories in Compile += output213.value
176188

177189
lazy val `scalafix-output211` = `scalafix-output`(scala211, _.dependsOn(`scalafix-data211`))
178190
lazy val `scalafix-output212` = `scalafix-output`(scala212, _.settings(addOutput212).dependsOn(`scalafix-data212`))
179-
lazy val `scalafix-output213` = `scalafix-output`(scala213, _.settings(addOutput213).dependsOn(`scalafix-data213`))
191+
lazy val `scalafix-output213` = `scalafix-output`(
192+
scala213,
193+
_.settings(addOutput213)
194+
.settings(scala213Settings)
195+
.dependsOn(`scalafix-data213`)
196+
)
180197

181198
lazy val `scalafix-output213-failure` = project
182199
.in(file("scalafix/output213-failure"))
@@ -216,11 +233,6 @@ lazy val dontPublish = Seq(
216233
publishLocal := {}
217234
)
218235

219-
lazy val scala213Settings = Seq(
220-
resolvers += "scala-pr" at "https://scala-ci.typesafe.com/artifactory/scala-integration/",
221-
scalaVersion := scala213
222-
)
223-
224236
val preRelease = "pre-release"
225237
val travisScalaVersion = sys.env.get("TRAVIS_SCALA_VERSION").flatMap(Version.parse)
226238
val releaseVersion = sys.env.get("TRAVIS_TAG").flatMap(Version.parse)
@@ -249,6 +261,10 @@ inThisBuild(releaseCredentials)
249261
// required by sbt-scala-module
250262
inThisBuild(Seq(
251263
crossScalaVersions := Seq(scala211, scala212, scala213),
264+
commands += Command.command("latest-213") { state =>
265+
LatestScala.printLatestScala213()
266+
state
267+
},
252268
commands += Command.command(preRelease) { state =>
253269
// Show Compat version, Scala version, and Java Version
254270
val jvmVersion = Version.parse(sys.props("java.specification.version")).get.minor

project/LatestScala213.scala

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
import org.jsoup.Jsoup
2+
import com.github.nscala_time.time.Imports._
3+
4+
import java.nio.file._
5+
import java.net.URL
6+
7+
// Fetch the latest Scala 2.13 by scraping the artifactory web directory
8+
// We just search the latest version by date
9+
// run the command: latest-213 in sbt
10+
// NB. maven-metadata.xml does not point to the latest version
11+
object LatestScala {
12+
13+
def printLatestScala213(): Unit = {
14+
val url = "https://scala-ci.typesafe.com/artifactory/scala-integration/org/scala-lang/scala-library/"
15+
val index = new URL(url).openStream()
16+
val html = scala.io.Source.fromInputStream(index).mkString
17+
index.close
18+
19+
val doc = Jsoup.parse(html, url)
20+
val pre = doc.select("pre").get(1).text
21+
val versionsAndDateRaw = pre.split("\n").drop(1).dropRight(1)
22+
val dateFormat = DateTimeFormat.forPattern("dd-MMM-yyyy HH:mm")
23+
val versionsAndDate =
24+
versionsAndDateRaw.map{line =>
25+
val Array(version, dateRaw) = line.split("/")
26+
val dateClean = dateRaw.dropRight(1).trim
27+
val date = DateTime.parse(dateClean, dateFormat)
28+
(version, date)
29+
}
30+
31+
def Descending[T : Ordering] = implicitly[Ordering[T]].reverse
32+
33+
val (version, date) = versionsAndDate.sortBy(_._2)(Descending).head
34+
val latestVersion = version
35+
val lastestDate = dateFormat.print(date)
36+
37+
println()
38+
println(latestVersion)
39+
println()
40+
println(lastestDate)
41+
println()
42+
}
43+
}

project/MultiScalaProject.scala

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -62,8 +62,12 @@ class MultiScalaCrossProject(
6262
name: String,
6363
configure: CrossProject => CrossProject)
6464
extends MultiScala {
65+
66+
def apply(scalaV: String): CrossProject = apply(scalaV, scalaV, x => x)
67+
6568
def apply(
6669
scalaV: String,
70+
scalaVJs: String,
6771
configurePerScala: CrossProject => CrossProject = x => x
6872
): CrossProject = {
6973
val projectId = projectIdPerScala(name, scalaV)
@@ -74,10 +78,9 @@ class MultiScalaCrossProject(
7478
)(platforms: _*)
7579
.crossType(CrossType.Full)
7680
.withoutSuffixFor(JVMPlatform)
77-
.settings(
78-
scalaVersion := scalaV,
79-
moduleName := name
80-
)
81+
.settings(moduleName := name)
82+
.jvmSettings(scalaVersion := scalaV)
83+
.jsSettings(scalaVersion := scalaVJs)
8184
.settings(srcFull(name))
8285

8386
configurePerScala(configure(resultingProject))
@@ -111,8 +114,8 @@ class MultiScalaProject(
111114
val resultingProject =
112115
Project(id = projectId, base = file(s".cross/$projectId"))
113116
.settings(
114-
scalaVersion := scalaV,
115-
moduleName := fullName
117+
moduleName := fullName,
118+
scalaVersion := scalaV
116119
)
117120
.settings(srcFull(base))
118121

project/plugins.sbt

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,4 +12,9 @@ addSbtPlugin("org.portable-scala" % "sbt-scalajs-crossproject" % "0.5.0")
1212
addSbtPlugin("org.scala-lang.modules" % "sbt-scala-module" % "1.0.14")
1313
addSbtPlugin("ch.epfl.scala" % "sbt-scalafix" % "0.5.10")
1414
addSbtPlugin("com.eed3si9n" % "sbt-buildinfo" % "0.7.0")
15-
addSbtPlugin("com.typesafe.sbt" % "sbt-pgp" % "0.8.3")
15+
addSbtPlugin("com.typesafe.sbt" % "sbt-pgp" % "0.8.3")
16+
17+
libraryDependencies ++= Seq(
18+
"com.github.nscala-time" %% "nscala-time" % "2.20.0",
19+
"org.jsoup" % "jsoup" % "1.10.1"
20+
)

0 commit comments

Comments
 (0)