49 lines
1.5 KiB
Go
49 lines
1.5 KiB
Go
package discovery
|
|
|
|
// PluginCache is an interface implemented by objects that are able to maintain
|
|
// a cache of plugins.
|
|
type PluginCache interface {
|
|
// CachedPluginPath returns a path where the requested plugin is already
|
|
// cached, or an empty string if the requested plugin is not yet cached.
|
|
CachedPluginPath(kind string, name string, version Version) string
|
|
|
|
// InstallDir returns the directory that new plugins should be installed into
|
|
// in order to populate the cache. This directory should be used as the
|
|
// first argument to getter.Get when downloading plugins with go-getter.
|
|
//
|
|
// After installing into this directory, use CachedPluginPath to obtain the
|
|
// path where the plugin was installed.
|
|
InstallDir() string
|
|
}
|
|
|
|
// NewLocalPluginCache returns a PluginCache that caches plugins in a
|
|
// given local directory.
|
|
func NewLocalPluginCache(dir string) PluginCache {
|
|
return &pluginCache{
|
|
Dir: dir,
|
|
}
|
|
}
|
|
|
|
type pluginCache struct {
|
|
Dir string
|
|
}
|
|
|
|
func (c *pluginCache) CachedPluginPath(kind string, name string, version Version) string {
|
|
allPlugins := FindPlugins(kind, []string{c.Dir})
|
|
plugins := allPlugins.WithName(name).WithVersion(version)
|
|
|
|
if plugins.Count() == 0 {
|
|
// nothing cached
|
|
return ""
|
|
}
|
|
|
|
// There should generally be only one plugin here; if there's more than
|
|
// one match for some reason then we'll just choose one arbitrarily.
|
|
plugin := plugins.Newest()
|
|
return plugin.Path
|
|
}
|
|
|
|
func (c *pluginCache) InstallDir() string {
|
|
return c.Dir
|
|
}
|