Merge pull request #1090 from xushiwei/cppkg

xtool/cppkg: support latest version
This commit is contained in:
xushiwei
2025-05-04 17:40:07 +08:00
committed by GitHub
5 changed files with 53 additions and 13 deletions

View File

@@ -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 => {

View File

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

View File

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

View File

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

View File

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