File tree 4 files changed +49
-14
lines changed
test/blackbox-tests/test-cases/watching 4 files changed +49
-14
lines changed Original file line number Diff line number Diff line change @@ -207,7 +207,7 @@ let build =
207
207
state of the lock could otherwise change between checking it and taking
208
208
it. *)
209
209
match Dune_util.Global_lock. lock ~timeout: None with
210
- | Error () ->
210
+ | Error lock_held_by ->
211
211
(* This case is reached if dune detects that another instance of dune
212
212
is already running. Rather than performing the build itself, the
213
213
current instance of dune will instruct the already-running instance to
@@ -217,6 +217,12 @@ let build =
217
217
perform the RPC call.
218
218
*)
219
219
Scheduler. go_without_rpc_server ~common ~config (fun () ->
220
+ User_warning. emit
221
+ [ Dune_util.Global_lock.Lock_held_by. message lock_held_by
222
+ ; Pp. text
223
+ " The requested targets will still be built however functionality will be \
224
+ reduced and some command line arguments will be ignored."
225
+ ];
220
226
build_via_rpc_server targets)
221
227
| Ok () ->
222
228
let request setup =
Original file line number Diff line number Diff line change 66
66
67
67
let locked = ref false
68
68
69
+ module Lock_held_by = struct
70
+ type t =
71
+ | Pid_from_lockfile of string
72
+ | Unknown
73
+
74
+ let read_lock_file () =
75
+ match Io. read_file (Path. build lock_file) with
76
+ | exception _ -> Unknown
77
+ | pid -> Pid_from_lockfile pid
78
+ ;;
79
+
80
+ let message t =
81
+ Pp. textf
82
+ " A running dune%s instance has locked the build directory. If this is not the \
83
+ case, please delete %S."
84
+ (match t with
85
+ | Unknown -> " "
86
+ | Pid_from_lockfile pid -> sprintf " (pid: %s)" pid)
87
+ (Path.Build. to_string_maybe_quoted lock_file)
88
+ ;;
89
+ end
90
+
69
91
let lock ~timeout =
70
92
match Config. (get global_lock) with
71
93
| `Disabled -> Ok ()
@@ -90,22 +112,15 @@ let lock ~timeout =
90
112
| `Success ->
91
113
locked := true ;
92
114
Ok ()
93
- | `Failure -> Error () )
115
+ | `Failure ->
116
+ let lock_held_by = Lock_held_by. read_lock_file () in
117
+ Error lock_held_by)
94
118
;;
95
119
96
120
let lock_exn ~timeout =
97
121
match lock ~timeout with
98
122
| Ok () -> ()
99
- | Error () ->
100
- User_error. raise
101
- [ Pp. textf
102
- " A running dune%s instance has locked the build directory. If this is not the \
103
- case, please delete %s"
104
- (match Io. read_file (Path. build lock_file) with
105
- | exception _ -> " "
106
- | pid -> sprintf " (pid: %s)" pid)
107
- (Path.Build. to_string_maybe_quoted lock_file)
108
- ]
123
+ | Error lock_held_by -> User_error. raise [ Lock_held_by. message lock_held_by ]
109
124
;;
110
125
111
126
let unlock () =
Original file line number Diff line number Diff line change 2
2
3
3
Before starting rpc, writing to the build dir, this lock should be locked. *)
4
4
5
- (* * attempt to acquire a lock. once a lock is locked, subsequent locks always
5
+ module Lock_held_by : sig
6
+ type t
7
+
8
+ val message : t -> 'a Pp .t
9
+ end
10
+
11
+ (* * Attempt to acquire a lock. once a lock is locked, subsequent locks always
6
12
succeed. Returns [Ok ()] if the lock is acquired within [timeout] seconds,
7
13
and [Error ()] otherwise. *)
8
- val lock : timeout :float option -> (unit , unit ) result
14
+ val lock : timeout :float option -> (unit , Lock_held_by .t ) result
9
15
10
16
val lock_exn : timeout :float option -> unit
11
17
Original file line number Diff line number Diff line change @@ -24,12 +24,20 @@ Build the project once before starting the watch server so the watch server star
24
24
25
25
Demonstrate that we can run " dune build" while the watch server is running.
26
26
$ dune build
27
+ Warning: A running dune (pid: 124305 ) instance has locked the build
28
+ directory. If this is not the case, please delete " _build/.lock" .
29
+ The requested targets will still be built however functionality will be
30
+ reduced and some command line arguments will be ignored.
27
31
Success
28
32
29
33
Demonstrate that error messages are still printed by " dune build" when it's
30
34
acting as an RPC client while running concurrently with an RPC server.
31
35
$ echo ' let () = print_endlin "Hello, World!"' > foo. ml
32
36
$ dune build
37
+ Warning: A running dune (pid: 124305 ) instance has locked the build
38
+ directory. If this is not the case, please delete " _build/.lock" .
39
+ The requested targets will still be built however functionality will be
40
+ reduced and some command line arguments will be ignored.
33
41
File " $ TESTCASE_ROOT /foo.ml" , line 1 , characters 9 -21:
34
42
1 | let () = print_endlin " Hello, World!"
35
43
^^^^^^^^^^^^
You can’t perform that action at this time.
0 commit comments