@@ -61,19 +61,23 @@ type Tools struct {
61
61
index * index.Resource
62
62
folder string
63
63
behaviour string
64
+ installed map [string ]string
64
65
mutex sync.RWMutex
65
66
}
66
67
67
68
// New will return a Tool object, allowing the caller to execute operations on it.
68
69
// The New function will accept an index as parameter (used to download the indexes)
69
70
// and a folder used to download the indexes
70
71
func New (index * index.Resource , folder , behaviour string ) * Tools {
71
- return & Tools {
72
+ t := & Tools {
72
73
index : index ,
73
74
folder : folder ,
74
75
behaviour : behaviour ,
76
+ installed : map [string ]string {},
75
77
mutex : sync.RWMutex {},
76
78
}
79
+ t .readInstalled ()
80
+ return t
77
81
}
78
82
79
83
// Installedhead is here only because it was required by the front-end.
@@ -184,10 +188,7 @@ func (t *Tools) Install(ctx context.Context, payload *tools.ToolPayload) (*tools
184
188
key := correctTool .Name + "-" + correctTool .Version
185
189
// Check if it already exists
186
190
if t .behaviour == "keep" && pathExists (t .folder ) {
187
- location , ok , err := checkInstalled (t .folder , key )
188
- if err != nil {
189
- return nil , err
190
- }
191
+ location , ok := t .installed [key ]
191
192
if ok && pathExists (location ) {
192
193
// overwrite the default tool with this one
193
194
err := t .writeInstalled (path )
@@ -284,44 +285,24 @@ func rename(base string) extract.Renamer {
284
285
}
285
286
}
286
287
287
- func readInstalled (installedFile string ) (map [string ]string , error ) {
288
+ func (t * Tools ) readInstalled () error {
289
+ t .mutex .Lock ()
290
+ defer t .mutex .Unlock ()
288
291
// read installed.json
289
- installed := map [string ]string {}
290
- data , err := os .ReadFile (installedFile )
291
- if err == nil {
292
- err = json .Unmarshal (data , & installed )
293
- if err != nil {
294
- return nil , err
295
- }
296
- }
297
- return installed , nil
298
- }
299
-
300
- func checkInstalled (folder , key string ) (string , bool , error ) {
301
- installedFile , err := utilities .SafeJoin (folder , "installed.json" )
292
+ installedFile , err := utilities .SafeJoin (t .folder , "installed.json" )
302
293
if err != nil {
303
- return "" , false , err
294
+ return err
304
295
}
305
- installed , err := readInstalled (installedFile )
296
+ data , err := os . ReadFile (installedFile )
306
297
if err != nil {
307
- return "" , false , err
298
+ return err
308
299
}
309
- location , ok := installed [key ]
310
- return location , ok , err
300
+ return json .Unmarshal (data , & t .installed )
311
301
}
312
302
313
303
func (t * Tools ) writeInstalled (path string ) error {
314
304
t .mutex .RLock ()
315
305
defer t .mutex .RUnlock ()
316
- // read installed.json
317
- installedFile , err := utilities .SafeJoin (t .folder , "installed.json" )
318
- if err != nil {
319
- return err
320
- }
321
- installed , err := readInstalled (installedFile )
322
- if err != nil {
323
- return err
324
- }
325
306
326
307
parts := strings .Split (path , string (filepath .Separator ))
327
308
tool := parts [len (parts )- 2 ]
@@ -330,10 +311,15 @@ func (t *Tools) writeInstalled(path string) error {
330
311
if err != nil {
331
312
return err
332
313
}
333
- installed [tool ] = toolFile
334
- installed [toolWithVersion ] = toolFile
314
+ t . installed [tool ] = toolFile
315
+ t . installed [toolWithVersion ] = toolFile
335
316
336
- data , err := json .Marshal (installed )
317
+ data , err := json .Marshal (t .installed )
318
+ if err != nil {
319
+ return err
320
+ }
321
+
322
+ installedFile , err := utilities .SafeJoin (t .folder , "installed.json" )
337
323
if err != nil {
338
324
return err
339
325
}
0 commit comments