mirror of https://github.com/sbt/sbt.git
allow watching and triggered messages to be customized
This commit is contained in:
parent
babe8dbbdb
commit
de6f55952f
|
|
@ -56,6 +56,8 @@ object Defaults extends BuildCommon
|
||||||
autoScalaLibrary :== true,
|
autoScalaLibrary :== true,
|
||||||
onLoad <<= onLoad ?? idFun[State],
|
onLoad <<= onLoad ?? idFun[State],
|
||||||
onUnload <<= onUnload ?? idFun[State],
|
onUnload <<= onUnload ?? idFun[State],
|
||||||
|
watchingMessage <<= watchingMessage ?? Watched.defaultWatchingMessage,
|
||||||
|
triggeredMessage <<= triggeredMessage ?? Watched.defaultTriggeredMessage,
|
||||||
definesClass :== FileValueCache(Locate.definesClass _ ).get,
|
definesClass :== FileValueCache(Locate.definesClass _ ).get,
|
||||||
trapExit :== false,
|
trapExit :== false,
|
||||||
trapExit in run :== true,
|
trapExit in run :== true,
|
||||||
|
|
@ -224,11 +226,13 @@ object Defaults extends BuildCommon
|
||||||
def watchTransitiveSourcesTask: Initialize[Task[Seq[File]]] =
|
def watchTransitiveSourcesTask: Initialize[Task[Seq[File]]] =
|
||||||
inDependencies[Task[Seq[File]]](watchSources.task, const(std.TaskExtra.constant(Nil)), includeRoot = true) apply { _.join.map(_.flatten) }
|
inDependencies[Task[Seq[File]]](watchSources.task, const(std.TaskExtra.constant(Nil)), includeRoot = true) apply { _.join.map(_.flatten) }
|
||||||
|
|
||||||
def watchSetting: Initialize[Watched] = (pollInterval, thisProjectRef) { (interval, base) =>
|
def watchSetting: Initialize[Watched] = (pollInterval, thisProjectRef, watchingMessage, triggeredMessage) { (interval, base, msg, trigMsg) =>
|
||||||
new Watched {
|
new Watched {
|
||||||
val scoped = watchTransitiveSources in base
|
val scoped = watchTransitiveSources in base
|
||||||
val key = ScopedKey(scoped.scope, scoped.key)
|
val key = ScopedKey(scoped.scope, scoped.key)
|
||||||
override def pollInterval = interval
|
override def pollInterval = interval
|
||||||
|
override def watchingMessage(s: WatchState) = msg(s)
|
||||||
|
override def triggeredMessage(s: WatchState) = trigMsg(s)
|
||||||
override def watchPaths(s: State) = EvaluateTask.evaluateTask(Project structure s, key, s, base) match {
|
override def watchPaths(s: State) = EvaluateTask.evaluateTask(Project structure s, key, s, base) match {
|
||||||
case Some(Value(ps)) => ps
|
case Some(Value(ps)) => ps
|
||||||
case Some(Inc(i)) => throw i
|
case Some(Inc(i)) => throw i
|
||||||
|
|
|
||||||
|
|
@ -61,6 +61,8 @@ object Keys
|
||||||
val pollInterval = SettingKey[Int]("poll-interval", "Interval between checks for modified sources by the continuous execution command.")
|
val pollInterval = SettingKey[Int]("poll-interval", "Interval between checks for modified sources by the continuous execution command.")
|
||||||
val watchSources = TaskKey[Seq[File]]("watch-sources", "Defines the sources in this project for continuous execution to watch for changes.")
|
val watchSources = TaskKey[Seq[File]]("watch-sources", "Defines the sources in this project for continuous execution to watch for changes.")
|
||||||
val watchTransitiveSources = TaskKey[Seq[File]]("watch-transitive-sources", "Defines the sources in all projects for continuous execution to watch.")
|
val watchTransitiveSources = TaskKey[Seq[File]]("watch-transitive-sources", "Defines the sources in all projects for continuous execution to watch.")
|
||||||
|
val watchingMessage = SettingKey[WatchState => String]("watching-message", "The message to show when triggered execution waits for sources to change.")
|
||||||
|
val triggeredMessage = SettingKey[WatchState => String]("triggered-message", "The message to show before triggered execution executes an action after sources change.")
|
||||||
|
|
||||||
// Path Keys
|
// Path Keys
|
||||||
val baseDirectory = SettingKey[File]("base-directory", "The base directory. Depending on the scope, this is the base directory for the build, project, configuration, or task.")
|
val baseDirectory = SettingKey[File]("base-directory", "The base directory. Depending on the scope, this is the base directory for the build, project, configuration, or task.")
|
||||||
|
|
|
||||||
|
|
@ -6,6 +6,7 @@ package sbt
|
||||||
import CommandSupport.{ClearOnFailure,FailureWall}
|
import CommandSupport.{ClearOnFailure,FailureWall}
|
||||||
import annotation.tailrec
|
import annotation.tailrec
|
||||||
import java.io.File
|
import java.io.File
|
||||||
|
import Types.const
|
||||||
|
|
||||||
trait Watched
|
trait Watched
|
||||||
{
|
{
|
||||||
|
|
@ -15,10 +16,19 @@ trait Watched
|
||||||
/** The time in milliseconds between checking for changes. The actual time between the last change made to a file and the
|
/** The time in milliseconds between checking for changes. The actual time between the last change made to a file and the
|
||||||
* execution time is between `pollInterval` and `pollInterval*2`.*/
|
* execution time is between `pollInterval` and `pollInterval*2`.*/
|
||||||
def pollInterval: Int = Watched.PollDelayMillis
|
def pollInterval: Int = Watched.PollDelayMillis
|
||||||
|
/** The message to show when triggered execution waits for sources to change.*/
|
||||||
|
def watchingMessage(s: WatchState): String = Watched.defaultWatchingMessage(s)
|
||||||
|
/** The message to show before an action is run. */
|
||||||
|
def triggeredMessage(s: WatchState): String = Watched.defaultTriggeredMessage(s)
|
||||||
}
|
}
|
||||||
|
|
||||||
object Watched
|
object Watched
|
||||||
{
|
{
|
||||||
|
val defaultWatchingMessage: WatchState => String = _.count + ". Waiting for source changes... (press enter to interrupt)"
|
||||||
|
val defaultTriggeredMessage: WatchState => String = const("")
|
||||||
|
val clearWhenTriggered: WatchState => String = const(clearScreen)
|
||||||
|
def clearScreen: String = "\033[2J\033[0;0H"
|
||||||
|
|
||||||
private[this] class AWatched extends Watched
|
private[this] class AWatched extends Watched
|
||||||
|
|
||||||
def multi(base: Watched, paths: Seq[Watched]): Watched =
|
def multi(base: Watched, paths: Seq[Watched]): Watched =
|
||||||
|
|
@ -27,11 +37,14 @@ object Watched
|
||||||
override def watchPaths(s: State) = (base.watchPaths(s) /: paths)(_ ++ _.watchPaths(s))
|
override def watchPaths(s: State) = (base.watchPaths(s) /: paths)(_ ++ _.watchPaths(s))
|
||||||
override def terminateWatch(key: Int): Boolean = base.terminateWatch(key)
|
override def terminateWatch(key: Int): Boolean = base.terminateWatch(key)
|
||||||
override val pollInterval = (base +: paths).map(_.pollInterval).min
|
override val pollInterval = (base +: paths).map(_.pollInterval).min
|
||||||
|
override def watchingMessage(s: WatchState) = base.watchingMessage(s)
|
||||||
|
override def triggeredMessage(s: WatchState) = base.triggeredMessage(s)
|
||||||
}
|
}
|
||||||
def empty: Watched = new AWatched
|
def empty: Watched = new AWatched
|
||||||
|
|
||||||
val PollDelayMillis = 500
|
val PollDelayMillis = 500
|
||||||
def isEnter(key: Int): Boolean = key == 10 || key == 13
|
def isEnter(key: Int): Boolean = key == 10 || key == 13
|
||||||
|
def printIfDefined(msg: String) = if(!msg.isEmpty) System.out.println(msg)
|
||||||
|
|
||||||
def executeContinuously(watched: Watched, s: State, next: String, repeat: String): State =
|
def executeContinuously(watched: Watched, s: State, next: String, repeat: String): State =
|
||||||
{
|
{
|
||||||
|
|
@ -40,7 +53,7 @@ object Watched
|
||||||
val watchState = s get ContinuousState getOrElse WatchState.empty
|
val watchState = s get ContinuousState getOrElse WatchState.empty
|
||||||
|
|
||||||
if(watchState.count > 0)
|
if(watchState.count > 0)
|
||||||
System.out.println(watchState.count + ". Waiting for source changes... (press enter to interrupt)")
|
printIfDefined(watched watchingMessage watchState)
|
||||||
|
|
||||||
val (triggered, newWatchState, newState) =
|
val (triggered, newWatchState, newState) =
|
||||||
try {
|
try {
|
||||||
|
|
@ -54,8 +67,10 @@ object Watched
|
||||||
(false, watchState, s.fail)
|
(false, watchState, s.fail)
|
||||||
}
|
}
|
||||||
|
|
||||||
if(triggered)
|
if(triggered) {
|
||||||
|
printIfDefined(watched triggeredMessage newWatchState)
|
||||||
(ClearOnFailure :: next :: FailureWall :: repeat :: s).put(ContinuousState, newWatchState)
|
(ClearOnFailure :: next :: FailureWall :: repeat :: s).put(ContinuousState, newWatchState)
|
||||||
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
while (System.in.available() > 0) System.in.read()
|
while (System.in.available() > 0) System.in.read()
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue