@@ -57,17 +57,19 @@ var (
57
57
//
58
58
// It requires an Index Resource to search for tools
59
59
type Tools struct {
60
- index * index.Resource
61
- folder string
60
+ index * index.Resource
61
+ folder string
62
+ behaviour string
62
63
}
63
64
64
65
// New will return a Tool object, allowing the caller to execute operations on it.
65
66
// The New function will accept an index as parameter (used to download the indexes)
66
67
// and a folder used to download the indexes
67
- func New (index * index.Resource , folder string ) * Tools {
68
+ func New (index * index.Resource , folder , behaviour string ) * Tools {
68
69
return & Tools {
69
- index : index ,
70
- folder : folder ,
70
+ index : index ,
71
+ folder : folder ,
72
+ behaviour : behaviour ,
71
73
}
72
74
}
73
75
@@ -175,6 +177,23 @@ func (t *Tools) Install(ctx context.Context, payload *tools.ToolPayload) (*tools
175
177
176
178
correctTool , correctSystem , found := FindTool (payload .Packager , payload .Name , payload .Version , index )
177
179
path = filepath .Join (payload .Packager , correctTool .Name , correctTool .Version )
180
+
181
+ key := correctTool .Name + "-" + correctTool .Version
182
+ // Check if it already exists
183
+ if t .behaviour == "keep" && pathExists (t .folder ) {
184
+ location , ok , err := checkInstalled (t .folder , key )
185
+ if err != nil {
186
+ return nil , err
187
+ }
188
+ if ok && pathExists (location ) {
189
+ // overwrite the default tool with this one
190
+ err := writeInstalled (t .folder , path )
191
+ if err != nil {
192
+ return nil , err
193
+ }
194
+ return & tools.Operation {Status : "ok" }, nil
195
+ }
196
+ }
178
197
if found {
179
198
return t .install (ctx , path , correctSystem .URL , correctSystem .Checksum )
180
199
}
@@ -262,21 +281,42 @@ func rename(base string) extract.Renamer {
262
281
}
263
282
}
264
283
265
- func writeInstalled ( folder , path string ) error {
284
+ func readInstalled ( installedFile string ) ( map [ string ] string , error ) {
266
285
// read installed.json
267
286
installed := map [string ]string {}
268
-
269
- installedFile , err := utilities .SafeJoin (folder , "installed.json" )
270
- if err != nil {
271
- return err
272
- }
273
287
data , err := os .ReadFile (installedFile )
274
288
if err == nil {
275
289
err = json .Unmarshal (data , & installed )
276
290
if err != nil {
277
- return err
291
+ return nil , err
278
292
}
279
293
}
294
+ return installed , nil
295
+ }
296
+
297
+ func checkInstalled (folder , key string ) (string , bool , error ) {
298
+ installedFile , err := utilities .SafeJoin (folder , "installed.json" )
299
+ if err != nil {
300
+ return "" , false , err
301
+ }
302
+ installed , err := readInstalled (installedFile )
303
+ if err != nil {
304
+ return "" , false , err
305
+ }
306
+ location , ok := installed [key ]
307
+ return location , ok , err
308
+ }
309
+
310
+ func writeInstalled (folder , path string ) error {
311
+ // read installed.json
312
+ installedFile , err := utilities .SafeJoin (folder , "installed.json" )
313
+ if err != nil {
314
+ return err
315
+ }
316
+ installed , err := readInstalled (installedFile )
317
+ if err != nil {
318
+ return err
319
+ }
280
320
281
321
parts := strings .Split (path , string (filepath .Separator ))
282
322
tool := parts [len (parts )- 2 ]
@@ -288,14 +328,25 @@ func writeInstalled(folder, path string) error {
288
328
installed [tool ] = toolFile
289
329
installed [toolWithVersion ] = toolFile
290
330
291
- data , err = json .Marshal (installed )
331
+ data , err : = json .Marshal (installed )
292
332
if err != nil {
293
333
return err
294
334
}
295
335
296
336
return os .WriteFile (installedFile , data , 0644 )
297
337
}
298
338
339
+ func pathExists (path string ) bool {
340
+ _ , err := os .Stat (path )
341
+ if err == nil {
342
+ return true
343
+ }
344
+ if os .IsNotExist (err ) {
345
+ return false
346
+ }
347
+ return true
348
+ }
349
+
299
350
// FindTool searches the index for the correct tool and system that match the specified tool name and version
300
351
func FindTool (pack , name , version string , data Index ) (Tool , System , bool ) {
301
352
var correctTool Tool
0 commit comments