From c7f2c9c704711b0d2da16cc42fa1a51f7dd09454 Mon Sep 17 00:00:00 2001 From: Zachary Yedidia Date: Sat, 26 Jan 2019 01:09:50 -0500 Subject: [PATCH] More plugin manager work --- cmd/micro/manager/fetch.go | 37 ++++++++++++++++-- cmd/micro/manager/{parser.go => plugin.go} | 45 ++++++++++++++++------ 2 files changed, 68 insertions(+), 14 deletions(-) rename cmd/micro/manager/{parser.go => plugin.go} (79%) diff --git a/cmd/micro/manager/fetch.go b/cmd/micro/manager/fetch.go index 97245676..4e68b5a1 100644 --- a/cmd/micro/manager/fetch.go +++ b/cmd/micro/manager/fetch.go @@ -3,6 +3,7 @@ package manager import ( "io/ioutil" "net/http" + "os" "path" "github.com/zyedidia/micro/cmd/micro/config" @@ -29,18 +30,48 @@ func NewPluginInfoFromUrl(url string) (*PluginInfo, error) { // FetchRepo downloads this plugin's git repository func (i *PluginInfo) FetchRepo() error { - _, err := git.PlainClone(path.Join(config.ConfigDir, "plugin", i.Name), false, &git.CloneOptions{ + dir := path.Join(config.ConfigDir, "plugin", i.Name) + r, err := git.PlainClone(dir, false, &git.CloneOptions{ URL: i.Repo, Progress: nil, }) + if err != nil { + return err + } + + p := &Plugin{ + info: i, + dir: dir, + repo: r, + } + + err = p.ResolveVersion() + if err != nil { + return err + } + err = p.WriteVersion() + return err } -func (i *PluginInfo) FetchDeps() error { +func (p *Plugin) ResolveVersion() error { return nil } -func (i *PluginInfo) PostInstallHooks() error { +func (p *Plugin) WriteVersion() error { + return ioutil.WriteFile(path.Join(p.dir, versionfile), []byte(p.version.String()), os.ModePerm) +} + +func (p *Plugin) FetchDeps() error { + _, err := ListInstalledPlugins() + if err != nil { + return err + } + + return nil +} + +func (p *Plugin) PostInstallHooks() error { return nil } diff --git a/cmd/micro/manager/parser.go b/cmd/micro/manager/plugin.go similarity index 79% rename from cmd/micro/manager/parser.go rename to cmd/micro/manager/plugin.go index d4eb63b0..4b54f268 100644 --- a/cmd/micro/manager/parser.go +++ b/cmd/micro/manager/plugin.go @@ -22,12 +22,25 @@ var ( ErrMissingRequire = errors.New("Missing or empty require field") ) +const ( + infojson = "plugin.json" + versionfile = "version.lock" +) + type Plugin struct { - info *PluginInfo - dir string - repo *git.Repository - // Index into info.Versions showing the current version of this plugin - Version int + info *PluginInfo + dir string + repo *git.Repository + version semver.Version // currently installed version +} + +func (p *Plugin) GetRequires() *PluginVersion { + for _, v := range p.info.Versions { + if p.version.Equals(v.Vers) { + return &v + } + } + return nil } // PluginVersion describes a version for a plugin as well as any dependencies that @@ -98,7 +111,7 @@ func (i *PluginInfo) makeVersions() error { return nil } -// InstalledPlugins searches the config directory for all installed plugins +// ListInstalledPlugins searches the config directory for all installed plugins // and returns the list of plugin infos corresponding to them func ListInstalledPlugins() ([]*Plugin, error) { pdir := path.Join(config.ConfigDir, "plugin") @@ -118,8 +131,8 @@ func ListInstalledPlugins() ([]*Plugin, error) { } for _, f := range files { - if f.Name() == "repo.json" { - dat, err := ioutil.ReadFile(path.Join(pdir, dir.Name(), "repo.json")) + if f.Name() == infojson { + dat, err := ioutil.ReadFile(path.Join(pdir, dir.Name(), infojson)) if err != nil { return nil, err } @@ -128,6 +141,15 @@ func ListInstalledPlugins() ([]*Plugin, error) { return nil, err } + versiondat, err := ioutil.ReadFile(path.Join(pdir, dir.Name(), versionfile)) + if err != nil { + return nil, err + } + sv, err := semver.Make(string(versiondat)) + if err != nil { + return nil, err + } + dirname := path.Join(pdir, dir.Name()) r, err := git.PlainOpen(dirname) if err != nil { @@ -135,9 +157,10 @@ func ListInstalledPlugins() ([]*Plugin, error) { } p := &Plugin{ - info: info, - dir: dirname, - repo: r, + info: info, + dir: dirname, + repo: r, + version: sv, } plugins = append(plugins, p)