Skip to content

Commit 59c81f3

Browse files
lnuJanDeDobbeleer
authored andcommitted
feat: release notes hyperlink for all languages
If version enabled and hyperlink enabled(global level), an hyperlink to the release notes of the current version is generated. The regex and the url template can be modified in the json template.
1 parent 7a4d2e1 commit 59c81f3

File tree

7 files changed

+164
-19
lines changed

7 files changed

+164
-19
lines changed

src/segment_dotnet.go

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,10 @@ func (d *dotnet) init(props *properties, env environmentInfo) {
3030
commands: []string{"dotnet"},
3131
versionParam: "--version",
3232
extensions: []string{"*.cs", "*.vb", "*.sln", "*.csproj", "*.vbproj"},
33-
versionRegex: `(?P<version>[0-9]+.[0-9]+.[0-9]+)`,
33+
version: &version{
34+
regex: `(?:(?P<version>((?P<major>[0-9]+).(?P<minor>[0-9]+).(?:\d{2})(?P<patch>[0-9]{1}))))`,
35+
urlTemplate: "[%1s](https://github.com/dotnet/core/blob/master/release-notes/%[2]s.%[3]s/%[2]s.%[3]s.%[4]s/%[2]s.%[3]s.%[4]s.md)",
36+
},
3437
}
3538
}
3639

src/segment_golang.go

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,10 @@ func (g *golang) init(props *properties, env environmentInfo) {
1515
commands: []string{"go"},
1616
versionParam: "version",
1717
extensions: []string{"*.go", "go.mod"},
18-
versionRegex: `go(?P<version>[0-9]+.[0-9]+.[0-9]+)`,
18+
version: &version{
19+
regex: `(?:go(?P<version>((?P<major>[0-9]+).(?P<minor>[0-9]+).(?P<patch>[0-9]+))))`,
20+
urlTemplate: "[%s](https://golang.org/doc/go%s.%s)",
21+
},
1922
}
2023
}
2124

src/segment_julia.go

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,9 @@ func (j *julia) init(props *properties, env environmentInfo) {
1515
commands: []string{"julia"},
1616
versionParam: "--version",
1717
extensions: []string{"*.jl"},
18-
versionRegex: `julia version (?P<version>[0-9]+.[0-9]+.[0-9]+)`,
18+
version: &version{
19+
regex: `julia version (?P<version>[0-9]+.[0-9]+.[0-9]+)`,
20+
},
1921
}
2022
}
2123

src/segment_language.go

Lines changed: 63 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,45 @@
11
package main
22

3+
import (
4+
"errors"
5+
"fmt"
6+
"strings"
7+
)
8+
39
type loadContext func()
410

511
type inContext func() bool
612

13+
type version struct {
14+
full string
15+
major string
16+
minor string
17+
patch string
18+
regex string
19+
urlTemplate string
20+
}
21+
22+
func (v *version) parse(versionInfo string) error {
23+
values := findNamedRegexMatch(v.regex, versionInfo)
24+
if len(values) == 0 {
25+
return errors.New("cannot parse version string")
26+
}
27+
28+
v.full = values["version"]
29+
v.major = values["major"]
30+
v.minor = values["minor"]
31+
v.patch = values["patch"]
32+
return nil
33+
}
34+
735
type language struct {
836
props *properties
937
env environmentInfo
1038
extensions []string
1139
commands []string
1240
executable string
1341
versionParam string
14-
versionRegex string
15-
version string
42+
version *version
1643
exitCode int
1744
loadContext loadContext
1845
inContext inContext
@@ -42,8 +69,21 @@ func (l *language) string() string {
4269
if !l.hasCommand() {
4370
return l.props.getString(MissingCommandTextProperty, MissingCommandText)
4471
}
45-
l.setVersion()
46-
return l.version
72+
73+
err := l.setVersion()
74+
if err != nil {
75+
return ""
76+
}
77+
78+
// build release notes hyperlink
79+
if l.props.getBool(EnableHyperlink, false) && l.version.urlTemplate != "" {
80+
version, err := TruncatingSprintf(l.version.urlTemplate, l.version.full, l.version.major, l.version.minor, l.version.patch)
81+
if err != nil {
82+
return l.version.full
83+
}
84+
return version
85+
}
86+
return l.version.full
4787
}
4888

4989
func (l *language) enabled() bool {
@@ -77,16 +117,18 @@ func (l *language) hasLanguageFiles() bool {
77117
return true
78118
}
79119

80-
// getVersion returns the version and exit code returned by the executable
81-
func (l *language) setVersion() {
120+
// setVersion parses the version string returned by the command
121+
func (l *language) setVersion() error {
82122
versionInfo, err := l.env.runCommand(l.executable, l.versionParam)
83123
if exitErr, ok := err.(*commandError); ok {
84124
l.exitCode = exitErr.exitCode
85-
return
125+
return errors.New("error executing command")
86126
}
87-
values := findNamedRegexMatch(l.versionRegex, versionInfo)
88-
l.exitCode = 0
89-
l.version = values["version"]
127+
err = l.version.parse(versionInfo)
128+
if err != nil {
129+
return err
130+
}
131+
return nil
90132
}
91133

92134
// hasCommand checks if one of the commands exists and sets it as executable
@@ -116,3 +158,14 @@ func (l *language) inLanguageContext() bool {
116158
}
117159
return l.inContext()
118160
}
161+
162+
func TruncatingSprintf(str string, args ...interface{}) (string, error) {
163+
n := strings.Count(str, "%s")
164+
if n > len(args) {
165+
return "", errors.New("Too many parameters")
166+
}
167+
if n == 0 {
168+
return fmt.Sprintf(str, args...), nil
169+
}
170+
return fmt.Sprintf(str, args[:n]...), nil
171+
}

src/segment_language_test.go

Lines changed: 82 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import (
77
)
88

99
const (
10-
universion = "1.3.3.7"
10+
universion = "1.3.307"
1111
uni = "*.uni"
1212
corn = "*.corn"
1313
)
@@ -23,6 +23,8 @@ type languageArgs struct {
2323
versionParam string
2424
versionRegex string
2525
missingCommandText string
26+
urlTemplate string
27+
enableHyperlink bool
2628
}
2729

2830
func (l *languageArgs) hasvalue(value string, list []string) bool {
@@ -45,8 +47,9 @@ func bootStrapLanguageTest(args *languageArgs) *language {
4547
}
4648
props := &properties{
4749
values: map[Property]interface{}{
48-
DisplayVersion: args.displayVersion,
49-
DisplayMode: args.displayMode,
50+
DisplayVersion: args.displayVersion,
51+
DisplayMode: args.displayMode,
52+
EnableHyperlink: args.enableHyperlink,
5053
},
5154
}
5255
if args.missingCommandText != "" {
@@ -58,7 +61,10 @@ func bootStrapLanguageTest(args *languageArgs) *language {
5861
extensions: args.extensions,
5962
commands: args.commands,
6063
versionParam: args.versionParam,
61-
versionRegex: args.versionRegex,
64+
version: &version{
65+
regex: args.versionRegex,
66+
urlTemplate: args.urlTemplate,
67+
},
6268
}
6369
return l
6470
}
@@ -222,3 +228,75 @@ func TestLanguageEnabledMissingCommandCustomText(t *testing.T) {
222228
assert.True(t, lang.enabled())
223229
assert.Equal(t, args.missingCommandText, lang.string(), "unicorn is available and uni and corn files are found")
224230
}
231+
232+
func TestLanguageHyperlinkEnabled(t *testing.T) {
233+
args := &languageArgs{
234+
versionParam: "--version",
235+
commands: []string{"uni", "corn"},
236+
enabledCommands: []string{"corn"},
237+
extensions: []string{uni, corn},
238+
versionRegex: `(?P<version>((?P<major>[0-9]+).(?P<minor>[0-9]+).(?P<patch>[0-9]+)))`,
239+
urlTemplate: "[%s](https://unicor.org/doc/%s.%s.%s)",
240+
version: universion,
241+
enabledExtensions: []string{corn},
242+
displayVersion: true,
243+
enableHyperlink: true,
244+
}
245+
lang := bootStrapLanguageTest(args)
246+
assert.True(t, lang.enabled())
247+
assert.Equal(t, "[1.3.307](https://unicor.org/doc/1.3.307)", lang.string())
248+
}
249+
250+
func TestLanguageHyperlinkEnabledWrongRegex(t *testing.T) {
251+
args := &languageArgs{
252+
versionParam: "--version",
253+
commands: []string{"uni", "corn"},
254+
enabledCommands: []string{"corn"},
255+
extensions: []string{uni, corn},
256+
versionRegex: `wrong`,
257+
urlTemplate: "[%s](https://unicor.org/doc/%s.%s.%s)",
258+
version: universion,
259+
enabledExtensions: []string{corn},
260+
displayVersion: true,
261+
enableHyperlink: true,
262+
}
263+
lang := bootStrapLanguageTest(args)
264+
assert.True(t, lang.enabled())
265+
assert.Equal(t, "", lang.string())
266+
}
267+
268+
func TestLanguageHyperlinkEnabledLessParamInTemplate(t *testing.T) {
269+
args := &languageArgs{
270+
versionParam: "--version",
271+
commands: []string{"uni", "corn"},
272+
enabledCommands: []string{"corn"},
273+
extensions: []string{uni, corn},
274+
versionRegex: `(?P<version>((?P<major>[0-9]+).(?P<minor>[0-9]+).(?P<patch>[0-9]+)))`,
275+
urlTemplate: "[%s](https://unicor.org/doc/%s)",
276+
version: universion,
277+
enabledExtensions: []string{corn},
278+
displayVersion: true,
279+
enableHyperlink: true,
280+
}
281+
lang := bootStrapLanguageTest(args)
282+
assert.True(t, lang.enabled())
283+
assert.Equal(t, "[1.3.307](https://unicor.org/doc/1)", lang.string())
284+
}
285+
286+
func TestLanguageHyperlinkEnabledMoreParamInTemplate(t *testing.T) {
287+
args := &languageArgs{
288+
versionParam: "--version",
289+
commands: []string{"uni", "corn"},
290+
enabledCommands: []string{"corn"},
291+
extensions: []string{uni, corn},
292+
versionRegex: `(?P<version>((?P<major>[0-9]+).(?P<minor>[0-9]+).(?P<patch>[0-9]+)))`,
293+
urlTemplate: "[%s](https://unicor.org/doc/%s.%s.%s.%s)",
294+
version: universion,
295+
enabledExtensions: []string{corn},
296+
displayVersion: true,
297+
enableHyperlink: true,
298+
}
299+
lang := bootStrapLanguageTest(args)
300+
assert.True(t, lang.enabled())
301+
assert.Equal(t, "1.3.307", lang.string())
302+
}

src/segment_node.go

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,10 @@ func (n *node) init(props *properties, env environmentInfo) {
1515
commands: []string{"node"},
1616
versionParam: "--version",
1717
extensions: []string{"*.js", "*.ts", "package.json"},
18-
versionRegex: `(?P<version>[0-9]+.[0-9]+.[0-9]+)`,
18+
version: &version{
19+
regex: `(?:v(?P<version>((?P<major>[0-9]+).(?P<minor>[0-9]+).(?P<patch>[0-9]+))))`,
20+
urlTemplate: "[%[1]s](https://github.com/nodejs/node/blob/master/doc/changelogs/CHANGELOG_V%[2]s.md#%[1]s)",
21+
},
1922
}
2023
}
2124

src/segment_python.go

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,9 +32,12 @@ func (p *python) init(props *properties, env environmentInfo) {
3232
commands: []string{"python", "python3"},
3333
versionParam: "--version",
3434
extensions: []string{"*.py", "*.ipynb", "pyproject.toml", "venv.bak", "venv", ".venv"},
35-
versionRegex: `Python (?P<version>[0-9]+.[0-9]+.[0-9]+)`,
3635
loadContext: p.loadContext,
3736
inContext: p.inContext,
37+
version: &version{
38+
regex: `(?:Python (?P<version>((?P<major>[0-9]+).(?P<minor>[0-9]+).(?P<patch>[0-9]+))))`,
39+
urlTemplate: "[%s](https://www.python.org/downloads/release/python-%s%s%s/)",
40+
},
3841
}
3942
}
4043

0 commit comments

Comments
 (0)