@@ -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 )
@@ -288,44 +289,24 @@ func rename(base string) extract.Renamer {
288
289
}
289
290
}
290
291
291
- func readInstalled (installedFile string ) (map [string ]string , error ) {
292
+ func (t * Tools ) readInstalled () error {
293
+ t .mutex .Lock ()
294
+ defer t .mutex .Unlock ()
292
295
// read installed.json
293
- installed := map [string ]string {}
294
- data , err := os .ReadFile (installedFile )
295
- if err == nil {
296
- err = json .Unmarshal (data , & installed )
297
- if err != nil {
298
- return nil , err
299
- }
300
- }
301
- return installed , nil
302
- }
303
-
304
- func checkInstalled (folder , key string ) (string , bool , error ) {
305
- installedFile , err := utilities .SafeJoin (folder , "installed.json" )
296
+ installedFile , err := utilities .SafeJoin (t .folder , "installed.json" )
306
297
if err != nil {
307
- return "" , false , err
298
+ return err
308
299
}
309
- installed , err := readInstalled (installedFile )
300
+ data , err := os . ReadFile (installedFile )
310
301
if err != nil {
311
- return "" , false , err
302
+ return err
312
303
}
313
- location , ok := installed [key ]
314
- return location , ok , err
304
+ return json .Unmarshal (data , & t .installed )
315
305
}
316
306
317
307
func (t * Tools ) writeInstalled (path string ) error {
318
308
t .mutex .RLock ()
319
309
defer t .mutex .RUnlock ()
320
- // read installed.json
321
- installedFile , err := utilities .SafeJoin (t .folder , "installed.json" )
322
- if err != nil {
323
- return err
324
- }
325
- installed , err := readInstalled (installedFile )
326
- if err != nil {
327
- return err
328
- }
329
310
330
311
parts := strings .Split (path , string (filepath .Separator ))
331
312
tool := parts [len (parts )- 2 ]
@@ -334,10 +315,15 @@ func (t *Tools) writeInstalled(path string) error {
334
315
if err != nil {
335
316
return err
336
317
}
337
- installed [tool ] = toolFile
338
- installed [toolWithVersion ] = toolFile
318
+ t . installed [tool ] = toolFile
319
+ t . installed [toolWithVersion ] = toolFile
339
320
340
- data , err := json .Marshal (installed )
321
+ data , err := json .Marshal (t .installed )
322
+ if err != nil {
323
+ return err
324
+ }
325
+
326
+ installedFile , err := utilities .SafeJoin (t .folder , "installed.json" )
341
327
if err != nil {
342
328
return err
343
329
}
0 commit comments