Skip to content

Commit 7c94ace

Browse files
committed
fix(watch): simplify restart status line
Hide the stale progress snapshot while a watch build is being restarted and show a plain restart message until the next build begins and regular progress reporting resumes. Signed-off-by: Rudi Grinberg <me@rgrinberg.com>
1 parent 01bfe4d commit 7c94ace

1 file changed

Lines changed: 47 additions & 35 deletions

File tree

bin/scheduler_setup.ml

Lines changed: 47 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -22,46 +22,47 @@ let maybe_clear_screen
2222
[ Pp.nop; Pp.tag User_message.Style.Success (Pp.verbatim message); Pp.nop ]))
2323
;;
2424

25-
let on_event ~terminal_persistence = function
25+
let set_overlay overlay message =
26+
Option.iter !overlay ~f:Console.Status_line.remove_overlay;
27+
overlay := Some (Console.Status_line.add_overlay (Constant message))
28+
;;
29+
30+
let clear_overlay overlay =
31+
Option.iter !overlay ~f:Console.Status_line.remove_overlay;
32+
overlay := None
33+
;;
34+
35+
let on_event overlay ~terminal_persistence = function
2636
| Run.Event.Tick -> Console.Status_line.refresh ()
2737
| Source_files_changed { details_hum } ->
28-
maybe_clear_screen ~terminal_persistence ~details_hum
38+
maybe_clear_screen ~terminal_persistence ~details_hum;
39+
clear_overlay overlay
2940
| Build_interrupted ->
30-
Console.Status_line.set
31-
(Live
32-
(fun () ->
33-
let progression =
34-
match Fiber.Svar.read Build_system.state with
35-
| Initializing
36-
| Restarting_current_build
37-
| Build_succeeded__now_waiting_for_changes
38-
| Build_failed__now_waiting_for_changes -> Build_system.Progress.init
39-
| Building progress -> progress
40-
in
41-
Pp.seq
42-
(Pp.tag User_message.Style.Error (Pp.verbatim "Source files changed"))
43-
(Pp.verbatim
44-
(sprintf
45-
", restarting current build... (%u/%u)"
46-
progression.number_of_rules_executed
47-
progression.number_of_rules_discovered))))
41+
set_overlay
42+
overlay
43+
(Pp.tag User_message.Style.Error (Pp.verbatim "Restarting current build..."))
4844
| Build_finish build_result ->
4945
let message =
5046
match build_result with
51-
| Success -> Pp.tag User_message.Style.Success (Pp.verbatim "Success")
47+
| Success ->
48+
Pp.seq
49+
(Pp.tag User_message.Style.Success (Pp.verbatim "Success"))
50+
(Pp.verbatim ", waiting for filesystem changes...")
5251
| Failure ->
52+
let error_count =
53+
Build_system_error.(
54+
Id.Map.cardinal (Set.current (Fiber.Svar.read Build_system.errors)))
55+
in
5356
let failure_message =
54-
match
55-
Build_system_error.(
56-
Id.Map.cardinal (Set.current (Fiber.Svar.read Build_system.errors)))
57-
with
57+
match error_count with
5858
| 1 -> Pp.textf "Had 1 error"
5959
| n -> Pp.textf "Had %d errors" n
6060
in
61-
Pp.tag User_message.Style.Error failure_message
61+
Pp.seq
62+
(Pp.tag User_message.Style.Error failure_message)
63+
(Pp.verbatim ", waiting for filesystem changes...")
6264
in
63-
Console.Status_line.set
64-
(Constant (Pp.seq message (Pp.verbatim ", waiting for filesystem changes...")))
65+
set_overlay overlay message
6566
;;
6667

6768
let rpc server =
@@ -79,14 +80,27 @@ let no_build_no_rpc ~config:dune_config f =
7980
Run.go config ~on_event:(fun _ -> ()) f
8081
;;
8182

83+
let run_with_watch_status ~terminal_persistence f =
84+
let overlay = ref None in
85+
Exn.protect
86+
~f:(fun () ->
87+
let on_event = on_event overlay ~terminal_persistence in
88+
f on_event)
89+
~finally:(fun () -> clear_overlay overlay)
90+
;;
91+
8292
let go_without_rpc_server ~(common : Common.t) ~config:dune_config f =
8393
let config =
8494
let watch_exclusions = Common.watch_exclusions common in
8595
Dune_config.for_scheduler dune_config ~print_ctrl_c_warning:true ~watch_exclusions
8696
in
8797
Dune_rules.Clflags.concurrency := config.concurrency;
88-
let on_event = on_event ~terminal_persistence:dune_config.terminal_persistence in
89-
Run.go config ~on_event f
98+
match Common.watch common with
99+
| No -> Run.go config ~on_event:(fun _ -> ()) f
100+
| Yes _ ->
101+
run_with_watch_status
102+
~terminal_persistence:dune_config.terminal_persistence
103+
(fun on_event -> Run.go config ~on_event f)
90104
;;
91105

92106
let go_with_rpc_server ~common ~config f =
@@ -121,9 +135,7 @@ let go_with_rpc_server_and_console_status_reporting
121135
let* () = Root.Rpc.Global.ensure_ready () in
122136
run ()
123137
in
124-
Run.go
125-
config
126-
~file_watcher
127-
~on_event:(on_event ~terminal_persistence:dune_config.terminal_persistence)
128-
run
138+
run_with_watch_status
139+
~terminal_persistence:dune_config.terminal_persistence
140+
(fun on_event -> Run.go config ~file_watcher ~on_event run)
129141
;;

0 commit comments

Comments
 (0)