github.com/wanddynosios/cli/v8@v8.7.9-0.20240221182337-1a92e3a7017f/actor/pluginaction/uninstall.go (about) 1 package pluginaction 2 3 import ( 4 "os" 5 "os/exec" 6 "time" 7 8 "code.cloudfoundry.org/cli/actor/actionerror" 9 ) 10 11 //go:generate go run github.com/maxbrunsfeld/counterfeiter/v6 . PluginUninstaller 12 13 type PluginUninstaller interface { 14 Run(pluginPath string, command string) error 15 } 16 17 func (actor Actor) UninstallPlugin(uninstaller PluginUninstaller, name string) error { 18 plugin, exist := actor.config.GetPlugin(name) 19 if !exist { 20 return actionerror.PluginNotFoundError{PluginName: name} 21 } 22 23 var binaryErr error 24 25 if actor.FileExists(plugin.Location) { 26 err := uninstaller.Run(plugin.Location, "CLI-MESSAGE-UNINSTALL") 27 if err != nil { 28 switch err.(type) { 29 case *exec.ExitError: 30 binaryErr = actionerror.PluginExecuteError{ 31 Err: err, 32 } 33 case *os.PathError: 34 binaryErr = actionerror.PluginExecuteError{ 35 Err: err, 36 } 37 default: 38 return err 39 } 40 } 41 42 // No test for sleeping for 500 ms for parity with pre-refactored behavior. 43 time.Sleep(500 * time.Millisecond) 44 45 removed := false 46 for i := 0; i < 50; i++ { 47 err = os.Remove(plugin.Location) 48 if err == nil { 49 removed = true 50 break 51 } 52 53 if os.IsNotExist(err) { 54 removed = true 55 break 56 } 57 58 if err != nil && !os.IsNotExist(err) { 59 if _, isPathError := err.(*os.PathError); isPathError { 60 time.Sleep(50 * time.Millisecond) 61 } else { 62 return err 63 } 64 } 65 } 66 67 if !removed { 68 binaryErr = actionerror.PluginBinaryRemoveFailedError{ 69 Err: err, 70 } 71 } 72 } 73 74 actor.config.RemovePlugin(name) 75 err := actor.config.WritePluginConfig() 76 if err != nil { 77 return err 78 } 79 80 return binaryErr 81 }