mirror of
https://github.com/zyedidia/micro.git
synced 2026-03-09 14:20:16 +09:00
86 lines
1.6 KiB
Go
86 lines
1.6 KiB
Go
package manager
|
|
|
|
import (
|
|
"fmt"
|
|
"io/ioutil"
|
|
"net/http"
|
|
"path"
|
|
|
|
"github.com/blang/semver"
|
|
"github.com/zyedidia/micro/internal/config"
|
|
"github.com/zyedidia/micro/internal/util"
|
|
git "gopkg.in/src-d/go-git.v4"
|
|
)
|
|
|
|
// NewPluginInfoFromUrl creates a new PluginInfo from a URL by fetching
|
|
// the data at that URL and parsing the JSON (running a GET request at
|
|
// the URL should return the JSON for a plugin info)
|
|
func NewPluginInfoFromUrl(url string) (*PluginInfo, error) {
|
|
resp, err := http.Get(url)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
defer resp.Body.Close()
|
|
dat, err := ioutil.ReadAll(resp.Body)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
return NewPluginInfo(dat)
|
|
}
|
|
|
|
// FetchRepo downloads this plugin's git repository
|
|
func (i *PluginInfo) FetchRepo() error {
|
|
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 (p *Plugin) ResolveVersion() error {
|
|
i := p.Info
|
|
vs := i.Versions
|
|
|
|
for _, v := range vs {
|
|
microrange, err := semver.ParseRange(v.Require["micro"])
|
|
if err != nil {
|
|
return err
|
|
}
|
|
if microrange(util.SemVersion) {
|
|
p.Version = v.Vers
|
|
fmt.Println("resolve version to ", v.Vstr)
|
|
return nil
|
|
}
|
|
}
|
|
|
|
return ErrRequireUnsat
|
|
}
|
|
|
|
func (p *Plugin) WriteVersion() error {
|
|
return ioutil.WriteFile(path.Join(p.Dir, versionfile), []byte(p.Version.String()), 0644)
|
|
}
|
|
|
|
func (p *Plugin) PostInstallHooks() error {
|
|
return nil
|
|
}
|