@@ -216,6 +216,17 @@ func Init(req *rpc.InitRequest) (<-chan *rpc.InitResponse, *status.Status) {
216
216
}
217
217
}
218
218
219
+ // We load hardware before verifying builtin tools are installed
220
+ // otherwise we wouldn't find them and reinstall them each time
221
+ // and they would never get reloaded.
222
+ for _ , err := range instance .PackageManager .LoadHardware () {
223
+ outChan <- & rpc.InitResponse {
224
+ Message : & rpc.InitResponse_Error {
225
+ Error : err .Proto (),
226
+ },
227
+ }
228
+ }
229
+
219
230
taskCallback := func (msg * rpc.TaskProgress ) {
220
231
outChan <- & rpc.InitResponse {
221
232
Message : & rpc.InitResponse_InitProgress {
@@ -237,9 +248,19 @@ func Init(req *rpc.InitRequest) (<-chan *rpc.InitResponse, *status.Status) {
237
248
}
238
249
239
250
// Install tools if necessary
240
- ctagsTool , _ := getBuiltinCtagsTool (instance .PackageManager )
241
- if ctagsTool == nil {
242
- if _ , err := instance .installToolIfMissing (ctagsTool , downloadCallback , taskCallback ); err != nil {
251
+ toolHasBeenInstalled := false
252
+ ctagsTool , err := getBuiltinCtagsTool (instance .PackageManager )
253
+ if err != nil {
254
+ s := status .Newf (codes .Internal , err .Error ())
255
+ outChan <- & rpc.InitResponse {
256
+ Message : & rpc.InitResponse_Error {
257
+ Error : s .Proto (),
258
+ },
259
+ }
260
+ } else {
261
+ ctagsInstalled , err := instance .installToolIfMissing (ctagsTool , downloadCallback , taskCallback )
262
+ toolHasBeenInstalled = toolHasBeenInstalled || ctagsInstalled
263
+ if err != nil {
243
264
s := status .Newf (codes .Internal , err .Error ())
244
265
outChan <- & rpc.InitResponse {
245
266
Message : & rpc.InitResponse_Error {
@@ -250,8 +271,17 @@ func Init(req *rpc.InitRequest) (<-chan *rpc.InitResponse, *status.Status) {
250
271
}
251
272
252
273
serialDiscoveryTool , _ := getBuiltinSerialDiscoveryTool (instance .PackageManager )
253
- if serialDiscoveryTool == nil {
254
- if _ , err := instance .installToolIfMissing (serialDiscoveryTool , downloadCallback , taskCallback ); err != nil {
274
+ if err != nil {
275
+ s := status .Newf (codes .Internal , err .Error ())
276
+ outChan <- & rpc.InitResponse {
277
+ Message : & rpc.InitResponse_Error {
278
+ Error : s .Proto (),
279
+ },
280
+ }
281
+ } else {
282
+ serialDiscoveryToolInstalled , err := instance .installToolIfMissing (serialDiscoveryTool , downloadCallback , taskCallback )
283
+ toolHasBeenInstalled = toolHasBeenInstalled || serialDiscoveryToolInstalled
284
+ if err != nil {
255
285
s := status .Newf (codes .Internal , err .Error ())
256
286
outChan <- & rpc.InitResponse {
257
287
Message : & rpc.InitResponse_Error {
@@ -261,12 +291,15 @@ func Init(req *rpc.InitRequest) (<-chan *rpc.InitResponse, *status.Status) {
261
291
}
262
292
}
263
293
264
- // Load hardware only after tools have been installed
265
- for _ , err := range instance .PackageManager .LoadHardware () {
266
- outChan <- & rpc.InitResponse {
267
- Message : & rpc.InitResponse_Error {
268
- Error : err .Proto (),
269
- },
294
+ if toolHasBeenInstalled {
295
+ // We installed at least one new tool after loading hardware
296
+ // so we must reload again otherwise we would never found them.
297
+ for _ , err := range instance .PackageManager .LoadHardware () {
298
+ outChan <- & rpc.InitResponse {
299
+ Message : & rpc.InitResponse_Error {
300
+ Error : err .Proto (),
301
+ },
302
+ }
270
303
}
271
304
}
272
305
0 commit comments