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  }