From d2cd284e5edd158d4a86ab5865b3deb787fa1542 Mon Sep 17 00:00:00 2001 From: Dairus Date: Tue, 20 Jan 2026 18:13:27 +0100 Subject: [PATCH] [2.x] Add scripted test for #7838 (#8541) This PR adds a new scripted test `watch-termination-reload` to prevent regression of the fix in PR #7838. The test verifies that the `Reload` action is correctly passed to the `watchOnTermination` callback when a reload is triggered in watch mode, instead of falling back to `CancelWatch` (which was the root cause of issue #7017). --- .../project/Build.scala | 43 +++++++++++++++++++ .../src/main/scala/Test.scala | 3 ++ .../watch/watch-termination-reload/test | 4 ++ 3 files changed, 50 insertions(+) create mode 100644 src/sbt-test/watch/watch-termination-reload/project/Build.scala create mode 100644 src/sbt-test/watch/watch-termination-reload/src/main/scala/Test.scala create mode 100644 src/sbt-test/watch/watch-termination-reload/test diff --git a/src/sbt-test/watch/watch-termination-reload/project/Build.scala b/src/sbt-test/watch/watch-termination-reload/project/Build.scala new file mode 100644 index 000000000..12fb5c6a6 --- /dev/null +++ b/src/sbt-test/watch/watch-termination-reload/project/Build.scala @@ -0,0 +1,43 @@ +package sbt.watch.termination.reload + +import sbt._ +import Keys._ +import sbt.nio.Keys._ +import sbt.nio.Watch + +object Build { + val checkTerminationAction = inputKey[Unit]("Check that watchOnTermination received the expected action") + val checkTerminationActionImpl: Def.Initialize[InputTask[Unit]] = Def.inputTask { + val Seq(expectedAction) = Def.spaceDelimited().parsed + val logFile = baseDirectory.value / "action-log.txt" + val loggedAction = IO.read(logFile).trim + assert(loggedAction == expectedAction, s"Expected action '$expectedAction', but got '$loggedAction'") + } + + lazy val root = (project in file(".")).settings( + checkTerminationAction := checkTerminationActionImpl.evaluated, + watchOnTermination := { (count: Int, action: Watch.Action) => + if (action == Watch.Reload) { + val logFile = baseDirectory.value / "action-log.txt" + IO.write(logFile, action.toString) + } + }, + watchOnFileInputEvent := { (count: Int, event: Watch.Event) => + if (event.path.getFileName.toString == "trigger.txt") { + val flagFile = baseDirectory.value / "triggered.txt" + if (!flagFile.exists) { + IO.write(flagFile, "true") + Watch.Reload + } else { + Watch.CancelWatch + } + } else Watch.Ignore + }, + watchSources += baseDirectory.value / "trigger.txt", + Compile / compile := { + val trigger = baseDirectory.value / "trigger.txt" + IO.write(trigger, System.currentTimeMillis.toString) + (Compile / compile).value + } + ) +} diff --git a/src/sbt-test/watch/watch-termination-reload/src/main/scala/Test.scala b/src/sbt-test/watch/watch-termination-reload/src/main/scala/Test.scala new file mode 100644 index 000000000..85486e63d --- /dev/null +++ b/src/sbt-test/watch/watch-termination-reload/src/main/scala/Test.scala @@ -0,0 +1,3 @@ +class Test { + // Minimal source to enable ~compile in watch mode +} \ No newline at end of file diff --git a/src/sbt-test/watch/watch-termination-reload/test b/src/sbt-test/watch/watch-termination-reload/test new file mode 100644 index 000000000..d2478d77c --- /dev/null +++ b/src/sbt-test/watch/watch-termination-reload/test @@ -0,0 +1,4 @@ +# Start watch mode with ~compile, which triggers file modification and reload +> ~compile +# Check that watchOnTermination received Reload action +> checkTerminationAction Reload \ No newline at end of file