aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMax Resnick <max@ofmax.li>2024-01-27 16:18:38 -0800
committerMax Resnick <max@ofmax.li>2024-02-25 08:42:58 -0800
commit4b6a22c3e0b3a3eece007fd1abbcf2be7ac5aa39 (patch)
tree4776853fbcebbde37dc03246b49932b01b362277
parent8e365468cec859da974a5e617ab3eb8d0a59df63 (diff)
downloadgo-bumpver-4b6a22c3e0b3a3eece007fd1abbcf2be7ac5aa39.tar.gz
fix: not validated
-rw-r--r--main.go57
-rw-r--r--main_test.go82
2 files changed, 126 insertions, 13 deletions
diff --git a/main.go b/main.go
index 8bf3496..34e30cb 100644
--- a/main.go
+++ b/main.go
@@ -19,6 +19,31 @@ import (
"github.com/Masterminds/semver/v3"
)
+var (
+ cmdExamples = `
+**stdin**
+❯ echo "1.1.1\n1.2.1" | bumpver patch -
+1.2.2
+
+**file**
+❯ echo v0.1.0 > VERSION
+❯ bumpver patch VERSION
+0.1.1
+
+**a minor**
+❯ bumpver minor <(git tag -l)
+3.4.0
+
+**a major**
+❯ bumpver major <(git tag -l)
+4.0.0
+
+**create new prerelease**
+❯ echo "0.1.0" | bumpver patch --prerelease --prerelease-fmt 'rc.$BumpInt' -
+0.1.1-rc.0
+`
+)
+
// FmtPart format keywords
type FmtPart string
@@ -59,8 +84,10 @@ func (prf *preReleaseVersion) incPreRelease() (semver.Version, error) {
// current int ++
currentVerStrPart := currentPreReleaseParts[idx]
currentVerPart, err := strconv.Atoi(currentVerStrPart)
+ // the current part is not an int, make it one
if err != nil {
- return semver.Version{}, err
+ newPreReleaseParts = append(newPreReleaseParts, "0")
+ continue
}
newPreReleaseParts = append(newPreReleaseParts, strconv.Itoa(currentVerPart+1))
case string(KeyArg):
@@ -107,10 +134,11 @@ var (
preReleaseFmtArgs = make(map[string]string)
preRelease bool
rootCmd = &cobra.Command{
- Use: "bumpver part [major|minor|patch] file [-|file]",
- Short: "A tool for bumping semver git tags.",
- Args: cobra.MatchAll(cobra.ExactArgs(2)),
- Long: `Inspired by the python bump2version tool.`,
+ Use: "bumpver part [major|minor|patch] file [-|file]",
+ Short: "A tool for bumping semver git tags.",
+ Example: cmdExamples,
+ Args: cobra.MatchAll(cobra.ExactArgs(2)),
+ Long: `Inspired by the python bump2version tool.`,
RunE: func(cmd *cobra.Command, argz []string) error {
part := argz[0]
var err error
@@ -157,9 +185,13 @@ var (
case "patch":
nextVersion = lastVersion.IncPatch()
case "prerelease":
+ parsedFmt, err := parseFmtString(preReleaseFmtString)
+ if err != nil {
+ return err
+ }
preRelVersion := preReleaseVersion{
// []string{"PR", "$KeyArg PR_NUM"},
- parseFmtString(preReleaseFmtString),
+ parsedFmt,
preReleaseFmtArgs,
lastVersion,
versionPart,
@@ -207,8 +239,17 @@ func checkArgPart(arg string) error {
return nil
}
-func parseFmtString(toSplit string) []string {
- return strings.Split(toSplit, ".")
+func parseFmtString(toSplit string) ([]string, error) {
+ splitted := strings.Split(toSplit, ".")
+ for _, section := range splitted {
+ keyWord := strings.Split(section, " ")
+ if keyWord[0] == string(KeyArg) {
+ if len(keyWord) != 2 {
+ return []string{}, errors.New("$KeyArg expected to find an argument")
+ }
+ }
+ }
+ return strings.Split(toSplit, "."), nil
}
func main() {
diff --git a/main_test.go b/main_test.go
index 248f6e6..440cb6b 100644
--- a/main_test.go
+++ b/main_test.go
@@ -3,6 +3,7 @@ package main
import (
"bytes"
"log"
+ "slices"
"strings"
"testing"
@@ -197,8 +198,8 @@ func TestIncPreRelease(t *testing.T) {
versionPart: "patch",
},
startVersion: "1.0.1-PR.jjj.j",
- expectedResult: "1.0.1-PR.11.2",
- hasError: true,
+ expectedResult: "1.0.1-PR.11.0",
+ hasError: false,
},
{
name: "test fmt arg change",
@@ -208,8 +209,8 @@ func TestIncPreRelease(t *testing.T) {
versionPart: "patch",
},
startVersion: "1.0.1-stuff.jjj.j",
- expectedResult: "1.0.1-PR.11.2",
- hasError: true,
+ expectedResult: "1.0.1-PR.11.0",
+ hasError: false,
},
{
name: "test creating a new pre-release",
@@ -233,6 +234,17 @@ func TestIncPreRelease(t *testing.T) {
expectedResult: "2.0.0-PR.11.0",
hasError: false,
},
+ {
+ name: "test creating a new major prerelease",
+ prf: preReleaseVersion{
+ Fmt: []string{"PR", "$KeyArg PR_NUM", "$BumpInt"},
+ KeyArgs: map[string]string{"PR_NUM": "11"},
+ versionPart: "major",
+ },
+ startVersion: "1.8.1-PR.GG.GG",
+ expectedResult: "1.8.1-PR.11.0",
+ hasError: false,
+ },
}
for _, test := range tests {
@@ -249,7 +261,7 @@ func TestIncPreRelease(t *testing.T) {
t.Fatal(err)
}
if test.hasError && err == nil {
- t.Fatalf("found %s expected %s", nv, test.expectedResult)
+ t.Fatal("expected to find error found none")
}
// its an error and we expect it
if test.hasError && err != nil {
@@ -262,3 +274,63 @@ func TestIncPreRelease(t *testing.T) {
})
}
}
+
+func TestParseFmtString(t *testing.T) {
+ tests := []struct {
+ name string
+ fmtString string
+ hasErr bool
+ expected []string
+ // * for nil cases
+ }{
+ {
+ name: "parsing should return 2 elements, with $KeyArg",
+ fmtString: "rc.$KeyArg FOOBAR",
+ hasErr: false,
+ expected: []string{"rc", "$KeyArg FOOBAR"},
+ },
+ {
+ name: "$KeyArg should have an arg and will fail if it doesn't",
+ fmtString: "rc.$KeyArg",
+ hasErr: true,
+ expected: []string{},
+ },
+ {
+ name: "$BumpInt should be returned",
+ fmtString: "rc.$BumpInt",
+ hasErr: false,
+ expected: []string{"rc", "$BumpInt"},
+ },
+ {
+ name: "$BumpInt and $KeyArg should returned",
+ fmtString: "rc.$BumpInt.$KeyArg FOOBAR",
+ hasErr: false,
+ expected: []string{"rc", "$BumpInt", "$KeyArg FOOBAR"},
+ },
+ {
+ name: "$BumpInt and $KeyArg should returned",
+ fmtString: "rc.$BumpInt.$KeyArg",
+ hasErr: true,
+ expected: []string{},
+ },
+ }
+ for _, test := range tests {
+ t.Run(test.name, func(t *testing.T) {
+ result, err := parseFmtString(test.fmtString)
+ if err != nil && test.hasErr {
+ return
+ } else if err != nil && !test.hasErr {
+ t.Fatalf("%s didn't expect error but found %s", test.name, err)
+ return
+ } else if test.hasErr && err == nil {
+ t.Fatal("Expected error found none")
+ }
+ if !slices.Equal(result, test.expected) {
+ t.Fatalf("Expected %s, found %s", strings.Join(test.expected, " "), strings.Join(result, " "))
+
+ }
+ })
+
+ }
+
+}