From 8455ee82268a4c91b536f11495b215d6dbadc089 Mon Sep 17 00:00:00 2001 From: xushiwei Date: Sun, 4 May 2025 17:34:02 +0800 Subject: [PATCH] xtool/cppkg: support latest version --- cmd/llgo/cppkg_install_cmd.gox | 2 ++ cmd/llgo/gop_autogen.go | 14 +++++++----- xtool/cppkg/conan.go | 5 +++- xtool/cppkg/cppkg.go | 3 --- xtool/cppkg/manager.go | 42 +++++++++++++++++++++++++++++++--- 5 files changed, 53 insertions(+), 13 deletions(-) diff --git a/cmd/llgo/cppkg_install_cmd.gox b/cmd/llgo/cppkg_install_cmd.gox index 5b7fa599..ba105cdf 100644 --- a/cmd/llgo/cppkg_install_cmd.gox +++ b/cmd/llgo/cppkg_install_cmd.gox @@ -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 => { diff --git a/cmd/llgo/gop_autogen.go b/cmd/llgo/gop_autogen.go index fdf603d0..53c3d149 100644 --- a/cmd/llgo/gop_autogen.go +++ b/cmd/llgo/gop_autogen.go @@ -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) }) } diff --git a/xtool/cppkg/conan.go b/xtool/cppkg/conan.go index 7492354e..1d022720 100644 --- a/xtool/cppkg/conan.go +++ b/xtool/cppkg/conan.go @@ -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) diff --git a/xtool/cppkg/cppkg.go b/xtool/cppkg/cppkg.go index 734c13bf..f3687276 100644 --- a/xtool/cppkg/cppkg.go +++ b/xtool/cppkg/cppkg.go @@ -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) diff --git a/xtool/cppkg/manager.go b/xtool/cppkg/manager.go index 4ff5aae8..5abc3ab3 100644 --- a/xtool/cppkg/manager.go +++ b/xtool/cppkg/manager.go @@ -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) +}