Skip to content

Commit 4bea696

Browse files
Re-run things when users press enter in watch mode (#1451)
Like how Mill does
1 parent 0e01a08 commit 4bea696

File tree

7 files changed

+29
-16
lines changed

7 files changed

+29
-16
lines changed

modules/cli/src/main/scala/scala/cli/commands/Compile.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -97,7 +97,7 @@ object Compile extends ScalaCommand[CompileOptions] with BuildCommandHelpers {
9797
for (builds <- res.orReport(logger))
9898
postBuild(builds, allowExit = false)
9999
}
100-
try WatchUtil.waitForCtrlC()
100+
try WatchUtil.waitForCtrlC(() => watcher.schedule())
101101
finally watcher.dispose()
102102
}
103103
else {

modules/cli/src/main/scala/scala/cli/commands/Package.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,7 @@ object Package extends ScalaCommand[PackageOptions] with BuildCommandHelpers {
104104
System.err.println("Build cancelled")
105105
}
106106
}
107-
try WatchUtil.waitForCtrlC()
107+
try WatchUtil.waitForCtrlC(() => watcher.schedule())
108108
finally watcher.dispose()
109109
}
110110
else {

modules/cli/src/main/scala/scala/cli/commands/Repl.scala

Lines changed: 15 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -126,17 +126,23 @@ object Repl extends ScalaCommand[ReplOptions] {
126126

127127
if (inputs.isEmpty) {
128128
val artifacts = initialBuildOptions.artifacts(logger, Scope.Main).orExit(logger)
129-
doRunRepl(
130-
initialBuildOptions,
131-
artifacts,
132-
None,
133-
allowExit = !options.sharedRepl.watch.watchMode,
134-
buildOpt = None
135-
)
129+
// synchronizing, so that multiple presses to enter (handled by WatchUtil.waitForCtrlC)
130+
// don't try to run repls in parallel
131+
val lock = new Object
132+
def runThing() = lock.synchronized {
133+
doRunRepl(
134+
initialBuildOptions,
135+
artifacts,
136+
None,
137+
allowExit = !options.sharedRepl.watch.watchMode,
138+
buildOpt = None
139+
)
140+
}
141+
runThing()
136142
if (options.sharedRepl.watch.watchMode) {
137143
// nothing to watch, just wait for Ctrl+C
138144
WatchUtil.printWatchMessage()
139-
WatchUtil.waitForCtrlC()
145+
WatchUtil.waitForCtrlC(() => runThing())
140146
}
141147
}
142148
else if (options.sharedRepl.watch.watchMode) {
@@ -159,7 +165,7 @@ object Repl extends ScalaCommand[ReplOptions] {
159165
case _: Build.Cancelled => buildCancelled(allowExit = false)
160166
}
161167
}
162-
try WatchUtil.waitForCtrlC()
168+
try WatchUtil.waitForCtrlC(() => watcher.schedule())
163169
finally watcher.dispose()
164170
}
165171
else {

modules/cli/src/main/scala/scala/cli/commands/Run.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -230,7 +230,7 @@ object Run extends ScalaCommand[RunOptions] with BuildCommandHelpers {
230230
System.err.println("Compilation failed")
231231
}
232232
}
233-
try WatchUtil.waitForCtrlC()
233+
try WatchUtil.waitForCtrlC(() => watcher.schedule())
234234
finally watcher.dispose()
235235
}
236236
else {

modules/cli/src/main/scala/scala/cli/commands/Test.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -137,7 +137,7 @@ object Test extends ScalaCommand[TestOptions] {
137137
for (builds <- res.orReport(logger))
138138
maybeTest(builds, allowExit = false)
139139
}
140-
try WatchUtil.waitForCtrlC()
140+
try WatchUtil.waitForCtrlC(() => watcher.schedule())
141141
finally watcher.dispose()
142142
}
143143
else {

modules/cli/src/main/scala/scala/cli/commands/WatchUtil.scala

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,14 @@ object WatchUtil {
1717
def printWatchMessage(): Unit =
1818
System.err.println(waitMessage("Watching sources"))
1919

20-
def waitForCtrlC(): Unit =
21-
while (System.in.read() != -1) {}
20+
def waitForCtrlC(onPressEnter: () => Unit = () => ()): Unit = {
21+
var readKey = -1
22+
while ({
23+
readKey = System.in.read()
24+
readKey != -1
25+
})
26+
if (readKey == '\n')
27+
onPressEnter()
28+
}
2229

2330
}

modules/cli/src/main/scala/scala/cli/commands/publish/Publish.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -276,7 +276,7 @@ object Publish extends ScalaCommand[PublishOptions] with BuildCommandHelpers {
276276
)
277277
}
278278
}
279-
try WatchUtil.waitForCtrlC()
279+
try WatchUtil.waitForCtrlC(() => watcher.schedule())
280280
finally watcher.dispose()
281281
}
282282
else {

0 commit comments

Comments
 (0)