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:
|
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@1.7.18
|
||||||
|
llgo cppkg install davegamble/cjson@latest
|
||||||
|
llgo cppkg install davegamble/cjson
|
||||||
`
|
`
|
||||||
|
|
||||||
run args => {
|
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:
|
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@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
|
//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
|
//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
|
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)
|
cppkg1.Install(args[0], cppkg1.DefaultFlags)
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -75,7 +75,10 @@ type githubRelease struct {
|
|||||||
|
|
||||||
func getRelease(pkg *Package, tagPattern string) (ret *githubRelease, err error) {
|
func getRelease(pkg *Package, tagPattern string) (ret *githubRelease, err error) {
|
||||||
if tagPattern == "" {
|
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)
|
ver := strings.Replace(tagPattern, "*", pkg.Version, 1)
|
||||||
gr, err := github.GetRelease(pkg.Path, ver)
|
gr, err := github.GetRelease(pkg.Path, ver)
|
||||||
|
|||||||
@@ -29,9 +29,6 @@ const (
|
|||||||
// pkgAndVer: 7bitcoder/7bitconf@1.2.0
|
// pkgAndVer: 7bitcoder/7bitconf@1.2.0
|
||||||
func Install(pkgAndVer string, flags int) {
|
func Install(pkgAndVer string, flags int) {
|
||||||
pkgPath, ver := parsePkgVer(pkgAndVer)
|
pkgPath, ver := parsePkgVer(pkgAndVer)
|
||||||
if ver == "" {
|
|
||||||
panic("TODO: get latest version")
|
|
||||||
}
|
|
||||||
|
|
||||||
m, err := New("")
|
m, err := New("")
|
||||||
check(err)
|
check(err)
|
||||||
|
|||||||
@@ -19,8 +19,10 @@ package cppkg
|
|||||||
import (
|
import (
|
||||||
"errors"
|
"errors"
|
||||||
"os"
|
"os"
|
||||||
|
"strings"
|
||||||
|
|
||||||
"github.com/goccy/go-yaml"
|
"github.com/goccy/go-yaml"
|
||||||
|
"github.com/goplus/llgo/internal/github"
|
||||||
"golang.org/x/mod/semver"
|
"golang.org/x/mod/semver"
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -73,11 +75,16 @@ type Package struct {
|
|||||||
Version string
|
Version string
|
||||||
Folder string
|
Folder string
|
||||||
Template *Template
|
Template *Template
|
||||||
|
|
||||||
|
gr *github.Release // optional
|
||||||
}
|
}
|
||||||
|
|
||||||
var (
|
var (
|
||||||
// ErrVersionNotFound is returned when the specified version is not found.
|
// ErrVersionNotFound is returned when the specified version is not found.
|
||||||
ErrVersionNotFound = errors.New("version not found")
|
ErrVersionNotFound = errors.New("version not found")
|
||||||
|
|
||||||
|
// ErrDynamicTag is returned when the tag is dynamic.
|
||||||
|
ErrDynamicTag = errors.New("dynamic tag")
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
@@ -109,15 +116,32 @@ func (p *Manager) Lookup(pkgPath, ver string, flags int) (_ *Package, err error)
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return
|
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 {
|
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 {
|
if compareVer(ver, conf.Template.FromVer) < 0 {
|
||||||
err = ErrVersionNotFound
|
err = ErrVersionNotFound
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
folder := conf.Template.Folder
|
templ := conf.Template
|
||||||
return &Package{conf.PkgName, pkgPath, ver, folder, &conf.Template}, nil
|
return &Package{conf.PkgName, pkgPath, ver, templ.Folder, &templ, nil}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (p *Manager) indexRoot() string {
|
func (p *Manager) indexRoot() string {
|
||||||
@@ -158,3 +182,15 @@ func indexInit(root string, flags int) (err error) {
|
|||||||
func compareVer(v1, v2 string) int {
|
func compareVer(v1, v2 string) int {
|
||||||
return semver.Compare("v"+v1, "v"+v2)
|
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