mirror of https://github.com/sbt/sbt.git
Merge pull request #4899 from eatkins/watch-symlink-scripted
Add scripted test for symlink source monitoring
This commit is contained in:
commit
96d6e0d52a
|
|
@ -0,0 +1,46 @@
|
||||||
|
import java.nio.file.{ Files, Paths }
|
||||||
|
import java.nio.file.StandardCopyOption.REPLACE_EXISTING
|
||||||
|
|
||||||
|
val createSymlinks = taskKey[Unit]("create symlinks to source files and directories")
|
||||||
|
createSymlinks := {
|
||||||
|
val base = baseDirectory.value.toPath
|
||||||
|
val srcDir = base / "src" / "main" / "scala"
|
||||||
|
val foo = Files.createDirectories(srcDir / "file-source") / "Foo.scala"
|
||||||
|
Files.createSymbolicLink(srcDir / "sources", Files.createDirectories(base / "sources"))
|
||||||
|
Files.deleteIfExists(foo)
|
||||||
|
Files.createSymbolicLink(foo, base / "file-source" / "Foo.scala")
|
||||||
|
}
|
||||||
|
|
||||||
|
ThisBuild / watchOnFileInputEvent := {
|
||||||
|
val srcDir = baseDirectory.value.toPath / "src" / "main" / "scala"
|
||||||
|
(_: Int, event: Watch.Event) =>
|
||||||
|
event.path match {
|
||||||
|
case p if p == (srcDir / "file-source" / "Foo.scala") => Watch.CancelWatch
|
||||||
|
case p if p == (srcDir / "sources" / "Bar.scala") => Watch.CancelWatch
|
||||||
|
case _ => Watch.Ignore
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
val copySource = inputKey[Unit]("copy a source file from changes")
|
||||||
|
copySource := {
|
||||||
|
val relative = Def.spaceDelimited("").parsed.head.split("/") match {
|
||||||
|
case Array(head) => Paths.get(head)
|
||||||
|
case Array(head, tail @ _*) => tail.foldLeft(Paths.get(head))(_ / _)
|
||||||
|
}
|
||||||
|
val base = baseDirectory.value.toPath
|
||||||
|
Files.copy((base / "changes").resolve(relative), base.resolve(relative), REPLACE_EXISTING)
|
||||||
|
}
|
||||||
|
|
||||||
|
val removeLink = inputKey[Unit]("remove a symlink")
|
||||||
|
removeLink := {
|
||||||
|
val relative = Def.spaceDelimited("").parsed.head.split("/") match {
|
||||||
|
case Array(head) => Paths.get(head)
|
||||||
|
case Array(head, tail @ _*) => tail.foldLeft(Paths.get(head))(_ / _)
|
||||||
|
}
|
||||||
|
val srcDir = baseDirectory.value.toPath / "src" / "main" / "scala"
|
||||||
|
Files.deleteIfExists(srcDir.resolve(relative))
|
||||||
|
}
|
||||||
|
|
||||||
|
commands += Command.single("skipWindows") { (state, command) =>
|
||||||
|
if (scala.util.Properties.isWin) state else command :: state
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1 @@
|
||||||
|
class Foo {}
|
||||||
|
|
@ -0,0 +1,3 @@
|
||||||
|
package sources
|
||||||
|
|
||||||
|
class Bar
|
||||||
|
|
@ -0,0 +1 @@
|
||||||
|
class Foo
|
||||||
|
|
@ -0,0 +1,15 @@
|
||||||
|
> createSymlinks
|
||||||
|
|
||||||
|
> skipWindows ~compile; copySource file-source/Foo.scala
|
||||||
|
|
||||||
|
> ~compile; copySource sources/Bar.scala
|
||||||
|
|
||||||
|
> skipWindows ~compile; removeLink file-source/Foo.scala
|
||||||
|
|
||||||
|
> ~compile; removeLink sources
|
||||||
|
|
||||||
|
> ~compile; createSymlinks
|
||||||
|
|
||||||
|
> copySource sources/Bar.scala
|
||||||
|
|
||||||
|
> ~compile; removeLink sources/Bar.scala
|
||||||
Loading…
Reference in New Issue