Skip to content

Commit 1174fa1

Browse files
committed
fix: improve version handling and changelog generation using semantic versioning
1 parent 33d6c65 commit 1174fa1

7 files changed

Lines changed: 53 additions & 32 deletions

File tree

cmd/project/project_extension_upload.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -185,7 +185,7 @@ var projectExtensionUploadCmd = &cobra.Command{
185185
}
186186
}
187187

188-
logging.FromContext(cmd.Context()).Infof("Uploaded extension %s with version %s", name, version)
188+
logging.FromContext(cmd.Context()).Infof("Uploaded extension %s with version %s", name, version.String())
189189

190190
if _, err := client.ExtensionManager.Refresh(adminCtx); err != nil {
191191
return fmt.Errorf("cannot refresh extension list: %w", err)

extension/bundle_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,7 @@ func TestCreateBundle(t *testing.T) {
8989

9090
version, err := bundle.GetVersion()
9191
assert.NoError(t, err)
92-
assert.Equal(t, "1.0.0.0", version.String())
92+
assert.Equal(t, "1.0.0", version.String())
9393

9494
// does notthing
9595
bundle.Validate(getTestContext(), &ValidationContext{})

extension/zip.go

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -521,14 +521,16 @@ func PrepareExtensionForRelease(ctx context.Context, sourceRoot, extensionRoot s
521521
if ext.GetExtensionConfig().Changelog.Enabled {
522522
v, _ := ext.GetVersion()
523523

524-
logging.FromContext(ctx).Infof("Generated changelog for version %s", v.Original())
524+
logging.FromContext(ctx).Infof("Generated changelog for version %s", v.String())
525525

526-
content, err := changelog.GenerateChangelog(ctx, v.Original(), sourceRoot, ext.GetExtensionConfig().Changelog)
526+
content, err := changelog.GenerateChangelog(ctx, v.String(), sourceRoot, ext.GetExtensionConfig().Changelog)
527527
if err != nil {
528528
return err
529529
}
530530

531-
changelogFile := fmt.Sprintf("# %s\n%s", v.Original(), content)
531+
changelogFile := fmt.Sprintf("# %s\n%s", v.String(), content)
532+
533+
logging.FromContext(ctx).Debugf("Changelog:\n%s", changelogFile)
532534

533535
if err := os.WriteFile(path.Join(extensionRoot, "CHANGELOG_en-GB.md"), []byte(changelogFile), os.ModePerm); err != nil {
534536
return err

go.mod

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ require (
2222
github.com/joho/godotenv v1.5.1
2323
github.com/microcosm-cc/bluemonday v1.0.27
2424
github.com/otiai10/copy v1.14.1
25-
github.com/shyim/go-version v0.0.0-20250514104457-ded98488bd6f
25+
github.com/shyim/go-version v0.0.0-20250514132108-aa2854d2c40b
2626
github.com/spf13/cobra v1.9.1
2727
github.com/stretchr/testify v1.10.0
2828
github.com/tetratelabs/wazero v1.9.0

go.sum

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -142,6 +142,10 @@ github.com/shyim/go-version v0.0.0-20250513054659-15e244b52011 h1:Fv97bFEM3NPyDW
142142
github.com/shyim/go-version v0.0.0-20250513054659-15e244b52011/go.mod h1:z47ygE4N7EC0H58FP5j5cXZtl1pSnfjwYJsHtiVtcwU=
143143
github.com/shyim/go-version v0.0.0-20250514104457-ded98488bd6f h1:0zgN0ZKq9EmT7sL0MEn9V70rGiwkj78Vv1WD0xmys8c=
144144
github.com/shyim/go-version v0.0.0-20250514104457-ded98488bd6f/go.mod h1:z47ygE4N7EC0H58FP5j5cXZtl1pSnfjwYJsHtiVtcwU=
145+
github.com/shyim/go-version v0.0.0-20250514131704-4ce943532a2c h1:gJ1D2/OkhbH/TOFffIx42cSBAF2qbuJ0JXlDr4zljrM=
146+
github.com/shyim/go-version v0.0.0-20250514131704-4ce943532a2c/go.mod h1:z47ygE4N7EC0H58FP5j5cXZtl1pSnfjwYJsHtiVtcwU=
147+
github.com/shyim/go-version v0.0.0-20250514132108-aa2854d2c40b h1:BBiMTvsse8YOfQuP/bFqxJjeqhkJtY1M0ZlGiwP5xtA=
148+
github.com/shyim/go-version v0.0.0-20250514132108-aa2854d2c40b/go.mod h1:z47ygE4N7EC0H58FP5j5cXZtl1pSnfjwYJsHtiVtcwU=
145149
github.com/spf13/cobra v1.9.1 h1:CXSaggrXdbHK9CF+8ywj8Amf7PBRmPCOJugH954Nnlo=
146150
github.com/spf13/cobra v1.9.1/go.mod h1:nDyEzZ8ogv936Cinf6g1RU9MRY64Ir93oCnqb9wxYW0=
147151
github.com/spf13/pflag v1.0.6 h1:jFzHGLGAlb3ruxLB8MhbI6A8+AQX/2eW4qeyNZXNp2o=

internal/git/git.go

Lines changed: 35 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,11 @@ import (
66
"os"
77
"os/exec"
88
"path"
9+
"sort"
910
"strings"
1011

1112
"github.com/shopware/shopware-cli/logging"
13+
"github.com/shyim/go-version"
1214
)
1315

1416
type GitCommit struct {
@@ -34,44 +36,56 @@ func runGit(ctx context.Context, repo string, args ...string) (string, error) {
3436
}
3537

3638
func getPreviousTag(ctx context.Context, currentTag, repo string) (string, error) {
37-
if err := unshallowRepository(ctx, repo); err != nil {
38-
return "", err
39-
}
40-
4139
previousVersion := os.Getenv("SHOPWARE_CLI_PREVIOUS_TAG")
4240
if previousVersion != "" {
4341
return previousVersion, nil
4442
}
4543

46-
commits, err := runGit(ctx, repo, "log", "--pretty=format:%h", "--no-merges")
44+
tags, err := runGit(ctx, repo, "tag", "--list")
4745
if err != nil {
48-
return "", fmt.Errorf("cannot get previous tag: %w", err)
46+
return "", fmt.Errorf("failed to run git command: %w", err)
4947
}
5048

51-
commitsArray := strings.Split(commits, "\n")
52-
for commit := range commitsArray {
53-
contains, err := runGit(ctx, repo, "tag", "--contains", commitsArray[commit])
54-
if err != nil {
55-
return "", fmt.Errorf("cannot get previous tag: %w", err)
56-
}
49+
// direct tag match
50+
tagsArray := strings.Split(tags, "\n")
51+
52+
var tagList []*version.Version
5753

58-
if contains == "" {
54+
for _, tag := range tagsArray {
55+
v, err := version.NewVersion(tag)
56+
if err != nil {
5957
continue
6058
}
6159

62-
matchingTags := strings.Split(contains, "\n")
60+
tagList = append(tagList, v)
61+
}
6362

64-
if len(matchingTags) == 0 {
65-
continue
63+
currentVersion := version.Must(version.NewVersion(currentTag))
64+
65+
sort.Sort(sort.Reverse(version.Collection(tagList)))
66+
67+
// same major version
68+
currentMajor := currentVersion.Segments()[0]
69+
for _, tag := range tagList {
70+
if tag.Segments()[0] == currentMajor && tag.LessThan(currentVersion) {
71+
return tag.String(), nil
6672
}
73+
}
6774

68-
if matchingTags[0] == currentTag {
69-
continue
75+
// Look at previous major version
76+
for _, tag := range tagList {
77+
if tag.Segments()[0] == currentMajor-1 {
78+
return tag.String(), nil
7079
}
80+
}
7181

72-
return matchingTags[0], nil
82+
commits, err := runGit(ctx, repo, "log", "--pretty=format:%h", "--no-merges")
83+
if err != nil {
84+
return "", fmt.Errorf("cannot get previous tag: %w", err)
7385
}
7486

87+
commitsArray := strings.Split(commits, "\n")
88+
7589
// if no tag was found, return the first commit
7690
return commitsArray[len(commitsArray)-1], nil
7791
}
@@ -94,6 +108,7 @@ func GetCommits(ctx context.Context, currentVersion, repo string) ([]GitCommit,
94108
}
95109

96110
logging.FromContext(ctx).Debugf("Previous tag: %s", previousTag)
111+
logging.FromContext(ctx).Debugf("Diffing %s..HEAD", previousTag)
97112

98113
commits, err := runGit(ctx, repo, "log", "--pretty=format:%h|%s", previousTag+"..HEAD", "--no-merges")
99114
if err != nil {
@@ -142,7 +157,7 @@ func getTagForVersion(ctx context.Context, version, repo string) (string, error)
142157
}
143158
}
144159

145-
return "", nil
160+
return version, nil
146161
}
147162

148163
func GetPublicVCSURL(ctx context.Context, repo string) (string, error) {

internal/git/git_test.go

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -25,15 +25,15 @@ func TestNoTags(t *testing.T) {
2525
runCommand(t, tmpDir, "add", "a")
2626
runCommand(t, tmpDir, "commit", "-m", "initial commit", "--no-verify", "--no-gpg-sign")
2727

28-
tag, err := getPreviousTag(t.Context(), "", tmpDir)
28+
tag, err := getPreviousTag(t.Context(), "1.0.0", tmpDir)
2929
assert.NoError(t, err)
3030
assert.NotEmpty(t, tag)
3131

3232
currentTag, err := getTagForVersion(t.Context(), "1.0.0", tmpDir)
3333
assert.NoError(t, err)
34-
assert.Equal(t, "", currentTag)
34+
assert.Equal(t, "1.0.0", currentTag)
3535

36-
commits, err := GetCommits(t.Context(), "", tmpDir)
36+
commits, err := GetCommits(t.Context(), "1.0.0", tmpDir)
3737
assert.NoError(t, err)
3838
assert.Len(t, commits, 0)
3939
}
@@ -49,15 +49,15 @@ func TestWithOneTagAndCommit(t *testing.T) {
4949
runCommand(t, tmpDir, "add", "b")
5050
runCommand(t, tmpDir, "commit", "-m", "second commit", "--no-verify", "--no-gpg-sign")
5151

52-
tag, err := getPreviousTag(t.Context(), "", tmpDir)
52+
tag, err := getPreviousTag(t.Context(), "1.0.0", tmpDir)
5353
assert.NoError(t, err)
54-
assert.Equal(t, tag, "v1.0.0")
54+
assert.NotEqual(t, tag, "v1.0.0")
5555

5656
currentTag, err := getTagForVersion(t.Context(), "1.0.0", tmpDir)
5757
assert.NoError(t, err)
5858
assert.Equal(t, "1.0.0", currentTag)
5959

60-
commits, err := GetCommits(t.Context(), "", tmpDir)
60+
commits, err := GetCommits(t.Context(), "1.0.0", tmpDir)
6161
assert.NoError(t, err)
6262
assert.Len(t, commits, 1)
6363
assert.Equal(t, commits[0].Message, "second commit")

0 commit comments

Comments
 (0)