Skip to content

Commit d6c390c

Browse files
committed
fix(release): resolve stable alias version
Resolve Neovim's stable alias by extracting its concrete version and matching that version against the release tag instead of comparing release names. Add regression coverage for aliases whose names differ from the concrete release. Fixes: #19
1 parent ccc1732 commit d6c390c

2 files changed

Lines changed: 75 additions & 7 deletions

File tree

internal/release/info.go

Lines changed: 19 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -124,10 +124,10 @@ func (rs *Releases) Process(data []byte, appOpts *config.AppOptions) error {
124124
}
125125

126126
releases := (*rs)[:0]
127-
var stable Info
127+
stableVersion := ""
128128
for _, info := range *rs {
129129
if info.TagName == "stable" {
130-
stable = info
130+
stableVersion = extractStableVersion(info)
131131
continue
132132
}
133133

@@ -148,10 +148,9 @@ func (rs *Releases) Process(data []byte, appOpts *config.AppOptions) error {
148148
releases = append(releases, info)
149149
}
150150

151-
for i, info := range releases {
152-
if info.Name == stable.Name {
153-
info.Stable = true
154-
releases[i] = info
151+
for i := range releases {
152+
if releases[i].CleanTagName() == stableVersion {
153+
releases[i].Stable = true
155154
}
156155
}
157156
*rs = releases
@@ -233,7 +232,20 @@ func (i *Info) VersionLess(v string) bool {
233232
return len(s1) < len(s2)
234233
}
235234

236-
var checksumRe = regexp.MustCompile(`([a-f0-9]{64})\s+([^\s]+)`)
235+
var (
236+
stableVersionRe = regexp.MustCompile(`(?i)\bv?(\d+\.\d+\.\d+)\b`)
237+
checksumRe = regexp.MustCompile(`([a-f0-9]{64})\s+([^\s]+)`)
238+
)
239+
240+
func extractStableVersion(info Info) string {
241+
for _, text := range []string{info.Body, info.Name} {
242+
match := stableVersionRe.FindStringSubmatch(text)
243+
if len(match) == 2 {
244+
return match[1]
245+
}
246+
}
247+
return ""
248+
}
237249

238250
func (i *Info) ChecksumsFromBody() map[string]string {
239251
result := make(map[string]string)

internal/release/info_test.go

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
package release
2+
3+
import (
4+
"testing"
5+
6+
"github.com/candango/nvimim/internal/config"
7+
"github.com/stretchr/testify/require"
8+
)
9+
10+
func TestProcessResolvesStableAliasByConcreteVersion(t *testing.T) {
11+
data := []byte(`[
12+
{
13+
"tag_name": "stable",
14+
"name": "Nvim stable",
15+
"body": "This release points to NVIM v0.12.4."
16+
},
17+
{
18+
"tag_name": "v0.12.4",
19+
"name": "Nvim v0.12.4"
20+
},
21+
{
22+
"tag_name": "v0.12.3",
23+
"name": "Nvim v0.12.3"
24+
}
25+
]`)
26+
27+
releases := Releases{}
28+
err := releases.Process(data, &config.AppOptions{MinRelease: "0.7.0"})
29+
require.NoError(t, err)
30+
31+
stable, err := releases.Get("stable")
32+
require.NoError(t, err)
33+
require.Equal(t, "0.12.4", stable.CleanTagName())
34+
}
35+
36+
func TestProcessResolvesStableAliasFromNameWhenBodyHasNoVersion(t *testing.T) {
37+
data := []byte(`[
38+
{
39+
"tag_name": "stable",
40+
"name": "Nvim v0.12.4",
41+
"body": "Stable release"
42+
},
43+
{
44+
"tag_name": "v0.12.4",
45+
"name": "Nvim 0.12.4"
46+
}
47+
]`)
48+
49+
releases := Releases{}
50+
err := releases.Process(data, &config.AppOptions{MinRelease: "0.7.0"})
51+
require.NoError(t, err)
52+
53+
stable, err := releases.Get("stable")
54+
require.NoError(t, err)
55+
require.Equal(t, "0.12.4", stable.CleanTagName())
56+
}

0 commit comments

Comments
 (0)