2014-12-18 13:57:05 +01:00
|
|
|
import Dependencies._
|
2019-12-08 00:39:30 +01:00
|
|
|
import Util._
|
|
|
|
|
import com.typesafe.tools.mima.core.ProblemFilters._
|
|
|
|
|
import com.typesafe.tools.mima.core._
|
2018-07-31 02:28:42 +02:00
|
|
|
import local.Scripted
|
2020-06-22 01:48:33 +02:00
|
|
|
import java.nio.file.{ Files, Path => JPath }
|
2023-01-02 23:48:13 +01:00
|
|
|
import java.util.Locale
|
2019-12-08 00:39:30 +01:00
|
|
|
|
2019-07-27 21:47:00 +02:00
|
|
|
import scala.util.Try
|
2014-12-18 05:38:10 +01:00
|
|
|
|
2021-03-07 23:41:52 +01:00
|
|
|
// ThisBuild settings take lower precedence,
|
|
|
|
|
// but can be shared across the multi projects.
|
2019-05-13 19:59:58 +02:00
|
|
|
ThisBuild / version := {
|
2024-09-17 17:02:30 +02:00
|
|
|
val v = "2.0.0-alpha12-SNAPSHOT"
|
2019-05-13 19:59:58 +02:00
|
|
|
nightlyVersion.getOrElse(v)
|
|
|
|
|
}
|
2024-03-17 09:54:20 +01:00
|
|
|
ThisBuild / version2_13 := "2.0.0-alpha10-SNAPSHOT"
|
2020-10-04 06:09:15 +02:00
|
|
|
ThisBuild / versionScheme := Some("early-semver")
|
2019-05-17 20:51:07 +02:00
|
|
|
ThisBuild / scalafmtOnCompile := !(Global / insideCI).value
|
|
|
|
|
ThisBuild / Test / scalafmtOnCompile := !(Global / insideCI).value
|
2022-11-28 16:45:10 +01:00
|
|
|
// ThisBuild / turbo := true
|
2020-11-01 21:08:46 +01:00
|
|
|
ThisBuild / usePipelining := false // !(Global / insideCI).value
|
2021-03-07 23:41:52 +01:00
|
|
|
ThisBuild / organization := "org.scala-sbt"
|
|
|
|
|
ThisBuild / description := "sbt is an interactive build tool"
|
|
|
|
|
ThisBuild / licenses := List("Apache-2.0" -> url("https://github.com/sbt/sbt/blob/develop/LICENSE"))
|
|
|
|
|
ThisBuild / javacOptions ++= Seq("-source", "1.8", "-target", "1.8")
|
|
|
|
|
ThisBuild / Compile / doc / javacOptions := Nil
|
|
|
|
|
ThisBuild / developers := List(
|
|
|
|
|
Developer("harrah", "Mark Harrah", "@harrah", url("https://github.com/harrah")),
|
|
|
|
|
Developer("eed3si9n", "Eugene Yokota", "@eed3si9n", url("https://github.com/eed3si9n")),
|
|
|
|
|
Developer("jsuereth", "Josh Suereth", "@jsuereth", url("https://github.com/jsuereth")),
|
|
|
|
|
Developer("dwijnand", "Dale Wijnand", "@dwijnand", url("https://github.com/dwijnand")),
|
|
|
|
|
Developer("eatkins", "Ethan Atkins", "@eatkins", url("https://github.com/eatkins")),
|
|
|
|
|
Developer(
|
|
|
|
|
"gkossakowski",
|
|
|
|
|
"Grzegorz Kossakowski",
|
|
|
|
|
"@gkossakowski",
|
|
|
|
|
url("https://github.com/gkossakowski")
|
|
|
|
|
),
|
|
|
|
|
Developer("Duhemm", "Martin Duhem", "@Duhemm", url("https://github.com/Duhemm"))
|
|
|
|
|
)
|
|
|
|
|
ThisBuild / homepage := Some(url("https://github.com/sbt/sbt"))
|
|
|
|
|
ThisBuild / scmInfo := Some(
|
|
|
|
|
ScmInfo(url("https://github.com/sbt/sbt"), "git@github.com:sbt/sbt.git")
|
|
|
|
|
)
|
|
|
|
|
ThisBuild / resolvers += Resolver.mavenLocal
|
2022-09-17 08:23:56 +02:00
|
|
|
ThisBuild / libraryDependencySchemes += "org.scala-lang.modules" %% "scala-xml" % VersionScheme.Always
|
2019-05-13 19:59:58 +02:00
|
|
|
|
2021-01-10 21:26:26 +01:00
|
|
|
Global / semanticdbEnabled := !(Global / insideCI).value
|
2021-09-18 23:37:41 +02:00
|
|
|
// Change main/src/main/scala/sbt/plugins/SemanticdbPlugin.scala too, if you change this.
|
2023-06-12 16:44:20 +02:00
|
|
|
Global / semanticdbVersion := "4.7.8"
|
2020-07-19 18:43:51 +02:00
|
|
|
val excludeLint = SettingKey[Set[Def.KeyedInitialize[_]]]("excludeLintKeys")
|
|
|
|
|
Global / excludeLint := (Global / excludeLint).?.value.getOrElse(Set.empty)
|
|
|
|
|
Global / excludeLint += componentID
|
|
|
|
|
Global / excludeLint += scriptedBufferLog
|
|
|
|
|
Global / excludeLint += checkPluginCross
|
2022-09-20 09:49:26 +02:00
|
|
|
ThisBuild / evictionErrorLevel := Level.Info
|
2020-07-19 18:43:51 +02:00
|
|
|
|
2024-03-05 13:24:31 +01:00
|
|
|
def commonSettings: Seq[Setting[_]] = Def.settings(
|
2019-05-11 09:42:06 +02:00
|
|
|
headerLicense := Some(
|
|
|
|
|
HeaderLicense.Custom(
|
|
|
|
|
"""|sbt
|
2023-06-20 13:42:07 +02:00
|
|
|
|Copyright 2023, Scala center
|
|
|
|
|
|Copyright 2011 - 2022, Lightbend, Inc.
|
2018-02-01 15:53:05 +01:00
|
|
|
|Copyright 2008 - 2010, Mark Harrah
|
2018-09-14 09:38:58 +02:00
|
|
|
|Licensed under Apache License 2.0 (see LICENSE)
|
2018-02-01 15:53:05 +01:00
|
|
|
|""".stripMargin
|
2019-05-11 09:42:06 +02:00
|
|
|
)
|
|
|
|
|
),
|
2018-02-01 15:53:05 +01:00
|
|
|
scalaVersion := baseScalaVersion,
|
|
|
|
|
componentID := None,
|
2019-07-09 22:55:04 +02:00
|
|
|
resolvers += Resolver.typesafeIvyRepo("releases").withName("typesafe-sbt-build-ivy-releases"),
|
2024-03-05 13:24:31 +01:00
|
|
|
resolvers ++= Resolver.sonatypeOssRepos("snapshots"),
|
2024-05-07 10:39:25 +02:00
|
|
|
resolvers ++= Resolver.sonatypeOssRepos("snapshots"),
|
2019-04-21 04:06:52 +02:00
|
|
|
testFrameworks += TestFramework("hedgehog.sbt.Framework"),
|
2019-10-21 02:42:52 +02:00
|
|
|
testFrameworks += TestFramework("verify.runner.Framework"),
|
2021-05-03 05:25:23 +02:00
|
|
|
Global / concurrentRestrictions += Util.testExclusiveRestriction,
|
|
|
|
|
Test / testOptions += Tests.Argument(TestFrameworks.ScalaCheck, "-w", "1"),
|
|
|
|
|
Test / testOptions += Tests.Argument(TestFrameworks.ScalaCheck, "-verbosity", "2"),
|
|
|
|
|
compile / javacOptions ++= Seq("-Xlint", "-Xlint:-serial"),
|
2021-05-10 00:22:03 +02:00
|
|
|
/*
|
2019-03-22 07:28:14 +01:00
|
|
|
Compile / doc / scalacOptions ++= {
|
|
|
|
|
import scala.sys.process._
|
|
|
|
|
val devnull = ProcessLogger(_ => ())
|
|
|
|
|
val tagOrSha = ("git describe --exact-match" #|| "git rev-parse HEAD").lineStream(devnull).head
|
2018-02-22 02:33:45 +01:00
|
|
|
Seq(
|
|
|
|
|
"-sourcepath",
|
2021-05-03 05:25:23 +02:00
|
|
|
(LocalRootProject / baseDirectory).value.getAbsolutePath,
|
2018-02-22 02:33:45 +01:00
|
|
|
"-doc-source-url",
|
2019-03-22 07:28:14 +01:00
|
|
|
s"https://github.com/sbt/sbt/tree/$tagOrSha€{FILE_PATH}.scala"
|
2018-02-22 02:33:45 +01:00
|
|
|
)
|
|
|
|
|
},
|
2021-05-10 00:22:03 +02:00
|
|
|
*/
|
2020-01-14 23:01:17 +01:00
|
|
|
Compile / javafmtOnCompile := Def
|
|
|
|
|
.taskDyn(if ((scalafmtOnCompile).value) Compile / javafmt else Def.task(()))
|
|
|
|
|
.value,
|
|
|
|
|
Test / javafmtOnCompile := Def
|
|
|
|
|
.taskDyn(if ((Test / scalafmtOnCompile).value) Test / javafmt else Def.task(()))
|
|
|
|
|
.value,
|
|
|
|
|
Compile / unmanagedSources / inputFileStamps :=
|
|
|
|
|
(Compile / unmanagedSources / inputFileStamps).dependsOn(Compile / javafmtOnCompile).value,
|
|
|
|
|
Test / unmanagedSources / inputFileStamps :=
|
|
|
|
|
(Test / unmanagedSources / inputFileStamps).dependsOn(Test / javafmtOnCompile).value,
|
2021-05-03 05:25:23 +02:00
|
|
|
Test / publishArtifact := false,
|
|
|
|
|
run / fork := true,
|
2018-02-01 15:53:05 +01:00
|
|
|
)
|
2023-11-14 12:12:34 +01:00
|
|
|
|
|
|
|
|
def utilCommonSettings: Seq[Setting[_]] = Def.settings(
|
|
|
|
|
baseSettings,
|
2024-03-05 13:24:31 +01:00
|
|
|
crossScalaVersions := Seq(scala212, scala213, scala3),
|
|
|
|
|
libraryDependencies += Dependencies.scalaCollectionCompat,
|
|
|
|
|
libraryDependencies ++= {
|
|
|
|
|
if (scalaBinaryVersion.value == "3") Nil
|
|
|
|
|
else Seq(compilerPlugin(kindProjector))
|
|
|
|
|
}
|
2023-11-14 12:12:34 +01:00
|
|
|
)
|
2014-12-18 05:38:10 +01:00
|
|
|
|
|
|
|
|
def minimalSettings: Seq[Setting[_]] =
|
2015-02-15 04:29:24 +01:00
|
|
|
commonSettings ++ customCommands ++
|
2021-03-07 23:41:52 +01:00
|
|
|
publishPomSettings
|
2014-12-18 05:38:10 +01:00
|
|
|
|
|
|
|
|
def baseSettings: Seq[Setting[_]] =
|
2017-04-20 01:56:35 +02:00
|
|
|
minimalSettings ++ Seq(projectComponent) ++ baseScalacOptions ++ Licensed.settings
|
2014-12-18 05:38:10 +01:00
|
|
|
|
|
|
|
|
def testedBaseSettings: Seq[Setting[_]] =
|
|
|
|
|
baseSettings ++ testDependencies
|
|
|
|
|
|
2021-05-03 05:25:23 +02:00
|
|
|
val sbt13Plus =
|
|
|
|
|
Seq(
|
|
|
|
|
"1.3.0",
|
|
|
|
|
"1.4.0",
|
|
|
|
|
"1.5.0",
|
2022-07-11 05:50:06 +02:00
|
|
|
"1.6.0",
|
|
|
|
|
"1.7.0",
|
2021-05-03 05:25:23 +02:00
|
|
|
)
|
2019-12-08 00:49:13 +01:00
|
|
|
val sbt10Plus =
|
2019-05-11 09:42:06 +02:00
|
|
|
Seq(
|
|
|
|
|
"1.0.0",
|
|
|
|
|
"1.0.1",
|
|
|
|
|
"1.0.2",
|
|
|
|
|
"1.0.3",
|
|
|
|
|
"1.0.4",
|
|
|
|
|
"1.1.0",
|
|
|
|
|
"1.1.1",
|
|
|
|
|
"1.1.2",
|
|
|
|
|
"1.1.3",
|
|
|
|
|
"1.1.4",
|
|
|
|
|
"1.1.5",
|
|
|
|
|
"1.1.6",
|
|
|
|
|
"1.2.0",
|
2019-12-08 00:49:13 +01:00
|
|
|
"1.2.1",
|
|
|
|
|
/*DOA,*/ "1.2.3",
|
|
|
|
|
"1.2.4",
|
|
|
|
|
/*DOA,*/ "1.2.6",
|
2019-05-11 09:42:06 +02:00
|
|
|
"1.2.7",
|
|
|
|
|
"1.2.8",
|
|
|
|
|
) ++ sbt13Plus
|
2019-12-08 00:49:13 +01:00
|
|
|
val noUtilVersion =
|
|
|
|
|
Set("1.0.4", "1.1.4", "1.1.5", "1.1.6", "1.2.3", "1.2.4", "1.2.6", "1.2.7", "1.2.8")
|
2019-04-18 09:14:04 +02:00
|
|
|
|
2019-12-08 00:49:13 +01:00
|
|
|
val mimaSettings = mimaSettingsSince(sbt10Plus)
|
|
|
|
|
val utilMimaSettings = mimaSettingsSince(sbt10Plus.filterNot(noUtilVersion))
|
|
|
|
|
def mimaSettingsSince(versions: Seq[String]): Seq[Def.Setting[_]] = Def settings (
|
2018-01-10 04:48:07 +01:00
|
|
|
mimaPreviousArtifacts := {
|
2019-04-18 09:14:04 +02:00
|
|
|
val crossVersion = if (crossPaths.value) CrossVersion.binary else CrossVersion.disabled
|
|
|
|
|
versions.map(v => organization.value % moduleName.value % v cross crossVersion).toSet
|
2018-03-12 18:21:22 +01:00
|
|
|
},
|
|
|
|
|
mimaBinaryIssueFilters ++= Seq(
|
2018-08-08 08:57:34 +02:00
|
|
|
// Changes in the internal package
|
2018-03-12 18:21:22 +01:00
|
|
|
exclude[DirectMissingMethodProblem]("sbt.internal.*"),
|
|
|
|
|
exclude[FinalClassProblem]("sbt.internal.*"),
|
|
|
|
|
exclude[FinalMethodProblem]("sbt.internal.*"),
|
|
|
|
|
exclude[IncompatibleResultTypeProblem]("sbt.internal.*"),
|
2021-06-30 03:25:47 +02:00
|
|
|
exclude[ReversedMissingMethodProblem]("sbt.internal.*"),
|
|
|
|
|
exclude[DirectMissingMethodProblem]("sbt.PluginData.apply"),
|
|
|
|
|
exclude[DirectMissingMethodProblem]("sbt.PluginData.copy"),
|
|
|
|
|
exclude[DirectMissingMethodProblem]("sbt.PluginData.this"),
|
2023-08-11 16:08:11 +02:00
|
|
|
exclude[IncompatibleResultTypeProblem]("sbt.EvaluateTask.executeProgress"),
|
2023-10-04 09:49:05 +02:00
|
|
|
exclude[DirectMissingMethodProblem]("sbt.Keys.currentTaskProgress"),
|
2023-08-16 13:11:39 +02:00
|
|
|
exclude[IncompatibleResultTypeProblem]("sbt.PluginData.copy$default$10")
|
2018-03-12 18:21:22 +01:00
|
|
|
),
|
2017-07-20 18:31:39 +02:00
|
|
|
)
|
|
|
|
|
|
2024-09-15 07:58:23 +02:00
|
|
|
val scriptedSbtMimaSettings = Def.settings(mimaPreviousArtifacts := Set())
|
2018-07-10 06:58:45 +02:00
|
|
|
|
2017-04-21 09:14:31 +02:00
|
|
|
lazy val sbtRoot: Project = (project in file("."))
|
2022-09-20 09:49:26 +02:00
|
|
|
.aggregate(allProjects.map(p => LocalProject(p.id)): _*)
|
2017-04-21 09:14:31 +02:00
|
|
|
.settings(
|
2015-03-27 00:22:24 +01:00
|
|
|
minimalSettings,
|
2018-10-05 09:04:22 +02:00
|
|
|
onLoadMessage := {
|
2019-03-23 17:31:22 +01:00
|
|
|
val version = sys.props("java.specification.version")
|
2023-08-11 16:08:11 +02:00
|
|
|
""" __ __
|
2018-10-05 09:04:22 +02:00
|
|
|
| _____/ /_ / /_
|
|
|
|
|
| / ___/ __ \/ __/
|
2023-08-11 16:08:11 +02:00
|
|
|
| (__ ) /_/ / /_
|
|
|
|
|
| /____/_.___/\__/
|
2018-10-05 09:04:22 +02:00
|
|
|
|Welcome to the build for sbt.
|
|
|
|
|
|""".stripMargin +
|
2019-05-11 09:42:06 +02:00
|
|
|
(if (version != "1.8")
|
|
|
|
|
s"""!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
2019-03-23 17:31:22 +01:00
|
|
|
| Java version is $version. We recommend java 8.
|
2018-10-05 09:04:22 +02:00
|
|
|
|!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!""".stripMargin
|
2019-05-11 09:42:06 +02:00
|
|
|
else "")
|
2018-10-05 09:04:22 +02:00
|
|
|
},
|
2017-05-08 15:34:41 +02:00
|
|
|
Util.baseScalacOptions,
|
|
|
|
|
Docs.settings,
|
|
|
|
|
scalacOptions += "-Ymacro-expand:none", // for both sxr and doc
|
|
|
|
|
Util.publishPomSettings,
|
|
|
|
|
otherRootSettings,
|
2015-02-06 20:35:32 +01:00
|
|
|
publish := {},
|
2017-05-30 08:44:13 +02:00
|
|
|
publishLocal := {},
|
2021-05-03 05:25:23 +02:00
|
|
|
publish / skip := true,
|
|
|
|
|
Global / commands += Command
|
2019-05-11 09:42:06 +02:00
|
|
|
.single("sbtOn")((state, dir) => s"sbtProj/test:runMain sbt.RunFromSourceMain $dir" :: state),
|
2019-10-17 23:27:43 +02:00
|
|
|
mimaSettings,
|
2019-10-20 06:41:53 +02:00
|
|
|
mimaPreviousArtifacts := Set.empty,
|
2020-07-27 23:33:19 +02:00
|
|
|
buildThinClient := (sbtClientProj / buildThinClient).evaluated,
|
2022-06-26 19:15:50 +02:00
|
|
|
nativeImage := (sbtClientProj / nativeImage).value,
|
2020-07-27 23:33:19 +02:00
|
|
|
installNativeThinClient := {
|
|
|
|
|
// nativeInstallDirectory can be set globally or in a gitignored local file
|
|
|
|
|
val dir = nativeInstallDirectory.?.value
|
|
|
|
|
val target = Def.spaceDelimited("").parsed.headOption match {
|
|
|
|
|
case Some(p) => file(p).toPath
|
|
|
|
|
case _ =>
|
|
|
|
|
dir match {
|
2020-08-14 04:56:02 +02:00
|
|
|
case Some(d) => d / "sbtn"
|
2020-07-27 23:33:19 +02:00
|
|
|
case _ =>
|
|
|
|
|
val msg = "Expected input parameter <path>: installNativeExecutable /usr/local/bin"
|
|
|
|
|
throw new IllegalStateException(msg)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
val base = baseDirectory.value.toPath
|
2022-06-26 19:15:50 +02:00
|
|
|
val exec = (sbtClientProj / nativeImage).value.toPath
|
2020-07-27 23:33:19 +02:00
|
|
|
streams.value.log.info(s"installing thin client ${base.relativize(exec)} to ${target}")
|
|
|
|
|
Files.copy(exec, target, java.nio.file.StandardCopyOption.REPLACE_EXISTING)
|
|
|
|
|
}
|
2015-03-24 21:12:51 +01:00
|
|
|
)
|
|
|
|
|
|
|
|
|
|
// This is used to configure an sbt-launcher for this version of sbt.
|
|
|
|
|
lazy val bundledLauncherProj =
|
2017-04-21 09:14:31 +02:00
|
|
|
(project in file("launch"))
|
2021-03-07 23:41:52 +01:00
|
|
|
.enablePlugins(SbtLauncherPlugin)
|
2017-04-21 09:14:31 +02:00
|
|
|
.settings(
|
|
|
|
|
minimalSettings,
|
|
|
|
|
inConfig(Compile)(Transform.configSettings),
|
|
|
|
|
)
|
|
|
|
|
.settings(
|
|
|
|
|
name := "sbt-launch",
|
|
|
|
|
moduleName := "sbt-launch",
|
|
|
|
|
description := "sbt application launcher",
|
|
|
|
|
autoScalaLibrary := false,
|
|
|
|
|
crossPaths := false,
|
2022-06-13 09:17:15 +02:00
|
|
|
Compile / doc / javacOptions := Nil,
|
2021-05-03 05:25:23 +02:00
|
|
|
Compile / packageBin := sbtLaunchJar.value,
|
2019-10-17 23:27:43 +02:00
|
|
|
mimaSettings,
|
|
|
|
|
mimaPreviousArtifacts := Set()
|
2017-04-21 09:14:31 +02:00
|
|
|
)
|
2014-12-18 05:38:10 +01:00
|
|
|
|
2014-12-18 19:14:04 +01:00
|
|
|
/* ** subproject declarations ** */
|
2014-12-18 05:38:10 +01:00
|
|
|
|
2024-03-05 13:24:31 +01:00
|
|
|
val collectionProj = project
|
|
|
|
|
.in(file("util-collection"))
|
2023-11-14 11:43:12 +01:00
|
|
|
.dependsOn(utilPosition, utilCore)
|
2017-06-26 12:38:37 +02:00
|
|
|
.settings(
|
2021-12-06 08:06:26 +01:00
|
|
|
name := "Collections",
|
2017-06-26 12:38:37 +02:00
|
|
|
testedBaseSettings,
|
2017-07-20 18:31:39 +02:00
|
|
|
libraryDependencies ++= Seq(sjsonNewScalaJson.value),
|
2020-07-08 01:52:52 +02:00
|
|
|
libraryDependencies ++= (CrossVersion.partialVersion(scalaVersion.value) match {
|
|
|
|
|
case Some((2, major)) if major <= 12 => Seq()
|
2021-12-06 08:06:26 +01:00
|
|
|
case _ => Seq(scalaPar)
|
2020-07-08 01:52:52 +02:00
|
|
|
}),
|
2017-07-20 18:31:39 +02:00
|
|
|
mimaSettings,
|
2024-03-17 09:54:20 +01:00
|
|
|
conflictWarning := ConflictWarning.disable,
|
2017-06-26 12:38:37 +02:00
|
|
|
)
|
|
|
|
|
|
|
|
|
|
// Command line-related utilities.
|
|
|
|
|
val completeProj = (project in file("internal") / "util-complete")
|
2019-12-08 00:49:13 +01:00
|
|
|
.dependsOn(collectionProj, utilControl, utilLogging)
|
2017-06-26 12:38:37 +02:00
|
|
|
.settings(
|
|
|
|
|
testedBaseSettings,
|
|
|
|
|
name := "Completion",
|
2017-07-20 18:31:39 +02:00
|
|
|
libraryDependencies += jline,
|
Support scala 2.13 console in thin client
In order to make the console task work with scala 2.13 and the thin
client, we need to provide a way for the scala repl to use an sbt
provided jline3 terminal instead of the default terminal typically built
by the repl. We also need to put jline 3 higher up in the classloading
hierarchy to ensure that two versions of jline 3 are not loaded (which
makes it impossible to share the sbt terminal with the scala terminal).
One impact of this change is the decoupling of the version of
jline-terminal used by the in process scala console and the version
of jline-terminal specified by the scala version itself. It is possible
to override this by setting the `useScalaReplJLine` flag to true. When
that is set, the scala REPL will run in a fully isolated classloader. That
will ensure that the versions are consistent. It will, however, for sure
break the thin client and may interfere with the embedded shell ui.
As part of this work, I also discovered that jline 3 Terminal.getSize is
very slow. In jline 2, the terminal attributes were automatically cached with a
timeout of, I think, 1 second so it wasn't a big deal to call
Terminal.getAttributes. The getSize method in jline 3 is not cached and
it shells out to run a tty command. This caused a significant
performance regression in sbt because when progress is enabled, we call
Terminal.getSize whenever we log any messages. I added caching of
getSize at the TerminalImpl level to address this. The timeout is 1
second, which seems responsive enough for most use cases. We could also
move the calculation onto a background thread and have it periodically
updated, but that seems like overkill.
2020-07-20 19:12:04 +02:00
|
|
|
libraryDependencies += jline3Reader,
|
2020-10-14 08:28:55 +02:00
|
|
|
libraryDependencies += jline3Builtins,
|
2017-07-20 18:31:39 +02:00
|
|
|
mimaSettings,
|
2018-07-16 04:28:55 +02:00
|
|
|
// Parser is used publicly, so we can't break bincompat.
|
|
|
|
|
mimaBinaryIssueFilters := Seq(
|
2019-10-17 23:27:43 +02:00
|
|
|
exclude[DirectMissingMethodProblem]("sbt.internal.util.complete.SoftInvalid.apply"),
|
|
|
|
|
exclude[DirectMissingMethodProblem]("sbt.internal.util.complete.Invalid.apply"),
|
|
|
|
|
exclude[DirectMissingMethodProblem]("sbt.internal.util.complete.Finite.apply"),
|
|
|
|
|
exclude[DirectMissingMethodProblem]("sbt.internal.util.complete.Infinite.decrement"),
|
2018-07-16 04:28:55 +02:00
|
|
|
exclude[DirectMissingMethodProblem]("sbt.internal.util.complete.History.this"),
|
2019-10-17 23:27:43 +02:00
|
|
|
exclude[IncompatibleMethTypeProblem]("sbt.internal.util.complete.Completion.suggestion"),
|
|
|
|
|
exclude[IncompatibleMethTypeProblem]("sbt.internal.util.complete.Completion.token"),
|
2019-11-22 20:37:07 +01:00
|
|
|
exclude[IncompatibleMethTypeProblem]("sbt.internal.util.complete.Completion.displayOnly"),
|
|
|
|
|
exclude[IncompatibleSignatureProblem]("sbt.internal.util.complete.*"),
|
2017-12-04 17:18:08 +01:00
|
|
|
),
|
2017-06-26 12:38:37 +02:00
|
|
|
)
|
2019-12-08 00:49:13 +01:00
|
|
|
.configure(addSbtIO)
|
2017-06-26 12:38:37 +02:00
|
|
|
|
|
|
|
|
// A logic with restricted negation as failure for a unique, stable model
|
|
|
|
|
val logicProj = (project in file("internal") / "util-logic")
|
2019-12-08 00:49:13 +01:00
|
|
|
.dependsOn(collectionProj, utilRelation)
|
2017-06-26 12:38:37 +02:00
|
|
|
.settings(
|
|
|
|
|
testedBaseSettings,
|
2017-07-20 18:31:39 +02:00
|
|
|
name := "Logic",
|
|
|
|
|
mimaSettings,
|
2017-06-26 12:38:37 +02:00
|
|
|
)
|
|
|
|
|
|
2019-12-08 00:49:13 +01:00
|
|
|
// defines Java structures used across Scala versions, such as the API structures and relationships extracted by
|
|
|
|
|
// the analysis compiler phases and passed back to sbt. The API structures are defined in a simple
|
|
|
|
|
// format from which Java sources are generated by the datatype generator Projproject
|
|
|
|
|
lazy val utilInterface = (project in file("internal") / "util-interface").settings(
|
2023-11-14 12:12:34 +01:00
|
|
|
baseSettings,
|
2019-12-08 00:49:13 +01:00
|
|
|
javaOnlySettings,
|
|
|
|
|
crossPaths := false,
|
2021-04-04 01:23:38 +02:00
|
|
|
autoScalaLibrary := false,
|
2022-06-13 09:17:15 +02:00
|
|
|
Compile / doc / javacOptions := Nil,
|
2019-12-08 00:49:13 +01:00
|
|
|
name := "Util Interface",
|
|
|
|
|
exportJars := true,
|
|
|
|
|
utilMimaSettings,
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
lazy val utilControl = (project in file("internal") / "util-control").settings(
|
|
|
|
|
utilCommonSettings,
|
|
|
|
|
name := "Util Control",
|
|
|
|
|
utilMimaSettings,
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
lazy val utilPosition = (project in file("internal") / "util-position")
|
|
|
|
|
.settings(
|
|
|
|
|
utilCommonSettings,
|
|
|
|
|
name := "Util Position",
|
|
|
|
|
scalacOptions += "-language:experimental.macros",
|
|
|
|
|
libraryDependencies ++= Seq(scalaReflect.value, scalatest % "test"),
|
|
|
|
|
utilMimaSettings,
|
|
|
|
|
)
|
|
|
|
|
|
2023-11-14 12:12:34 +01:00
|
|
|
lazy val utilCore = project
|
|
|
|
|
.in(file("internal") / "util-core")
|
2023-11-14 11:43:12 +01:00
|
|
|
.settings(
|
|
|
|
|
utilCommonSettings,
|
|
|
|
|
name := "Util Core",
|
|
|
|
|
libraryDependencies ++= {
|
|
|
|
|
if (scalaBinaryVersion.value.startsWith("2")) {
|
|
|
|
|
Seq("org.scala-lang" % "scala-reflect" % scalaVersion.value)
|
|
|
|
|
} else Seq.empty
|
|
|
|
|
},
|
|
|
|
|
Util.keywordsSettings,
|
|
|
|
|
utilMimaSettings
|
|
|
|
|
)
|
|
|
|
|
|
2024-03-05 13:24:31 +01:00
|
|
|
lazy val utilLogging = project
|
|
|
|
|
.in(file("internal") / "util-logging")
|
2019-12-08 00:49:13 +01:00
|
|
|
.enablePlugins(ContrabandPlugin, JsonCodecPlugin)
|
2023-11-14 11:43:12 +01:00
|
|
|
.dependsOn(utilInterface, utilCore)
|
2019-12-08 00:49:13 +01:00
|
|
|
.settings(
|
|
|
|
|
utilCommonSettings,
|
|
|
|
|
name := "Util Logging",
|
|
|
|
|
libraryDependencies ++=
|
2020-06-30 17:57:57 +02:00
|
|
|
Seq(
|
|
|
|
|
jline,
|
Support scala 2.13 console in thin client
In order to make the console task work with scala 2.13 and the thin
client, we need to provide a way for the scala repl to use an sbt
provided jline3 terminal instead of the default terminal typically built
by the repl. We also need to put jline 3 higher up in the classloading
hierarchy to ensure that two versions of jline 3 are not loaded (which
makes it impossible to share the sbt terminal with the scala terminal).
One impact of this change is the decoupling of the version of
jline-terminal used by the in process scala console and the version
of jline-terminal specified by the scala version itself. It is possible
to override this by setting the `useScalaReplJLine` flag to true. When
that is set, the scala REPL will run in a fully isolated classloader. That
will ensure that the versions are consistent. It will, however, for sure
break the thin client and may interfere with the embedded shell ui.
As part of this work, I also discovered that jline 3 Terminal.getSize is
very slow. In jline 2, the terminal attributes were automatically cached with a
timeout of, I think, 1 second so it wasn't a big deal to call
Terminal.getAttributes. The getSize method in jline 3 is not cached and
it shells out to run a tty command. This caused a significant
performance regression in sbt because when progress is enabled, we call
Terminal.getSize whenever we log any messages. I added caching of
getSize at the TerminalImpl level to address this. The timeout is 1
second, which seems responsive enough for most use cases. We could also
move the calculation onto a background thread and have it periodically
updated, but that seems like overkill.
2020-07-20 19:12:04 +02:00
|
|
|
jline3Terminal,
|
2020-09-20 23:56:49 +02:00
|
|
|
jline3JNA,
|
Support scala 2.13 console in thin client
In order to make the console task work with scala 2.13 and the thin
client, we need to provide a way for the scala repl to use an sbt
provided jline3 terminal instead of the default terminal typically built
by the repl. We also need to put jline 3 higher up in the classloading
hierarchy to ensure that two versions of jline 3 are not loaded (which
makes it impossible to share the sbt terminal with the scala terminal).
One impact of this change is the decoupling of the version of
jline-terminal used by the in process scala console and the version
of jline-terminal specified by the scala version itself. It is possible
to override this by setting the `useScalaReplJLine` flag to true. When
that is set, the scala REPL will run in a fully isolated classloader. That
will ensure that the versions are consistent. It will, however, for sure
break the thin client and may interfere with the embedded shell ui.
As part of this work, I also discovered that jline 3 Terminal.getSize is
very slow. In jline 2, the terminal attributes were automatically cached with a
timeout of, I think, 1 second so it wasn't a big deal to call
Terminal.getAttributes. The getSize method in jline 3 is not cached and
it shells out to run a tty command. This caused a significant
performance regression in sbt because when progress is enabled, we call
Terminal.getSize whenever we log any messages. I added caching of
getSize at the TerminalImpl level to address this. The timeout is 1
second, which seems responsive enough for most use cases. We could also
move the calculation onto a background thread and have it periodically
updated, but that seems like overkill.
2020-07-20 19:12:04 +02:00
|
|
|
jline3Jansi,
|
2020-06-30 17:57:57 +02:00
|
|
|
log4jApi,
|
|
|
|
|
log4jCore,
|
|
|
|
|
disruptor,
|
|
|
|
|
sjsonNewScalaJson.value,
|
|
|
|
|
),
|
2024-06-04 14:49:37 +02:00
|
|
|
testDependencies,
|
2021-12-20 08:00:30 +01:00
|
|
|
Compile / generateContrabands / contrabandCodecsDependencies := List(sjsonNewCore.value),
|
2021-05-03 05:25:23 +02:00
|
|
|
Compile / generateContrabands / sourceManaged := baseDirectory.value / "src" / "main" / "contraband-scala",
|
|
|
|
|
Compile / managedSourceDirectories +=
|
2019-12-13 03:10:45 +01:00
|
|
|
baseDirectory.value / "src" / "main" / "contraband-scala",
|
2021-05-03 05:25:23 +02:00
|
|
|
Compile / generateContrabands / contrabandFormatsForType := { tpe =>
|
|
|
|
|
val old = (Compile / generateContrabands / contrabandFormatsForType).value
|
2019-12-08 00:49:13 +01:00
|
|
|
val name = tpe.removeTypeParameters.name
|
|
|
|
|
if (name == "Throwable") Nil
|
|
|
|
|
else old(tpe)
|
|
|
|
|
},
|
2023-05-14 06:38:34 +02:00
|
|
|
Test / fork := true,
|
2019-12-08 00:49:13 +01:00
|
|
|
utilMimaSettings,
|
|
|
|
|
mimaBinaryIssueFilters ++= Seq(
|
|
|
|
|
exclude[DirectMissingMethodProblem]("sbt.internal.util.SuccessEvent.copy*"),
|
|
|
|
|
exclude[DirectMissingMethodProblem]("sbt.internal.util.TraceEvent.copy*"),
|
|
|
|
|
exclude[DirectMissingMethodProblem]("sbt.internal.util.StringEvent.copy*"),
|
|
|
|
|
// Private final class constructors changed
|
|
|
|
|
exclude[DirectMissingMethodProblem]("sbt.util.InterfaceUtil#ConcretePosition.this"),
|
|
|
|
|
exclude[DirectMissingMethodProblem]("sbt.util.InterfaceUtil#ConcreteProblem.this"),
|
|
|
|
|
exclude[ReversedMissingMethodProblem]("sbt.internal.util.ConsoleOut.flush"),
|
|
|
|
|
// This affects Scala 2.11 only it seems, so it's ok?
|
|
|
|
|
exclude[InheritedNewAbstractMethodProblem](
|
|
|
|
|
"sbt.internal.util.codec.JsonProtocol.LogOptionFormat"
|
|
|
|
|
),
|
|
|
|
|
exclude[InheritedNewAbstractMethodProblem](
|
|
|
|
|
"sbt.internal.util.codec.JsonProtocol.ProgressItemFormat"
|
|
|
|
|
),
|
|
|
|
|
exclude[InheritedNewAbstractMethodProblem](
|
|
|
|
|
"sbt.internal.util.codec.JsonProtocol.ProgressEventFormat"
|
|
|
|
|
),
|
Add internal multi logger implementation
Prior to these changes, sbt was leaking large amounts of memory via
log4j appenders. sbt has an unusual use case for log4j because it
creates many ephemeral loggers while also having a global logger that is
supposed to work for the duration of the sbt session. There is a lot of
shared global state in log4j and properly cleaning up the ephemeral task
appenders would break global logging. This commit fixes the behavior by
introducing an alternate logging implementation. Users can still use the
old log4j logging implementation but it will be off by default. The
internal implementation is very simple: it just blocks the current
thread and writes to all of the appenders. Nevertheless, I found the
performance to be roughly identical to that of log4j in my sample
project. As an experiment, I did the appending on a thread pool and got
a significant performance improvement but I'll defer that to a later PR
since parallel io is harder to reason about.
Background: I was testing sbt performance in
https://github.com/jtjeferreira/sbt-multi-module-sample and noticed that
performance rapidly degraded after I ran compile a few times. I took a
heap dump and it became obvious that sbt was leaking console appenders.
Further investigation revealed that all of the leaking appenders in the
project were coming from task streams. This made me think that the fix
would be to track what loggers were created during task evaluation and
clear them out when task evaluation completed. That almost worked except
that log4j has an internal append only data structure containing logger
names. Since we create unique logger names for each run, that internal
data structure grew without bound. It looked like this could be worked
around by creating a new log4j Configuration (where that data structure
was stored) but while creating new configurations with each task runs
did fix the leak, it also broke global logging, which was using a
different configuration. At this point, I decided to write an alternate
implementation of the appender api where I could be sure that the
appenders were cleaned up without breaking global logging.
Implementation: I made ConsoleAppender a trait and made it no longer
extends log4j AbstractAppender. To do this, I had to remove the one
log4j specific method, append(LogEvent). ConsoleAppender now has a
method toLog4J that, in most cases, will return a log4j Appender that is
almost identical to the Appenders that we previously used. To manage
the loggers created during task evaluation, I introduce a new class,
LoggerContext. The LoggerContext determines which logging backend to use
and keeps track of what appenders and loggers have been created. We can
create a fresh LoggerContext before each task evaluation and clear it
out, cleaning up all of its resources after task evaluation concludes.
In order to make this work, there were many places where we need to
either pass in a LoggerContext or create a new one. The main magic is
happening in the `next(State)` method in Main. This is where we create a
new LoggerContext prior to command evaluation and clean it up after the
evaluation completes.
Users can toggle log4j using the new useLog4J key. They also can set the
system property, sbt.log.uselog4j. The global logger will use the sbt
internal implementation unless the system property is set.
There are a fairly significant number of mima issues since I changed the
type of ConsoleAppender. All of the mima changes were in the
sbt.internal package so I think this should be ok.
Effects: the memory leaks are gone. I successfully ran 5000 no-op
compiles in the sbt-multi-module-sample above with no degradation of
performace. There was a noticeable degradation after 30 no-op compiles
before.
During the refactor, I had to work on TestLogger and in doing so I also
fixed https://github.com/sbt/sbt/issues/4480.
This also should fix https://github.com/sbt/sbt/issues/4773
2020-08-05 20:23:35 +02:00
|
|
|
exclude[DirectMissingMethodProblem]("sbt.internal.util.MainAppender.*"),
|
|
|
|
|
exclude[IncompatibleMethTypeProblem]("sbt.internal.util.BufferedAppender.*"),
|
|
|
|
|
exclude[IncompatibleMethTypeProblem]("sbt.internal.util.ManagedLogger.this"),
|
|
|
|
|
exclude[IncompatibleMethTypeProblem]("sbt.internal.util.ManagedLogger.this"),
|
|
|
|
|
exclude[IncompatibleMethTypeProblem]("sbt.internal.util.MainAppender*"),
|
|
|
|
|
exclude[IncompatibleMethTypeProblem]("sbt.internal.util.GlobalLogging.*"),
|
|
|
|
|
exclude[IncompatibleSignatureProblem]("sbt.internal.util.GlobalLogging.*"),
|
|
|
|
|
exclude[IncompatibleSignatureProblem]("sbt.internal.util.MainAppender*"),
|
|
|
|
|
exclude[MissingTypesProblem]("sbt.internal.util.ConsoleAppender"),
|
|
|
|
|
exclude[MissingTypesProblem]("sbt.internal.util.BufferedAppender"),
|
2021-05-03 05:25:23 +02:00
|
|
|
exclude[MissingClassProblem]("sbt.internal.util.Terminal$BlockingInputStream$"),
|
2023-10-11 20:59:19 +02:00
|
|
|
exclude[IncompatibleResultTypeProblem]("sbt.util.LoggerContext#Log4JLoggerContext.loggers"),
|
2019-12-08 00:49:13 +01:00
|
|
|
),
|
|
|
|
|
)
|
|
|
|
|
.configure(addSbtIO)
|
|
|
|
|
|
|
|
|
|
lazy val utilRelation = (project in file("internal") / "util-relation")
|
|
|
|
|
.settings(
|
|
|
|
|
utilCommonSettings,
|
|
|
|
|
name := "Util Relation",
|
|
|
|
|
libraryDependencies ++= Seq(scalacheck % "test"),
|
|
|
|
|
utilMimaSettings,
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
// Persisted caching based on sjson-new
|
2024-03-05 13:24:31 +01:00
|
|
|
lazy val utilCache = project
|
|
|
|
|
.in(file("util-cache"))
|
2024-03-01 09:34:11 +01:00
|
|
|
.enablePlugins(
|
|
|
|
|
ContrabandPlugin,
|
|
|
|
|
// we generate JsonCodec only for actionresult.conta
|
2024-08-11 08:49:46 +02:00
|
|
|
JsonCodecPlugin,
|
2024-03-01 09:34:11 +01:00
|
|
|
)
|
|
|
|
|
.dependsOn(utilLogging)
|
2019-12-08 00:49:13 +01:00
|
|
|
.settings(
|
2024-02-07 16:34:06 +01:00
|
|
|
testedBaseSettings,
|
2019-12-08 00:49:13 +01:00
|
|
|
name := "Util Cache",
|
|
|
|
|
libraryDependencies ++=
|
2024-03-01 09:34:11 +01:00
|
|
|
Seq(
|
|
|
|
|
sjsonNewCore.value,
|
|
|
|
|
sjsonNewScalaJson.value,
|
|
|
|
|
sjsonNewMurmurhash.value,
|
|
|
|
|
scalaReflect.value
|
|
|
|
|
),
|
|
|
|
|
Compile / managedSourceDirectories +=
|
|
|
|
|
baseDirectory.value / "src" / "main" / "contraband-scala",
|
|
|
|
|
Compile / generateContrabands / sourceManaged := baseDirectory.value / "src" / "main" / "contraband-scala",
|
|
|
|
|
Compile / generateContrabands / contrabandFormatsForType := ContrabandConfig.getFormats,
|
2019-12-08 00:49:13 +01:00
|
|
|
utilMimaSettings,
|
2024-02-07 16:34:06 +01:00
|
|
|
Test / fork := true,
|
|
|
|
|
)
|
|
|
|
|
.configure(
|
|
|
|
|
addSbtIO,
|
|
|
|
|
addSbtCompilerInterface,
|
2019-12-08 00:49:13 +01:00
|
|
|
)
|
|
|
|
|
|
|
|
|
|
// Builds on cache to provide caching for filesystem-related operations
|
|
|
|
|
lazy val utilTracking = (project in file("util-tracking"))
|
|
|
|
|
.dependsOn(utilCache)
|
|
|
|
|
.settings(
|
|
|
|
|
utilCommonSettings,
|
|
|
|
|
name := "Util Tracking",
|
|
|
|
|
libraryDependencies ++= Seq(scalatest % "test"),
|
|
|
|
|
utilMimaSettings,
|
2020-04-24 11:53:38 +02:00
|
|
|
mimaBinaryIssueFilters ++= Seq(
|
|
|
|
|
// Private final class constructors changed
|
|
|
|
|
ProblemFilters.exclude[IncompatibleMethTypeProblem]("sbt.util.Tracked#CacheHelp.this"),
|
|
|
|
|
)
|
2019-12-08 00:49:13 +01:00
|
|
|
)
|
|
|
|
|
.configure(addSbtIO)
|
|
|
|
|
|
|
|
|
|
lazy val utilScripted = (project in file("internal") / "util-scripted")
|
|
|
|
|
.dependsOn(utilLogging, utilInterface)
|
|
|
|
|
.settings(
|
|
|
|
|
utilCommonSettings,
|
|
|
|
|
name := "Util Scripted",
|
2021-11-16 02:19:26 +01:00
|
|
|
libraryDependencies += scalaParsers.value,
|
2019-12-08 00:49:13 +01:00
|
|
|
utilMimaSettings,
|
|
|
|
|
)
|
|
|
|
|
.configure(addSbtIO)
|
2014-12-18 05:38:10 +01:00
|
|
|
/* **** Intermediate-level Modules **** */
|
|
|
|
|
|
|
|
|
|
// Runner for uniform test interface
|
2017-04-21 09:14:31 +02:00
|
|
|
lazy val testingProj = (project in file("testing"))
|
|
|
|
|
.enablePlugins(ContrabandPlugin, JsonCodecPlugin)
|
2019-12-08 00:49:13 +01:00
|
|
|
.dependsOn(testAgentProj, utilLogging)
|
2017-04-21 09:14:31 +02:00
|
|
|
.settings(
|
2015-03-27 00:22:24 +01:00
|
|
|
baseSettings,
|
2014-12-18 05:38:10 +01:00
|
|
|
name := "Testing",
|
2020-01-10 14:41:55 +01:00
|
|
|
libraryDependencies ++= Seq(
|
2022-12-09 00:40:34 +01:00
|
|
|
scalaXml.value,
|
2019-05-11 09:42:06 +02:00
|
|
|
testInterface,
|
|
|
|
|
launcherInterface,
|
2022-01-17 08:27:44 +01:00
|
|
|
sjsonNewScalaJson.value,
|
|
|
|
|
sjsonNewCore.value,
|
2019-05-11 09:42:06 +02:00
|
|
|
),
|
2024-03-17 09:54:20 +01:00
|
|
|
conflictWarning := ConflictWarning.disable,
|
2021-05-03 05:25:23 +02:00
|
|
|
Compile / managedSourceDirectories +=
|
2017-04-19 07:50:18 +02:00
|
|
|
baseDirectory.value / "src" / "main" / "contraband-scala",
|
2021-05-03 05:25:23 +02:00
|
|
|
Compile / generateContrabands / sourceManaged := baseDirectory.value / "src" / "main" / "contraband-scala",
|
|
|
|
|
Compile / generateContrabands / contrabandFormatsForType := ContrabandConfig.getFormats,
|
2017-07-20 18:31:39 +02:00
|
|
|
mimaSettings,
|
2018-03-07 21:31:24 +01:00
|
|
|
mimaBinaryIssueFilters ++= Seq(
|
|
|
|
|
// private[sbt]
|
2018-03-27 15:12:01 +02:00
|
|
|
exclude[IncompatibleMethTypeProblem]("sbt.TestStatus.write"),
|
|
|
|
|
exclude[IncompatibleResultTypeProblem]("sbt.TestStatus.read"),
|
2018-03-12 16:18:42 +01:00
|
|
|
// copy method was never meant to be public
|
|
|
|
|
exclude[DirectMissingMethodProblem]("sbt.protocol.testing.EndTestGroupErrorEvent.copy"),
|
2019-05-11 09:42:06 +02:00
|
|
|
exclude[DirectMissingMethodProblem](
|
|
|
|
|
"sbt.protocol.testing.EndTestGroupErrorEvent.copy$default$*"
|
|
|
|
|
),
|
2018-03-12 16:18:42 +01:00
|
|
|
exclude[DirectMissingMethodProblem]("sbt.protocol.testing.EndTestGroupEvent.copy"),
|
|
|
|
|
exclude[DirectMissingMethodProblem]("sbt.protocol.testing.EndTestGroupEvent.copy$default$*"),
|
|
|
|
|
exclude[DirectMissingMethodProblem]("sbt.protocol.testing.StartTestGroupEvent.copy"),
|
2019-05-11 09:42:06 +02:00
|
|
|
exclude[DirectMissingMethodProblem](
|
|
|
|
|
"sbt.protocol.testing.StartTestGroupEvent.copy$default$*"
|
|
|
|
|
),
|
2018-03-12 16:18:42 +01:00
|
|
|
exclude[DirectMissingMethodProblem]("sbt.protocol.testing.TestCompleteEvent.copy"),
|
|
|
|
|
exclude[DirectMissingMethodProblem]("sbt.protocol.testing.TestCompleteEvent.copy$default$*"),
|
|
|
|
|
exclude[DirectMissingMethodProblem]("sbt.protocol.testing.TestInitEvent.copy"),
|
|
|
|
|
exclude[DirectMissingMethodProblem]("sbt.protocol.testing.TestItemDetail.copy"),
|
|
|
|
|
exclude[DirectMissingMethodProblem]("sbt.protocol.testing.TestItemDetail.copy$default$*"),
|
|
|
|
|
exclude[DirectMissingMethodProblem]("sbt.protocol.testing.TestItemEvent.copy"),
|
|
|
|
|
exclude[DirectMissingMethodProblem]("sbt.protocol.testing.TestItemEvent.copy$default$*"),
|
|
|
|
|
exclude[DirectMissingMethodProblem]("sbt.protocol.testing.TestStringEvent.copy"),
|
|
|
|
|
exclude[DirectMissingMethodProblem]("sbt.protocol.testing.TestStringEvent.copy$default$1"),
|
2021-12-12 07:49:11 +01:00
|
|
|
// no reason to use
|
2018-04-23 19:46:08 +02:00
|
|
|
exclude[DirectMissingMethodProblem]("sbt.JUnitXmlTestsListener.testSuite"),
|
2018-03-12 16:18:42 +01:00
|
|
|
)
|
2017-04-21 09:14:31 +02:00
|
|
|
)
|
2019-12-08 00:49:13 +01:00
|
|
|
.configure(addSbtIO, addSbtCompilerClasspath)
|
2014-12-18 05:38:10 +01:00
|
|
|
|
|
|
|
|
// Testing agent for running tests in a separate process.
|
2017-05-24 11:15:22 +02:00
|
|
|
lazy val testAgentProj = (project in file("testing") / "agent")
|
|
|
|
|
.settings(
|
|
|
|
|
minimalSettings,
|
|
|
|
|
crossPaths := false,
|
|
|
|
|
autoScalaLibrary := false,
|
2022-06-13 09:17:15 +02:00
|
|
|
Compile / doc / javacOptions := Nil,
|
2017-05-24 11:15:22 +02:00
|
|
|
name := "Test Agent",
|
2017-07-20 18:31:39 +02:00
|
|
|
libraryDependencies += testInterface,
|
|
|
|
|
mimaSettings,
|
2017-05-24 11:15:22 +02:00
|
|
|
)
|
2014-12-18 05:38:10 +01:00
|
|
|
|
|
|
|
|
// Basic task engine
|
2017-04-21 09:14:31 +02:00
|
|
|
lazy val taskProj = (project in file("tasks"))
|
2019-12-08 00:49:13 +01:00
|
|
|
.dependsOn(collectionProj, utilControl)
|
2017-04-21 09:14:31 +02:00
|
|
|
.settings(
|
2015-03-27 00:22:24 +01:00
|
|
|
testedBaseSettings,
|
2017-07-20 18:31:39 +02:00
|
|
|
name := "Tasks",
|
|
|
|
|
mimaSettings,
|
2019-03-08 21:26:15 +01:00
|
|
|
mimaBinaryIssueFilters ++= Seq(
|
2019-10-17 23:27:43 +02:00
|
|
|
exclude[IncompatibleSignatureProblem]("sbt.Triggers.this"),
|
|
|
|
|
exclude[IncompatibleSignatureProblem]("sbt.Triggers.runBefore"),
|
|
|
|
|
exclude[IncompatibleSignatureProblem]("sbt.Triggers.injectFor"),
|
|
|
|
|
exclude[IncompatibleSignatureProblem]("sbt.Triggers.onComplete"),
|
|
|
|
|
exclude[DirectMissingMethodProblem]("sbt.Inc.apply"),
|
2019-03-18 02:17:39 +01:00
|
|
|
// ok because sbt.ExecuteProgress has been under private[sbt]
|
|
|
|
|
exclude[IncompatibleResultTypeProblem]("sbt.ExecuteProgress.initial"),
|
|
|
|
|
exclude[DirectMissingMethodProblem]("sbt.ExecuteProgress.*"),
|
|
|
|
|
exclude[ReversedMissingMethodProblem]("sbt.ExecuteProgress.*"),
|
2019-10-17 23:27:43 +02:00
|
|
|
exclude[IncompatibleSignatureProblem]("sbt.ExecuteProgress.*"),
|
|
|
|
|
// ok because sbt.Execute has been under private[sbt]
|
|
|
|
|
exclude[IncompatibleSignatureProblem]("sbt.Execute.*"),
|
|
|
|
|
exclude[IncompatibleSignatureProblem]("sbt.Execute#CyclicException.*"),
|
|
|
|
|
exclude[IncompatibleSignatureProblem]("sbt.NodeView.*"),
|
2019-03-08 21:26:15 +01:00
|
|
|
)
|
2017-04-21 09:14:31 +02:00
|
|
|
)
|
2014-12-18 05:38:10 +01:00
|
|
|
|
|
|
|
|
// Standard task system. This provides map, flatMap, join, and more on top of the basic task model.
|
2017-04-21 09:14:31 +02:00
|
|
|
lazy val stdTaskProj = (project in file("tasks-standard"))
|
2019-12-08 00:49:13 +01:00
|
|
|
.dependsOn(collectionProj, utilLogging, utilCache)
|
2017-04-21 09:14:31 +02:00
|
|
|
.dependsOn(taskProj % "compile;test->test")
|
|
|
|
|
.settings(
|
2015-03-27 00:22:24 +01:00
|
|
|
testedBaseSettings,
|
2014-12-18 05:38:10 +01:00
|
|
|
name := "Task System",
|
2017-07-20 18:31:39 +02:00
|
|
|
testExclusive,
|
|
|
|
|
mimaSettings,
|
2019-05-29 15:43:14 +02:00
|
|
|
mimaBinaryIssueFilters ++= Seq(
|
|
|
|
|
// unused private[sbt]
|
|
|
|
|
exclude[DirectMissingMethodProblem]("sbt.Task.mapTask"),
|
2021-05-03 05:25:23 +02:00
|
|
|
exclude[NewMixinForwarderProblem]("sbt.std.TaskExtra.joinAnyTasks"),
|
2019-05-29 15:43:14 +02:00
|
|
|
),
|
2017-04-21 09:14:31 +02:00
|
|
|
)
|
2019-12-08 00:49:13 +01:00
|
|
|
.configure(addSbtIO)
|
2014-12-18 05:38:10 +01:00
|
|
|
|
|
|
|
|
// Embedded Scala code runner
|
2017-04-21 09:14:31 +02:00
|
|
|
lazy val runProj = (project in file("run"))
|
2017-06-16 22:11:33 +02:00
|
|
|
.enablePlugins(ContrabandPlugin)
|
2019-12-08 00:49:13 +01:00
|
|
|
.dependsOn(collectionProj, utilLogging, utilControl)
|
2017-04-21 09:14:31 +02:00
|
|
|
.settings(
|
2015-03-27 00:22:24 +01:00
|
|
|
testedBaseSettings,
|
2017-05-12 00:33:12 +02:00
|
|
|
name := "Run",
|
2021-05-03 05:25:23 +02:00
|
|
|
Compile / managedSourceDirectories +=
|
2017-05-12 00:33:12 +02:00
|
|
|
baseDirectory.value / "src" / "main" / "contraband-scala",
|
2021-05-03 05:25:23 +02:00
|
|
|
Compile / generateContrabands / sourceManaged := baseDirectory.value / "src" / "main" / "contraband-scala",
|
2017-07-20 18:31:39 +02:00
|
|
|
mimaSettings,
|
2018-03-12 16:18:42 +01:00
|
|
|
mimaBinaryIssueFilters ++= Seq(
|
|
|
|
|
// copy method was never meant to be public
|
|
|
|
|
exclude[DirectMissingMethodProblem]("sbt.ForkOptions.copy"),
|
|
|
|
|
exclude[DirectMissingMethodProblem]("sbt.ForkOptions.copy$default$*"),
|
|
|
|
|
exclude[DirectMissingMethodProblem]("sbt.OutputStrategy#BufferedOutput.copy"),
|
|
|
|
|
exclude[DirectMissingMethodProblem]("sbt.OutputStrategy#BufferedOutput.copy$default$*"),
|
|
|
|
|
exclude[DirectMissingMethodProblem]("sbt.OutputStrategy#CustomOutput.copy"),
|
|
|
|
|
exclude[DirectMissingMethodProblem]("sbt.OutputStrategy#CustomOutput.copy$default$*"),
|
|
|
|
|
exclude[DirectMissingMethodProblem]("sbt.OutputStrategy#LoggedOutput.copy"),
|
|
|
|
|
exclude[DirectMissingMethodProblem]("sbt.OutputStrategy#LoggedOutput.copy$default$*"),
|
2021-09-19 07:16:45 +02:00
|
|
|
exclude[Problem]("sbt.TrapExit*"),
|
|
|
|
|
exclude[MissingClassProblem]("sbt.ExitCode"), // private
|
|
|
|
|
exclude[MissingClassProblem]("sbt.LoggingExceptionHandler"), // private
|
2018-03-12 16:18:42 +01:00
|
|
|
)
|
2017-04-21 09:14:31 +02:00
|
|
|
)
|
2019-12-08 00:49:13 +01:00
|
|
|
.configure(addSbtIO, addSbtCompilerClasspath)
|
2014-12-18 05:38:10 +01:00
|
|
|
|
2018-02-01 15:53:11 +01:00
|
|
|
val sbtProjDepsCompileScopeFilter =
|
2019-05-11 09:42:06 +02:00
|
|
|
ScopeFilter(
|
|
|
|
|
inDependencies(LocalProject("sbtProj"), includeRoot = false),
|
|
|
|
|
inConfigurations(Compile)
|
|
|
|
|
)
|
2018-02-01 15:53:11 +01:00
|
|
|
|
2024-09-15 07:58:23 +02:00
|
|
|
lazy val scriptedSbtProj = (project in file("scripted-sbt"))
|
2020-01-12 04:52:36 +01:00
|
|
|
.dependsOn(sbtProj % "compile;test->test", commandProj, utilLogging, utilScripted)
|
2017-04-21 09:14:31 +02:00
|
|
|
.settings(
|
2015-03-27 00:22:24 +01:00
|
|
|
baseSettings,
|
2024-09-15 07:58:23 +02:00
|
|
|
name := "scripted-sbt",
|
2017-07-20 18:31:39 +02:00
|
|
|
libraryDependencies ++= Seq(launcherInterface % "provided"),
|
|
|
|
|
mimaSettings,
|
2024-09-15 07:58:23 +02:00
|
|
|
scriptedSbtMimaSettings,
|
2018-07-10 06:58:45 +02:00
|
|
|
)
|
2019-12-08 00:49:13 +01:00
|
|
|
.configure(addSbtIO, addSbtCompilerInterface, addSbtLmCore)
|
2018-07-10 06:58:45 +02:00
|
|
|
|
2020-09-23 03:21:01 +02:00
|
|
|
lazy val dependencyTreeProj = (project in file("dependency-tree"))
|
|
|
|
|
.dependsOn(sbtProj)
|
|
|
|
|
.settings(
|
|
|
|
|
sbtPlugin := true,
|
|
|
|
|
baseSettings,
|
|
|
|
|
name := "sbt-dependency-tree",
|
2024-03-26 07:21:59 +01:00
|
|
|
pluginCrossBuild / sbtVersion := version.value,
|
2020-09-23 06:42:14 +02:00
|
|
|
publishMavenStyle := true,
|
2020-09-23 03:21:01 +02:00
|
|
|
// mimaSettings,
|
2020-09-23 03:47:38 +02:00
|
|
|
mimaPreviousArtifacts := Set.empty,
|
2020-09-23 03:21:01 +02:00
|
|
|
)
|
|
|
|
|
|
2024-03-01 09:34:11 +01:00
|
|
|
lazy val remoteCacheProj = (project in file("sbt-remote-cache"))
|
|
|
|
|
.dependsOn(sbtProj)
|
|
|
|
|
.settings(
|
|
|
|
|
sbtPlugin := true,
|
|
|
|
|
baseSettings,
|
|
|
|
|
name := "sbt-remote-cache",
|
|
|
|
|
pluginCrossBuild / sbtVersion := version.value,
|
|
|
|
|
publishMavenStyle := true,
|
|
|
|
|
// mimaSettings,
|
|
|
|
|
mimaPreviousArtifacts := Set.empty,
|
|
|
|
|
libraryDependencies += remoteapis,
|
|
|
|
|
)
|
|
|
|
|
|
2014-12-18 05:38:10 +01:00
|
|
|
// Implementation and support code for defining actions.
|
2017-04-21 09:14:31 +02:00
|
|
|
lazy val actionsProj = (project in file("main-actions"))
|
2019-12-08 00:49:13 +01:00
|
|
|
.dependsOn(
|
|
|
|
|
completeProj,
|
|
|
|
|
runProj,
|
|
|
|
|
stdTaskProj,
|
|
|
|
|
taskProj,
|
|
|
|
|
testingProj,
|
2024-02-07 16:34:06 +01:00
|
|
|
utilCache,
|
2019-12-08 00:49:13 +01:00
|
|
|
utilLogging,
|
|
|
|
|
utilRelation,
|
|
|
|
|
utilTracking,
|
|
|
|
|
)
|
2017-04-21 09:14:31 +02:00
|
|
|
.settings(
|
2015-03-27 00:22:24 +01:00
|
|
|
testedBaseSettings,
|
2016-11-30 14:42:51 +01:00
|
|
|
name := "Actions",
|
2017-07-20 18:31:39 +02:00
|
|
|
libraryDependencies += sjsonNewScalaJson.value,
|
Support scala 2.13 console in thin client
In order to make the console task work with scala 2.13 and the thin
client, we need to provide a way for the scala repl to use an sbt
provided jline3 terminal instead of the default terminal typically built
by the repl. We also need to put jline 3 higher up in the classloading
hierarchy to ensure that two versions of jline 3 are not loaded (which
makes it impossible to share the sbt terminal with the scala terminal).
One impact of this change is the decoupling of the version of
jline-terminal used by the in process scala console and the version
of jline-terminal specified by the scala version itself. It is possible
to override this by setting the `useScalaReplJLine` flag to true. When
that is set, the scala REPL will run in a fully isolated classloader. That
will ensure that the versions are consistent. It will, however, for sure
break the thin client and may interfere with the embedded shell ui.
As part of this work, I also discovered that jline 3 Terminal.getSize is
very slow. In jline 2, the terminal attributes were automatically cached with a
timeout of, I think, 1 second so it wasn't a big deal to call
Terminal.getAttributes. The getSize method in jline 3 is not cached and
it shells out to run a tty command. This caused a significant
performance regression in sbt because when progress is enabled, we call
Terminal.getSize whenever we log any messages. I added caching of
getSize at the TerminalImpl level to address this. The timeout is 1
second, which seems responsive enough for most use cases. We could also
move the calculation onto a background thread and have it periodically
updated, but that seems like overkill.
2020-07-20 19:12:04 +02:00
|
|
|
libraryDependencies += jline3Terminal,
|
2017-07-20 18:31:39 +02:00
|
|
|
mimaSettings,
|
2017-12-05 17:16:26 +01:00
|
|
|
mimaBinaryIssueFilters ++= Seq(
|
|
|
|
|
// Removed unused private[sbt] nested class
|
|
|
|
|
exclude[MissingClassProblem]("sbt.Doc$Scaladoc"),
|
|
|
|
|
// Removed no longer used private[sbt] method
|
|
|
|
|
exclude[DirectMissingMethodProblem]("sbt.Doc.generate"),
|
2018-04-05 08:14:00 +02:00
|
|
|
exclude[DirectMissingMethodProblem]("sbt.compiler.Eval.filesModifiedBytes"),
|
|
|
|
|
exclude[DirectMissingMethodProblem]("sbt.compiler.Eval.fileModifiedBytes"),
|
2021-05-03 05:25:23 +02:00
|
|
|
exclude[DirectMissingMethodProblem]("sbt.Doc.$init$"),
|
2021-07-08 09:13:22 +02:00
|
|
|
// Added field in nested private[this] class
|
|
|
|
|
exclude[ReversedMissingMethodProblem]("sbt.compiler.Eval#EvalType.sourceName"),
|
2017-12-05 17:16:26 +01:00
|
|
|
),
|
2017-04-21 09:14:31 +02:00
|
|
|
)
|
|
|
|
|
.configure(
|
|
|
|
|
addSbtIO,
|
2017-06-26 12:38:37 +02:00
|
|
|
addSbtCompilerInterface,
|
|
|
|
|
addSbtCompilerClasspath,
|
|
|
|
|
addSbtCompilerApiInfo,
|
2017-07-16 00:09:40 +02:00
|
|
|
addSbtLmCore,
|
2017-06-26 12:38:37 +02:00
|
|
|
addSbtZinc
|
2017-04-21 09:14:31 +02:00
|
|
|
)
|
|
|
|
|
|
|
|
|
|
lazy val protocolProj = (project in file("protocol"))
|
2017-06-16 22:11:33 +02:00
|
|
|
.enablePlugins(ContrabandPlugin, JsonCodecPlugin)
|
2019-12-08 00:49:13 +01:00
|
|
|
.dependsOn(collectionProj, utilLogging)
|
2017-04-21 09:14:31 +02:00
|
|
|
.settings(
|
2016-12-01 09:14:07 +01:00
|
|
|
testedBaseSettings,
|
|
|
|
|
name := "Protocol",
|
2022-01-18 05:21:38 +01:00
|
|
|
libraryDependencies ++= Seq(sjsonNewScalaJson.value, sjsonNewCore.value, ipcSocket),
|
2021-05-03 05:25:23 +02:00
|
|
|
Compile / managedSourceDirectories +=
|
2017-04-19 07:50:18 +02:00
|
|
|
baseDirectory.value / "src" / "main" / "contraband-scala",
|
2021-05-03 05:25:23 +02:00
|
|
|
Compile / generateContrabands / sourceManaged := baseDirectory.value / "src" / "main" / "contraband-scala",
|
|
|
|
|
Compile / generateContrabands / contrabandFormatsForType := ContrabandConfig.getFormats,
|
2017-07-20 18:31:39 +02:00
|
|
|
mimaSettings,
|
2018-03-12 16:18:42 +01:00
|
|
|
mimaBinaryIssueFilters ++= Seq(
|
|
|
|
|
// copy method was never meant to be public
|
|
|
|
|
exclude[DirectMissingMethodProblem]("sbt.protocol.ChannelAcceptedEvent.copy"),
|
|
|
|
|
exclude[DirectMissingMethodProblem]("sbt.protocol.ChannelAcceptedEvent.copy$default$1"),
|
|
|
|
|
exclude[DirectMissingMethodProblem]("sbt.protocol.ExecCommand.copy"),
|
|
|
|
|
exclude[DirectMissingMethodProblem]("sbt.protocol.ExecCommand.copy$default$1"),
|
|
|
|
|
exclude[DirectMissingMethodProblem]("sbt.protocol.ExecCommand.copy$default$2"),
|
|
|
|
|
exclude[DirectMissingMethodProblem]("sbt.protocol.ExecStatusEvent.copy"),
|
|
|
|
|
exclude[DirectMissingMethodProblem]("sbt.protocol.ExecStatusEvent.copy$default$*"),
|
|
|
|
|
exclude[DirectMissingMethodProblem]("sbt.protocol.ExecutionEvent.copy"),
|
|
|
|
|
exclude[DirectMissingMethodProblem]("sbt.protocol.ExecutionEvent.copy$default$*"),
|
|
|
|
|
exclude[DirectMissingMethodProblem]("sbt.protocol.InitCommand.copy"),
|
|
|
|
|
exclude[DirectMissingMethodProblem]("sbt.protocol.InitCommand.copy$default$*"),
|
|
|
|
|
exclude[DirectMissingMethodProblem]("sbt.protocol.LogEvent.copy"),
|
|
|
|
|
exclude[DirectMissingMethodProblem]("sbt.protocol.LogEvent.copy$default$*"),
|
|
|
|
|
exclude[DirectMissingMethodProblem]("sbt.protocol.SettingQuery.copy"),
|
|
|
|
|
exclude[DirectMissingMethodProblem]("sbt.protocol.SettingQuery.copy$default$1"),
|
|
|
|
|
exclude[DirectMissingMethodProblem]("sbt.protocol.SettingQueryFailure.copy"),
|
|
|
|
|
exclude[DirectMissingMethodProblem]("sbt.protocol.SettingQueryFailure.copy$default$*"),
|
|
|
|
|
exclude[DirectMissingMethodProblem]("sbt.protocol.SettingQuerySuccess.copy"),
|
|
|
|
|
exclude[DirectMissingMethodProblem]("sbt.protocol.SettingQuerySuccess.copy$default$*"),
|
2020-05-12 17:34:34 +02:00
|
|
|
// ignore missing or incompatible methods in sbt.internal
|
|
|
|
|
exclude[IncompatibleMethTypeProblem]("sbt.internal.*"),
|
2018-03-12 16:18:42 +01:00
|
|
|
exclude[DirectMissingMethodProblem]("sbt.internal.*"),
|
2019-10-21 04:33:02 +02:00
|
|
|
exclude[MissingTypesProblem]("sbt.internal.protocol.JsonRpcResponseError"),
|
2018-03-12 16:18:42 +01:00
|
|
|
)
|
2017-04-21 09:14:31 +02:00
|
|
|
)
|
2016-12-01 09:14:07 +01:00
|
|
|
|
2014-12-18 05:38:10 +01:00
|
|
|
// General command support and core commands not specific to a build system
|
2017-04-21 09:14:31 +02:00
|
|
|
lazy val commandProj = (project in file("main-command"))
|
2017-06-16 22:11:33 +02:00
|
|
|
.enablePlugins(ContrabandPlugin, JsonCodecPlugin)
|
2024-02-07 16:34:06 +01:00
|
|
|
.dependsOn(protocolProj, completeProj, utilLogging, utilCache)
|
2017-04-21 09:14:31 +02:00
|
|
|
.settings(
|
2015-03-27 00:22:24 +01:00
|
|
|
testedBaseSettings,
|
2015-03-24 16:14:13 +01:00
|
|
|
name := "Command",
|
2022-01-18 05:21:38 +01:00
|
|
|
libraryDependencies ++= Seq(
|
|
|
|
|
launcherInterface,
|
|
|
|
|
sjsonNewCore.value,
|
|
|
|
|
sjsonNewScalaJson.value,
|
|
|
|
|
templateResolverApi
|
|
|
|
|
),
|
2021-05-03 05:25:23 +02:00
|
|
|
Compile / managedSourceDirectories +=
|
2017-04-19 07:50:18 +02:00
|
|
|
baseDirectory.value / "src" / "main" / "contraband-scala",
|
2021-05-03 05:25:23 +02:00
|
|
|
Compile / generateContrabands / sourceManaged := baseDirectory.value / "src" / "main" / "contraband-scala",
|
|
|
|
|
Compile / generateContrabands / contrabandFormatsForType := ContrabandConfig.getFormats,
|
2017-07-20 18:31:39 +02:00
|
|
|
mimaSettings,
|
2017-09-18 01:08:45 +02:00
|
|
|
mimaBinaryIssueFilters ++= Vector(
|
2019-10-17 23:27:43 +02:00
|
|
|
exclude[DirectMissingMethodProblem]("sbt.Exit.apply"),
|
|
|
|
|
exclude[DirectMissingMethodProblem]("sbt.Reboot.apply"),
|
|
|
|
|
exclude[DirectMissingMethodProblem]("sbt.TemplateResolverInfo.apply"),
|
2018-04-26 15:03:35 +02:00
|
|
|
// dropped private[sbt] method
|
|
|
|
|
exclude[DirectMissingMethodProblem]("sbt.BasicCommands.compatCommands"),
|
|
|
|
|
// dropped mainly internal command strings holder
|
|
|
|
|
exclude[MissingClassProblem]("sbt.BasicCommandStrings$Compat$"),
|
2018-01-10 04:48:07 +01:00
|
|
|
exclude[DirectMissingMethodProblem]("sbt.BasicCommands.rebootOptionParser"),
|
2017-09-18 01:08:45 +02:00
|
|
|
// Changed the signature of Server method. nacho cheese.
|
2017-09-22 05:05:48 +02:00
|
|
|
exclude[DirectMissingMethodProblem]("sbt.internal.server.Server.*"),
|
|
|
|
|
// Added method to ServerInstance. This is also internal.
|
|
|
|
|
exclude[ReversedMissingMethodProblem]("sbt.internal.server.ServerInstance.*"),
|
2017-10-02 21:52:02 +02:00
|
|
|
// Added method to CommandChannel. internal.
|
|
|
|
|
exclude[ReversedMissingMethodProblem]("sbt.internal.CommandChannel.*"),
|
2017-10-21 08:27:40 +02:00
|
|
|
// Added an overload to reboot. The overload is private[sbt].
|
|
|
|
|
exclude[ReversedMissingMethodProblem]("sbt.StateOps.reboot"),
|
2018-01-30 06:43:30 +01:00
|
|
|
// Replace nailgun socket stuff
|
|
|
|
|
exclude[MissingClassProblem]("sbt.internal.NG*"),
|
|
|
|
|
exclude[MissingClassProblem]("sbt.internal.ReferenceCountedFileDescriptor"),
|
2018-03-12 18:13:17 +01:00
|
|
|
// made private[sbt] method private[this]
|
|
|
|
|
exclude[DirectMissingMethodProblem]("sbt.State.handleException"),
|
2018-03-12 16:18:42 +01:00
|
|
|
// copy method was never meant to be public
|
|
|
|
|
exclude[DirectMissingMethodProblem]("sbt.CommandSource.copy"),
|
|
|
|
|
exclude[DirectMissingMethodProblem]("sbt.CommandSource.copy$default$*"),
|
|
|
|
|
exclude[DirectMissingMethodProblem]("sbt.Exec.copy"),
|
|
|
|
|
exclude[DirectMissingMethodProblem]("sbt.Exec.copy$default$*"),
|
2018-06-26 04:34:55 +02:00
|
|
|
// internal
|
|
|
|
|
exclude[ReversedMissingMethodProblem]("sbt.internal.client.ServerConnection.*"),
|
2020-05-22 14:39:45 +02:00
|
|
|
exclude[MissingTypesProblem]("sbt.internal.server.ServerConnection*"),
|
|
|
|
|
exclude[IncompatibleSignatureProblem]("sbt.internal.server.ServerConnection.*")
|
2017-11-28 03:37:31 +01:00
|
|
|
),
|
2021-05-03 05:25:23 +02:00
|
|
|
Compile / headerCreate / unmanagedSources := {
|
|
|
|
|
val old = (Compile / headerCreate / unmanagedSources).value
|
2019-05-11 09:42:06 +02:00
|
|
|
old filterNot { x =>
|
|
|
|
|
(x.getName startsWith "NG") || (x.getName == "ReferenceCountedFileDescriptor.java")
|
|
|
|
|
}
|
2017-11-28 03:37:31 +01:00
|
|
|
},
|
2017-04-21 09:14:31 +02:00
|
|
|
)
|
2017-06-23 18:58:00 +02:00
|
|
|
.configure(
|
|
|
|
|
addSbtIO,
|
2017-06-26 12:38:37 +02:00
|
|
|
addSbtCompilerInterface,
|
2017-06-23 18:58:00 +02:00
|
|
|
addSbtCompilerClasspath,
|
Add global file repository task
Every time that the compile task is run, there are potentially a large
number of iops that must occur in order for sbt to generate the source
file list as well as for zinc to check which files have changed since
the last build. This can lead to a noticeable delay between when a build
is started (either manually or by triggered execution) and when
compilation actually begins. To reduce this latency, I am adding a
global view of the file system that will be stored in
BasicKeys.globalFileTreeView.
To make this work, I introduce the StampedFile trait, which augments the
java.io.File class with a stamp method that returns the zinc stamp for
the file. For source files, this will be a hash of the file, while for
binaries, it is just the last modified time. In order to gain access to
the sbt.internal.inc.Stamper class, I had to append addSbtZinc to the
commandProj configurations.
This view may or may not use an in-memory cache of the file system tree
to return the results. Because there is always the risk of the cache
getting out of sync with the actual file system, I both make it optional
to use a cache and provide a mechanism for flushing the cache. Moreover,
the in-memory cache implementation in sbt.io, which is backed by a
swoval FileTreeRepository, has the property that touching a monitored
directory invalidates the entire directory within the cache, so the
flush command isn't even strictly needed in general.
Because caching is optional, the global is of a FileTreeDataView, which
doesn't specify a caching strategy. Subsequent commits will make use of
this to potentially speed up incremental compilation by caching the
Stamps of the source files so that zinc does not need to compute the
hashes itself and will allow for continuous builds to use the cache to
monitor events instead of creating a new, standalone FileEventMonitor.
2018-08-26 01:43:48 +02:00
|
|
|
addSbtLmCore,
|
|
|
|
|
addSbtZinc
|
2017-06-23 18:58:00 +02:00
|
|
|
)
|
2014-12-18 05:38:10 +01:00
|
|
|
|
2017-05-23 23:48:20 +02:00
|
|
|
// The core macro project defines the main logic of the DSL, abstracted
|
2019-07-28 05:49:24 +02:00
|
|
|
// away from several sbt implementors (tasks, settings, et cetera).
|
2017-05-23 23:53:04 +02:00
|
|
|
lazy val coreMacrosProj = (project in file("core-macros"))
|
2024-02-07 16:34:06 +01:00
|
|
|
.dependsOn(
|
|
|
|
|
collectionProj,
|
|
|
|
|
utilCache,
|
|
|
|
|
)
|
2017-05-23 23:53:04 +02:00
|
|
|
.settings(
|
2023-11-14 12:12:34 +01:00
|
|
|
testedBaseSettings,
|
2017-05-23 23:48:20 +02:00
|
|
|
name := "Core Macros",
|
2020-08-16 19:57:10 +02:00
|
|
|
SettingKey[Boolean]("exportPipelining") := false,
|
2017-07-20 18:31:39 +02:00
|
|
|
mimaSettings,
|
2017-05-23 23:48:20 +02:00
|
|
|
)
|
|
|
|
|
|
2014-12-18 05:38:10 +01:00
|
|
|
// Fixes scope=Scope for Setting (core defined in collectionProj) to define the settings system used in build definitions
|
2017-04-21 09:14:31 +02:00
|
|
|
lazy val mainSettingsProj = (project in file("main-settings"))
|
2019-12-08 00:49:13 +01:00
|
|
|
.dependsOn(
|
|
|
|
|
completeProj,
|
|
|
|
|
commandProj,
|
|
|
|
|
stdTaskProj,
|
|
|
|
|
coreMacrosProj,
|
2022-08-10 16:07:14 +02:00
|
|
|
logicProj,
|
2019-12-08 00:49:13 +01:00
|
|
|
utilLogging,
|
|
|
|
|
utilCache,
|
|
|
|
|
utilRelation,
|
|
|
|
|
)
|
2017-04-21 09:14:31 +02:00
|
|
|
.settings(
|
2015-03-27 00:22:24 +01:00
|
|
|
testedBaseSettings,
|
2017-05-24 10:27:51 +02:00
|
|
|
name := "Main Settings",
|
2021-05-03 05:25:23 +02:00
|
|
|
Test / testOptions ++= {
|
2020-01-12 04:52:36 +01:00
|
|
|
val cp = (Test / fullClasspathAsJars).value.map(_.data).mkString(java.io.File.pathSeparator)
|
|
|
|
|
val framework = TestFrameworks.ScalaTest
|
|
|
|
|
Tests.Argument(framework, s"-Dsbt.server.classpath=$cp") ::
|
|
|
|
|
Tests.Argument(framework, s"-Dsbt.server.version=${version.value}") ::
|
|
|
|
|
Tests.Argument(framework, s"-Dsbt.server.scala.version=${scalaVersion.value}") :: Nil
|
|
|
|
|
},
|
2017-07-20 18:31:39 +02:00
|
|
|
mimaSettings,
|
2018-01-10 04:48:07 +01:00
|
|
|
mimaBinaryIssueFilters ++= Seq(
|
2019-10-17 23:27:43 +02:00
|
|
|
exclude[IncompatibleSignatureProblem]("sbt.Previous#References.getReferences"),
|
|
|
|
|
exclude[IncompatibleSignatureProblem]("sbt.Def.delegate"),
|
|
|
|
|
exclude[IncompatibleSignatureProblem]("sbt.Def.add"),
|
|
|
|
|
exclude[IncompatibleSignatureProblem]("sbt.Def.grouped"),
|
|
|
|
|
exclude[IncompatibleSignatureProblem]("sbt.Def.compile"),
|
|
|
|
|
exclude[IncompatibleSignatureProblem]("sbt.Def.asTransform"),
|
|
|
|
|
exclude[DirectMissingMethodProblem]("sbt.Def.StaticScopes"),
|
|
|
|
|
exclude[IncompatibleSignatureProblem]("sbt.Previous.this"),
|
|
|
|
|
exclude[DirectMissingMethodProblem]("sbt.BuildRef.apply"),
|
|
|
|
|
exclude[DirectMissingMethodProblem]("sbt.ScopeMask.apply"),
|
|
|
|
|
exclude[DirectMissingMethodProblem]("sbt.Def.intersect"),
|
|
|
|
|
exclude[DirectMissingMethodProblem]("sbt.LocalProject.apply"),
|
|
|
|
|
exclude[DirectMissingMethodProblem]("sbt.std.InitializeInstance.pure"),
|
|
|
|
|
exclude[DirectMissingMethodProblem]("sbt.std.InitializeInstance.flatten"),
|
|
|
|
|
exclude[DirectMissingMethodProblem]("sbt.std.InitializeInstance.map"),
|
|
|
|
|
exclude[DirectMissingMethodProblem]("sbt.std.InitializeInstance.app"),
|
|
|
|
|
exclude[DirectMissingMethodProblem]("sbt.std.ParserInstance.pure"),
|
|
|
|
|
exclude[DirectMissingMethodProblem]("sbt.std.ParserInstance.map"),
|
|
|
|
|
exclude[DirectMissingMethodProblem]("sbt.std.ParserInstance.app"),
|
|
|
|
|
exclude[DirectMissingMethodProblem]("sbt.std.ParserInstance.pure"),
|
|
|
|
|
exclude[DirectMissingMethodProblem]("sbt.std.TaskInstance.pure"),
|
|
|
|
|
exclude[DirectMissingMethodProblem]("sbt.std.TaskInstance.flatten"),
|
|
|
|
|
exclude[DirectMissingMethodProblem]("sbt.std.TaskInstance.map"),
|
|
|
|
|
exclude[DirectMissingMethodProblem]("sbt.std.TaskInstance.app"),
|
|
|
|
|
exclude[DirectMissingMethodProblem]("sbt.std.FullInstance.flatten"),
|
2018-01-10 04:48:07 +01:00
|
|
|
exclude[DirectMissingMethodProblem]("sbt.Scope.display012StyleMasked"),
|
2018-03-27 02:36:41 +02:00
|
|
|
// added a method to a sealed trait
|
|
|
|
|
exclude[InheritedNewAbstractMethodProblem]("sbt.Scoped.canEqual"),
|
|
|
|
|
exclude[InheritedNewAbstractMethodProblem]("sbt.ScopedTaskable.canEqual"),
|
2020-02-16 20:51:53 +01:00
|
|
|
// widened ScopedTaskable parameter to (new) supertype Taskable
|
|
|
|
|
exclude[IncompatibleSignatureProblem]("sbt.Scoped#RichTaskable*.this"),
|
|
|
|
|
exclude[IncompatibleSignatureProblem]("sbt.TupleSyntax.t*ToTable*"),
|
2018-01-10 04:48:07 +01:00
|
|
|
),
|
2017-04-21 09:14:31 +02:00
|
|
|
)
|
|
|
|
|
.configure(
|
2017-06-26 12:38:37 +02:00
|
|
|
addSbtIO,
|
|
|
|
|
addSbtCompilerInterface,
|
2017-04-21 09:14:31 +02:00
|
|
|
addSbtCompilerClasspath,
|
2017-07-16 00:09:40 +02:00
|
|
|
addSbtLmCore
|
2017-04-21 09:14:31 +02:00
|
|
|
)
|
2014-12-18 05:38:10 +01:00
|
|
|
|
2019-04-18 09:14:04 +02:00
|
|
|
lazy val zincLmIntegrationProj = (project in file("zinc-lm-integration"))
|
|
|
|
|
.settings(
|
|
|
|
|
name := "Zinc LM Integration",
|
|
|
|
|
testedBaseSettings,
|
2021-05-03 05:25:23 +02:00
|
|
|
Test / testOptions +=
|
2020-01-12 04:52:36 +01:00
|
|
|
Tests.Argument(TestFrameworks.ScalaTest, s"-Dsbt.zinc.version=$zincVersion"),
|
2019-04-18 09:14:04 +02:00
|
|
|
mimaSettingsSince(sbt13Plus),
|
2020-04-24 23:43:07 +02:00
|
|
|
mimaBinaryIssueFilters ++= Seq(
|
|
|
|
|
exclude[IncompatibleMethTypeProblem]("sbt.internal.inc.ZincComponentCompiler*"),
|
|
|
|
|
exclude[IncompatibleSignatureProblem]("sbt.internal.inc.ZincComponentCompiler*"),
|
|
|
|
|
exclude[IncompatibleSignatureProblem]("sbt.internal.inc.ZincLMHelper.update"),
|
|
|
|
|
),
|
2019-05-09 03:26:15 +02:00
|
|
|
libraryDependencies += launcherInterface,
|
2019-04-18 09:14:04 +02:00
|
|
|
)
|
|
|
|
|
.configure(addSbtZincCompileCore, addSbtLmCore, addSbtLmIvyTest)
|
|
|
|
|
|
2022-08-10 16:07:14 +02:00
|
|
|
lazy val buildFileProj = (project in file("buildfile"))
|
|
|
|
|
.dependsOn(
|
|
|
|
|
mainSettingsProj,
|
|
|
|
|
)
|
|
|
|
|
.settings(
|
|
|
|
|
testedBaseSettings,
|
|
|
|
|
name := "build file",
|
|
|
|
|
libraryDependencies ++= Seq(scalaCompiler),
|
|
|
|
|
)
|
|
|
|
|
.configure(
|
|
|
|
|
addSbtIO,
|
|
|
|
|
addSbtLmCore,
|
|
|
|
|
addSbtLmIvy,
|
|
|
|
|
addSbtCompilerInterface,
|
2024-03-06 13:59:33 +01:00
|
|
|
addSbtZincCompileCore
|
2022-08-10 16:07:14 +02:00
|
|
|
)
|
|
|
|
|
|
2016-11-23 16:17:34 +01:00
|
|
|
// The main integration project for sbt. It brings all of the projects together, configures them, and provides for overriding conventions.
|
2017-04-21 09:14:31 +02:00
|
|
|
lazy val mainProj = (project in file("main"))
|
2017-06-16 22:11:33 +02:00
|
|
|
.enablePlugins(ContrabandPlugin)
|
2019-05-11 09:42:06 +02:00
|
|
|
.dependsOn(
|
|
|
|
|
actionsProj,
|
2022-09-20 09:49:26 +02:00
|
|
|
buildFileProj,
|
2019-05-11 09:42:06 +02:00
|
|
|
mainSettingsProj,
|
|
|
|
|
runProj,
|
|
|
|
|
commandProj,
|
|
|
|
|
collectionProj,
|
2019-12-08 00:49:13 +01:00
|
|
|
zincLmIntegrationProj,
|
|
|
|
|
utilLogging,
|
2019-05-11 09:42:06 +02:00
|
|
|
)
|
2017-04-21 09:14:31 +02:00
|
|
|
.settings(
|
2015-03-27 00:22:24 +01:00
|
|
|
testedBaseSettings,
|
2014-12-18 05:38:10 +01:00
|
|
|
name := "Main",
|
2018-10-05 19:32:40 +02:00
|
|
|
checkPluginCross := {
|
|
|
|
|
val sv = scalaVersion.value
|
2020-01-10 14:41:55 +01:00
|
|
|
val f = baseDirectory.value / "src" / "main" / "scala" / "sbt" / "PluginCross.scala"
|
2021-01-11 01:23:43 +01:00
|
|
|
if (sv.startsWith("2.12") && !IO.readLines(f).exists(_.contains(s""""$sv""""))) {
|
2020-01-10 14:41:55 +01:00
|
|
|
sys.error(s"PluginCross.scala does not match up with the scalaVersion $sv")
|
2021-01-11 01:23:43 +01:00
|
|
|
}
|
2019-03-09 02:15:04 +01:00
|
|
|
},
|
2020-01-10 14:41:55 +01:00
|
|
|
libraryDependencies ++=
|
2022-10-18 16:08:23 +02:00
|
|
|
(Seq(
|
2022-12-09 00:40:34 +01:00
|
|
|
scalaXml.value,
|
2022-10-18 16:08:23 +02:00
|
|
|
sjsonNewScalaJson.value,
|
|
|
|
|
sjsonNewCore.value,
|
|
|
|
|
launcherInterface,
|
|
|
|
|
caffeine,
|
|
|
|
|
lmCoursierShaded,
|
|
|
|
|
) ++ log4jModules),
|
2021-01-11 01:23:43 +01:00
|
|
|
libraryDependencies ++= (scalaVersion.value match {
|
|
|
|
|
case v if v.startsWith("2.12.") => List()
|
|
|
|
|
case _ => List(scalaPar)
|
|
|
|
|
}),
|
2021-05-03 05:25:23 +02:00
|
|
|
Compile / managedSourceDirectories +=
|
2017-05-13 14:01:51 +02:00
|
|
|
baseDirectory.value / "src" / "main" / "contraband-scala",
|
2021-05-03 05:25:23 +02:00
|
|
|
Compile / generateContrabands / sourceManaged := baseDirectory.value / "src" / "main" / "contraband-scala",
|
|
|
|
|
Test / testOptions += Tests
|
2019-05-11 10:52:42 +02:00
|
|
|
.Argument(TestFrameworks.ScalaCheck, "-minSuccessfulTests", "1000"),
|
2020-08-16 19:57:10 +02:00
|
|
|
SettingKey[Boolean]("usePipelining") := false,
|
2023-11-25 00:51:20 +01:00
|
|
|
// TODO: Fix doc
|
|
|
|
|
Compile / doc / sources := Nil,
|
2022-08-10 16:07:14 +02:00
|
|
|
// mimaSettings,
|
|
|
|
|
// mimaBinaryIssueFilters ++= Vector(),
|
2017-04-21 09:14:31 +02:00
|
|
|
)
|
2017-06-23 18:58:00 +02:00
|
|
|
.configure(
|
|
|
|
|
addSbtIO,
|
2017-07-16 00:09:40 +02:00
|
|
|
addSbtLmCore,
|
2019-10-16 20:27:32 +02:00
|
|
|
addSbtLmIvy,
|
2017-06-26 12:38:37 +02:00
|
|
|
addSbtCompilerInterface,
|
2024-03-06 13:59:33 +01:00
|
|
|
addSbtZincCompileCore
|
2017-08-10 17:23:15 +02:00
|
|
|
)
|
2014-12-18 05:38:10 +01:00
|
|
|
|
|
|
|
|
// Strictly for bringing implicits and aliases from subsystems into the top-level sbt namespace through a single package object
|
|
|
|
|
// technically, we need a dependency on all of mainProj's dependencies, but we don't do that since this is strictly an integration project
|
|
|
|
|
// with the sole purpose of providing certain identifiers without qualification (with a package object)
|
2021-04-20 05:43:15 +02:00
|
|
|
lazy val sbtProj = (project in file("sbt-app"))
|
2020-01-12 04:52:36 +01:00
|
|
|
.dependsOn(mainProj)
|
2017-04-21 09:14:31 +02:00
|
|
|
.settings(
|
2018-01-24 09:56:42 +01:00
|
|
|
testedBaseSettings,
|
2014-12-18 05:38:10 +01:00
|
|
|
name := "sbt",
|
2015-09-14 09:27:22 +02:00
|
|
|
normalizedName := "sbt",
|
2021-01-11 01:23:43 +01:00
|
|
|
version := {
|
|
|
|
|
if (scalaVersion.value == baseScalaVersion) version.value
|
|
|
|
|
else version2_13.value
|
|
|
|
|
},
|
2017-07-20 18:31:39 +02:00
|
|
|
crossPaths := false,
|
2021-01-11 01:23:43 +01:00
|
|
|
crossTarget := { target.value / scalaVersion.value },
|
2017-11-23 15:58:26 +01:00
|
|
|
javaOptions ++= Seq("-Xdebug", "-Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5005"),
|
2017-07-20 18:31:39 +02:00
|
|
|
mimaSettings,
|
2017-08-28 06:42:26 +02:00
|
|
|
mimaBinaryIssueFilters ++= sbtIgnoredProblems,
|
2019-10-21 02:42:52 +02:00
|
|
|
)
|
2020-02-14 15:01:11 +01:00
|
|
|
.settings(
|
|
|
|
|
Test / run / connectInput := true,
|
|
|
|
|
Test / run / outputStrategy := Some(StdoutOutput),
|
|
|
|
|
Test / run / fork := true,
|
2021-05-03 05:25:23 +02:00
|
|
|
Test / testOptions ++= {
|
2020-02-14 15:01:11 +01:00
|
|
|
val cp = (Test / fullClasspathAsJars).value.map(_.data).mkString(java.io.File.pathSeparator)
|
|
|
|
|
val framework = TestFrameworks.ScalaTest
|
|
|
|
|
Tests.Argument(framework, s"-Dsbt.server.classpath=$cp") ::
|
|
|
|
|
Tests.Argument(framework, s"-Dsbt.server.version=${version.value}") ::
|
|
|
|
|
Tests.Argument(framework, s"-Dsbt.server.scala.version=${scalaVersion.value}") :: Nil
|
|
|
|
|
},
|
|
|
|
|
)
|
2022-09-20 09:49:26 +02:00
|
|
|
.configure(addSbtIO)
|
|
|
|
|
// addSbtCompilerBridge
|
2019-10-21 02:42:52 +02:00
|
|
|
|
|
|
|
|
lazy val serverTestProj = (project in file("server-test"))
|
2024-09-15 07:58:23 +02:00
|
|
|
.dependsOn(sbtProj % "compile->test", scriptedSbtProj % "compile->test")
|
2019-10-21 02:42:52 +02:00
|
|
|
.settings(
|
|
|
|
|
testedBaseSettings,
|
|
|
|
|
publish / skip := true,
|
|
|
|
|
// make server tests serial
|
2020-06-22 00:46:18 +02:00
|
|
|
Test / watchTriggers += baseDirectory.value.toGlob / "src" / "server-test" / **,
|
2019-10-21 02:42:52 +02:00
|
|
|
Test / parallelExecution := false,
|
2018-03-26 16:37:25 +02:00
|
|
|
Test / run / connectInput := true,
|
|
|
|
|
Test / run / outputStrategy := Some(StdoutOutput),
|
|
|
|
|
Test / run / fork := true,
|
2020-09-27 18:46:32 +02:00
|
|
|
Test / sourceGenerators += Def.task {
|
|
|
|
|
val rawClasspath =
|
|
|
|
|
(Compile / fullClasspathAsJars).value.map(_.data).mkString(java.io.File.pathSeparator)
|
|
|
|
|
val cp =
|
2021-11-14 14:59:34 +01:00
|
|
|
if (scala.util.Properties.isWin) rawClasspath.replace("\\", "\\\\")
|
2020-09-27 18:46:32 +02:00
|
|
|
else rawClasspath
|
|
|
|
|
val content = {
|
|
|
|
|
s"""|
|
|
|
|
|
|package testpkg
|
|
|
|
|
|
|
|
|
|
|
|object TestProperties {
|
|
|
|
|
| val classpath = "$cp"
|
|
|
|
|
| val version = "${version.value}"
|
|
|
|
|
| val scalaVersion = "${scalaVersion.value}"
|
|
|
|
|
|}
|
|
|
|
|
""".stripMargin
|
|
|
|
|
}
|
2021-12-12 07:49:11 +01:00
|
|
|
val file =
|
|
|
|
|
(Test / target).value / "generated" / "src" / "test" / "scala" / "testpkg" / "TestProperties.scala"
|
2020-09-27 18:46:32 +02:00
|
|
|
IO.write(file, content)
|
|
|
|
|
file :: Nil
|
2020-01-12 04:52:36 +01:00
|
|
|
},
|
2017-04-21 09:14:31 +02:00
|
|
|
)
|
2017-10-20 05:18:43 +02:00
|
|
|
|
2020-06-22 01:48:33 +02:00
|
|
|
val isWin = scala.util.Properties.isWin
|
2023-01-02 23:48:13 +01:00
|
|
|
val isLinux = scala.util.Properties.isLinux
|
|
|
|
|
val isArmArchitecture: Boolean = sys.props
|
|
|
|
|
.getOrElse("os.arch", "")
|
|
|
|
|
.toLowerCase(Locale.ROOT) == "aarch64"
|
2020-07-27 23:33:19 +02:00
|
|
|
val buildThinClient =
|
2020-06-22 01:48:33 +02:00
|
|
|
inputKey[JPath]("generate a java implementation of the thin client")
|
2020-07-27 23:33:19 +02:00
|
|
|
// Use a TaskKey rather than SettingKey for nativeInstallDirectory so it can left unset by default
|
|
|
|
|
val nativeInstallDirectory = taskKey[JPath]("The install directory for the native executable")
|
|
|
|
|
val installNativeThinClient = inputKey[JPath]("Install the native executable")
|
2020-06-22 01:48:33 +02:00
|
|
|
lazy val sbtClientProj = (project in file("client"))
|
2022-06-26 19:15:50 +02:00
|
|
|
.enablePlugins(NativeImagePlugin)
|
2020-06-22 01:48:33 +02:00
|
|
|
.dependsOn(commandProj)
|
|
|
|
|
.settings(
|
2024-03-05 13:24:31 +01:00
|
|
|
commonSettings,
|
2020-06-22 01:48:33 +02:00
|
|
|
publish / skip := true,
|
|
|
|
|
name := "sbt-client",
|
|
|
|
|
mimaPreviousArtifacts := Set.empty,
|
|
|
|
|
crossPaths := false,
|
|
|
|
|
exportJars := true,
|
|
|
|
|
libraryDependencies += jansi,
|
2022-12-09 00:40:34 +01:00
|
|
|
libraryDependencies += scalatest % Test,
|
2022-06-26 19:15:50 +02:00
|
|
|
Compile / mainClass := Some("sbt.client.Client"),
|
|
|
|
|
nativeImageReady := { () =>
|
|
|
|
|
()
|
2020-06-22 01:48:33 +02:00
|
|
|
},
|
2023-05-12 15:22:18 +02:00
|
|
|
nativeImageVersion := "22.2.0",
|
2022-06-27 09:09:43 +02:00
|
|
|
nativeImageOutput := target.value / "bin" / "sbtn",
|
2022-06-26 19:15:50 +02:00
|
|
|
nativeImageOptions ++= Seq(
|
2020-06-22 01:48:33 +02:00
|
|
|
"--no-fallback",
|
|
|
|
|
s"--initialize-at-run-time=sbt.client",
|
2022-06-26 19:15:50 +02:00
|
|
|
// "--verbose",
|
2020-06-22 01:48:33 +02:00
|
|
|
"-H:IncludeResourceBundles=jline.console.completer.CandidateListCompletionHandler",
|
|
|
|
|
"-H:+ReportExceptionStackTraces",
|
2020-07-01 23:29:50 +02:00
|
|
|
"-H:-ParseRuntimeOptions",
|
2020-08-14 04:56:02 +02:00
|
|
|
s"-H:Name=${target.value / "bin" / "sbtn"}",
|
2020-06-22 01:48:33 +02:00
|
|
|
),
|
2020-07-27 23:33:19 +02:00
|
|
|
buildThinClient := {
|
2020-06-22 01:48:33 +02:00
|
|
|
val isFish = Def.spaceDelimited("").parsed.headOption.fold(false)(_ == "--fish")
|
|
|
|
|
val ext = if (isWin) ".bat" else if (isFish) ".fish" else ".sh"
|
|
|
|
|
val output = target.value.toPath / "bin" / s"${if (isFish) "fish-" else ""}client$ext"
|
|
|
|
|
java.nio.file.Files.createDirectories(output.getParent)
|
|
|
|
|
val cp = (Compile / fullClasspathAsJars).value.map(_.data)
|
|
|
|
|
val args =
|
|
|
|
|
if (isWin) "%*" else if (isFish) s"$$argv" else s"$$*"
|
|
|
|
|
java.nio.file.Files.write(
|
|
|
|
|
output,
|
|
|
|
|
s"""
|
|
|
|
|
|${if (isWin) "@echo off" else s"#!/usr/bin/env ${if (isFish) "fish" else "sh"}"}
|
|
|
|
|
|
|
|
|
|
|
|java -cp ${cp.mkString(java.io.File.pathSeparator)} sbt.client.Client --jna $args
|
|
|
|
|
""".stripMargin.linesIterator.toSeq.tail.mkString("\n").getBytes
|
|
|
|
|
)
|
|
|
|
|
output.toFile.setExecutable(true)
|
|
|
|
|
output
|
|
|
|
|
},
|
|
|
|
|
)
|
|
|
|
|
|
2019-03-09 02:15:04 +01:00
|
|
|
/*
|
2018-10-24 17:19:28 +02:00
|
|
|
lazy val sbtBig = (project in file(".big"))
|
|
|
|
|
.dependsOn(sbtProj)
|
|
|
|
|
.settings(
|
|
|
|
|
name := "sbt-big",
|
|
|
|
|
normalizedName := "sbt-big",
|
|
|
|
|
crossPaths := false,
|
|
|
|
|
assemblyShadeRules.in(assembly) := {
|
|
|
|
|
val packagesToBeShaded = Seq(
|
|
|
|
|
"fastparse",
|
|
|
|
|
"jawn",
|
|
|
|
|
"scalapb",
|
|
|
|
|
)
|
|
|
|
|
packagesToBeShaded.map( prefix => {
|
|
|
|
|
ShadeRule.rename(s"$prefix.**" -> s"sbt.internal.$prefix.@1").inAll
|
|
|
|
|
})
|
|
|
|
|
},
|
|
|
|
|
assemblyMergeStrategy in assembly := {
|
|
|
|
|
case "LICENSE" | "NOTICE" => MergeStrategy.first
|
|
|
|
|
case x => (assemblyMergeStrategy in assembly).value(x)
|
|
|
|
|
},
|
|
|
|
|
artifact.in(Compile, packageBin) := artifact.in(Compile, assembly).value,
|
|
|
|
|
assemblyOption.in(assembly) ~= { _.copy(includeScala = false) },
|
|
|
|
|
addArtifact(artifact.in(Compile, packageBin), assembly),
|
|
|
|
|
pomPostProcess := { node =>
|
|
|
|
|
new RuleTransformer(new RewriteRule {
|
|
|
|
|
override def transform(node: XmlNode): XmlNodeSeq = node match {
|
|
|
|
|
case e: Elem if node.label == "dependency" =>
|
|
|
|
|
Comment(
|
|
|
|
|
"the dependency that was here has been absorbed via sbt-assembly"
|
|
|
|
|
)
|
|
|
|
|
case _ => node
|
|
|
|
|
}
|
|
|
|
|
}).transform(node).head
|
|
|
|
|
},
|
|
|
|
|
)
|
2019-05-11 09:42:06 +02:00
|
|
|
*/
|
2018-10-24 17:19:28 +02:00
|
|
|
|
2019-12-27 06:24:03 +01:00
|
|
|
// util projects used by Zinc and Lm
|
|
|
|
|
lazy val lowerUtils = (project in (file("internal") / "lower"))
|
|
|
|
|
.aggregate(lowerUtilProjects.map(p => LocalProject(p.id)): _*)
|
|
|
|
|
.settings(
|
2023-11-14 12:12:34 +01:00
|
|
|
publish / skip := true
|
2019-12-27 06:24:03 +01:00
|
|
|
)
|
|
|
|
|
|
|
|
|
|
lazy val upperModules = (project in (file("internal") / "upper"))
|
2020-11-15 03:22:29 +01:00
|
|
|
.aggregate(
|
|
|
|
|
((allProjects diff lowerUtilProjects)
|
|
|
|
|
diff Seq(bundledLauncherProj)).map(p => LocalProject(p.id)): _*
|
|
|
|
|
)
|
2019-12-27 06:24:03 +01:00
|
|
|
.settings(
|
2023-11-14 12:12:34 +01:00
|
|
|
publish / skip := true
|
2019-12-27 06:24:03 +01:00
|
|
|
)
|
|
|
|
|
|
2017-08-28 06:42:26 +02:00
|
|
|
lazy val sbtIgnoredProblems = {
|
2017-11-29 22:45:02 +01:00
|
|
|
Vector(
|
2019-10-17 23:27:43 +02:00
|
|
|
exclude[IncompatibleSignatureProblem]("sbt.package.some"),
|
|
|
|
|
exclude[IncompatibleSignatureProblem]("sbt.package.inThisBuild"),
|
|
|
|
|
exclude[IncompatibleSignatureProblem]("sbt.package.inConfig"),
|
|
|
|
|
exclude[IncompatibleSignatureProblem]("sbt.package.inTask"),
|
|
|
|
|
exclude[IncompatibleSignatureProblem]("sbt.package.inScope"),
|
2018-01-10 04:48:07 +01:00
|
|
|
exclude[MissingClassProblem]("buildinfo.BuildInfo"),
|
|
|
|
|
exclude[MissingClassProblem]("buildinfo.BuildInfo$"),
|
2017-08-28 06:42:26 +02:00
|
|
|
// Added more items to Import trait.
|
|
|
|
|
exclude[ReversedMissingMethodProblem]("sbt.Import.sbt$Import$_setter_$WatchSource_="),
|
2017-11-29 22:45:02 +01:00
|
|
|
exclude[ReversedMissingMethodProblem]("sbt.Import.WatchSource"),
|
Add support for managed task inputs
In my recent changes to watch, I have been moving towards a world in
which sbt manages the file inputs and outputs at the task level. The
main idea is that we want to enable a user to specify the inputs and
outputs of a task and have sbt able to track those inputs across
multiple task evaluations. Sbt should be able to automatically trigger a
build when the inputs change and it also should be able to avoid task
evaluation if non of the inputs have changed.
The former case of having sbt automatically watch the file inputs of a
task has been present since watch was refactored. In this commit, I
make it possible for the user to retrieve the lists of new, modified and
deleted files. The user can then avoid task evaluation if none of the
inputs have changed.
To implement this, I inject a number of new settings during project
load if the fileInputs setting is defined for a task. The injected
settings are:
allPathsAndAttributes -- this retrieves all of the paths described by
the fileInputs for the task along with their attributes
fileStamps -- this retrieves all of the file stamps for the files
returned by allPathsAndAttributes
Using these two injected tasks, I also inject a number of derived tasks,
such as allFiles, which returns all of the regular files returned by
allPathsAndAttributes and changedFiles, which returns all of the regular
files that have been modified since the last run.
Using these injected settings, the user is able to write tasks that
avoid evaluation if the inputs haven't changed.
foo / fileInputs += baseDirectory.value.toGlob / ** / "*.scala"
foo := {
foo.previous match {
case Some(p) if (foo / changedFiles).value.isEmpty => p
case _ => fooImpl((foo / allFiles).value
}
}
To make this whole mechanism work, I add a private task key:
val fileAttributeMap = taskKey[java.util.HashMap[Path, Stamp]]("...")
This keeps track of the stamps for all of the files that are managed by
sbt. The fileStamps task will first look for the stamp in the attribute
map and, only if it is not present, it will update the cache. This
allows us to ensure that a given file will only be stamped once per task
evaluation run no matter how the file inputs are specified. Moreover, in
a continuous build, I'm able to reuse the attribute map which can
significantly reduce latency because the default file stamping
implementation used by zinc is fairly expensive (it can take anywhere
between 300-1500ms to stamp 5000 8kb source files on my mac).
I also renamed some of the watch related keys to be a bit more clear.
2019-04-24 02:00:13 +02:00
|
|
|
exclude[ReversedMissingMethodProblem]("sbt.Import.AnyPath"),
|
|
|
|
|
exclude[ReversedMissingMethodProblem]("sbt.Import.sbt$Import$_setter_$**_="),
|
|
|
|
|
exclude[ReversedMissingMethodProblem]("sbt.Import.sbt$Import$_setter_$*_="),
|
2019-04-30 21:02:28 +02:00
|
|
|
exclude[ReversedMissingMethodProblem]("sbt.Import.sbt$Import$_setter_$ChangedFiles_="),
|
Add support for managed task inputs
In my recent changes to watch, I have been moving towards a world in
which sbt manages the file inputs and outputs at the task level. The
main idea is that we want to enable a user to specify the inputs and
outputs of a task and have sbt able to track those inputs across
multiple task evaluations. Sbt should be able to automatically trigger a
build when the inputs change and it also should be able to avoid task
evaluation if non of the inputs have changed.
The former case of having sbt automatically watch the file inputs of a
task has been present since watch was refactored. In this commit, I
make it possible for the user to retrieve the lists of new, modified and
deleted files. The user can then avoid task evaluation if none of the
inputs have changed.
To implement this, I inject a number of new settings during project
load if the fileInputs setting is defined for a task. The injected
settings are:
allPathsAndAttributes -- this retrieves all of the paths described by
the fileInputs for the task along with their attributes
fileStamps -- this retrieves all of the file stamps for the files
returned by allPathsAndAttributes
Using these two injected tasks, I also inject a number of derived tasks,
such as allFiles, which returns all of the regular files returned by
allPathsAndAttributes and changedFiles, which returns all of the regular
files that have been modified since the last run.
Using these injected settings, the user is able to write tasks that
avoid evaluation if the inputs haven't changed.
foo / fileInputs += baseDirectory.value.toGlob / ** / "*.scala"
foo := {
foo.previous match {
case Some(p) if (foo / changedFiles).value.isEmpty => p
case _ => fooImpl((foo / allFiles).value
}
}
To make this whole mechanism work, I add a private task key:
val fileAttributeMap = taskKey[java.util.HashMap[Path, Stamp]]("...")
This keeps track of the stamps for all of the files that are managed by
sbt. The fileStamps task will first look for the stamp in the attribute
map and, only if it is not present, it will update the cache. This
allows us to ensure that a given file will only be stamped once per task
evaluation run no matter how the file inputs are specified. Moreover, in
a continuous build, I'm able to reuse the attribute map which can
significantly reduce latency because the default file stamping
implementation used by zinc is fairly expensive (it can take anywhere
between 300-1500ms to stamp 5000 8kb source files on my mac).
I also renamed some of the watch related keys to be a bit more clear.
2019-04-24 02:00:13 +02:00
|
|
|
exclude[ReversedMissingMethodProblem]("sbt.Import.sbt$Import$_setter_$AnyPath_="),
|
|
|
|
|
exclude[ReversedMissingMethodProblem]("sbt.Import.sbt$Import$_setter_$Glob_="),
|
|
|
|
|
exclude[ReversedMissingMethodProblem]("sbt.Import.sbt$Import$_setter_$RecursiveGlob_="),
|
|
|
|
|
exclude[ReversedMissingMethodProblem]("sbt.Import.sbt$Import$_setter_$RelativeGlob_="),
|
|
|
|
|
exclude[ReversedMissingMethodProblem]("sbt.Import.*"),
|
|
|
|
|
exclude[ReversedMissingMethodProblem]("sbt.Import.**"),
|
2019-04-30 21:02:28 +02:00
|
|
|
exclude[ReversedMissingMethodProblem]("sbt.Import.ChangedFiles"),
|
Add support for managed task inputs
In my recent changes to watch, I have been moving towards a world in
which sbt manages the file inputs and outputs at the task level. The
main idea is that we want to enable a user to specify the inputs and
outputs of a task and have sbt able to track those inputs across
multiple task evaluations. Sbt should be able to automatically trigger a
build when the inputs change and it also should be able to avoid task
evaluation if non of the inputs have changed.
The former case of having sbt automatically watch the file inputs of a
task has been present since watch was refactored. In this commit, I
make it possible for the user to retrieve the lists of new, modified and
deleted files. The user can then avoid task evaluation if none of the
inputs have changed.
To implement this, I inject a number of new settings during project
load if the fileInputs setting is defined for a task. The injected
settings are:
allPathsAndAttributes -- this retrieves all of the paths described by
the fileInputs for the task along with their attributes
fileStamps -- this retrieves all of the file stamps for the files
returned by allPathsAndAttributes
Using these two injected tasks, I also inject a number of derived tasks,
such as allFiles, which returns all of the regular files returned by
allPathsAndAttributes and changedFiles, which returns all of the regular
files that have been modified since the last run.
Using these injected settings, the user is able to write tasks that
avoid evaluation if the inputs haven't changed.
foo / fileInputs += baseDirectory.value.toGlob / ** / "*.scala"
foo := {
foo.previous match {
case Some(p) if (foo / changedFiles).value.isEmpty => p
case _ => fooImpl((foo / allFiles).value
}
}
To make this whole mechanism work, I add a private task key:
val fileAttributeMap = taskKey[java.util.HashMap[Path, Stamp]]("...")
This keeps track of the stamps for all of the files that are managed by
sbt. The fileStamps task will first look for the stamp in the attribute
map and, only if it is not present, it will update the cache. This
allows us to ensure that a given file will only be stamped once per task
evaluation run no matter how the file inputs are specified. Moreover, in
a continuous build, I'm able to reuse the attribute map which can
significantly reduce latency because the default file stamping
implementation used by zinc is fairly expensive (it can take anywhere
between 300-1500ms to stamp 5000 8kb source files on my mac).
I also renamed some of the watch related keys to be a bit more clear.
2019-04-24 02:00:13 +02:00
|
|
|
exclude[ReversedMissingMethodProblem]("sbt.Import.RecursiveGlob"),
|
|
|
|
|
exclude[ReversedMissingMethodProblem]("sbt.Import.Glob"),
|
|
|
|
|
exclude[ReversedMissingMethodProblem]("sbt.Import.RelativeGlob"),
|
2017-11-29 22:45:02 +01:00
|
|
|
// Dropped in favour of kind-projector's polymorphic lambda literals
|
|
|
|
|
exclude[DirectMissingMethodProblem]("sbt.Import.Param"),
|
|
|
|
|
exclude[DirectMissingMethodProblem]("sbt.package.Param"),
|
2018-07-01 09:13:09 +02:00
|
|
|
exclude[ReversedMissingMethodProblem]("sbt.Import.SemanticSelector"),
|
|
|
|
|
exclude[ReversedMissingMethodProblem]("sbt.Import.sbt$Import$_setter_$SemanticSelector_="),
|
2017-11-29 22:45:02 +01:00
|
|
|
// Dropped in favour of plain scala.Function, and its compose method
|
|
|
|
|
exclude[DirectMissingMethodProblem]("sbt.package.toFn1"),
|
2021-05-03 05:25:23 +02:00
|
|
|
exclude[NewMixinForwarderProblem]("sbt.IOSyntax1.singleFileFinder"),
|
|
|
|
|
exclude[DirectMissingMethodProblem]("sbt.IOSyntax1.$init$"),
|
2017-04-21 09:14:31 +02:00
|
|
|
)
|
2017-08-28 06:42:26 +02:00
|
|
|
}
|
2014-12-18 05:38:10 +01:00
|
|
|
|
2017-10-29 14:37:53 +01:00
|
|
|
def runNpm(command: String, base: File, log: sbt.internal.util.ManagedLogger) = {
|
|
|
|
|
import scala.sys.process._
|
|
|
|
|
try {
|
2017-12-19 06:17:46 +01:00
|
|
|
val exitCode = Process(s"npm $command", Option(base)) ! log
|
2017-10-29 14:37:53 +01:00
|
|
|
if (exitCode != 0) throw new Exception("Process returned exit code: " + exitCode)
|
|
|
|
|
} catch {
|
|
|
|
|
case e: java.io.IOException => log.warn("failed to run npm " + e.getMessage)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2017-10-02 09:33:29 +02:00
|
|
|
lazy val vscodePlugin = (project in file("vscode-sbt-scala"))
|
|
|
|
|
.settings(
|
2021-01-10 20:18:22 +01:00
|
|
|
bspEnabled := false,
|
2017-10-02 09:33:29 +02:00
|
|
|
crossPaths := false,
|
2021-05-03 05:25:23 +02:00
|
|
|
publish / skip := true,
|
|
|
|
|
Compile / compile := {
|
2020-09-20 21:02:09 +02:00
|
|
|
val _ = update.value
|
2017-10-29 14:37:53 +01:00
|
|
|
runNpm("run compile", baseDirectory.value, streams.value.log)
|
|
|
|
|
sbt.internal.inc.Analysis.empty
|
2017-10-02 09:33:29 +02:00
|
|
|
},
|
|
|
|
|
update := {
|
|
|
|
|
val old = update.value
|
|
|
|
|
val t = target.value / "updated"
|
|
|
|
|
val base = baseDirectory.value
|
2017-10-06 02:26:59 +02:00
|
|
|
val log = streams.value.log
|
2017-10-02 09:33:29 +02:00
|
|
|
if (t.exists) ()
|
|
|
|
|
else {
|
2017-10-29 14:37:53 +01:00
|
|
|
runNpm("install", base, log)
|
2017-10-02 09:33:29 +02:00
|
|
|
IO.touch(t)
|
|
|
|
|
}
|
|
|
|
|
old
|
|
|
|
|
},
|
|
|
|
|
cleanFiles ++= {
|
|
|
|
|
val base = baseDirectory.value
|
|
|
|
|
Vector(
|
|
|
|
|
target.value / "updated",
|
2019-05-11 09:42:06 +02:00
|
|
|
base / "node_modules",
|
|
|
|
|
base / "client" / "node_modules",
|
2017-10-02 09:33:29 +02:00
|
|
|
base / "client" / "server",
|
|
|
|
|
base / "client" / "out",
|
2019-05-11 09:42:06 +02:00
|
|
|
base / "server" / "node_modules"
|
|
|
|
|
) filter { _.exists }
|
2017-10-02 09:33:29 +02:00
|
|
|
}
|
|
|
|
|
)
|
|
|
|
|
|
2020-01-13 01:50:29 +01:00
|
|
|
def scriptedTask(launch: Boolean): Def.Initialize[InputTask[Unit]] = Def.inputTask {
|
2020-09-20 21:02:09 +02:00
|
|
|
val _ = publishLocalBinAll.value
|
2020-01-13 01:50:29 +01:00
|
|
|
val launchJar = s"-Dsbt.launch.jar=${(bundledLauncherProj / Compile / packageBin).value}"
|
2017-04-21 09:14:31 +02:00
|
|
|
Scripted.doScripted(
|
2024-09-15 07:58:23 +02:00
|
|
|
(scriptedSbtProj / scalaInstance).value,
|
2017-04-21 09:14:31 +02:00
|
|
|
scriptedSource.value,
|
|
|
|
|
scriptedBufferLog.value,
|
2018-01-24 14:42:18 +01:00
|
|
|
Def.setting(Scripted.scriptedParser(scriptedSource.value)).parsed,
|
2017-04-21 09:14:31 +02:00
|
|
|
scriptedPrescripted.value,
|
2020-01-13 01:50:29 +01:00
|
|
|
scriptedLaunchOpts.value ++ (if (launch) Some(launchJar) else None),
|
2020-01-12 04:52:36 +01:00
|
|
|
scalaVersion.value,
|
|
|
|
|
version.value,
|
2024-09-15 07:58:23 +02:00
|
|
|
(scriptedSbtProj / Test / fullClasspathAsJars).value
|
2020-11-20 21:17:59 +01:00
|
|
|
.map(_.data)
|
|
|
|
|
.filterNot(_.getName.contains("scala-compiler")),
|
2022-10-02 07:58:37 +02:00
|
|
|
(bundledLauncherProj / Compile / packageBin).value,
|
2019-11-17 21:34:19 +01:00
|
|
|
streams.value.log
|
2017-04-21 09:14:31 +02:00
|
|
|
)
|
2014-12-18 05:38:10 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
lazy val publishLauncher = TaskKey[Unit]("publish-launcher")
|
|
|
|
|
|
2017-04-21 09:14:31 +02:00
|
|
|
def allProjects =
|
|
|
|
|
Seq(
|
2017-06-26 12:38:37 +02:00
|
|
|
logicProj,
|
|
|
|
|
completeProj,
|
2017-04-21 09:14:31 +02:00
|
|
|
testingProj,
|
|
|
|
|
testAgentProj,
|
|
|
|
|
taskProj,
|
|
|
|
|
stdTaskProj,
|
|
|
|
|
runProj,
|
2024-09-15 07:58:23 +02:00
|
|
|
scriptedSbtProj,
|
2020-09-23 03:21:01 +02:00
|
|
|
dependencyTreeProj,
|
2017-04-21 09:14:31 +02:00
|
|
|
protocolProj,
|
|
|
|
|
actionsProj,
|
|
|
|
|
commandProj,
|
|
|
|
|
mainSettingsProj,
|
2019-04-18 09:14:04 +02:00
|
|
|
zincLmIntegrationProj,
|
2017-04-21 09:14:31 +02:00
|
|
|
mainProj,
|
|
|
|
|
sbtProj,
|
2017-05-26 06:59:49 +02:00
|
|
|
bundledLauncherProj,
|
2020-06-22 01:48:33 +02:00
|
|
|
sbtClientProj,
|
2022-08-10 16:07:14 +02:00
|
|
|
buildFileProj,
|
2024-02-07 16:34:06 +01:00
|
|
|
utilCache,
|
|
|
|
|
utilTracking,
|
2024-03-17 21:32:02 +01:00
|
|
|
collectionProj,
|
|
|
|
|
coreMacrosProj,
|
2024-03-01 09:34:11 +01:00
|
|
|
remoteCacheProj,
|
2019-12-27 06:24:03 +01:00
|
|
|
) ++ lowerUtilProjects
|
|
|
|
|
|
2020-09-20 21:02:09 +02:00
|
|
|
// These need to be cross published to 2.12 and 2.13 for Zinc
|
2019-12-27 06:24:03 +01:00
|
|
|
lazy val lowerUtilProjects =
|
|
|
|
|
Seq(
|
2023-11-14 12:12:34 +01:00
|
|
|
utilCore,
|
2019-12-08 00:49:13 +01:00
|
|
|
utilControl,
|
|
|
|
|
utilInterface,
|
|
|
|
|
utilLogging,
|
|
|
|
|
utilPosition,
|
|
|
|
|
utilRelation,
|
|
|
|
|
utilScripted,
|
2017-04-21 09:14:31 +02:00
|
|
|
)
|
2015-02-03 04:44:02 +01:00
|
|
|
|
2017-05-08 15:08:40 +02:00
|
|
|
lazy val nonRoots = allProjects.map(p => LocalProject(p.id))
|
2014-12-18 05:38:10 +01:00
|
|
|
|
2018-07-31 02:28:42 +02:00
|
|
|
ThisBuild / scriptedBufferLog := true
|
2021-12-12 07:49:11 +01:00
|
|
|
ThisBuild / scriptedPrescripted := { _ => }
|
2018-07-31 02:28:42 +02:00
|
|
|
|
2017-04-21 09:14:31 +02:00
|
|
|
def otherRootSettings =
|
|
|
|
|
Seq(
|
2022-10-02 07:58:37 +02:00
|
|
|
scripted := scriptedTask(true).evaluated,
|
|
|
|
|
scriptedUnpublished := scriptedTask(true).evaluated,
|
2021-05-03 05:25:23 +02:00
|
|
|
scriptedSource := (sbtProj / sourceDirectory).value / "sbt-test",
|
|
|
|
|
scripted / watchTriggers += scriptedSource.value.toGlob / **,
|
|
|
|
|
scriptedUnpublished / watchTriggers := (scripted / watchTriggers).value,
|
2019-12-30 01:26:05 +01:00
|
|
|
scriptedLaunchOpts := List("-Xmx1500M", "-Xms512M", "-server") :::
|
|
|
|
|
(sys.props.get("sbt.ivy.home") match {
|
|
|
|
|
case Some(home) => List(s"-Dsbt.ivy.home=$home")
|
|
|
|
|
case _ => Nil
|
|
|
|
|
}),
|
2020-09-20 21:02:09 +02:00
|
|
|
publishLocalBinAll := {
|
|
|
|
|
val _ = (Compile / publishLocalBin).all(scriptedProjects).value
|
|
|
|
|
},
|
2017-04-21 09:14:31 +02:00
|
|
|
) ++ inConfig(Scripted.RepoOverrideTest)(
|
|
|
|
|
Seq(
|
2017-06-23 18:58:00 +02:00
|
|
|
scriptedLaunchOpts := List(
|
|
|
|
|
"-Xmx1500M",
|
|
|
|
|
"-Xms512M",
|
|
|
|
|
"-server",
|
|
|
|
|
"-Dsbt.override.build.repos=true",
|
|
|
|
|
s"""-Dsbt.repository.config=${scriptedSource.value / "repo.config"}"""
|
2019-12-30 01:26:05 +01:00
|
|
|
) :::
|
|
|
|
|
(sys.props.get("sbt.ivy.home") match {
|
|
|
|
|
case Some(home) => List(s"-Dsbt.ivy.home=$home")
|
|
|
|
|
case _ => Nil
|
|
|
|
|
}),
|
2020-01-13 01:50:29 +01:00
|
|
|
scripted := scriptedTask(true).evaluated,
|
|
|
|
|
scriptedUnpublished := scriptedTask(true).evaluated,
|
2021-05-03 05:25:23 +02:00
|
|
|
scriptedSource := (sbtProj / sourceDirectory).value / "repo-override-test"
|
2019-05-11 09:42:06 +02:00
|
|
|
)
|
|
|
|
|
)
|
2016-04-24 20:23:48 +02:00
|
|
|
|
2014-12-18 19:14:04 +01:00
|
|
|
lazy val docProjects: ScopeFilter = ScopeFilter(
|
2019-05-11 09:42:06 +02:00
|
|
|
inAnyProject -- inProjects(
|
|
|
|
|
sbtRoot,
|
|
|
|
|
sbtProj,
|
2024-09-15 07:58:23 +02:00
|
|
|
scriptedSbtProj,
|
2019-12-27 06:24:03 +01:00
|
|
|
upperModules,
|
|
|
|
|
lowerUtils,
|
2019-05-11 09:42:06 +02:00
|
|
|
),
|
2014-12-18 19:14:04 +01:00
|
|
|
inConfigurations(Compile)
|
2014-12-18 05:38:10 +01:00
|
|
|
)
|
2020-01-14 23:01:17 +01:00
|
|
|
lazy val javafmtOnCompile = taskKey[Unit]("Formats java sources before compile")
|
2020-01-12 04:52:36 +01:00
|
|
|
lazy val scriptedProjects = ScopeFilter(inAnyProject -- inProjects(vscodePlugin))
|
2014-12-18 23:40:20 +01:00
|
|
|
|
|
|
|
|
def customCommands: Seq[Setting[_]] = Seq(
|
2017-01-15 07:44:05 +01:00
|
|
|
commands += Command.command("setupBuildScala212") { state =>
|
|
|
|
|
s"""set scalaVersion in ThisBuild := "$scala212" """ ::
|
2014-12-18 23:40:20 +01:00
|
|
|
state
|
|
|
|
|
},
|
|
|
|
|
commands += Command.command("release-sbt-local") { state =>
|
2015-02-25 18:31:21 +01:00
|
|
|
"clean" ::
|
2017-04-21 09:14:31 +02:00
|
|
|
"so compile" ::
|
|
|
|
|
"so publishLocal" ::
|
|
|
|
|
"reload" ::
|
|
|
|
|
state
|
2014-12-18 23:40:20 +01:00
|
|
|
},
|
2018-02-21 08:28:33 +01:00
|
|
|
commands += Command.command("publishLocalAllModule") { state =>
|
|
|
|
|
val extracted = Project.extract(state)
|
|
|
|
|
import extracted._
|
2019-05-11 09:42:06 +02:00
|
|
|
val sv = get(scalaVersion)
|
|
|
|
|
val projs = structure.allProjectRefs
|
2021-12-12 07:49:11 +01:00
|
|
|
val ioOpt = projs find { case ProjectRef(_, id) => id == "ioRoot"; case _ => false }
|
2018-02-21 08:28:33 +01:00
|
|
|
val utilOpt = projs find { case ProjectRef(_, id) => id == "utilRoot"; case _ => false }
|
2021-12-12 07:49:11 +01:00
|
|
|
val lmOpt = projs find { case ProjectRef(_, id) => id == "lmRoot"; case _ => false }
|
2018-02-21 08:28:33 +01:00
|
|
|
val zincOpt = projs find { case ProjectRef(_, id) => id == "zincRoot"; case _ => false }
|
2021-12-12 07:49:11 +01:00
|
|
|
(ioOpt map { case ProjectRef(build, _) => "{" + build.toString + "}/publishLocal" }).toList :::
|
|
|
|
|
(utilOpt map { case ProjectRef(build, _) =>
|
|
|
|
|
"{" + build.toString + "}/publishLocal"
|
|
|
|
|
}).toList :::
|
|
|
|
|
(lmOpt map { case ProjectRef(build, _) =>
|
|
|
|
|
"{" + build.toString + "}/publishLocal"
|
|
|
|
|
}).toList :::
|
|
|
|
|
(zincOpt map { case ProjectRef(build, _) =>
|
|
|
|
|
val zincSv = get((ProjectRef(build, "zinc") / scalaVersion))
|
|
|
|
|
val csv = get((ProjectRef(build, "compilerBridge") / crossScalaVersions)).toList
|
|
|
|
|
(csv flatMap { bridgeSv =>
|
|
|
|
|
s"++$bridgeSv" :: ("{" + build.toString + "}compilerBridge/publishLocal") :: Nil
|
|
|
|
|
}) :::
|
|
|
|
|
List(s"++$zincSv", "{" + build.toString + "}/publishLocal")
|
2019-05-11 09:42:06 +02:00
|
|
|
}).getOrElse(Nil) :::
|
|
|
|
|
List(s"++$sv", "publishLocal") :::
|
|
|
|
|
state
|
2018-02-21 08:28:33 +01:00
|
|
|
},
|
2020-09-20 21:02:09 +02:00
|
|
|
commands += Command.command("releaseLowerUtils") { state =>
|
|
|
|
|
// TODO - Any sort of validation
|
|
|
|
|
"clean" ::
|
|
|
|
|
"+lowerUtils/compile" ::
|
|
|
|
|
"+lowerUtils/publishSigned" ::
|
|
|
|
|
s"++$scala212" ::
|
|
|
|
|
state
|
|
|
|
|
},
|
|
|
|
|
commands += Command.command("release") { state =>
|
2014-12-18 23:40:20 +01:00
|
|
|
// TODO - Any sort of validation
|
2021-04-26 05:15:16 +02:00
|
|
|
"upperModules/compile" ::
|
2020-09-20 21:02:09 +02:00
|
|
|
"upperModules/publishSigned" ::
|
2020-11-16 05:38:48 +01:00
|
|
|
"bundledLauncherProj/publishSigned" ::
|
2015-02-21 03:09:43 +01:00
|
|
|
state
|
|
|
|
|
},
|
2014-12-18 23:40:20 +01:00
|
|
|
)
|
2018-01-11 15:13:21 +01:00
|
|
|
|
2021-03-07 23:41:52 +01:00
|
|
|
ThisBuild / pomIncludeRepository := { _ =>
|
|
|
|
|
false
|
|
|
|
|
}
|
|
|
|
|
ThisBuild / publishTo := {
|
|
|
|
|
val nexus = "https://oss.sonatype.org/"
|
2021-04-04 01:23:38 +02:00
|
|
|
Some("releases" at nexus + "service/local/staging/deploy/maven2")
|
2021-03-07 23:41:52 +01:00
|
|
|
}
|
|
|
|
|
ThisBuild / publishMavenStyle := true
|