Merge pull request #1090 from xushiwei/cppkg
xtool/cppkg: support latest version
This commit is contained in:
@@ -22,6 +22,8 @@ short "Install a C/C++ package from github.com/goplus/cppkg"
|
||||
long `Installs a C/C++ package with the given name and version. For example:
|
||||
|
||||
llgo cppkg install davegamble/cjson@1.7.18
|
||||
llgo cppkg install davegamble/cjson@latest
|
||||
llgo cppkg install davegamble/cjson
|
||||
`
|
||||
|
||||
run args => {
|
||||
|
||||
@@ -146,17 +146,19 @@ func (this *cppkg_install) Main(_gop_arg0 string) {
|
||||
this.Long(`Installs a C/C++ package with the given name and version. For example:
|
||||
|
||||
llgo cppkg install davegamble/cjson@1.7.18
|
||||
llgo cppkg install davegamble/cjson@latest
|
||||
llgo cppkg install davegamble/cjson
|
||||
`)
|
||||
//line cmd/llgo/cppkg_install_cmd.gox:27:1
|
||||
this.Run__1(func(args []string) {
|
||||
//line cmd/llgo/cppkg_install_cmd.gox:28:1
|
||||
if len(args) < 1 {
|
||||
//line cmd/llgo/cppkg_install_cmd.gox:29:1
|
||||
this.Help()
|
||||
this.Run__1(func(args []string) {
|
||||
//line cmd/llgo/cppkg_install_cmd.gox:30:1
|
||||
if len(args) < 1 {
|
||||
//line cmd/llgo/cppkg_install_cmd.gox:31:1
|
||||
this.Help()
|
||||
//line cmd/llgo/cppkg_install_cmd.gox:32:1
|
||||
return
|
||||
}
|
||||
//line cmd/llgo/cppkg_install_cmd.gox:33:1
|
||||
//line cmd/llgo/cppkg_install_cmd.gox:35:1
|
||||
cppkg1.Install(args[0], cppkg1.DefaultFlags)
|
||||
})
|
||||
}
|
||||
|
||||
@@ -75,7 +75,10 @@ type githubRelease struct {
|
||||
|
||||
func getRelease(pkg *Package, tagPattern string) (ret *githubRelease, err error) {
|
||||
if tagPattern == "" {
|
||||
return nil, errors.New("dynamic tag")
|
||||
return nil, ErrDynamicTag
|
||||
}
|
||||
if pkg.gr != nil {
|
||||
return &githubRelease{PublishedAt: pkg.gr.PublishedAt}, nil
|
||||
}
|
||||
ver := strings.Replace(tagPattern, "*", pkg.Version, 1)
|
||||
gr, err := github.GetRelease(pkg.Path, ver)
|
||||
|
||||
@@ -29,9 +29,6 @@ const (
|
||||
// pkgAndVer: 7bitcoder/7bitconf@1.2.0
|
||||
func Install(pkgAndVer string, flags int) {
|
||||
pkgPath, ver := parsePkgVer(pkgAndVer)
|
||||
if ver == "" {
|
||||
panic("TODO: get latest version")
|
||||
}
|
||||
|
||||
m, err := New("")
|
||||
check(err)
|
||||
|
||||
@@ -19,8 +19,10 @@ package cppkg
|
||||
import (
|
||||
"errors"
|
||||
"os"
|
||||
"strings"
|
||||
|
||||
"github.com/goccy/go-yaml"
|
||||
"github.com/goplus/llgo/internal/github"
|
||||
"golang.org/x/mod/semver"
|
||||
)
|
||||
|
||||
@@ -73,11 +75,16 @@ type Package struct {
|
||||
Version string
|
||||
Folder string
|
||||
Template *Template
|
||||
|
||||
gr *github.Release // optional
|
||||
}
|
||||
|
||||
var (
|
||||
// ErrVersionNotFound is returned when the specified version is not found.
|
||||
ErrVersionNotFound = errors.New("version not found")
|
||||
|
||||
// ErrDynamicTag is returned when the tag is dynamic.
|
||||
ErrDynamicTag = errors.New("dynamic tag")
|
||||
)
|
||||
|
||||
const (
|
||||
@@ -109,15 +116,32 @@ func (p *Manager) Lookup(pkgPath, ver string, flags int) (_ *Package, err error)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
|
||||
if ver == "" || ver == "latest" {
|
||||
if conf.Template.Tag == "" {
|
||||
return nil, ErrDynamicTag
|
||||
}
|
||||
gr, e := github.GetRelease(pkgPath, "")
|
||||
if e != nil {
|
||||
return nil, e
|
||||
}
|
||||
ver, err = verByTag(gr.TagName, conf.Template.Tag)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
templ := conf.Template
|
||||
return &Package{conf.PkgName, pkgPath, ver, templ.Folder, &templ, gr}, nil
|
||||
}
|
||||
|
||||
if v, ok := conf.Versions[ver]; ok {
|
||||
return &Package{conf.PkgName, pkgPath, ver, v.Folder, nil}, nil
|
||||
return &Package{conf.PkgName, pkgPath, ver, v.Folder, nil, nil}, nil
|
||||
}
|
||||
if compareVer(ver, conf.Template.FromVer) < 0 {
|
||||
err = ErrVersionNotFound
|
||||
return
|
||||
}
|
||||
folder := conf.Template.Folder
|
||||
return &Package{conf.PkgName, pkgPath, ver, folder, &conf.Template}, nil
|
||||
templ := conf.Template
|
||||
return &Package{conf.PkgName, pkgPath, ver, templ.Folder, &templ, nil}, nil
|
||||
}
|
||||
|
||||
func (p *Manager) indexRoot() string {
|
||||
@@ -158,3 +182,15 @@ func indexInit(root string, flags int) (err error) {
|
||||
func compareVer(v1, v2 string) int {
|
||||
return semver.Compare("v"+v1, "v"+v2)
|
||||
}
|
||||
|
||||
func verByTag(tag, tagPattern string) (ver string, err error) {
|
||||
if pos := strings.IndexByte(tagPattern, '*'); pos >= 0 {
|
||||
prefix := tagPattern[:pos]
|
||||
suffix := tagPattern[pos+1:]
|
||||
if strings.HasPrefix(tag, prefix) && strings.HasSuffix(tag, suffix) {
|
||||
ver = tag[pos : len(tag)-len(suffix)]
|
||||
return
|
||||
}
|
||||
}
|
||||
return "", errors.New("tag not match: " + tag + " with " + tagPattern)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user