Skip to content

Commit 55790be

Browse files
authored
feat: better versioning (#2131)
1 parent 88fdbd1 commit 55790be

9 files changed

+70
-42
lines changed

cmd/release/main.go

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,10 @@ func release() error {
6767
return err
6868
}
6969

70+
if err := setVersionFile("internal/version/version.txt", version); err != nil {
71+
return err
72+
}
73+
7074
if err := setJSONVersion("package.json", version); err != nil {
7175
return err
7276
}
@@ -144,6 +148,10 @@ func changelog(version *semver.Version) error {
144148
return os.WriteFile(changelogTarget, []byte(changelog), 0o644)
145149
}
146150

151+
func setVersionFile(fileName string, version *semver.Version) error {
152+
return os.WriteFile(fileName, []byte(version.String()+"\n"), 0o644)
153+
}
154+
147155
func setJSONVersion(fileName string, version *semver.Version) error {
148156
// Read the JSON file
149157
b, err := os.ReadFile(fileName)

cmd/task/task.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ import (
1717
"github.com/go-task/task/v3/internal/filepathext"
1818
"github.com/go-task/task/v3/internal/flags"
1919
"github.com/go-task/task/v3/internal/logger"
20-
ver "github.com/go-task/task/v3/internal/version"
20+
"github.com/go-task/task/v3/internal/version"
2121
"github.com/go-task/task/v3/taskfile"
2222
"github.com/go-task/task/v3/taskfile/ast"
2323
)
@@ -57,7 +57,7 @@ func run() error {
5757
}
5858

5959
if flags.Version {
60-
fmt.Printf("Task version: %s\n", ver.GetVersionWithSum())
60+
fmt.Println(version.GetVersionWithBuildInfo())
6161
return nil
6262
}
6363

executor_test.go

Lines changed: 12 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@ import (
1010
"testing"
1111

1212
"github.com/sebdah/goldie/v2"
13-
"github.com/stretchr/testify/assert"
1413
"github.com/stretchr/testify/require"
1514

1615
"github.com/go-task/task/v3"
@@ -343,41 +342,31 @@ func TestSpecialVars(t *testing.T) {
343342

344343
const dir = "testdata/special_vars"
345344
const subdir = "testdata/special_vars/subdir"
346-
toAbs := func(rel string) string {
347-
abs, err := filepath.Abs(rel)
348-
assert.NoError(t, err)
349-
return abs
350-
}
351345

352-
tests := []struct {
353-
target string
354-
expected string
355-
}{
346+
tests := []string{
356347
// Root
357-
{target: "print-task", expected: "print-task"},
358-
{target: "print-root-dir", expected: toAbs(dir)},
359-
{target: "print-taskfile", expected: toAbs(dir) + "/Taskfile.yml"},
360-
{target: "print-taskfile-dir", expected: toAbs(dir)},
361-
{target: "print-task-version", expected: "unknown"},
362-
{target: "print-task-dir", expected: toAbs(dir) + "/foo"},
348+
"print-task",
349+
"print-root-dir",
350+
"print-taskfile",
351+
"print-taskfile-dir",
352+
"print-task-dir",
363353
// Included
364-
{target: "included:print-task", expected: "included:print-task"},
365-
{target: "included:print-root-dir", expected: toAbs(dir)},
366-
{target: "included:print-taskfile", expected: toAbs(dir) + "/included/Taskfile.yml"},
367-
{target: "included:print-taskfile-dir", expected: toAbs(dir) + "/included"},
368-
{target: "included:print-task-version", expected: "unknown"},
354+
"included:print-task",
355+
"included:print-root-dir",
356+
"included:print-taskfile",
357+
"included:print-taskfile-dir",
369358
}
370359

371360
for _, dir := range []string{dir, subdir} {
372361
for _, test := range tests {
373362
NewExecutorTest(t,
374-
WithName(fmt.Sprintf("%s-%s", dir, test.target)),
363+
WithName(fmt.Sprintf("%s-%s", dir, test)),
375364
WithExecutorOptions(
376365
task.WithDir(dir),
377366
task.WithSilent(true),
378367
task.WithVersionCheck(true),
379368
),
380-
WithTask(test.target),
369+
WithTask(test),
381370
WithPostProcessFn(PPRemoveAbsolutePaths),
382371
)
383372
}

internal/version/version.go

Lines changed: 47 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,33 +1,67 @@
11
package version
22

33
import (
4-
"fmt"
4+
_ "embed"
55
"runtime/debug"
6+
"strings"
67
)
78

89
var (
9-
version = ""
10-
sum = ""
10+
//go:embed version.txt
11+
version string
12+
commit string
13+
dirty bool
1114
)
1215

1316
func init() {
14-
info, ok := debug.ReadBuildInfo()
15-
if !ok || info.Main.Version == "(devel)" || info.Main.Version == "" {
16-
version = "unknown"
17-
} else {
18-
if version == "" {
19-
version = info.Main.Version
17+
version = strings.TrimSpace(version)
18+
// Attempt to get build info from the Go runtime. We only use this if not
19+
// built from a tagged version.
20+
if info, ok := debug.ReadBuildInfo(); ok && info.Main.Version == "(devel)" {
21+
commit = getCommit(info)
22+
dirty = getDirty(info)
23+
}
24+
}
25+
26+
func getDirty(info *debug.BuildInfo) bool {
27+
for _, setting := range info.Settings {
28+
if setting.Key == "vcs.modified" {
29+
return setting.Value == "true"
2030
}
21-
if sum == "" {
22-
sum = info.Main.Sum
31+
}
32+
return false
33+
}
34+
35+
func getCommit(info *debug.BuildInfo) string {
36+
for _, setting := range info.Settings {
37+
if setting.Key == "vcs.revision" {
38+
return setting.Value[:7]
2339
}
2440
}
41+
return ""
2542
}
2643

44+
// GetVersion returns the version of Task. By default, this is retrieved from
45+
// the embedded version.txt file which is kept up-to-date by our release script.
46+
// However, it can also be overridden at build time using:
47+
// -ldflags="-X 'github.com/go-task/task/v3/internal/version.version=vX.X.X'".
2748
func GetVersion() string {
2849
return version
2950
}
3051

31-
func GetVersionWithSum() string {
32-
return fmt.Sprintf("%s (%s)", version, sum)
52+
// GetVersionWithBuildInfo is the same as [GetVersion], but it also includes
53+
// the commit hash and dirty status if available. This will only work when built
54+
// within inside of a Git checkout.
55+
func GetVersionWithBuildInfo() string {
56+
var buildInfo string
57+
if commit != "" {
58+
buildInfo += commit
59+
}
60+
if dirty {
61+
buildInfo += "-dirty"
62+
}
63+
if buildInfo != "" {
64+
return version + "-" + buildInfo
65+
}
66+
return version
3367
}

internal/version/version.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
3.42.1

testdata/special_vars/subdir/testdata/TestSpecialVars-testdata-special_vars-subdir-included-print-task-version.golden

Lines changed: 0 additions & 1 deletion
This file was deleted.

testdata/special_vars/subdir/testdata/TestSpecialVars-testdata-special_vars-subdir-print-task-version.golden

Lines changed: 0 additions & 1 deletion
This file was deleted.

testdata/special_vars/testdata/TestSpecialVars-testdata-special_vars-included-print-task-version.golden

Lines changed: 0 additions & 1 deletion
This file was deleted.

testdata/special_vars/testdata/TestSpecialVars-testdata-special_vars-print-task-version.golden

Lines changed: 0 additions & 1 deletion
This file was deleted.

0 commit comments

Comments
 (0)