mirror of https://github.com/sbt/sbt.git
Merge branch 'develop' into 2.x-fix-7706
This commit is contained in:
commit
254ff06b6b
|
|
@ -27,7 +27,7 @@ trait TestResultLogger {
|
|||
*
|
||||
* @param log The target logger to write output to.
|
||||
* @param results The test results about which to log.
|
||||
* @param taskName The task about which we are logging. Eg. "my-module-b/test:test"
|
||||
* @param taskName The task about which we are logging. Eg. "my-module-b/Test/test"
|
||||
*/
|
||||
def run(log: Logger, results: Output, taskName: String): Unit
|
||||
|
||||
|
|
|
|||
|
|
@ -332,9 +332,6 @@ object Defaults extends BuildCommon {
|
|||
envVars :== Map.empty,
|
||||
sbtVersion := appConfiguration.value.provider.id.version,
|
||||
sbtBinaryVersion := binarySbtVersion(sbtVersion.value),
|
||||
// `pluginCrossBuild` scoping is based on sbt-cross-building plugin.
|
||||
// The idea here is to be able to define a `sbtVersion in pluginCrossBuild`, which
|
||||
// directs the dependencies of the plugin to build to the specified sbt plugin version.
|
||||
pluginCrossBuild / sbtVersion := sbtVersion.value,
|
||||
onLoad := idFun[State],
|
||||
onUnload := idFun[State],
|
||||
|
|
@ -3105,7 +3102,7 @@ object Classpaths {
|
|||
Defaults.globalDefaults(
|
||||
Seq(
|
||||
publishMavenStyle :== true,
|
||||
sbtPluginPublishLegacyMavenStyle :== true,
|
||||
sbtPluginPublishLegacyMavenStyle :== false,
|
||||
publishArtifact :== true,
|
||||
(Test / publishArtifact) :== false
|
||||
)
|
||||
|
|
@ -5052,7 +5049,7 @@ trait BuildExtra extends BuildCommon with DefExtra {
|
|||
|
||||
/**
|
||||
* Disables post-compilation hook for determining tests for tab-completion (such as for 'test-only').
|
||||
* This is useful for reducing test:compile time when not running test.
|
||||
* This is useful for reducing Test/compile time when not running test.
|
||||
*/
|
||||
def noTestCompletion(config: Configuration = Test): Setting[_] =
|
||||
inConfig(config)(Seq(definedTests := detectTests.value)).head
|
||||
|
|
|
|||
|
|
@ -36,7 +36,6 @@ final class ParsedKey(val key: ScopedKey[_], val mask: ScopeMask, val separaters
|
|||
end ParsedKey
|
||||
|
||||
object Act {
|
||||
val ZeroString = "*"
|
||||
private[sbt] val GlobalIdent = "Global"
|
||||
private[sbt] val ZeroIdent = "Zero"
|
||||
private[sbt] val ThisBuildIdent = "ThisBuild"
|
||||
|
|
@ -46,8 +45,6 @@ object Act {
|
|||
token(OptSpace ~> '/' <~ OptSpace).examples("/").map(_ => ())
|
||||
|
||||
private[sbt] val slashSeq: Seq[String] = Seq("/")
|
||||
private[sbt] val colonSeq: Seq[String] = Seq(":")
|
||||
private[sbt] val colonColonSeq: Seq[String] = Seq("::")
|
||||
|
||||
// this does not take aggregation into account
|
||||
def scopedKey(
|
||||
|
|
@ -242,26 +239,15 @@ object Act {
|
|||
def toAxis[T](opt: Option[T], ifNone: ScopeAxis[T]): ScopeAxis[T] =
|
||||
opt match { case Some(t) => Select(t); case None => ifNone }
|
||||
|
||||
def config(confs: Set[String]): Parser[ParsedAxis[String]] = {
|
||||
val sep = ':' !!! "Expected ':' (if selecting a configuration)"
|
||||
token(
|
||||
(ZeroString ^^^ ParsedZero | value(examples(ID, confs, "configuration"))) <~ sep
|
||||
) ?? Omitted
|
||||
}
|
||||
|
||||
// New configuration parser that's able to parse configuration ident trailed by slash.
|
||||
private[sbt] def configIdent(
|
||||
confs: Set[String],
|
||||
idents: Set[String],
|
||||
fromIdent: String => String
|
||||
): Parser[(ParsedAxis[String], Seq[String])] = {
|
||||
val oldSep: Parser[Char] = ':'
|
||||
val sep: Parser[Unit] = spacedSlash !!! "Expected '/'"
|
||||
token(
|
||||
((ZeroString ^^^ (ParsedZero -> colonSeq)) <~ oldSep)
|
||||
| ((ZeroString ^^^ (ParsedZero -> slashSeq)) <~ sep)
|
||||
| ((ZeroIdent ^^^ (ParsedZero -> slashSeq)) <~ sep)
|
||||
| (value(examples(ID, confs, "configuration")).map(_ -> colonSeq) <~ oldSep)
|
||||
((ZeroIdent ^^^ (ParsedZero -> slashSeq)) <~ sep)
|
||||
| (value(examples(CapitalizedID, idents, "configuration ident").map(fromIdent))
|
||||
.map(_ -> slashSeq) <~ sep)
|
||||
) ?? (Omitted -> Nil)
|
||||
|
|
@ -358,16 +344,10 @@ object Act {
|
|||
val suggested = normKeys.map(_._1).toSet
|
||||
val keyP = filterStrings(examples(ID, suggested, "key"), valid.keySet, "key").map(valid)
|
||||
|
||||
((token(
|
||||
(token(
|
||||
value(keyP).map(_ -> slashSeq)
|
||||
| ZeroString ^^^ (ParsedZero -> slashSeq)
|
||||
| ZeroIdent ^^^ (ParsedZero -> slashSeq)
|
||||
) <~ spacedSlash) |
|
||||
(token(
|
||||
value(keyP).map(_ -> colonColonSeq)
|
||||
| ZeroString ^^^ (ParsedZero -> colonColonSeq)
|
||||
| ZeroIdent ^^^ (ParsedZero -> colonColonSeq)
|
||||
) <~ token("::".id))) ?? (Omitted -> Nil)
|
||||
) <~ spacedSlash) ?? (Omitted -> Nil)
|
||||
}
|
||||
|
||||
def resolveTask(task: ParsedAxis[AttributeKey[_]]): Option[AttributeKey[_]] =
|
||||
|
|
@ -411,11 +391,10 @@ object Act {
|
|||
}
|
||||
|
||||
def projectRef(index: KeyIndex, currentBuild: URI): Parser[ParsedAxis[ResolvedReference]] = {
|
||||
val global = token(ZeroString ~ spacedSlash) ^^^ ParsedZero
|
||||
val zeroIdent = token(ZeroIdent ~ spacedSlash) ^^^ ParsedZero
|
||||
val thisBuildIdent = value(token(ThisBuildIdent ~ spacedSlash) ^^^ BuildRef(currentBuild))
|
||||
val trailing = spacedSlash !!! "Expected '/' (if selecting a project)"
|
||||
global | zeroIdent | thisBuildIdent |
|
||||
zeroIdent | thisBuildIdent |
|
||||
value(resolvedReferenceIdent(index, currentBuild, trailing)) |
|
||||
value(resolvedReference(index, currentBuild, trailing))
|
||||
}
|
||||
|
|
@ -491,12 +470,6 @@ object Act {
|
|||
import Aggregation.evaluatingParser
|
||||
actionParser.flatMap { action =>
|
||||
val akp = aggregatedKeyParserSep(extracted)
|
||||
def warnOldShellSyntax(seps: Seq[String], keyStrings: String): Unit =
|
||||
if (seps.contains(":") || seps.contains("::")) {
|
||||
state.log.warn(
|
||||
s"sbt 0.13 shell syntax is deprecated; use slash syntax instead: $keyStrings"
|
||||
)
|
||||
} else ()
|
||||
def evaluate(pairs: Seq[(ScopedKey[_], Seq[String])]): Parser[() => State] = {
|
||||
val kvs = pairs.map(_._1)
|
||||
val seps = pairs.headOption.map(_._2).getOrElse(Nil)
|
||||
|
|
@ -510,7 +483,6 @@ object Act {
|
|||
{
|
||||
val keyStrings = preparedPairs.map(pp => showKey.show(pp.key)).mkString(", ")
|
||||
state.log.debug("Evaluating tasks: " + keyStrings)
|
||||
warnOldShellSyntax(seps, keyStrings)
|
||||
evaluate()
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -82,7 +82,7 @@ $PrintCommand <task>
|
|||
Displays lines from the logging of previous commands that match `pattern`.
|
||||
|
||||
$LastGrepCommand <pattern> [key]
|
||||
Displays lines from logging associated with `key` that match `pattern`. The key typically refers to a task (for example, test:compile). The logging that is displayed is restricted to the logging for that particular task.
|
||||
Displays lines from logging associated with `key` that match `pattern`. The key typically refers to a task (for example, Test/compile). The logging that is displayed is restricted to the logging for that particular task.
|
||||
|
||||
<pattern> is a regular expression interpreted by java.util.Pattern. Matching text is highlighted (when highlighting is supported and enabled).
|
||||
See also '$LastCommand'."""
|
||||
|
|
@ -94,7 +94,7 @@ $LastGrepCommand <pattern> [key]
|
|||
Prints the logging for the previous command, typically at a more verbose level.
|
||||
|
||||
$LastCommand <key>
|
||||
Prints the logging associated with the provided key. The key typically refers to a task (for example, test:compile). The logging that is displayed is restricted to the logging for that particular task.
|
||||
Prints the logging associated with the provided key. The key typically refers to a task (for example, Test/compile). The logging that is displayed is restricted to the logging for that particular task.
|
||||
|
||||
See also '$LastGrepCommand'."""
|
||||
|
||||
|
|
|
|||
|
|
@ -36,7 +36,7 @@ object SettingQuery {
|
|||
index: KeyIndex,
|
||||
currentBuild: URI
|
||||
): Parser[ParsedExplicitAxis[ResolvedReference]] = {
|
||||
val global = token(Act.ZeroString ~ '/') ^^^ ParsedExplicitGlobal
|
||||
val global = token(Act.GlobalIdent ~ '/') ^^^ ParsedExplicitGlobal
|
||||
val trailing = '/' !!! "Expected '/' (if selecting a project)"
|
||||
global | explicitValue(Act.resolvedReference(index, currentBuild, trailing))
|
||||
}
|
||||
|
|
@ -56,7 +56,12 @@ object SettingQuery {
|
|||
for {
|
||||
rawProject <- projectRef(index, currentBuild)
|
||||
proj = resolveProject(rawProject)
|
||||
confAmb <- Act.config(index configs proj)
|
||||
confPair <- Act.configIdent(
|
||||
index.configs(proj),
|
||||
index.configIdents(proj),
|
||||
index.fromConfigIdent(proj)
|
||||
)
|
||||
(confAmb, seps) = confPair
|
||||
partialMask = ScopeMask(true, confAmb.isExplicit, false, false)
|
||||
} yield Act.taskKeyExtra(index, defaultConfigs, keyMap, proj, confAmb, partialMask, Nil)
|
||||
}
|
||||
|
|
|
|||
|
|
@ -10,12 +10,19 @@ package sbt
|
|||
package plugins
|
||||
|
||||
import sbt.Def.Setting
|
||||
import sbt.Keys._
|
||||
import sbt.Keys.*
|
||||
import sbt.SlashSyntax0.*
|
||||
|
||||
object SbtPlugin extends AutoPlugin {
|
||||
object SbtPlugin extends AutoPlugin:
|
||||
override def requires = ScriptedPlugin
|
||||
|
||||
override lazy val projectSettings: Seq[Setting[_]] = Seq(
|
||||
sbtPlugin := true
|
||||
sbtPlugin := true,
|
||||
pluginCrossBuild / sbtVersion := {
|
||||
scalaBinaryVersion.value match
|
||||
case "3" => sbtVersion.value
|
||||
case "2.12" => "1.5.8"
|
||||
case "2.10" => "0.13.18"
|
||||
},
|
||||
)
|
||||
}
|
||||
end SbtPlugin
|
||||
|
|
|
|||
|
|
@ -6,5 +6,5 @@
|
|||
> checkNext 1 2
|
||||
|
||||
> checkScopes 0 0
|
||||
> all x compile:y::x runtime:y::x y
|
||||
> all x Compile/y/x Runtime/y/x y
|
||||
> checkScopes 21 91
|
||||
|
|
@ -1,9 +1,7 @@
|
|||
ThisBuild / scalaVersion := "2.12.19"
|
||||
|
||||
scalaVersion := "2.12.19"
|
||||
libraryDependencies ++= Seq(
|
||||
"com.novocode" % "junit-interface" % "0.5" % Test,
|
||||
"junit" % "junit" % "4.13.1" % Test,
|
||||
"commons-io" % "commons-io" % "2.5" % Runtime,
|
||||
)
|
||||
|
||||
libraryDependencies += scalaVersion("org.scala-lang" % "scala-compiler" % _ ).value
|
||||
|
|
|
|||
|
|
@ -3,13 +3,11 @@ package foo.bar
|
|||
import org.junit._
|
||||
import org.junit.Assert._
|
||||
|
||||
class Basic
|
||||
{
|
||||
val foo = new Foo
|
||||
@Test
|
||||
def checkBind(): Unit =
|
||||
{
|
||||
try { assertTrue( foo.eval("3") == 3) }
|
||||
catch { case e => e.printStackTrace; throw e}
|
||||
}
|
||||
class Basic {
|
||||
val foo = new Foo
|
||||
@Test
|
||||
def checkBind(): Unit = {
|
||||
try { assertTrue( foo.eval("3") == 3) }
|
||||
catch { case e => e.printStackTrace; throw e}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,10 +1,10 @@
|
|||
> run 1
|
||||
> test:test
|
||||
> test
|
||||
> clean
|
||||
|
||||
> run 2
|
||||
> test:test
|
||||
> test
|
||||
> clean
|
||||
|
||||
> run -1
|
||||
> test:test
|
||||
> test
|
||||
|
|
@ -1,7 +1,7 @@
|
|||
> a/publish
|
||||
|
||||
$ copy-file changes/B.scala b/B.scala
|
||||
-> b/test:compile
|
||||
-> b/Test/compile
|
||||
|
||||
# Need to sleep 3s because the check depends on last modified time and typical resolution is 1s.
|
||||
$ sleep 3000
|
||||
|
|
@ -9,4 +9,4 @@ $ sleep 3000
|
|||
$ copy-file changes/A.scala a/src/test/scala/A.scala
|
||||
> a/publish
|
||||
|
||||
> b/test:compile
|
||||
> b/Test/compile
|
||||
|
|
|
|||
|
|
@ -1,3 +1,3 @@
|
|||
> export compile:dependencyClasspath
|
||||
> export test:dependencyClasspath
|
||||
> test:compile
|
||||
> export Compile/dependencyClasspath
|
||||
> export Test/dependencyClasspath
|
||||
> Test/compile
|
||||
|
|
|
|||
|
|
@ -8,4 +8,4 @@ $ copy-file changes/scalacheck-ivy.xml ivy.xml
|
|||
|
||||
$ copy-file changes/scala-tools-ivysettings.xml ivysettings.xml
|
||||
> check
|
||||
> test:compile
|
||||
> Test/compile
|
||||
|
|
|
|||
|
|
@ -0,0 +1,28 @@
|
|||
val scala3 = "3.3.3"
|
||||
val scala212 = "2.12.19"
|
||||
|
||||
organization := "com.example"
|
||||
version := "0.1.0-SNAPSHOT"
|
||||
|
||||
lazy val checkSbt2Plugin = taskKey[Unit]("")
|
||||
|
||||
lazy val plugin = (projectMatrix in file("plugin"))
|
||||
.enablePlugins(SbtPlugin)
|
||||
.settings(
|
||||
organization := "com.example",
|
||||
name := "sbt-example",
|
||||
// TODO: Once 2.0 is released we can move this check to the `test` file
|
||||
checkSbt2Plugin := {
|
||||
val repo = (ThisBuild / baseDirectory).value / "repo"
|
||||
val sbtV = sbtBinaryVersion.value
|
||||
val expected = (repo / "com" / "example" /
|
||||
s"sbt-example_sbt${sbtV}_3" /
|
||||
"0.1.0-SNAPSHOT" /
|
||||
s"sbt-example_sbt${sbtV}_3-0.1.0-SNAPSHOT.pom")
|
||||
assert(expected.exists, s"$expected did not exist")
|
||||
},
|
||||
)
|
||||
.jvmPlatform(scalaVersions = Seq(scala3, scala212))
|
||||
|
||||
publishMavenStyle := true
|
||||
publishTo := Some(Resolver.file("test-publish", (ThisBuild / baseDirectory).value / "repo/"))
|
||||
|
|
@ -0,0 +1,8 @@
|
|||
> compile
|
||||
|
||||
> publish
|
||||
|
||||
$ exists repo/com/example/sbt-example_2.12_1.0/0.1.0-SNAPSHOT/sbt-example_2.12_1.0-0.1.0-SNAPSHOT.pom
|
||||
$ absent repo/com/example/sbt-example_2.12_1.0/0.1.0-SNAPSHOT/sbt-example-0.1.0-SNAPSHOT.pom
|
||||
|
||||
> checkSbt2Plugin
|
||||
|
|
@ -1,3 +1,3 @@
|
|||
> show pluginCrossBuild::sbtDependency
|
||||
> compile
|
||||
-> test:compile
|
||||
-> Test/compile
|
||||
|
|
|
|||
|
|
@ -3,20 +3,20 @@
|
|||
|
||||
> compile
|
||||
> test
|
||||
> test:run
|
||||
> Test/run
|
||||
|
||||
# This part verifies that the package-src action works properly under a flattened/merged source hierarchy
|
||||
|
||||
> packageSrc
|
||||
> test:packageSrc
|
||||
> Test/packageSrc
|
||||
|
||||
$ delete src
|
||||
$ delete test-src
|
||||
|
||||
-> test:run
|
||||
-> Test/run
|
||||
|
||||
> unpackage
|
||||
> test:unpackage
|
||||
> Test/unpackage
|
||||
|
||||
> test:test
|
||||
> test:run
|
||||
> Test/test
|
||||
> Test/run
|
||||
|
|
|
|||
|
|
@ -1,16 +1,16 @@
|
|||
> compile
|
||||
$ exists target/scala-2.12/classes/META-INF/semanticdb/src/main/scala/foo/Compile.scala.semanticdb
|
||||
|
||||
> test:compile
|
||||
> Test/compile
|
||||
$ exists target/scala-2.12/test-classes/META-INF/semanticdb/src/test/scala/foo/Test.scala.semanticdb
|
||||
|
||||
> it:compile
|
||||
> IntegrationTest/compile
|
||||
$ exists target/scala-2.12/it-classes/META-INF/semanticdb/src/it/scala/foo/IntegrationTest.scala.semanticdb
|
||||
|
||||
> custom:compile
|
||||
> Custom/compile
|
||||
$ exists target/scala-2.12/custom-classes/META-INF/semanticdb/src/custom/scala/foo/Custom.scala.semanticdb
|
||||
|
||||
> st:compile
|
||||
> SystemTest/compile
|
||||
$ exists target/scala-2.12/st-classes/META-INF/semanticdb/src/st/scala/foo/SystemTest.scala.semanticdb
|
||||
|
||||
> check
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
# should fail because it should run all test:tests, some of which are expected to fail (1 and 4)
|
||||
# should fail because it should run all tests, some of which are expected to fail (1 and 4)
|
||||
-> testQuick
|
||||
|
||||
$ touch success1
|
||||
|
|
|
|||
|
|
@ -1,28 +1,27 @@
|
|||
> clean
|
||||
$ delete src/
|
||||
$ copy-file changes/ClassFailModuleSuccess.scala src/it/scala/Test.scala
|
||||
-> it:test
|
||||
-> IntegrationTest/test
|
||||
|
||||
> clean
|
||||
$ delete src/
|
||||
$ copy-file changes/ClassFailModuleFail.scala src/it/scala/Test.scala
|
||||
-> it:test
|
||||
-> IntegrationTest/test
|
||||
|
||||
> clean
|
||||
$ delete src/
|
||||
$ copy-file changes/ClassSuccessModuleFail.scala src/it/scala/Test.scala
|
||||
-> it:test
|
||||
-> IntegrationTest/test
|
||||
|
||||
|
||||
> clean
|
||||
$ delete src/
|
||||
$ copy-file changes/ClassSuccessModuleSuccess.scala src/it/scala/Test.scala
|
||||
> it:test
|
||||
> IntegrationTest/test
|
||||
|
||||
# verify that a failing normal test fails when run directly
|
||||
$ copy-file changes/AlwaysFail.scala src/test/scala/AlwaysFail.scala
|
||||
-> test:test
|
||||
|
||||
# but that it does not affect the result of it:test (#539)
|
||||
> it:test
|
||||
-> Test/test
|
||||
|
||||
# but that it does not affect the result of IntegrationTest/test (#539)
|
||||
> IntegrationTest/test
|
||||
|
|
|
|||
|
|
@ -1,3 +1,3 @@
|
|||
scalaVersion := "2.12.19"
|
||||
val specs = "org.specs2" %% "specs2-core" % "4.3.4"
|
||||
ThisBuild / scalaVersion := "2.12.19"
|
||||
libraryDependencies += specs % Test
|
||||
|
|
|
|||
|
|
@ -1 +1 @@
|
|||
> test:test
|
||||
> test
|
||||
|
|
@ -1,7 +1,7 @@
|
|||
Global / cacheStores := Seq.empty
|
||||
|
||||
val scalatest = "org.scalatest" %% "scalatest" % "3.0.5"
|
||||
ThisBuild / scalaVersion := "2.12.19"
|
||||
scalaVersion := "2.12.19"
|
||||
|
||||
lazy val root = (project in file("."))
|
||||
.settings(
|
||||
|
|
|
|||
|
|
@ -27,7 +27,7 @@ $ sleep 2000
|
|||
# src/test compilation group change.
|
||||
|
||||
$ copy-file changed/Base.scala src/test/scala/Base.scala
|
||||
> test:compile
|
||||
> Test/compile
|
||||
$ sleep 2000
|
||||
-> testQuick Create
|
||||
> testQuick Delete
|
||||
|
|
|
|||
|
|
@ -112,7 +112,6 @@ class ClientTest extends AbstractServerTest {
|
|||
test("compi completions") {
|
||||
val expected = Vector(
|
||||
"compile",
|
||||
"compile:",
|
||||
"compileAnalysisFile",
|
||||
"compileAnalysisFilename",
|
||||
"compileAnalysisTargetRoot",
|
||||
|
|
@ -135,7 +134,6 @@ class ClientTest extends AbstractServerTest {
|
|||
val testOnlyExpected = Vector(
|
||||
"testOnly",
|
||||
"testOnly/",
|
||||
"testOnly::",
|
||||
"testOnly;",
|
||||
)
|
||||
assert(complete("testOnly") == testOnlyExpected)
|
||||
|
|
|
|||
|
|
@ -22,8 +22,8 @@ import sbt.util._
|
|||
// no longer specific to Tasks, so 'TaskStreams' should be renamed
|
||||
/**
|
||||
* Represents a set of streams associated with a context. In sbt, this is a named set of streams for
|
||||
* a particular scoped key. For example, logging for test:compile is by default sent to the "out"
|
||||
* stream in the test:compile context.
|
||||
* a particular scoped key. For example, logging for Test/compile is by default sent to the "out"
|
||||
* stream in the Test/compile context.
|
||||
*/
|
||||
sealed trait TaskStreams[Key] {
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue