@@ -57,17 +57,19 @@ var (
5757//
5858// It requires an Index Resource to search for tools
5959type Tools struct {
60- index * index.Resource
61- folder string
60+ index * index.Resource
61+ folder string
62+ behaviour string
6263}
6364
6465// New will return a Tool object, allowing the caller to execute operations on it.
6566// The New function will accept an index as parameter (used to download the indexes)
6667// 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 {
6869 return & Tools {
69- index : index ,
70- folder : folder ,
70+ index : index ,
71+ folder : folder ,
72+ behaviour : behaviour ,
7173 }
7274}
7375
@@ -175,6 +177,23 @@ func (t *Tools) Install(ctx context.Context, payload *tools.ToolPayload) (*tools
175177
176178 correctTool , correctSystem , found := FindTool (payload .Packager , payload .Name , payload .Version , index )
177179 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+ }
178197 if found {
179198 return t .install (ctx , path , correctSystem .URL , correctSystem .Checksum )
180199 }
@@ -262,21 +281,42 @@ func rename(base string) extract.Renamer {
262281 }
263282}
264283
265- func writeInstalled ( folder , path string ) error {
284+ func readInstalled ( installedFile string ) ( map [ string ] string , error ) {
266285 // read installed.json
267286 installed := map [string ]string {}
268-
269- installedFile , err := utilities .SafeJoin (folder , "installed.json" )
270- if err != nil {
271- return err
272- }
273287 data , err := os .ReadFile (installedFile )
274288 if err == nil {
275289 err = json .Unmarshal (data , & installed )
276290 if err != nil {
277- return err
291+ return nil , err
278292 }
279293 }
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+ }
280320
281321 parts := strings .Split (path , string (filepath .Separator ))
282322 tool := parts [len (parts )- 2 ]
@@ -288,14 +328,25 @@ func writeInstalled(folder, path string) error {
288328 installed [tool ] = toolFile
289329 installed [toolWithVersion ] = toolFile
290330
291- data , err = json .Marshal (installed )
331+ data , err : = json .Marshal (installed )
292332 if err != nil {
293333 return err
294334 }
295335
296336 return os .WriteFile (installedFile , data , 0644 )
297337}
298338
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+
299350// FindTool searches the index for the correct tool and system that match the specified tool name and version
300351func FindTool (pack , name , version string , data Index ) (Tool , System , bool ) {
301352 var correctTool Tool
0 commit comments