]>
Commit | Line | Data |
---|---|---|
15c0b25d AP |
1 | package discovery |
2 | ||
3 | // PluginCache is an interface implemented by objects that are able to maintain | |
4 | // a cache of plugins. | |
5 | type PluginCache interface { | |
6 | // CachedPluginPath returns a path where the requested plugin is already | |
7 | // cached, or an empty string if the requested plugin is not yet cached. | |
8 | CachedPluginPath(kind string, name string, version Version) string | |
9 | ||
10 | // InstallDir returns the directory that new plugins should be installed into | |
11 | // in order to populate the cache. This directory should be used as the | |
12 | // first argument to getter.Get when downloading plugins with go-getter. | |
13 | // | |
14 | // After installing into this directory, use CachedPluginPath to obtain the | |
15 | // path where the plugin was installed. | |
16 | InstallDir() string | |
17 | } | |
18 | ||
19 | // NewLocalPluginCache returns a PluginCache that caches plugins in a | |
20 | // given local directory. | |
21 | func NewLocalPluginCache(dir string) PluginCache { | |
22 | return &pluginCache{ | |
23 | Dir: dir, | |
24 | } | |
25 | } | |
26 | ||
27 | type pluginCache struct { | |
28 | Dir string | |
29 | } | |
30 | ||
31 | func (c *pluginCache) CachedPluginPath(kind string, name string, version Version) string { | |
32 | allPlugins := FindPlugins(kind, []string{c.Dir}) | |
33 | plugins := allPlugins.WithName(name).WithVersion(version) | |
34 | ||
35 | if plugins.Count() == 0 { | |
36 | // nothing cached | |
37 | return "" | |
38 | } | |
39 | ||
40 | // There should generally be only one plugin here; if there's more than | |
41 | // one match for some reason then we'll just choose one arbitrarily. | |
42 | plugin := plugins.Newest() | |
43 | return plugin.Path | |
44 | } | |
45 | ||
46 | func (c *pluginCache) InstallDir() string { | |
47 | return c.Dir | |
48 | } |