github.com/liamawhite/cli-with-i18n@v6.32.1-0.20171122084555-dede0a5c3448+incompatible/actor/pluginaction/list.go (about) 1 package pluginaction 2 3 import ( 4 "fmt" 5 6 "github.com/blang/semver" 7 ) 8 9 type OutdatedPlugin struct { 10 Name string 11 CurrentVersion string 12 LatestVersion string 13 } 14 15 // GettingPluginRepositoryError is returned when there's an error 16 // accessing the plugin repository 17 type GettingPluginRepositoryError struct { 18 Name string 19 Message string 20 } 21 22 func (e GettingPluginRepositoryError) Error() string { 23 return fmt.Sprintf("Could not get plugin repository '%s'\n%s", e.Name, e.Message) 24 } 25 26 func (actor Actor) GetOutdatedPlugins() ([]OutdatedPlugin, error) { 27 var outdatedPlugins []OutdatedPlugin 28 29 repoPlugins := map[string]string{} 30 for _, repo := range actor.config.PluginRepositories() { 31 repository, err := actor.client.GetPluginRepository(repo.URL) 32 if err != nil { 33 return nil, GettingPluginRepositoryError{Name: repo.Name, Message: err.Error()} 34 } 35 36 for _, plugin := range repository.Plugins { 37 existingVersion, exist := repoPlugins[plugin.Name] 38 if exist { 39 if lessThan(existingVersion, plugin.Version) { 40 repoPlugins[plugin.Name] = plugin.Version 41 } 42 } else { 43 repoPlugins[plugin.Name] = plugin.Version 44 } 45 } 46 } 47 48 for _, installedPlugin := range actor.config.Plugins() { 49 repoVersion, exist := repoPlugins[installedPlugin.Name] 50 if exist && lessThan(installedPlugin.Version.String(), repoVersion) { 51 outdatedPlugins = append(outdatedPlugins, OutdatedPlugin{ 52 Name: installedPlugin.Name, 53 CurrentVersion: installedPlugin.Version.String(), 54 LatestVersion: repoVersion, 55 }) 56 } 57 } 58 59 return outdatedPlugins, nil 60 } 61 62 func lessThan(version1 string, version2 string) bool { 63 v1, err := semver.Make(version1) 64 if err != nil { 65 return false 66 } 67 68 v2, err := semver.Make(version2) 69 if err != nil { 70 return false 71 } 72 73 return v1.LT(v2) 74 }