Skip to content

Commit 8882c31

Browse files
authored
Merge pull request #1090 from xushiwei/cppkg
xtool/cppkg: support latest version
2 parents 3f74ade + 8455ee8 commit 8882c31

File tree

5 files changed

+52
-12
lines changed

5 files changed

+52
-12
lines changed

cmd/llgo/cppkg_install_cmd.gox

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,8 @@ short "Install a C/C++ package from github.com/goplus/cppkg"
2222
long `Installs a C/C++ package with the given name and version. For example:
2323

2424
llgo cppkg install davegamble/cjson@1.7.18
25+
llgo cppkg install davegamble/cjson@latest
26+
llgo cppkg install davegamble/cjson
2527
`
2628

2729
run args => {

cmd/llgo/gop_autogen.go

Lines changed: 7 additions & 5 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

xtool/cppkg/conan.go

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,10 @@ type githubRelease struct {
7575

7676
func getRelease(pkg *Package, tagPattern string) (ret *githubRelease, err error) {
7777
if tagPattern == "" {
78-
return nil, errors.New("dynamic tag")
78+
return nil, ErrDynamicTag
79+
}
80+
if pkg.gr != nil {
81+
return &githubRelease{PublishedAt: pkg.gr.PublishedAt}, nil
7982
}
8083
ver := strings.Replace(tagPattern, "*", pkg.Version, 1)
8184
gr, err := github.GetRelease(pkg.Path, ver)

xtool/cppkg/cppkg.go

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -29,9 +29,6 @@ const (
2929
// pkgAndVer: 7bitcoder/7bitconf@1.2.0
3030
func Install(pkgAndVer string, flags int) {
3131
pkgPath, ver := parsePkgVer(pkgAndVer)
32-
if ver == "" {
33-
panic("TODO: get latest version")
34-
}
3532

3633
m, err := New("")
3734
check(err)

xtool/cppkg/manager.go

Lines changed: 39 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,10 @@ package cppkg
1919
import (
2020
"errors"
2121
"os"
22+
"strings"
2223

2324
"github.com/goccy/go-yaml"
25+
"github.com/goplus/llgo/internal/github"
2426
"golang.org/x/mod/semver"
2527
)
2628

@@ -73,11 +75,16 @@ type Package struct {
7375
Version string
7476
Folder string
7577
Template *Template
78+
79+
gr *github.Release // optional
7680
}
7781

7882
var (
7983
// ErrVersionNotFound is returned when the specified version is not found.
8084
ErrVersionNotFound = errors.New("version not found")
85+
86+
// ErrDynamicTag is returned when the tag is dynamic.
87+
ErrDynamicTag = errors.New("dynamic tag")
8188
)
8289

8390
const (
@@ -109,15 +116,32 @@ func (p *Manager) Lookup(pkgPath, ver string, flags int) (_ *Package, err error)
109116
if err != nil {
110117
return
111118
}
119+
120+
if ver == "" || ver == "latest" {
121+
if conf.Template.Tag == "" {
122+
return nil, ErrDynamicTag
123+
}
124+
gr, e := github.GetRelease(pkgPath, "")
125+
if e != nil {
126+
return nil, e
127+
}
128+
ver, err = verByTag(gr.TagName, conf.Template.Tag)
129+
if err != nil {
130+
return
131+
}
132+
templ := conf.Template
133+
return &Package{conf.PkgName, pkgPath, ver, templ.Folder, &templ, gr}, nil
134+
}
135+
112136
if v, ok := conf.Versions[ver]; ok {
113-
return &Package{conf.PkgName, pkgPath, ver, v.Folder, nil}, nil
137+
return &Package{conf.PkgName, pkgPath, ver, v.Folder, nil, nil}, nil
114138
}
115139
if compareVer(ver, conf.Template.FromVer) < 0 {
116140
err = ErrVersionNotFound
117141
return
118142
}
119-
folder := conf.Template.Folder
120-
return &Package{conf.PkgName, pkgPath, ver, folder, &conf.Template}, nil
143+
templ := conf.Template
144+
return &Package{conf.PkgName, pkgPath, ver, templ.Folder, &templ, nil}, nil
121145
}
122146

123147
func (p *Manager) indexRoot() string {
@@ -158,3 +182,15 @@ func indexInit(root string, flags int) (err error) {
158182
func compareVer(v1, v2 string) int {
159183
return semver.Compare("v"+v1, "v"+v2)
160184
}
185+
186+
func verByTag(tag, tagPattern string) (ver string, err error) {
187+
if pos := strings.IndexByte(tagPattern, '*'); pos >= 0 {
188+
prefix := tagPattern[:pos]
189+
suffix := tagPattern[pos+1:]
190+
if strings.HasPrefix(tag, prefix) && strings.HasSuffix(tag, suffix) {
191+
ver = tag[pos : len(tag)-len(suffix)]
192+
return
193+
}
194+
}
195+
return "", errors.New("tag not match: " + tag + " with " + tagPattern)
196+
}

0 commit comments

Comments
 (0)