More plugin manager work
This commit is contained in:
parent
f4a3465a08
commit
c7f2c9c704
2 changed files with 68 additions and 14 deletions
|
@ -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
|
||||
}
|
||||
|
|
|
@ -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)
|
Loading…
Reference in a new issue