mirror of
https://github.com/sbt/sbt.git
synced 2026-09-02 02:57:21 +02:00
Some plugins remain commented out, for now.
sbt-doge is no longer needed because a variant of it has been folded
into sbt 1.
For some reason scripted requires src/doc jars of sbt, so switch back to
using `publishAll` rather than `publishLocalBinAll`. :(
Also, the sys.prop change in scripted is to force log4j2 to not use a
thread context classloader, and avoid the following:
ERROR StatusLogger Unable to create custom ContextSelector. Falling back to default.
java.lang.ClassCastException: Cannot cast org.apache.logging.log4j.core.async.AsyncLoggerContextSelector to org.apache.logging.log4j.core.selector.ContextSelector
at java.lang.Class.cast(Class.java:3369)
at org.apache.logging.log4j.util.LoaderUtil.newCheckedInstanceOf(LoaderUtil.java:201)
at org.apache.logging.log4j.util.LoaderUtil.newCheckedInstanceOfProperty(LoaderUtil.java:226)
at org.apache.logging.log4j.core.impl.Log4jContextFactory.createContextSelector(Log4jContextFactory.java:97)
at org.apache.logging.log4j.core.impl.Log4jContextFactory.<init>(Log4jContextFactory.java:58)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
at java.lang.Class.newInstance(Class.java:442)
at org.apache.logging.log4j.LogManager.<clinit>(LogManager.java:94)
at org.apache.logging.log4j.spi.ThreadContextMapFactory.createThreadContextMap(ThreadContextMapFactory.java:73)
at org.apache.logging.log4j.ThreadContext.init(ThreadContext.java:223)
at org.apache.logging.log4j.ThreadContext.<clinit>(ThreadContext.java:202)
at org.apache.logging.log4j.core.impl.ContextDataInjectorFactory.createDefaultInjector(ContextDataInjectorFactory.java:83)
at org.apache.logging.log4j.core.impl.ContextDataInjectorFactory.createInjector(ContextDataInjectorFactory.java:67)
at org.apache.logging.log4j.core.lookup.ContextMapLookup.<init>(ContextMapLookup.java:34)
at org.apache.logging.log4j.core.lookup.Interpolator.<init>(Interpolator.java:117)
at org.apache.logging.log4j.core.config.AbstractConfiguration.<init>(AbstractConfiguration.java:125)
at org.apache.logging.log4j.core.config.DefaultConfiguration.<init>(DefaultConfiguration.java:46)
at org.apache.logging.log4j.core.layout.PatternLayout$Builder.build(PatternLayout.java:650)
at org.apache.logging.log4j.core.layout.PatternLayout.createDefaultLayout(PatternLayout.java:487)
at sbt.internal.util.ConsoleAppender.<init>(ConsoleAppender.scala:245)
at sbt.internal.util.ConsoleAppender$.apply(ConsoleAppender.scala:196)
at sbt.internal.util.ConsoleLogger.<init>(ConsoleAppender.scala:42)
at sbt.internal.util.ConsoleLogger$.apply(ConsoleAppender.scala:34)
at sbt.test.ScriptedRunner.run(ScriptedTests.scala:221)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at Scripted$.doScripted(Scripted.scala:125)
at $0483e89d182e9d240274$.$anonfun$scriptedTask$5(build.sbt:301)
109 lines
4.3 KiB
Scala
109 lines
4.3 KiB
Scala
import sbt.io.Path._
|
|
import sbt._
|
|
import Keys._
|
|
|
|
object Transform {
|
|
lazy val transformSources = TaskKey[Seq[File]]("transform-sources")
|
|
lazy val inputSourceDirectories = SettingKey[Seq[File]]("input-source-directories")
|
|
lazy val inputSourceDirectory = SettingKey[File]("input-source-directory")
|
|
lazy val inputSources = TaskKey[Seq[File]]("input-sources")
|
|
lazy val sourceProperties = TaskKey[Map[String, String]]("source-properties")
|
|
|
|
lazy val transformResources = TaskKey[Seq[File]]("transform-resources")
|
|
lazy val inputResourceDirectories = SettingKey[Seq[File]]("input-resource-directories")
|
|
lazy val inputResourceDirectory = SettingKey[File]("input-resource-directory")
|
|
lazy val inputResources = TaskKey[Seq[File]]("input-resources")
|
|
lazy val resourceProperties = TaskKey[Map[String, String]]("resource-properties")
|
|
|
|
lazy val conscriptConfigs = TaskKey[Unit]("conscript-configs")
|
|
|
|
def conscriptSettings(launch: Reference) = Seq(
|
|
conscriptConfigs := {
|
|
val res = (managedResources in launch in Compile).value
|
|
val src = (sourceDirectory in Compile).value
|
|
val source = res.find(_.getName == "sbt.boot.properties") getOrElse sys.error(
|
|
"No managed boot.properties file.")
|
|
copyConscriptProperties(source, src / "conscript")
|
|
()
|
|
}
|
|
)
|
|
|
|
def copyConscriptProperties(source: File, conscriptBase: File): Seq[File] = {
|
|
IO.delete(conscriptBase)
|
|
val pairs = Seq(
|
|
"sbt.xMain" -> "xsbt",
|
|
"sbt.ScriptMain" -> "scalas",
|
|
"sbt.ConsoleMain" -> "screpl"
|
|
)
|
|
for ((main, dir) <- pairs) yield {
|
|
val file = conscriptBase / dir / "launchconfig"
|
|
copyPropertiesFile(source, main, file)
|
|
file
|
|
}
|
|
}
|
|
def copyPropertiesFile(source: File, newMain: String, target: File): Unit = {
|
|
def subMain(line: String): String =
|
|
if (line.trim.startsWith("class:")) " class: " + newMain else line
|
|
IO.writeLines(target, IO.readLines(source) map subMain)
|
|
}
|
|
|
|
def crossGenSettings = transSourceSettings ++ Seq(
|
|
sourceProperties := Map("cross.package0" -> "sbt", "cross.package1" -> "cross")
|
|
)
|
|
def transSourceSettings = Seq(
|
|
inputSourceDirectory := sourceDirectory.value / "input_sources",
|
|
inputSourceDirectories := Seq(inputSourceDirectory.value),
|
|
inputSources := (inputSourceDirectories.value ** (-DirectoryFilter)).get,
|
|
fileMappings in transformSources := transformSourceMappings.value,
|
|
transformSources := {
|
|
val rs = (fileMappings in transformSources).value
|
|
val props = sourceProperties.value
|
|
rs map { case (in, out) => transform(in, out, props) }
|
|
},
|
|
sourceGenerators += transformSources.taskValue
|
|
)
|
|
def transformSourceMappings = Def task {
|
|
val ss = inputSources.value
|
|
val sdirs = inputSourceDirectories.value
|
|
val sm = sourceManaged.value
|
|
((ss --- sdirs) pair (rebase(sdirs, sm) | flat(sm))).toSeq
|
|
}
|
|
def configSettings = transResourceSettings ++ Seq(
|
|
resourceProperties :=
|
|
Map("org" -> organization.value,
|
|
"sbt.version" -> version.value,
|
|
"scala.version" -> scalaVersion.value)
|
|
)
|
|
def transResourceSettings = Seq(
|
|
inputResourceDirectory := sourceDirectory.value / "input_resources",
|
|
inputResourceDirectories := Seq(inputResourceDirectory.value),
|
|
inputResources := (inputResourceDirectories.value ** (-DirectoryFilter)).get,
|
|
fileMappings in transformResources := transformResourceMappings.value,
|
|
transformResources := {
|
|
val rs = (fileMappings in transformResources).value
|
|
val props = resourceProperties.value
|
|
rs map { case (in, out) => transform(in, out, props) }
|
|
},
|
|
resourceGenerators += transformResources.taskValue
|
|
)
|
|
def transformResourceMappings = Def task {
|
|
val rs = inputResources.value
|
|
val rdirs = inputResourceDirectories.value
|
|
val rm = resourceManaged.value
|
|
((rs --- rdirs) pair (rebase(rdirs, rm) | flat(rm))).toSeq
|
|
}
|
|
|
|
def transform(in: File, out: File, map: Map[String, String]): File = {
|
|
def get(key: String): String =
|
|
map.getOrElse(key, sys.error("No value defined for key '" + key + "'"))
|
|
val newString = Property.replaceAllIn(IO.read(in), mtch => get(mtch.group(1)))
|
|
if (Some(newString) != read(out))
|
|
IO.write(out, newString)
|
|
out
|
|
}
|
|
def read(file: File): Option[String] = try { Some(IO.read(file)) } catch {
|
|
case _: java.io.IOException => None
|
|
}
|
|
lazy val Property = """\$\{\{([\w.-]+)\}\}""".r
|
|
}
|