mirror of https://github.com/sbt/sbt.git
Merge branch 'develop' into wip/query
This commit is contained in:
commit
89517c642c
|
|
@ -27,7 +27,7 @@ trait TestResultLogger {
|
||||||
*
|
*
|
||||||
* @param log The target logger to write output to.
|
* @param log The target logger to write output to.
|
||||||
* @param results The test results about which to log.
|
* @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
|
def run(log: Logger, results: Output, taskName: String): Unit
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -29,8 +29,32 @@ import xsbti.{ HashedVirtualFileRef, VirtualFile, VirtualFileRef }
|
||||||
import sjsonnew.JsonFormat
|
import sjsonnew.JsonFormat
|
||||||
import scala.reflect.ClassTag
|
import scala.reflect.ClassTag
|
||||||
|
|
||||||
|
trait BuildSyntax:
|
||||||
|
inline def settingKey[A1](inline description: String): SettingKey[A1] =
|
||||||
|
${ std.KeyMacro.settingKeyImpl[A1]('description) }
|
||||||
|
|
||||||
|
inline def taskKey[A1](inline description: String): TaskKey[A1] =
|
||||||
|
${ std.KeyMacro.taskKeyImpl[A1]('description) }
|
||||||
|
|
||||||
|
inline def inputKey[A1](inline description: String): InputKey[A1] =
|
||||||
|
${ std.KeyMacro.inputKeyImpl[A1]('description) }
|
||||||
|
|
||||||
|
import sbt.std.ParserInput
|
||||||
|
extension [A1](inline in: Task[A1])
|
||||||
|
inline def value: A1 = std.InputWrapper.`wrapTask_\u2603\u2603`[A1](in)
|
||||||
|
|
||||||
|
// implicit def macroValueIn[T](@deprecated("unused", "") in: InputTask[T]): std.InputEvaluated[T] =
|
||||||
|
// ???
|
||||||
|
|
||||||
|
extension [A1](inline in: Parser[A1])
|
||||||
|
inline def parsed: A1 = ParserInput.`parser_\u2603\u2603`[A1](Def.toSParser(in))
|
||||||
|
|
||||||
|
extension [A1](inline in: State => Parser[A1])
|
||||||
|
inline def parsed: A1 = ParserInput.`parser_\u2603\u2603`[A1](in)
|
||||||
|
end BuildSyntax
|
||||||
|
|
||||||
/** A concrete settings system that uses `sbt.Scope` for the scope type. */
|
/** A concrete settings system that uses `sbt.Scope` for the scope type. */
|
||||||
object Def extends Init[Scope] with TaskMacroExtra with InitializeImplicits:
|
object Def extends BuildSyntax with Init[Scope] with InitializeImplicits:
|
||||||
type Classpath = Seq[Attributed[HashedVirtualFileRef]]
|
type Classpath = Seq[Attributed[HashedVirtualFileRef]]
|
||||||
|
|
||||||
def settings(ss: SettingsDefinition*): Seq[Setting[_]] = ss.flatMap(_.settings)
|
def settings(ss: SettingsDefinition*): Seq[Setting[_]] = ss.flatMap(_.settings)
|
||||||
|
|
@ -404,15 +428,6 @@ object Def extends Init[Scope] with TaskMacroExtra with InitializeImplicits:
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
inline def settingKey[A1](inline description: String): SettingKey[A1] =
|
|
||||||
${ std.KeyMacro.settingKeyImpl[A1]('description) }
|
|
||||||
|
|
||||||
inline def taskKey[A1](inline description: String): TaskKey[A1] =
|
|
||||||
${ std.KeyMacro.taskKeyImpl[A1]('description) }
|
|
||||||
|
|
||||||
inline def inputKey[A1](inline description: String): InputKey[A1] =
|
|
||||||
${ std.KeyMacro.inputKeyImpl[A1]('description) }
|
|
||||||
|
|
||||||
class InitOps[T](private val x: Initialize[T]) extends AnyVal {
|
class InitOps[T](private val x: Initialize[T]) extends AnyVal {
|
||||||
def toTaskable: Taskable[T] = x
|
def toTaskable: Taskable[T] = x
|
||||||
}
|
}
|
||||||
|
|
@ -449,28 +464,9 @@ object Def extends Init[Scope] with TaskMacroExtra with InitializeImplicits:
|
||||||
t.info.attributes.get(isDummyTask) getOrElse false
|
t.info.attributes.get(isDummyTask) getOrElse false
|
||||||
end Def
|
end Def
|
||||||
|
|
||||||
// these need to be mixed into the sbt package object
|
sealed trait InitializeImplicits { self: Def.type =>
|
||||||
// because the target doesn't involve Initialize or anything in Def
|
|
||||||
trait TaskMacroExtra:
|
|
||||||
import sbt.std.ParserInput
|
|
||||||
extension [A1](inline in: Task[A1])
|
|
||||||
inline def value: A1 = std.InputWrapper.`wrapTask_\u2603\u2603`[A1](in)
|
|
||||||
|
|
||||||
// implicit def macroValueIn[T](@deprecated("unused", "") in: InputTask[T]): std.InputEvaluated[T] =
|
|
||||||
// ???
|
|
||||||
|
|
||||||
extension [A1](inline in: Parser[A1])
|
|
||||||
inline def parsed: A1 = ParserInput.`parser_\u2603\u2603`[A1](Def.toSParser(in))
|
|
||||||
|
|
||||||
extension [A1](inline in: State => Parser[A1])
|
|
||||||
inline def parsed: A1 = ParserInput.`parser_\u2603\u2603`[A1](in)
|
|
||||||
end TaskMacroExtra
|
|
||||||
|
|
||||||
sealed trait InitializeImplicits0 { self: Def.type =>
|
|
||||||
implicit def initOps[T](x: Def.Initialize[T]): Def.InitOps[T] = new Def.InitOps(x)
|
implicit def initOps[T](x: Def.Initialize[T]): Def.InitOps[T] = new Def.InitOps(x)
|
||||||
}
|
|
||||||
|
|
||||||
sealed trait InitializeImplicits extends InitializeImplicits0 { self: Def.type =>
|
|
||||||
implicit def initTaskOps[T](x: Def.Initialize[Task[T]]): Def.InitTaskOps[T] =
|
implicit def initTaskOps[T](x: Def.Initialize[Task[T]]): Def.InitTaskOps[T] =
|
||||||
new Def.InitTaskOps(x)
|
new Def.InitTaskOps(x)
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -382,6 +382,8 @@ object Scoped:
|
||||||
protected def onTask[A2](f: Task[A1] => Task[A2]): Initialize[Task[A2]] =
|
protected def onTask[A2](f: Task[A1] => Task[A2]): Initialize[Task[A2]] =
|
||||||
init.apply(f)
|
init.apply(f)
|
||||||
|
|
||||||
|
def dependsOn(tasks: Initialize[? <: Task[?]]*): Initialize[Task[A1]] =
|
||||||
|
init.zipWith(tasks.asInstanceOf[Seq[Initialize[Task[?]]]].join)(_.dependsOn(_*))
|
||||||
def flatMapTaskValue[T](f: A1 => Task[T]): Initialize[Task[T]] =
|
def flatMapTaskValue[T](f: A1 => Task[T]): Initialize[Task[T]] =
|
||||||
onTask(_.result flatMap (f compose successM))
|
onTask(_.result flatMap (f compose successM))
|
||||||
def map[A2](f: A1 => A2): Initialize[Task[A2]] =
|
def map[A2](f: A1 => A2): Initialize[Task[A2]] =
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,23 @@
|
||||||
|
/*
|
||||||
|
* sbt
|
||||||
|
* Copyright 2023, Scala center
|
||||||
|
* Copyright 2011 - 2022, Lightbend, Inc.
|
||||||
|
* Copyright 2008 - 2010, Mark Harrah
|
||||||
|
* Licensed under Apache License 2.0 (see LICENSE)
|
||||||
|
*/
|
||||||
|
|
||||||
|
package sbt
|
||||||
|
|
||||||
|
import sbt.internal.DslEntry
|
||||||
|
import sbt.librarymanagement.Configuration
|
||||||
|
|
||||||
|
trait BareBuildSyntax:
|
||||||
|
def enablePlugins(ps: AutoPlugin*): DslEntry = DslEntry.DslEnablePlugins(ps)
|
||||||
|
def disablePlugins(ps: AutoPlugin*): DslEntry = DslEntry.DslDisablePlugins(ps)
|
||||||
|
def configs(cs: Configuration*): DslEntry = DslEntry.DslConfigs(cs)
|
||||||
|
def dependsOn(deps: ClasspathDep[ProjectReference]*): DslEntry = DslEntry.DslDependsOn(deps)
|
||||||
|
// avoid conflict with `sbt.Keys.aggregate`
|
||||||
|
def aggregateProjects(refs: ProjectReference*): DslEntry = DslEntry.DslAggregate(refs)
|
||||||
|
end BareBuildSyntax
|
||||||
|
|
||||||
|
object BareBuildSyntax extends BareBuildSyntax
|
||||||
|
|
@ -1,41 +0,0 @@
|
||||||
/*
|
|
||||||
* sbt
|
|
||||||
* Copyright 2023, Scala center
|
|
||||||
* Copyright 2011 - 2022, Lightbend, Inc.
|
|
||||||
* Copyright 2008 - 2010, Mark Harrah
|
|
||||||
* Licensed under Apache License 2.0 (see LICENSE)
|
|
||||||
*/
|
|
||||||
|
|
||||||
package sbt
|
|
||||||
|
|
||||||
import sbt.internal.DslEntry
|
|
||||||
import sbt.librarymanagement.Configuration
|
|
||||||
|
|
||||||
private[sbt] trait BuildSyntax:
|
|
||||||
import scala.language.experimental.macros
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Creates a new Project. This is a macro that expects to be assigned directly to a val.
|
|
||||||
* The name of the val is used as the project ID and the name of the base directory of the project.
|
|
||||||
*/
|
|
||||||
inline def project: Project = ${ std.KeyMacro.projectImpl }
|
|
||||||
inline def projectMatrix: ProjectMatrix = ${ ProjectMatrix.projectMatrixImpl }
|
|
||||||
inline def settingKey[A1](inline description: String): SettingKey[A1] =
|
|
||||||
${ std.KeyMacro.settingKeyImpl[A1]('description) }
|
|
||||||
inline def taskKey[A1](inline description: String): TaskKey[A1] =
|
|
||||||
${ std.KeyMacro.taskKeyImpl[A1]('description) }
|
|
||||||
inline def inputKey[A1](inline description: String): InputKey[A1] =
|
|
||||||
${ std.KeyMacro.inputKeyImpl[A1]('description) }
|
|
||||||
|
|
||||||
def enablePlugins(ps: AutoPlugin*): DslEntry = DslEntry.DslEnablePlugins(ps)
|
|
||||||
def disablePlugins(ps: AutoPlugin*): DslEntry = DslEntry.DslDisablePlugins(ps)
|
|
||||||
def configs(cs: Configuration*): DslEntry = DslEntry.DslConfigs(cs)
|
|
||||||
def dependsOn(deps: ClasspathDep[ProjectReference]*): DslEntry = DslEntry.DslDependsOn(deps)
|
|
||||||
// avoid conflict with `sbt.Keys.aggregate`
|
|
||||||
def aggregateProjects(refs: ProjectReference*): DslEntry = DslEntry.DslAggregate(refs)
|
|
||||||
|
|
||||||
implicit def sbtStateToUpperStateOps(s: State): UpperStateOps =
|
|
||||||
new UpperStateOps.UpperStateOpsImpl(s)
|
|
||||||
end BuildSyntax
|
|
||||||
|
|
||||||
private[sbt] object BuildSyntax extends BuildSyntax
|
|
||||||
|
|
@ -332,9 +332,6 @@ object Defaults extends BuildCommon {
|
||||||
envVars :== Map.empty,
|
envVars :== Map.empty,
|
||||||
sbtVersion := appConfiguration.value.provider.id.version,
|
sbtVersion := appConfiguration.value.provider.id.version,
|
||||||
sbtBinaryVersion := binarySbtVersion(sbtVersion.value),
|
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,
|
pluginCrossBuild / sbtVersion := sbtVersion.value,
|
||||||
onLoad := idFun[State],
|
onLoad := idFun[State],
|
||||||
onUnload := idFun[State],
|
onUnload := idFun[State],
|
||||||
|
|
@ -2902,6 +2899,9 @@ object Classpaths {
|
||||||
import Defaults._
|
import Defaults._
|
||||||
import Keys._
|
import Keys._
|
||||||
|
|
||||||
|
def analyzed[A](data: A, analysisFile: VirtualFile): Attributed[A] =
|
||||||
|
Attributed.blank(data).put(Keys.analysis, analysisFile.id)
|
||||||
|
|
||||||
def concatDistinct[A](
|
def concatDistinct[A](
|
||||||
a: Taskable[Seq[A]],
|
a: Taskable[Seq[A]],
|
||||||
b: Taskable[Seq[A]]
|
b: Taskable[Seq[A]]
|
||||||
|
|
@ -3102,7 +3102,7 @@ object Classpaths {
|
||||||
Defaults.globalDefaults(
|
Defaults.globalDefaults(
|
||||||
Seq(
|
Seq(
|
||||||
publishMavenStyle :== true,
|
publishMavenStyle :== true,
|
||||||
sbtPluginPublishLegacyMavenStyle :== true,
|
sbtPluginPublishLegacyMavenStyle :== false,
|
||||||
publishArtifact :== true,
|
publishArtifact :== true,
|
||||||
(Test / publishArtifact) :== false
|
(Test / publishArtifact) :== false
|
||||||
)
|
)
|
||||||
|
|
@ -4776,11 +4776,18 @@ object Classpaths {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private[sbt] object Build0 extends BuildExtra
|
private[sbt] object BuildExtra extends BuildExtra
|
||||||
|
|
||||||
trait BuildExtra extends BuildCommon with DefExtra {
|
trait BuildExtra extends BuildCommon with DefExtra {
|
||||||
import Defaults._
|
import Defaults._
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a new Project. This is a macro that expects to be assigned directly to a val.
|
||||||
|
* The name of the val is used as the project ID and the name of the base directory of the project.
|
||||||
|
*/
|
||||||
|
inline def project: Project = ${ std.KeyMacro.projectImpl }
|
||||||
|
inline def projectMatrix: ProjectMatrix = ${ ProjectMatrix.projectMatrixImpl }
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Defines an alias given by `name` that expands to `value`.
|
* Defines an alias given by `name` that expands to `value`.
|
||||||
* This alias is defined globally after projects are loaded.
|
* This alias is defined globally after projects are loaded.
|
||||||
|
|
@ -5042,7 +5049,7 @@ trait BuildExtra extends BuildCommon with DefExtra {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Disables post-compilation hook for determining tests for tab-completion (such as for 'test-only').
|
* 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[_] =
|
def noTestCompletion(config: Configuration = Test): Setting[_] =
|
||||||
inConfig(config)(Seq(definedTests := detectTests.value)).head
|
inConfig(config)(Seq(definedTests := detectTests.value)).head
|
||||||
|
|
@ -5051,6 +5058,9 @@ trait BuildExtra extends BuildCommon with DefExtra {
|
||||||
f: ScopedKey[_] => Boolean
|
f: ScopedKey[_] => Boolean
|
||||||
): Seq[Setting[_]] =
|
): Seq[Setting[_]] =
|
||||||
ss filter (s => f(s.key) && (!transitive || s.dependencies.forall(f)))
|
ss filter (s => f(s.key) && (!transitive || s.dependencies.forall(f)))
|
||||||
|
|
||||||
|
implicit def sbtStateToUpperStateOps(s: State): UpperStateOps =
|
||||||
|
new UpperStateOps.UpperStateOpsImpl(s)
|
||||||
}
|
}
|
||||||
|
|
||||||
trait DefExtra {
|
trait DefExtra {
|
||||||
|
|
|
||||||
|
|
@ -13,6 +13,7 @@ import java.util.concurrent.atomic.AtomicReference
|
||||||
|
|
||||||
import sbt.Def.{ ScopedKey, Setting, dummyState }
|
import sbt.Def.{ ScopedKey, Setting, dummyState }
|
||||||
import sbt.Keys.{ TaskProgress => _, name => _, _ }
|
import sbt.Keys.{ TaskProgress => _, name => _, _ }
|
||||||
|
import sbt.BuildExtra.*
|
||||||
import sbt.ProjectExtra.*
|
import sbt.ProjectExtra.*
|
||||||
import sbt.Scope.Global
|
import sbt.Scope.Global
|
||||||
import sbt.SlashSyntax0._
|
import sbt.SlashSyntax0._
|
||||||
|
|
@ -24,7 +25,6 @@ import sbt.internal.util.{ Terminal => ITerminal, _ }
|
||||||
import sbt.librarymanagement.{ Resolver, UpdateReport }
|
import sbt.librarymanagement.{ Resolver, UpdateReport }
|
||||||
import sbt.std.Transform.DummyTaskMap
|
import sbt.std.Transform.DummyTaskMap
|
||||||
import sbt.util.{ Logger, Show }
|
import sbt.util.{ Logger, Show }
|
||||||
import sbt.BuildSyntax._
|
|
||||||
import sbt.internal.bsp.BuildTargetIdentifier
|
import sbt.internal.bsp.BuildTargetIdentifier
|
||||||
|
|
||||||
import scala.annotation.nowarn
|
import scala.annotation.nowarn
|
||||||
|
|
|
||||||
|
|
@ -16,8 +16,7 @@ import lmcoursier.{ CoursierConfiguration, FallbackDependency }
|
||||||
import org.apache.ivy.core.module.descriptor.ModuleDescriptor
|
import org.apache.ivy.core.module.descriptor.ModuleDescriptor
|
||||||
import org.apache.ivy.core.module.id.ModuleRevisionId
|
import org.apache.ivy.core.module.id.ModuleRevisionId
|
||||||
import org.apache.logging.log4j.core.{ Appender => XAppender }
|
import org.apache.logging.log4j.core.{ Appender => XAppender }
|
||||||
import sbt.BuildSyntax._
|
import sbt.Def.*
|
||||||
import sbt.Def.ScopedKey
|
|
||||||
import sbt.KeyRanks._
|
import sbt.KeyRanks._
|
||||||
import sbt.internal.InMemoryCacheStore.CacheStoreFactoryFactory
|
import sbt.internal.InMemoryCacheStore.CacheStoreFactoryFactory
|
||||||
import sbt.internal._
|
import sbt.internal._
|
||||||
|
|
|
||||||
|
|
@ -44,7 +44,6 @@ final class ParsedKey(val key: ScopedKey[_], val mask: ScopeMask, val separaters
|
||||||
end ParsedKey
|
end ParsedKey
|
||||||
|
|
||||||
object Act {
|
object Act {
|
||||||
val ZeroString = "*"
|
|
||||||
private[sbt] val GlobalIdent = "Global"
|
private[sbt] val GlobalIdent = "Global"
|
||||||
private[sbt] val ZeroIdent = "Zero"
|
private[sbt] val ZeroIdent = "Zero"
|
||||||
private[sbt] val ThisBuildIdent = "ThisBuild"
|
private[sbt] val ThisBuildIdent = "ThisBuild"
|
||||||
|
|
@ -54,8 +53,6 @@ object Act {
|
||||||
token(OptSpace ~> '/' <~ OptSpace).examples("/").map(_ => ())
|
token(OptSpace ~> '/' <~ OptSpace).examples("/").map(_ => ())
|
||||||
|
|
||||||
private[sbt] val slashSeq: Seq[String] = Seq("/")
|
private[sbt] val slashSeq: Seq[String] = Seq("/")
|
||||||
private[sbt] val colonSeq: Seq[String] = Seq(":")
|
|
||||||
private[sbt] val colonColonSeq: Seq[String] = Seq("::")
|
|
||||||
|
|
||||||
type KeysParser = Parser[Seq[ScopedKey[Any]]]
|
type KeysParser = Parser[Seq[ScopedKey[Any]]]
|
||||||
type KeysParserSep = Parser[Seq[(ScopedKey[Any], Seq[String])]]
|
type KeysParserSep = Parser[Seq[(ScopedKey[Any], Seq[String])]]
|
||||||
|
|
@ -283,26 +280,15 @@ object Act {
|
||||||
def toAxis[T](opt: Option[T], ifNone: ScopeAxis[T]): ScopeAxis[T] =
|
def toAxis[T](opt: Option[T], ifNone: ScopeAxis[T]): ScopeAxis[T] =
|
||||||
opt match { case Some(t) => Select(t); case None => ifNone }
|
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.
|
// New configuration parser that's able to parse configuration ident trailed by slash.
|
||||||
private[sbt] def configIdent(
|
private[sbt] def configIdent(
|
||||||
confs: Set[String],
|
confs: Set[String],
|
||||||
idents: Set[String],
|
idents: Set[String],
|
||||||
fromIdent: String => String
|
fromIdent: String => String
|
||||||
): Parser[(ParsedAxis[String], Seq[String])] = {
|
): Parser[(ParsedAxis[String], Seq[String])] = {
|
||||||
val oldSep: Parser[Char] = ':'
|
|
||||||
val sep: Parser[Unit] = spacedSlash !!! "Expected '/'"
|
val sep: Parser[Unit] = spacedSlash !!! "Expected '/'"
|
||||||
token(
|
token(
|
||||||
((ZeroString ^^^ (ParsedZero -> colonSeq)) <~ oldSep)
|
((ZeroIdent ^^^ (ParsedZero -> slashSeq)) <~ sep)
|
||||||
| ((ZeroString ^^^ (ParsedZero -> slashSeq)) <~ sep)
|
|
||||||
| ((ZeroIdent ^^^ (ParsedZero -> slashSeq)) <~ sep)
|
|
||||||
| (value(examples(ID, confs, "configuration")).map(_ -> colonSeq) <~ oldSep)
|
|
||||||
| (value(examples(CapitalizedID, idents, "configuration ident").map(fromIdent))
|
| (value(examples(CapitalizedID, idents, "configuration ident").map(fromIdent))
|
||||||
.map(_ -> slashSeq) <~ sep)
|
.map(_ -> slashSeq) <~ sep)
|
||||||
) ?? (Omitted -> Nil)
|
) ?? (Omitted -> Nil)
|
||||||
|
|
@ -399,16 +385,10 @@ object Act {
|
||||||
val suggested = normKeys.map(_._1).toSet
|
val suggested = normKeys.map(_._1).toSet
|
||||||
val keyP = filterStrings(examples(ID, suggested, "key"), valid.keySet, "key").map(valid)
|
val keyP = filterStrings(examples(ID, suggested, "key"), valid.keySet, "key").map(valid)
|
||||||
|
|
||||||
((token(
|
|
||||||
value(keyP).map(_ -> slashSeq)
|
|
||||||
| ZeroString ^^^ (ParsedZero -> slashSeq)
|
|
||||||
| ZeroIdent ^^^ (ParsedZero -> slashSeq)
|
|
||||||
) <~ spacedSlash) |
|
|
||||||
(token(
|
(token(
|
||||||
value(keyP).map(_ -> colonColonSeq)
|
value(keyP).map(_ -> slashSeq)
|
||||||
| ZeroString ^^^ (ParsedZero -> colonColonSeq)
|
| ZeroIdent ^^^ (ParsedZero -> slashSeq)
|
||||||
| ZeroIdent ^^^ (ParsedZero -> colonColonSeq)
|
) <~ spacedSlash) ?? (Omitted -> Nil)
|
||||||
) <~ token("::".id))) ?? (Omitted -> Nil)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
def resolveTask(task: ParsedAxis[AttributeKey[_]]): Option[AttributeKey[_]] =
|
def resolveTask(task: ParsedAxis[AttributeKey[_]]): Option[AttributeKey[_]] =
|
||||||
|
|
@ -452,11 +432,10 @@ object Act {
|
||||||
}
|
}
|
||||||
|
|
||||||
def projectRef(index: KeyIndex, currentBuild: URI): Parser[ParsedAxis[ResolvedReference]] = {
|
def projectRef(index: KeyIndex, currentBuild: URI): Parser[ParsedAxis[ResolvedReference]] = {
|
||||||
val global = token(ZeroString ~ spacedSlash) ^^^ ParsedZero
|
|
||||||
val zeroIdent = token(ZeroIdent ~ spacedSlash) ^^^ ParsedZero
|
val zeroIdent = token(ZeroIdent ~ spacedSlash) ^^^ ParsedZero
|
||||||
val thisBuildIdent = value(token(ThisBuildIdent ~ spacedSlash) ^^^ BuildRef(currentBuild))
|
val thisBuildIdent = value(token(ThisBuildIdent ~ spacedSlash) ^^^ BuildRef(currentBuild))
|
||||||
val trailing = spacedSlash !!! "Expected '/' (if selecting a project)"
|
val trailing = spacedSlash !!! "Expected '/' (if selecting a project)"
|
||||||
global | zeroIdent | thisBuildIdent |
|
zeroIdent | thisBuildIdent |
|
||||||
value(resolvedReferenceIdent(index, currentBuild, trailing)) |
|
value(resolvedReferenceIdent(index, currentBuild, trailing)) |
|
||||||
value(resolvedReference(index, currentBuild, trailing))
|
value(resolvedReference(index, currentBuild, trailing))
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -94,6 +94,7 @@ object BuildUtil {
|
||||||
("import _root_.scala.xml.{TopScope=>$scope}"
|
("import _root_.scala.xml.{TopScope=>$scope}"
|
||||||
:: "import _root_.sbt.*"
|
:: "import _root_.sbt.*"
|
||||||
:: "import _root_.sbt.given"
|
:: "import _root_.sbt.given"
|
||||||
|
:: "import _root_.sbt.BareBuildSyntax.*"
|
||||||
:: "import _root_.sbt.Keys.*"
|
:: "import _root_.sbt.Keys.*"
|
||||||
:: "import _root_.sbt.nio.Keys.*"
|
:: "import _root_.sbt.nio.Keys.*"
|
||||||
:: Nil)
|
:: Nil)
|
||||||
|
|
|
||||||
|
|
@ -43,7 +43,7 @@ private[sbt] object ClasspathImpl {
|
||||||
val xs = products.map(_ -> analysis)
|
val xs = products.map(_ -> analysis)
|
||||||
for (f, analysis) <- xs
|
for (f, analysis) <- xs
|
||||||
yield APIMappings
|
yield APIMappings
|
||||||
.store(analyzed(f, analysisFile), apiURL.value)
|
.store(Classpaths.analyzed(f, analysisFile), apiURL.value)
|
||||||
.put(Keys.moduleIDStr, Classpaths.moduleIdJsonKeyFormat.write(module))
|
.put(Keys.moduleIDStr, Classpaths.moduleIdJsonKeyFormat.write(module))
|
||||||
.put(Keys.configurationStr, config.name)
|
.put(Keys.configurationStr, config.name)
|
||||||
else exportedProducts.value
|
else exportedProducts.value
|
||||||
|
|
@ -57,7 +57,7 @@ private[sbt] object ClasspathImpl {
|
||||||
val config = configuration.value
|
val config = configuration.value
|
||||||
for (f, analysis) <- trackedExportedProductsImplTask(track).value
|
for (f, analysis) <- trackedExportedProductsImplTask(track).value
|
||||||
yield APIMappings
|
yield APIMappings
|
||||||
.store(analyzed(f, analysis), apiURL.value)
|
.store(Classpaths.analyzed(f, analysis), apiURL.value)
|
||||||
.put(Keys.artifactStr, RemoteCache.artifactToStr(art))
|
.put(Keys.artifactStr, RemoteCache.artifactToStr(art))
|
||||||
.put(Keys.moduleIDStr, Classpaths.moduleIdJsonKeyFormat.write(module))
|
.put(Keys.moduleIDStr, Classpaths.moduleIdJsonKeyFormat.write(module))
|
||||||
.put(Keys.configurationStr, config.name)
|
.put(Keys.configurationStr, config.name)
|
||||||
|
|
@ -71,7 +71,7 @@ private[sbt] object ClasspathImpl {
|
||||||
val config = configuration.value
|
val config = configuration.value
|
||||||
for (f, analysis) <- trackedJarProductsImplTask(track).value
|
for (f, analysis) <- trackedJarProductsImplTask(track).value
|
||||||
yield APIMappings
|
yield APIMappings
|
||||||
.store(analyzed(f, analysis), apiURL.value)
|
.store(Classpaths.analyzed(f, analysis), apiURL.value)
|
||||||
.put(Keys.artifactStr, RemoteCache.artifactToStr(art))
|
.put(Keys.artifactStr, RemoteCache.artifactToStr(art))
|
||||||
.put(Keys.moduleIDStr, Classpaths.moduleIdJsonKeyFormat.write(module))
|
.put(Keys.moduleIDStr, Classpaths.moduleIdJsonKeyFormat.write(module))
|
||||||
.put(Keys.configurationStr, config.name)
|
.put(Keys.configurationStr, config.name)
|
||||||
|
|
@ -344,9 +344,6 @@ private[sbt] object ClasspathImpl {
|
||||||
(tasks.toSeq.join).map(_.flatten.distinct)
|
(tasks.toSeq.join).map(_.flatten.distinct)
|
||||||
}
|
}
|
||||||
|
|
||||||
def analyzed[A](data: A, analysisFile: VirtualFile): Attributed[A] =
|
|
||||||
Attributed.blank(data).put(Keys.analysis, analysisFile.id)
|
|
||||||
|
|
||||||
def interSort(
|
def interSort(
|
||||||
projectRef: ProjectRef,
|
projectRef: ProjectRef,
|
||||||
conf: Configuration,
|
conf: Configuration,
|
||||||
|
|
|
||||||
|
|
@ -82,7 +82,7 @@ $PrintCommand <task>
|
||||||
Displays lines from the logging of previous commands that match `pattern`.
|
Displays lines from the logging of previous commands that match `pattern`.
|
||||||
|
|
||||||
$LastGrepCommand <pattern> [key]
|
$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).
|
<pattern> is a regular expression interpreted by java.util.Pattern. Matching text is highlighted (when highlighting is supported and enabled).
|
||||||
See also '$LastCommand'."""
|
See also '$LastCommand'."""
|
||||||
|
|
@ -94,7 +94,7 @@ $LastGrepCommand <pattern> [key]
|
||||||
Prints the logging for the previous command, typically at a more verbose level.
|
Prints the logging for the previous command, typically at a more verbose level.
|
||||||
|
|
||||||
$LastCommand <key>
|
$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'."""
|
See also '$LastGrepCommand'."""
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -11,8 +11,8 @@ package internal
|
||||||
package server
|
package server
|
||||||
|
|
||||||
import java.net.URI
|
import java.net.URI
|
||||||
|
import sbt.BuildExtra.*
|
||||||
import sbt.BuildPaths.{ configurationSources, projectStandard }
|
import sbt.BuildPaths.{ configurationSources, projectStandard }
|
||||||
import sbt.BuildSyntax._
|
|
||||||
import sbt.Def._
|
import sbt.Def._
|
||||||
import sbt.Keys._
|
import sbt.Keys._
|
||||||
import sbt.Project._
|
import sbt.Project._
|
||||||
|
|
|
||||||
|
|
@ -36,7 +36,7 @@ object SettingQuery {
|
||||||
index: KeyIndex,
|
index: KeyIndex,
|
||||||
currentBuild: URI
|
currentBuild: URI
|
||||||
): Parser[ParsedExplicitAxis[ResolvedReference]] = {
|
): Parser[ParsedExplicitAxis[ResolvedReference]] = {
|
||||||
val global = token(Act.ZeroString ~ '/') ^^^ ParsedExplicitGlobal
|
val global = token(Act.GlobalIdent ~ '/') ^^^ ParsedExplicitGlobal
|
||||||
val trailing = '/' !!! "Expected '/' (if selecting a project)"
|
val trailing = '/' !!! "Expected '/' (if selecting a project)"
|
||||||
global | explicitValue(Act.resolvedReference(index, currentBuild, trailing))
|
global | explicitValue(Act.resolvedReference(index, currentBuild, trailing))
|
||||||
}
|
}
|
||||||
|
|
@ -56,7 +56,12 @@ object SettingQuery {
|
||||||
for {
|
for {
|
||||||
rawProject <- projectRef(index, currentBuild)
|
rawProject <- projectRef(index, currentBuild)
|
||||||
proj = resolveProject(rawProject)
|
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)
|
partialMask = ScopeMask(true, confAmb.isExplicit, false, false)
|
||||||
} yield Act.taskKeyExtra(index, defaultConfigs, keyMap, proj, confAmb, partialMask, Nil)
|
} yield Act.taskKeyExtra(index, defaultConfigs, keyMap, proj, confAmb, partialMask, Nil)
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -12,7 +12,7 @@ import java.io.InputStream
|
||||||
import java.nio.file.Path
|
import java.nio.file.Path
|
||||||
import java.util.concurrent.atomic.AtomicBoolean
|
import java.util.concurrent.atomic.AtomicBoolean
|
||||||
|
|
||||||
import sbt.BuildSyntax.{ settingKey, taskKey }
|
import sbt.Def.{ settingKey, taskKey }
|
||||||
import sbt.KeyRanks.{ BMinusSetting, DSetting, Invisible }
|
import sbt.KeyRanks.{ BMinusSetting, DSetting, Invisible }
|
||||||
import sbt.internal.DynamicInput
|
import sbt.internal.DynamicInput
|
||||||
import sbt.internal.nio.FileTreeRepository
|
import sbt.internal.nio.FileTreeRepository
|
||||||
|
|
|
||||||
|
|
@ -12,7 +12,7 @@ package plugins
|
||||||
import java.io.File
|
import java.io.File
|
||||||
import java.net.URI
|
import java.net.URI
|
||||||
import sbt.internal.graph._
|
import sbt.internal.graph._
|
||||||
import sbt.BuildSyntax._
|
import sbt.Def._
|
||||||
import sbt.librarymanagement.{ ModuleID, UpdateReport }
|
import sbt.librarymanagement.{ ModuleID, UpdateReport }
|
||||||
|
|
||||||
trait MiniDependencyTreeKeys {
|
trait MiniDependencyTreeKeys {
|
||||||
|
|
|
||||||
|
|
@ -10,12 +10,19 @@ package sbt
|
||||||
package plugins
|
package plugins
|
||||||
|
|
||||||
import sbt.Def.Setting
|
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 def requires = ScriptedPlugin
|
||||||
|
|
||||||
override lazy val projectSettings: Seq[Setting[_]] = Seq(
|
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
|
||||||
|
|
|
||||||
|
|
@ -39,7 +39,7 @@ object SemanticdbPlugin extends AutoPlugin {
|
||||||
val sdb = semanticdbEnabled.value
|
val sdb = semanticdbEnabled.value
|
||||||
val m = semanticdbCompilerPlugin.value
|
val m = semanticdbCompilerPlugin.value
|
||||||
val sv = scalaVersion.value
|
val sv = scalaVersion.value
|
||||||
if (sdb && !ScalaInstance.isDotty(sv)) List(Build0.compilerPlugin(m))
|
if (sdb && !ScalaInstance.isDotty(sv)) List(BuildExtra.compilerPlugin(m))
|
||||||
else Nil
|
else Nil
|
||||||
},
|
},
|
||||||
semanticdbOptions += {
|
semanticdbOptions += {
|
||||||
|
|
|
||||||
|
|
@ -11,7 +11,7 @@ package sbt
|
||||||
import scala.util.control.NonFatal
|
import scala.util.control.NonFatal
|
||||||
import org.scalacheck._
|
import org.scalacheck._
|
||||||
import Prop._
|
import Prop._
|
||||||
import sbt.BuildSyntax.project
|
import sbt.BuildExtra.project
|
||||||
import java.io.File
|
import java.io.File
|
||||||
|
|
||||||
class ProjectDefs {
|
class ProjectDefs {
|
||||||
|
|
|
||||||
|
|
@ -23,9 +23,8 @@ package object sbt
|
||||||
with sbt.librarymanagement.DependencyFilterExtra
|
with sbt.librarymanagement.DependencyFilterExtra
|
||||||
with sbt.librarymanagement.LibraryManagementSyntax
|
with sbt.librarymanagement.LibraryManagementSyntax
|
||||||
with sbt.BuildExtra
|
with sbt.BuildExtra
|
||||||
with sbt.TaskMacroExtra
|
|
||||||
with sbt.ScopeFilter.Make
|
|
||||||
with sbt.BuildSyntax
|
with sbt.BuildSyntax
|
||||||
|
with sbt.ScopeFilter.Make
|
||||||
with sbt.OptionSyntax
|
with sbt.OptionSyntax
|
||||||
with sbt.SlashSyntax
|
with sbt.SlashSyntax
|
||||||
with sbt.Import:
|
with sbt.Import:
|
||||||
|
|
|
||||||
|
|
@ -29,7 +29,10 @@ trait Import {
|
||||||
val CustomOutput = sbt.OutputStrategy.CustomOutput
|
val CustomOutput = sbt.OutputStrategy.CustomOutput
|
||||||
val AllRequirements = sbt.PluginTrigger.AllRequirements
|
val AllRequirements = sbt.PluginTrigger.AllRequirements
|
||||||
val NoTrigger = sbt.PluginTrigger.NoTrigger
|
val NoTrigger = sbt.PluginTrigger.NoTrigger
|
||||||
|
val ClasspathDependency = ClasspathDep.ClasspathDependency
|
||||||
|
type ClasspathDependency = ClasspathDep.ClasspathDependency
|
||||||
|
val ResolvedClasspathDependency = ClasspathDep.ResolvedClasspathDependency
|
||||||
|
type ResolvedClasspathDependency = ClasspathDep.ResolvedClasspathDependency
|
||||||
// sbt.testing
|
// sbt.testing
|
||||||
type TestResult = sbt.protocol.testing.TestResult
|
type TestResult = sbt.protocol.testing.TestResult
|
||||||
val TestResult = sbt.protocol.testing.TestResult
|
val TestResult = sbt.protocol.testing.TestResult
|
||||||
|
|
@ -197,6 +200,8 @@ trait Import {
|
||||||
type SimpleReader = sbt.internal.util.SimpleReader
|
type SimpleReader = sbt.internal.util.SimpleReader
|
||||||
type SourcePosition = sbt.internal.util.SourcePosition
|
type SourcePosition = sbt.internal.util.SourcePosition
|
||||||
val StackTrace = sbt.internal.util.StackTrace
|
val StackTrace = sbt.internal.util.StackTrace
|
||||||
|
val StringAttributeKey = sbt.internal.util.StringAttributeKey
|
||||||
|
type StringAttributeKey = sbt.internal.util.StringAttributeKey
|
||||||
type SuppressedTraceContext = sbt.internal.util.SuppressedTraceContext
|
type SuppressedTraceContext = sbt.internal.util.SuppressedTraceContext
|
||||||
type TranslatedException = sbt.internal.util.TranslatedException
|
type TranslatedException = sbt.internal.util.TranslatedException
|
||||||
type TranslatedIOException = sbt.internal.util.TranslatedIOException
|
type TranslatedIOException = sbt.internal.util.TranslatedIOException
|
||||||
|
|
|
||||||
|
|
@ -6,5 +6,5 @@
|
||||||
> checkNext 1 2
|
> checkNext 1 2
|
||||||
|
|
||||||
> checkScopes 0 0
|
> checkScopes 0 0
|
||||||
> all x compile:y::x runtime:y::x y
|
> all x Compile/y/x Runtime/y/x y
|
||||||
> checkScopes 21 91
|
> checkScopes 21 91
|
||||||
|
|
@ -1,9 +1,7 @@
|
||||||
ThisBuild / scalaVersion := "2.12.19"
|
scalaVersion := "2.12.19"
|
||||||
|
|
||||||
libraryDependencies ++= Seq(
|
libraryDependencies ++= Seq(
|
||||||
"com.novocode" % "junit-interface" % "0.5" % Test,
|
"com.novocode" % "junit-interface" % "0.5" % Test,
|
||||||
"junit" % "junit" % "4.13.1" % Test,
|
"junit" % "junit" % "4.13.1" % Test,
|
||||||
"commons-io" % "commons-io" % "2.5" % Runtime,
|
"commons-io" % "commons-io" % "2.5" % Runtime,
|
||||||
)
|
)
|
||||||
|
|
||||||
libraryDependencies += scalaVersion("org.scala-lang" % "scala-compiler" % _ ).value
|
libraryDependencies += scalaVersion("org.scala-lang" % "scala-compiler" % _ ).value
|
||||||
|
|
|
||||||
|
|
@ -3,12 +3,10 @@ package foo.bar
|
||||||
import org.junit._
|
import org.junit._
|
||||||
import org.junit.Assert._
|
import org.junit.Assert._
|
||||||
|
|
||||||
class Basic
|
class Basic {
|
||||||
{
|
|
||||||
val foo = new Foo
|
val foo = new Foo
|
||||||
@Test
|
@Test
|
||||||
def checkBind(): Unit =
|
def checkBind(): Unit = {
|
||||||
{
|
|
||||||
try { assertTrue( foo.eval("3") == 3) }
|
try { assertTrue( foo.eval("3") == 3) }
|
||||||
catch { case e => e.printStackTrace; throw e}
|
catch { case e => e.printStackTrace; throw e}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,10 +1,10 @@
|
||||||
> run 1
|
> run 1
|
||||||
> test:test
|
> test
|
||||||
> clean
|
> clean
|
||||||
|
|
||||||
> run 2
|
> run 2
|
||||||
> test:test
|
> test
|
||||||
> clean
|
> clean
|
||||||
|
|
||||||
> run -1
|
> run -1
|
||||||
> test:test
|
> test
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
> a/publish
|
> a/publish
|
||||||
|
|
||||||
$ copy-file changes/B.scala b/B.scala
|
$ 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.
|
# Need to sleep 3s because the check depends on last modified time and typical resolution is 1s.
|
||||||
$ sleep 3000
|
$ sleep 3000
|
||||||
|
|
@ -9,4 +9,4 @@ $ sleep 3000
|
||||||
$ copy-file changes/A.scala a/src/test/scala/A.scala
|
$ copy-file changes/A.scala a/src/test/scala/A.scala
|
||||||
> a/publish
|
> a/publish
|
||||||
|
|
||||||
> b/test:compile
|
> b/Test/compile
|
||||||
|
|
|
||||||
|
|
@ -1,3 +1,3 @@
|
||||||
> export compile:dependencyClasspath
|
> export Compile/dependencyClasspath
|
||||||
> export test:dependencyClasspath
|
> export Test/dependencyClasspath
|
||||||
> test:compile
|
> Test/compile
|
||||||
|
|
|
||||||
|
|
@ -8,4 +8,4 @@ $ copy-file changes/scalacheck-ivy.xml ivy.xml
|
||||||
|
|
||||||
$ copy-file changes/scala-tools-ivysettings.xml ivysettings.xml
|
$ copy-file changes/scala-tools-ivysettings.xml ivysettings.xml
|
||||||
> check
|
> 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
|
> show pluginCrossBuild::sbtDependency
|
||||||
> compile
|
> compile
|
||||||
-> test:compile
|
-> Test/compile
|
||||||
|
|
|
||||||
|
|
@ -3,20 +3,20 @@
|
||||||
|
|
||||||
> compile
|
> compile
|
||||||
> test
|
> test
|
||||||
> test:run
|
> Test/run
|
||||||
|
|
||||||
# This part verifies that the package-src action works properly under a flattened/merged source hierarchy
|
# This part verifies that the package-src action works properly under a flattened/merged source hierarchy
|
||||||
|
|
||||||
> packageSrc
|
> packageSrc
|
||||||
> test:packageSrc
|
> Test/packageSrc
|
||||||
|
|
||||||
$ delete src
|
$ delete src
|
||||||
$ delete test-src
|
$ delete test-src
|
||||||
|
|
||||||
-> test:run
|
-> Test/run
|
||||||
|
|
||||||
> unpackage
|
> unpackage
|
||||||
> test:unpackage
|
> Test/unpackage
|
||||||
|
|
||||||
> test:test
|
> Test/test
|
||||||
> test:run
|
> Test/run
|
||||||
|
|
|
||||||
|
|
@ -1,16 +1,16 @@
|
||||||
> compile
|
> compile
|
||||||
$ exists target/scala-2.12/classes/META-INF/semanticdb/src/main/scala/foo/Compile.scala.semanticdb
|
$ 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
|
$ 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
|
$ 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
|
$ 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
|
$ exists target/scala-2.12/st-classes/META-INF/semanticdb/src/st/scala/foo/SystemTest.scala.semanticdb
|
||||||
|
|
||||||
> check
|
> 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
|
-> testQuick
|
||||||
|
|
||||||
$ touch success1
|
$ touch success1
|
||||||
|
|
|
||||||
|
|
@ -1,28 +1,27 @@
|
||||||
> clean
|
> clean
|
||||||
$ delete src/
|
$ delete src/
|
||||||
$ copy-file changes/ClassFailModuleSuccess.scala src/it/scala/Test.scala
|
$ copy-file changes/ClassFailModuleSuccess.scala src/it/scala/Test.scala
|
||||||
-> it:test
|
-> IntegrationTest/test
|
||||||
|
|
||||||
> clean
|
> clean
|
||||||
$ delete src/
|
$ delete src/
|
||||||
$ copy-file changes/ClassFailModuleFail.scala src/it/scala/Test.scala
|
$ copy-file changes/ClassFailModuleFail.scala src/it/scala/Test.scala
|
||||||
-> it:test
|
-> IntegrationTest/test
|
||||||
|
|
||||||
> clean
|
> clean
|
||||||
$ delete src/
|
$ delete src/
|
||||||
$ copy-file changes/ClassSuccessModuleFail.scala src/it/scala/Test.scala
|
$ copy-file changes/ClassSuccessModuleFail.scala src/it/scala/Test.scala
|
||||||
-> it:test
|
-> IntegrationTest/test
|
||||||
|
|
||||||
|
|
||||||
> clean
|
> clean
|
||||||
$ delete src/
|
$ delete src/
|
||||||
$ copy-file changes/ClassSuccessModuleSuccess.scala src/it/scala/Test.scala
|
$ copy-file changes/ClassSuccessModuleSuccess.scala src/it/scala/Test.scala
|
||||||
> it:test
|
> IntegrationTest/test
|
||||||
|
|
||||||
# verify that a failing normal test fails when run directly
|
# verify that a failing normal test fails when run directly
|
||||||
$ copy-file changes/AlwaysFail.scala src/test/scala/AlwaysFail.scala
|
$ copy-file changes/AlwaysFail.scala src/test/scala/AlwaysFail.scala
|
||||||
-> test:test
|
-> Test/test
|
||||||
|
|
||||||
# but that it does not affect the result of it:test (#539)
|
|
||||||
> it: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"
|
val specs = "org.specs2" %% "specs2-core" % "4.3.4"
|
||||||
ThisBuild / scalaVersion := "2.12.19"
|
|
||||||
libraryDependencies += specs % Test
|
libraryDependencies += specs % Test
|
||||||
|
|
|
||||||
|
|
@ -1 +1 @@
|
||||||
> test:test
|
> test
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
Global / cacheStores := Seq.empty
|
Global / cacheStores := Seq.empty
|
||||||
|
|
||||||
val scalatest = "org.scalatest" %% "scalatest" % "3.0.5"
|
val scalatest = "org.scalatest" %% "scalatest" % "3.0.5"
|
||||||
ThisBuild / scalaVersion := "2.12.19"
|
scalaVersion := "2.12.19"
|
||||||
|
|
||||||
lazy val root = (project in file("."))
|
lazy val root = (project in file("."))
|
||||||
.settings(
|
.settings(
|
||||||
|
|
|
||||||
|
|
@ -27,7 +27,7 @@ $ sleep 2000
|
||||||
# src/test compilation group change.
|
# src/test compilation group change.
|
||||||
|
|
||||||
$ copy-file changed/Base.scala src/test/scala/Base.scala
|
$ copy-file changed/Base.scala src/test/scala/Base.scala
|
||||||
> test:compile
|
> Test/compile
|
||||||
$ sleep 2000
|
$ sleep 2000
|
||||||
-> testQuick Create
|
-> testQuick Create
|
||||||
> testQuick Delete
|
> testQuick Delete
|
||||||
|
|
|
||||||
|
|
@ -112,7 +112,6 @@ class ClientTest extends AbstractServerTest {
|
||||||
test("compi completions") {
|
test("compi completions") {
|
||||||
val expected = Vector(
|
val expected = Vector(
|
||||||
"compile",
|
"compile",
|
||||||
"compile:",
|
|
||||||
"compileAnalysisFile",
|
"compileAnalysisFile",
|
||||||
"compileAnalysisFilename",
|
"compileAnalysisFilename",
|
||||||
"compileAnalysisTargetRoot",
|
"compileAnalysisTargetRoot",
|
||||||
|
|
@ -135,7 +134,6 @@ class ClientTest extends AbstractServerTest {
|
||||||
val testOnlyExpected = Vector(
|
val testOnlyExpected = Vector(
|
||||||
"testOnly",
|
"testOnly",
|
||||||
"testOnly/",
|
"testOnly/",
|
||||||
"testOnly::",
|
|
||||||
"testOnly;",
|
"testOnly;",
|
||||||
)
|
)
|
||||||
assert(complete("testOnly") == testOnlyExpected)
|
assert(complete("testOnly") == testOnlyExpected)
|
||||||
|
|
|
||||||
|
|
@ -22,8 +22,8 @@ import sbt.util._
|
||||||
// no longer specific to Tasks, so 'TaskStreams' should be renamed
|
// 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
|
* 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"
|
* a particular scoped key. For example, logging for Test/compile is by default sent to the "out"
|
||||||
* stream in the test:compile context.
|
* stream in the Test/compile context.
|
||||||
*/
|
*/
|
||||||
sealed trait TaskStreams[Key] {
|
sealed trait TaskStreams[Key] {
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue