More plugin manager work

This commit is contained in:
Zachary Yedidia 2019-01-26 01:09:50 -05:00
parent f4a3465a08
commit c7f2c9c704
2 changed files with 68 additions and 14 deletions

View file

@ -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
}

View file

@ -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)