Rename StampedFile to Stamped

This commit is contained in:
Ethan Atkins 2019-01-31 17:51:14 -08:00
parent d39bb96c41
commit 0bdc30b60b
10 changed files with 53 additions and 53 deletions

View File

@ -102,7 +102,7 @@ object BasicKeys {
"List of template resolver infos.", "List of template resolver infos.",
1000 1000
) )
private[sbt] val globalFileTreeView = AttributeKey[FileTreeDataView[StampedFile]]( private[sbt] val globalFileTreeView = AttributeKey[FileTreeDataView[Stamped]](
"globalFileTreeView", "globalFileTreeView",
"provides a view into the file system that may or may not cache the tree in memory", "provides a view into the file system that may or may not cache the tree in memory",
1000 1000

View File

@ -18,15 +18,15 @@ import scala.concurrent.duration._
* Configuration for viewing and monitoring the file system. * Configuration for viewing and monitoring the file system.
*/ */
final class FileTreeViewConfig private ( final class FileTreeViewConfig private (
val newDataView: () => FileTreeDataView[StampedFile], val newDataView: () => FileTreeDataView[Stamped],
val newMonitor: ( val newMonitor: (
FileTreeDataView[StampedFile], FileTreeDataView[Stamped],
Seq[WatchSource], Seq[WatchSource],
Logger Logger
) => FileEventMonitor[StampedFile] ) => FileEventMonitor[Stamped]
) )
object FileTreeViewConfig { object FileTreeViewConfig {
private implicit class RepositoryOps(val repository: FileTreeRepository[StampedFile]) { private implicit class RepositoryOps(val repository: FileTreeRepository[Stamped]) {
def register(sources: Seq[WatchSource]): Unit = sources foreach { s => def register(sources: Seq[WatchSource]): Unit = sources foreach { s =>
repository.register(s.base.toPath, if (s.recursive) Integer.MAX_VALUE else 0) repository.register(s.base.toPath, if (s.recursive) Integer.MAX_VALUE else 0)
} }
@ -34,10 +34,10 @@ object FileTreeViewConfig {
/** /**
* Create a new FileTreeViewConfig. This factory takes a generic parameter, T, that is bounded * Create a new FileTreeViewConfig. This factory takes a generic parameter, T, that is bounded
* by {{{sbt.io.FileTreeDataView[StampedFile]}}}. The reason for this is to ensure that a * by {{{sbt.io.FileTreeDataView[Stamped]}}}. The reason for this is to ensure that a
* sbt.io.FileTreeDataView that is instantiated by [[FileTreeViewConfig.newDataView]] can be * sbt.io.FileTreeDataView that is instantiated by [[FileTreeViewConfig.newDataView]] can be
* passed into [[FileTreeViewConfig.newMonitor]] without constraining the type of view to be * passed into [[FileTreeViewConfig.newMonitor]] without constraining the type of view to be
* {{{sbt.io.FileTreeDataView[StampedFile]}}}. * {{{sbt.io.FileTreeDataView[Stamped]}}}.
* @param newDataView create a new sbt.io.FileTreeDataView. This value may be cached in a global * @param newDataView create a new sbt.io.FileTreeDataView. This value may be cached in a global
* attribute * attribute
* @param newMonitor create a new sbt.io.FileEventMonitor using the sbt.io.FileTreeDataView * @param newMonitor create a new sbt.io.FileEventMonitor using the sbt.io.FileTreeDataView
@ -45,13 +45,13 @@ object FileTreeViewConfig {
* @tparam T the subtype of sbt.io.FileTreeDataView that is returned by [[FileTreeViewConfig.newDataView]] * @tparam T the subtype of sbt.io.FileTreeDataView that is returned by [[FileTreeViewConfig.newDataView]]
* @return a [[FileTreeViewConfig]] instance. * @return a [[FileTreeViewConfig]] instance.
*/ */
def apply[T <: FileTreeDataView[StampedFile]]( def apply[T <: FileTreeDataView[Stamped]](
newDataView: () => T, newDataView: () => T,
newMonitor: (T, Seq[WatchSource], Logger) => FileEventMonitor[StampedFile] newMonitor: (T, Seq[WatchSource], Logger) => FileEventMonitor[Stamped]
): FileTreeViewConfig = ): FileTreeViewConfig =
new FileTreeViewConfig( new FileTreeViewConfig(
newDataView, newDataView,
(view: FileTreeDataView[StampedFile], sources: Seq[WatchSource], logger: Logger) => (view: FileTreeDataView[Stamped], sources: Seq[WatchSource], logger: Logger) =>
newMonitor(view.asInstanceOf[T], sources, logger) newMonitor(view.asInstanceOf[T], sources, logger)
) )
@ -70,14 +70,14 @@ object FileTreeViewConfig {
antiEntropy: FiniteDuration antiEntropy: FiniteDuration
): FileTreeViewConfig = ): FileTreeViewConfig =
FileTreeViewConfig( FileTreeViewConfig(
() => FileTreeView.DEFAULT.asDataView(StampedFile.converter), () => FileTreeView.DEFAULT.asDataView(Stamped.converter),
(_: FileTreeDataView[StampedFile], sources, logger) => { (_: FileTreeDataView[Stamped], sources, logger) => {
val ioLogger: sbt.io.WatchLogger = msg => logger.debug(msg.toString) val ioLogger: sbt.io.WatchLogger = msg => logger.debug(msg.toString)
FileEventMonitor.antiEntropy( FileEventMonitor.antiEntropy(
new WatchServiceBackedObservable( new WatchServiceBackedObservable(
WatchState.empty(Watched.createWatchService(), sources), WatchState.empty(Watched.createWatchService(), sources),
delay, delay,
StampedFile.converter, Stamped.converter,
closeService = true, closeService = true,
ioLogger ioLogger
), ),
@ -97,11 +97,11 @@ object FileTreeViewConfig {
*/ */
def default(antiEntropy: FiniteDuration): FileTreeViewConfig = def default(antiEntropy: FiniteDuration): FileTreeViewConfig =
FileTreeViewConfig( FileTreeViewConfig(
() => FileTreeRepository.default(StampedFile.converter), () => FileTreeRepository.default(Stamped.converter),
(repository: FileTreeRepository[StampedFile], sources: Seq[WatchSource], logger: Logger) => { (repository: FileTreeRepository[Stamped], sources: Seq[WatchSource], logger: Logger) => {
repository.register(sources) repository.register(sources)
val copied = new Observable[StampedFile] { val copied = new Observable[Stamped] {
override def addObserver(observer: Observer[StampedFile]): Int = override def addObserver(observer: Observer[Stamped]): Int =
repository.addObserver(observer) repository.addObserver(observer)
override def removeObserver(handle: Int): Unit = repository.removeObserver(handle) override def removeObserver(handle: Int): Unit = repository.removeObserver(handle)
override def close(): Unit = {} // Don't close the underlying observable override def close(): Unit = {} // Don't close the underlying observable
@ -154,9 +154,9 @@ object FileTreeViewConfig {
pollingInterval: FiniteDuration, pollingInterval: FiniteDuration,
pollingSources: Seq[WatchSource], pollingSources: Seq[WatchSource],
): FileTreeViewConfig = FileTreeViewConfig( ): FileTreeViewConfig = FileTreeViewConfig(
() => FileTreeRepository.hybrid(StampedFile.converter, pollingSources: _*), () => FileTreeRepository.hybrid(Stamped.converter, pollingSources: _*),
( (
repository: HybridPollingFileTreeRepository[StampedFile], repository: HybridPollingFileTreeRepository[Stamped],
sources: Seq[WatchSource], sources: Seq[WatchSource],
logger: Logger logger: Logger
) => { ) => {

View File

@ -19,32 +19,32 @@ import xsbti.compile.analysis.Stamp
* a cached value that can be read without doing any io. This can be used to improve performance * a cached value that can be read without doing any io. This can be used to improve performance
* anywhere where we need to check if files have changed before doing potentially expensive work. * anywhere where we need to check if files have changed before doing potentially expensive work.
*/ */
trait StampedFile extends File with TypedPath { trait Stamped extends File with TypedPath {
def stamp: Stamp def stamp: Stamp
} }
/** /**
* Provides converter functions from TypedPath to [[StampedFile]]. * Provides converter functions from TypedPath to [[Stamped]].
*/ */
object StampedFile { object Stamped {
/** /**
* Converts a TypedPath instance to a [[StampedFile]] by calculating the file hash. * Converts a TypedPath instance to a [[Stamped]] by calculating the file hash.
*/ */
val sourceConverter: TypedPath => StampedFile = val sourceConverter: TypedPath => Stamped =
new StampedFileImpl(_: TypedPath, forceLastModified = false) new StampedImpl(_: TypedPath, forceLastModified = false)
/** /**
* Converts a TypedPath instance to a [[StampedFile]] using the last modified time. * Converts a TypedPath instance to a [[Stamped]] using the last modified time.
*/ */
val binaryConverter: TypedPath => StampedFile = val binaryConverter: TypedPath => Stamped =
new StampedFileImpl(_: TypedPath, forceLastModified = true) new StampedImpl(_: TypedPath, forceLastModified = true)
/** /**
* A combined convert that converts TypedPath instances representing *.jar and *.class files * A combined convert that converts TypedPath instances representing *.jar and *.class files
* using the last modified time and all other files using the file hash. * using the last modified time and all other files using the file hash.
*/ */
val converter: TypedPath => StampedFile = (tp: TypedPath) => val converter: TypedPath => Stamped = (tp: TypedPath) =>
tp.toPath.toString match { tp.toPath.toString match {
case s if s.endsWith(".jar") => binaryConverter(tp) case s if s.endsWith(".jar") => binaryConverter(tp)
case s if s.endsWith(".class") => binaryConverter(tp) case s if s.endsWith(".class") => binaryConverter(tp)
@ -54,13 +54,13 @@ object StampedFile {
/** /**
* Adds a default ordering that just delegates to the java.io.File.compareTo method. * Adds a default ordering that just delegates to the java.io.File.compareTo method.
*/ */
implicit case object ordering extends Ordering[StampedFile] { implicit case object ordering extends Ordering[Stamped] {
override def compare(left: StampedFile, right: StampedFile): Int = left.compareTo(right) override def compare(left: Stamped, right: Stamped): Int = left.compareTo(right)
} }
private class StampedFileImpl(typedPath: TypedPath, forceLastModified: Boolean) private class StampedImpl(typedPath: TypedPath, forceLastModified: Boolean)
extends java.io.File(typedPath.toPath.toString) extends java.io.File(typedPath.toPath.toString)
with StampedFile { with Stamped {
override val stamp: Stamp = override val stamp: Stamp =
if (forceLastModified || typedPath.isDirectory) Stamper.forLastModified(this) if (forceLastModified || typedPath.isDirectory) Stamper.forLastModified(this)
else Stamper.forHash(this) else Stamper.forHash(this)

View File

@ -146,7 +146,7 @@ object Watched {
private[sbt] def onEvent( private[sbt] def onEvent(
sources: Seq[WatchSource], sources: Seq[WatchSource],
projectSources: Seq[WatchSource] projectSources: Seq[WatchSource]
): Event[StampedFile] => Watched.Action = ): Event[Stamped] => Watched.Action =
event => event =>
if (sources.exists(_.accept(event.entry.typedPath.toPath))) Watched.Trigger if (sources.exists(_.accept(event.entry.typedPath.toPath))) Watched.Trigger
else if (projectSources.exists(_.accept(event.entry.typedPath.toPath))) event match { else if (projectSources.exists(_.accept(event.entry.typedPath.toPath))) event match {
@ -458,7 +458,7 @@ trait WatchConfig {
* *
* @return an sbt.io.FileEventMonitor instance. * @return an sbt.io.FileEventMonitor instance.
*/ */
def fileEventMonitor: FileEventMonitor[StampedFile] def fileEventMonitor: FileEventMonitor[Stamped]
/** /**
* A function that is periodically invoked to determine whether the watch should stop or * A function that is periodically invoked to determine whether the watch should stop or
@ -481,7 +481,7 @@ trait WatchConfig {
* @param event the detected sbt.io.FileEventMonitor.Event. * @param event the detected sbt.io.FileEventMonitor.Event.
* @return the next [[Watched.Action Action]] to run. * @return the next [[Watched.Action Action]] to run.
*/ */
def onWatchEvent(event: Event[StampedFile]): Watched.Action def onWatchEvent(event: Event[Stamped]): Watched.Action
/** /**
* Transforms the state after the watch terminates. * Transforms the state after the watch terminates.
@ -537,10 +537,10 @@ object WatchConfig {
*/ */
def default( def default(
logger: Logger, logger: Logger,
fileEventMonitor: FileEventMonitor[StampedFile], fileEventMonitor: FileEventMonitor[Stamped],
handleInput: InputStream => Watched.Action, handleInput: InputStream => Watched.Action,
preWatch: (Int, Boolean) => Watched.Action, preWatch: (Int, Boolean) => Watched.Action,
onWatchEvent: Event[StampedFile] => Watched.Action, onWatchEvent: Event[Stamped] => Watched.Action,
onWatchTerminated: (Watched.Action, String, State) => State, onWatchTerminated: (Watched.Action, String, State) => State,
triggeredMessage: (TypedPath, Int) => Option[String], triggeredMessage: (TypedPath, Int) => Option[String],
watchingMessage: Int => Option[String] watchingMessage: Int => Option[String]
@ -555,11 +555,11 @@ object WatchConfig {
val wm = watchingMessage val wm = watchingMessage
new WatchConfig { new WatchConfig {
override def logger: Logger = l override def logger: Logger = l
override def fileEventMonitor: FileEventMonitor[StampedFile] = fem override def fileEventMonitor: FileEventMonitor[Stamped] = fem
override def handleInput(inputStream: InputStream): Watched.Action = hi(inputStream) override def handleInput(inputStream: InputStream): Watched.Action = hi(inputStream)
override def preWatch(count: Int, lastResult: Boolean): Watched.Action = override def preWatch(count: Int, lastResult: Boolean): Watched.Action =
pw(count, lastResult) pw(count, lastResult)
override def onWatchEvent(event: Event[StampedFile]): Watched.Action = owe(event) override def onWatchEvent(event: Event[Stamped]): Watched.Action = owe(event)
override def onWatchTerminated(action: Watched.Action, command: String, state: State): State = override def onWatchTerminated(action: Watched.Action, command: String, state: State): State =
owt(action, command, state) owt(action, command, state)
override def triggeredMessage(typedPath: TypedPath, count: Int): Option[String] = override def triggeredMessage(typedPath: TypedPath, count: Int): Option[String] =

View File

@ -26,11 +26,11 @@ class WatchedSpec extends FlatSpec with Matchers {
private val fileTreeViewConfig = FileTreeViewConfig.default(50.millis) private val fileTreeViewConfig = FileTreeViewConfig.default(50.millis)
def config( def config(
sources: Seq[WatchSource], sources: Seq[WatchSource],
fileEventMonitor: Option[FileEventMonitor[StampedFile]] = None, fileEventMonitor: Option[FileEventMonitor[Stamped]] = None,
logger: Logger = NullLogger, logger: Logger = NullLogger,
handleInput: InputStream => Action = _ => Ignore, handleInput: InputStream => Action = _ => Ignore,
preWatch: (Int, Boolean) => Action = (_, _) => CancelWatch, preWatch: (Int, Boolean) => Action = (_, _) => CancelWatch,
onWatchEvent: Event[StampedFile] => Action = _ => Ignore, onWatchEvent: Event[Stamped] => Action = _ => Ignore,
triggeredMessage: (TypedPath, Int) => Option[String] = (_, _) => None, triggeredMessage: (TypedPath, Int) => Option[String] = (_, _) => None,
watchingMessage: Int => Option[String] = _ => None watchingMessage: Int => Option[String] = _ => None
): WatchConfig = { ): WatchConfig = {

View File

@ -274,7 +274,7 @@ object Defaults extends BuildCommon {
fileTreeViewConfig := FileManagement.defaultFileTreeView.value, fileTreeViewConfig := FileManagement.defaultFileTreeView.value,
fileTreeView := state.value fileTreeView := state.value
.get(BasicKeys.globalFileTreeView) .get(BasicKeys.globalFileTreeView)
.getOrElse(FileTreeView.DEFAULT.asDataView(StampedFile.converter)), .getOrElse(FileTreeView.DEFAULT.asDataView(Stamped.converter)),
externalHooks := { externalHooks := {
val view = fileTreeView.value val view = fileTreeView.value
compileOptions => compileOptions =>

View File

@ -93,14 +93,14 @@ object Keys {
@deprecated("This is no longer used for continuous execution", "1.3.0") @deprecated("This is no longer used for continuous execution", "1.3.0")
val watch = SettingKey(BasicKeys.watch) val watch = SettingKey(BasicKeys.watch)
val suppressSbtShellNotification = settingKey[Boolean]("""True to suppress the "Executing in batch mode.." message.""").withRank(CSetting) val suppressSbtShellNotification = settingKey[Boolean]("""True to suppress the "Executing in batch mode.." message.""").withRank(CSetting)
val fileTreeView = taskKey[FileTreeDataView[StampedFile]]("A view of the file system") val fileTreeView = taskKey[FileTreeDataView[Stamped]]("A view of the file system")
val pollInterval = settingKey[FiniteDuration]("Interval between checks for modified sources by the continuous execution command.").withRank(BMinusSetting) val pollInterval = settingKey[FiniteDuration]("Interval between checks for modified sources by the continuous execution command.").withRank(BMinusSetting)
val pollingDirectories = settingKey[Seq[Watched.WatchSource]]("Directories that cannot be cached and must always be rescanned. Typically these will be NFS mounted or something similar.").withRank(DSetting) val pollingDirectories = settingKey[Seq[Watched.WatchSource]]("Directories that cannot be cached and must always be rescanned. Typically these will be NFS mounted or something similar.").withRank(DSetting)
val watchAntiEntropy = settingKey[FiniteDuration]("Duration for which the watch EventMonitor will ignore events for a file after that file has triggered a build.").withRank(BMinusSetting) val watchAntiEntropy = settingKey[FiniteDuration]("Duration for which the watch EventMonitor will ignore events for a file after that file has triggered a build.").withRank(BMinusSetting)
val watchConfig = taskKey[WatchConfig]("The configuration for continuous execution.").withRank(BMinusSetting) val watchConfig = taskKey[WatchConfig]("The configuration for continuous execution.").withRank(BMinusSetting)
val watchLogger = taskKey[Logger]("A logger that reports watch events.").withRank(DSetting) val watchLogger = taskKey[Logger]("A logger that reports watch events.").withRank(DSetting)
val watchHandleInput = settingKey[InputStream => Watched.Action]("Function that is periodically invoked to determine if the continous build should be stopped or if a build should be triggered. It will usually read from stdin to respond to user commands.").withRank(BMinusSetting) val watchHandleInput = settingKey[InputStream => Watched.Action]("Function that is periodically invoked to determine if the continous build should be stopped or if a build should be triggered. It will usually read from stdin to respond to user commands.").withRank(BMinusSetting)
val watchOnEvent = taskKey[Event[StampedFile] => Watched.Action]("Determines how to handle a file event").withRank(BMinusSetting) val watchOnEvent = taskKey[Event[Stamped] => Watched.Action]("Determines how to handle a file event").withRank(BMinusSetting)
val watchOnTermination = taskKey[(Watched.Action, String, State) => State]("Transforms the input state after the continuous build completes.").withRank(BMinusSetting) val watchOnTermination = taskKey[(Watched.Action, String, State) => State]("Transforms the input state after the continuous build completes.").withRank(BMinusSetting)
val watchService = settingKey[() => WatchService]("Service to use to monitor file system changes.").withRank(BMinusSetting) val watchService = settingKey[() => WatchService]("Service to use to monitor file system changes.").withRank(BMinusSetting)
val watchProjectSources = taskKey[Seq[Watched.WatchSource]]("Defines the sources for the sbt meta project to watch to trigger a reload.").withRank(CSetting) val watchProjectSources = taskKey[Seq[Watched.WatchSource]]("Defines the sources for the sbt meta project to watch to trigger a reload.").withRank(CSetting)

View File

@ -862,7 +862,7 @@ object BuiltinCommands {
() ()
} }
val (_, config: FileTreeViewConfig) = extracted.runTask(Keys.fileTreeViewConfig, s) val (_, config: FileTreeViewConfig) = extracted.runTask(Keys.fileTreeViewConfig, s)
val view: FileTreeDataView[StampedFile] = config.newDataView() val view: FileTreeDataView[Stamped] = config.newDataView()
val newState = s.addExitHook(cleanup()) val newState = s.addExitHook(cleanup())
cleanup() cleanup()
newState newState

View File

@ -9,7 +9,7 @@ package sbt.internal
import java.nio.file.Paths import java.nio.file.Paths
import java.util.Optional import java.util.Optional
import sbt.StampedFile import sbt.Stamped
import sbt.internal.inc.ExternalLookup import sbt.internal.inc.ExternalLookup
import sbt.io.syntax.File import sbt.io.syntax.File
import sbt.io.{ FileTreeRepository, FileTreeDataView, TypedPath } import sbt.io.{ FileTreeRepository, FileTreeDataView, TypedPath }
@ -20,17 +20,17 @@ import scala.collection.mutable
private[sbt] object ExternalHooks { private[sbt] object ExternalHooks {
private val javaHome = Option(System.getProperty("java.home")).map(Paths.get(_)) private val javaHome = Option(System.getProperty("java.home")).map(Paths.get(_))
def apply(options: CompileOptions, view: FileTreeDataView[StampedFile]): DefaultExternalHooks = { def apply(options: CompileOptions, view: FileTreeDataView[Stamped]): DefaultExternalHooks = {
import scala.collection.JavaConverters._ import scala.collection.JavaConverters._
val sources = options.sources() val sources = options.sources()
val cachedSources = new java.util.HashMap[File, Stamp] val cachedSources = new java.util.HashMap[File, Stamp]
val converter: File => Stamp = f => StampedFile.sourceConverter(TypedPath(f.toPath)).stamp val converter: File => Stamp = f => Stamped.sourceConverter(TypedPath(f.toPath)).stamp
sources.foreach { sources.foreach {
case sf: StampedFile => cachedSources.put(sf, sf.stamp) case sf: Stamped => cachedSources.put(sf, sf.stamp)
case f: File => cachedSources.put(f, converter(f)) case f: File => cachedSources.put(f, converter(f))
} }
view match { view match {
case r: FileTreeRepository[StampedFile] => case r: FileTreeRepository[Stamped] =>
r.register(options.classesDirectory.toPath, Integer.MAX_VALUE) r.register(options.classesDirectory.toPath, Integer.MAX_VALUE)
options.classpath.foreach { f => options.classpath.foreach { f =>
r.register(f.toPath, Integer.MAX_VALUE) r.register(f.toPath, Integer.MAX_VALUE)

View File

@ -51,7 +51,7 @@ private[sbt] object FileManagement {
val view = fileTreeView.value val view = fileTreeView.value
val include = filter.toTask.value val include = filter.toTask.value
val ex = excludes.toTask.value val ex = excludes.toTask.value
val sourceFilter: Entry[StampedFile] => Boolean = (entry: Entry[StampedFile]) => { val sourceFilter: Entry[Stamped] => Boolean = (entry: Entry[Stamped]) => {
entry.value match { entry.value match {
case Right(sf) => include.accept(sf) && !ex.accept(sf) case Right(sf) => include.accept(sf) && !ex.accept(sf)
case _ => false case _ => false