mirror of https://github.com/sbt/sbt.git
The existing implementation of watch did not work with the thin client. In sbt 1.3.0, watch was changed to be a blocking command that performed manual task evaluation. This commit makes the implementation more similar to < 1.3.0 where watch modifies the state and after running the user specified command(s), it enters a blocking command. The new blocking command is very similar to the shell command. As part of this change, I also reworked some of the internals of watch so that a number of threads are spawned for reading file and input events. By using background threads that write to a single event queue, we are able to block on the file events and terminal input stream rather than polling. After this change, the cpu utilization as measured by ps drops from roughly 2% of a cpu to 0. To integrate with the network client, we introduce a new UITask that is similar to the AskUserTask but instead of reading lines and adding execs to the command queue, it reads characters and converts them into watch commands that we also append to the command queue. With this new implementation, the watch task that was added in 1.3.0 no longer works. My guess is that no one was really using it. It wasn't documented anywhere. The motivation for the task implementation was that it could be called within another task which would let users define a task that monitors for file changes before running. Since this had never been advertised and is only of limited utility anyway, I think it's fine to break it. I also had to disable the input-parser and symlinks tests. I'm not 100% sure why the symlinks test was failing. It would tend to work on my machine but fail in CI. I gave up on debugging it. The input-parser test also fails but would be a good candidate to be moved to the client test in the serverTestProj. At any rate, it was testing a code path that was only exercised if the user changed the watchInputStream method which is highly unlikely to have been done in any user builds. The WatchSpec had become a nuisance and wasn't really preventing from any regressions so I removed it. The scripted tests are how we test watch. |
||
|---|---|---|
| .. | ||
| src/main/scala/sbt/scriptedtest | ||
| NOTICE | ||