sbt/project/SbtScriptedIT.scala

109 lines
2.8 KiB
Scala
Raw Normal View History

import sbt._
import Keys._
import java.io.File
import java.util.UUID.randomUUID
object SbtScriptedIT extends AutoPlugin {
object autoImport {
val scriptedTestSbtRepo = settingKey[String]("SBT repository to be used in scripted tests")
val scriptedTestSbtRef = settingKey[String]("SBT branch to be used in scripted tests")
val scriptedTestLMImpl = settingKey[String]("Librarymanagement implementation to be used in scripted tests")
val scriptedSbtVersion = settingKey[String]("SBT version to be published locally for IT tests")
}
import autoImport._
override def requires = ScriptedPlugin
override def trigger = noTrigger
override lazy val globalSettings = Seq(
scriptedTestSbtRepo := "https://github.com/sbt/sbt.git",
scriptedTestSbtRef := "develop",
scriptedTestLMImpl := "ivy",
scriptedSbtVersion := s"""${sbtVersion.value}-LM-SNAPSHOT"""
)
private def cloneSbt(targetDir: File, repo: String, ref: String) = {
import org.eclipse.jgit.api._
if (!targetDir.exists) {
IO.createDirectory(targetDir)
new CloneCommand()
.setDirectory(targetDir)
.setURI(repo)
.call()
val git = Git.open(targetDir)
git.checkout().setName(ref).call()
}
}
private def publishLocalSbt(
targetDir: File,
lmVersion: String,
lmGroupID: String,
lmArtifactID: String,
version: String) = {
import sys.process._
Process(
Seq(
"sbt",
"-J-Xms2048m",
"-J-Xmx2048m",
"-J-XX:ReservedCodeCacheSize=256m",
"-J-XX:MaxMetaspaceSize=512m",
s"""-Dsbt.build.lm.version=${lmVersion}""",
s"""-Dsbt.build.lm.organization=${lmGroupID}""",
s"""-Dsbt.build.lm.moduleName=${lmArtifactID}""",
s"""set ThisBuild / version := "${version}"""",
"clean",
"publishLocal"
),
Some(targetDir)
) !
}
private def setScriptedTestsSbtVersion(baseDir: File, version: String) = {
IO.listFiles(baseDir).foreach { d =>
if (d.isDirectory) {
IO.createDirectory(d / "project")
IO.write(
d / "project" / "build.properties",
s"sbt.version=$version"
)
}
}
}
import sbt.ScriptedPlugin.autoImport._
override lazy val projectSettings = Seq(
scriptedTests := {
val targetDir = target.value / "sbt"
if (!targetDir.exists) {
cloneSbt(targetDir, scriptedTestSbtRepo.value, scriptedTestSbtRef.value)
publishLocalSbt(
targetDir,
version.value,
organization.value,
s"librarymanagement-${scriptedTestLMImpl.value}",
scriptedSbtVersion.value
)
}
setScriptedTestsSbtVersion(
sbtTestDirectory.value / thisProject.value.id,
scriptedSbtVersion.value
)
scriptedTests.value
}
)
}