From 1cd8607d34ef2684855b2899198e33f342b089c4 Mon Sep 17 00:00:00 2001 From: Ray Miller Date: Wed, 10 May 2023 12:25:24 +0100 Subject: [PATCH 01/10] Add version to go install command --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index b9a10d9..19f0a71 100644 --- a/README.md +++ b/README.md @@ -8,7 +8,7 @@ version is implemented using https://github.com/Masterminds/semver to parse and ## Installation ```bash -go install github.com/ray1729/git-semver +go install github.com/ray1729/git-semver@v0.1.0 ``` ## Usage From 5d60e0ca4d1d71b88d29c10af06d34e88154d431 Mon Sep 17 00:00:00 2001 From: Ray Miller Date: Wed, 10 May 2023 14:08:26 +0100 Subject: [PATCH 02/10] Improved and simplified error handling around execution of git commands. --- main.go | 15 ++++----------- 1 file changed, 4 insertions(+), 11 deletions(-) diff --git a/main.go b/main.go index 3c138e5..5ce5b71 100644 --- a/main.go +++ b/main.go @@ -263,25 +263,18 @@ func createTag(tagName string, sign bool) error { if sign { signFlag = "-s" } - cmd := exec.Command("git", "tag", signFlag, "-m", "Version "+tagName, tagName) - stderr, err := cmd.StderrPipe() + out, err := exec.Command("git", "tag", signFlag, "-m", "Version "+tagName, tagName).CombinedOutput() if err != nil { - return err - } - if err := cmd.Start(); err != nil { - return err - } - out, _ := io.ReadAll(stderr) - fmt.Fprintf(os.Stderr, string(out)) - if err := cmd.Wait(); err != nil { + fmt.Fprintln(os.Stderr, string(out)) return err } return nil } func getVersion(versionPrefix string) (*semver.Version, error) { - out, err := exec.Command("git", "tag").Output() + out, err := exec.Command("git", "tag").CombinedOutput() if err != nil { + fmt.Fprintln(os.Stderr, string(out)) return nil, err } var latest *semver.Version From 920675be1d5e28acbff0723402a0d92f203c7829 Mon Sep 17 00:00:00 2001 From: Ray Miller Date: Wed, 10 May 2023 14:09:54 +0100 Subject: [PATCH 03/10] Configure tag signing --- .git-semver | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.git-semver b/.git-semver index 36f5de3..bb55b15 100644 --- a/.git-semver +++ b/.git-semver @@ -1,2 +1,2 @@ VERSION_PREFIX=v -GIT_SIGN=false +GIT_SIGN=true From 88ad9ec55c8c916ff7e7ee0e13ebc9ec67e03ebc Mon Sep 17 00:00:00 2001 From: Ray Miller Date: Wed, 10 May 2023 14:11:02 +0100 Subject: [PATCH 04/10] Update version in readme --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 19f0a71..2824650 100644 --- a/README.md +++ b/README.md @@ -8,7 +8,7 @@ version is implemented using https://github.com/Masterminds/semver to parse and ## Installation ```bash -go install github.com/ray1729/git-semver@v0.1.0 +go install github.com/ray1729/git-semver@v0.2.0 ``` ## Usage @@ -37,4 +37,4 @@ Permission is hereby granted, free of charge, to any person obtaining a copy of The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. \ No newline at end of file +THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. From 6948f596fe8f8ba262cac535e1d53e948f4c14b3 Mon Sep 17 00:00:00 2001 From: Ray Miller Date: Wed, 10 May 2023 15:04:49 +0100 Subject: [PATCH 05/10] Bugfix initialization of new version when we aren't bumping major/minor/patch --- main.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/main.go b/main.go index 5ce5b71..45ea149 100644 --- a/main.go +++ b/main.go @@ -132,6 +132,8 @@ func nextVersion(inc string) func(*cli.Context) error { newVer = v.IncMinor() case "major": newVer = v.IncMajor() + default: + newVer = *v } } if c.IsSet("pre-release") { From 2bc4bf8f80eb59388f7176e1536c4b5287d9efbe Mon Sep 17 00:00:00 2001 From: Ray Miller Date: Wed, 10 May 2023 15:05:24 +0100 Subject: [PATCH 06/10] Update verison in README --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 2824650..9dac25c 100644 --- a/README.md +++ b/README.md @@ -8,7 +8,7 @@ version is implemented using https://github.com/Masterminds/semver to parse and ## Installation ```bash -go install github.com/ray1729/git-semver@v0.2.0 +go install github.com/ray1729/git-semver@v0.2.1 ``` ## Usage From 98a35831f0cf1113e84c48beba0054a42e6d07a1 Mon Sep 17 00:00:00 2001 From: Ray Miller Date: Wed, 10 May 2023 16:57:48 +0100 Subject: [PATCH 07/10] Bugfix parsing of quoted strings, better error reporting for config errors. --- main.go | 17 +++++----- main_test.go | 87 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 96 insertions(+), 8 deletions(-) create mode 100644 main_test.go diff --git a/main.go b/main.go index 45ea149..6d0d00a 100644 --- a/main.go +++ b/main.go @@ -235,11 +235,15 @@ func parseConfig(f io.Reader) (config, error) { } k, v, ok := strings.Cut(t, "=") if !ok { - return conf, fmt.Errorf("invalid configuration: %s", t) + return conf, fmt.Errorf("error parsing %s: invalid syntax", t) } k, v = strings.TrimSpace(k), strings.TrimSpace(v) if len(v) >= 2 && strings.HasPrefix(v, "\"") && strings.HasSuffix(v, "\"") { - v = strings.Trim(v, "\"") + unquotedV, err := strconv.Unquote(v) + if err != nil { + return conf, fmt.Errorf("error parsing %s: invalid quoted string", t) + } + v = unquotedV } switch strings.ToUpper(k) { case "VERSION_PREFIX": @@ -247,17 +251,14 @@ func parseConfig(f io.Reader) (config, error) { case "GIT_SIGN": b, err := strconv.ParseBool(v) if err != nil { - return conf, fmt.Errorf("error parsing GIT_SIGN %q: %v", v, err) + return conf, fmt.Errorf("error parsing %s: invalid boolean value", t) } conf.sign = b default: - return conf, fmt.Errorf("unrecognized configuration variable: %s", k) + return conf, fmt.Errorf("error parsing %s: unrecognized variable", t) } } - if err := s.Err(); err != nil { - return conf, err - } - return conf, nil + return conf, s.Err() } func createTag(tagName string, sign bool) error { diff --git a/main_test.go b/main_test.go new file mode 100644 index 0000000..841eb3e --- /dev/null +++ b/main_test.go @@ -0,0 +1,87 @@ +package main + +import ( + "strconv" + "strings" + "testing" +) + +func TestParseConfig(t *testing.T) { + + testCases := []struct { + input string + expect config + expectErr string + }{ + { + input: "VERSION_PREFIX=v\n", + expect: config{versionPrefix: "v"}, + }, + { + input: "GIT_SIGN=1\n", + expect: config{sign: true}, + }, + { + input: "VERSION_PREFIX=v\nGIT_SIGN=t\n", + expect: config{versionPrefix: "v", sign: true}, + }, + { + input: "version_prefix=v\ngit_sign=t\n", + expect: config{versionPrefix: "v", sign: true}, + }, + { + input: "VERSION_PREFIX=v\nGIT_SIGN=false\n", + expect: config{versionPrefix: "v", sign: false}, + }, + { + input: "VERSION_PREFIX=\"version/\"\nGIT_SIGN=f\n", + expect: config{versionPrefix: "version/", sign: false}, + }, + { + input: "VERSION_PREFIX=\"foo\\\"bar\"\n", + expect: config{versionPrefix: "foo\"bar"}, + }, + { + input: "foo\n", + expectErr: "error parsing foo: invalid syntax", + }, + { + input: "bad_key=v\n", + expectErr: "error parsing bad_key=v: unrecognized variable", + }, + { + input: "GIT_SIGN=wibble\n", + expectErr: "error parsing GIT_SIGN=wibble: invalid boolean value", + }, + { + input: "VERSION_PREFIX=\"foo\\z\"\n", + expectErr: "error parsing VERSION_PREFIX=\"foo\\z\": invalid quoted string", + }, + } + + for i, tc := range testCases { + t.Run(strconv.Itoa(i), func(t *testing.T) { + res, err := parseConfig(strings.NewReader(tc.input)) + if tc.expectErr != "" { + if err == nil { + t.Error("expected error not returned") + return + } + if err.Error() != tc.expectErr { + t.Errorf("expected error %q, got %q", tc.expectErr, err.Error()) + } + } else { + if err != nil { + t.Errorf("got unexpected error: %v", err) + } + if res.versionPrefix != tc.expect.versionPrefix { + t.Errorf("got versionPrefix %s, expected %s", res.versionPrefix, tc.expect.versionPrefix) + } + if res.sign != tc.expect.sign { + t.Errorf("got sign %t, expected %t", res.sign, tc.expect.sign) + } + } + }) + } + +} From a3766583866e0b436cd13a36054c8613755f36f3 Mon Sep 17 00:00:00 2001 From: Ray Miller Date: Wed, 10 May 2023 17:00:37 +0100 Subject: [PATCH 08/10] Add test case for comments lines in config --- main_test.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/main_test.go b/main_test.go index 841eb3e..f4f2690 100644 --- a/main_test.go +++ b/main_test.go @@ -29,6 +29,10 @@ func TestParseConfig(t *testing.T) { input: "version_prefix=v\ngit_sign=t\n", expect: config{versionPrefix: "v", sign: true}, }, + { + input: "# My config\nversion_prefix=v\ngit_sign=t\n", + expect: config{versionPrefix: "v", sign: true}, + }, { input: "VERSION_PREFIX=v\nGIT_SIGN=false\n", expect: config{versionPrefix: "v", sign: false}, From d12dfef527bbf3ffcca58ba4a7acf887a5cd2828 Mon Sep 17 00:00:00 2001 From: Ray Miller Date: Wed, 10 May 2023 17:00:47 +0100 Subject: [PATCH 09/10] Update version in README --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 9dac25c..affb27a 100644 --- a/README.md +++ b/README.md @@ -8,7 +8,7 @@ version is implemented using https://github.com/Masterminds/semver to parse and ## Installation ```bash -go install github.com/ray1729/git-semver@v0.2.1 +go install github.com/ray1729/git-semver@v0.2.2 ``` ## Usage From 66695a04740b792aadefb871758efd512e770849 Mon Sep 17 00:00:00 2001 From: Ray Miller Date: Wed, 10 May 2023 17:04:02 +0100 Subject: [PATCH 10/10] Return immediately from test if error is encountered --- main_test.go | 1 + 1 file changed, 1 insertion(+) diff --git a/main_test.go b/main_test.go index f4f2690..762ff4a 100644 --- a/main_test.go +++ b/main_test.go @@ -77,6 +77,7 @@ func TestParseConfig(t *testing.T) { } else { if err != nil { t.Errorf("got unexpected error: %v", err) + return } if res.versionPrefix != tc.expect.versionPrefix { t.Errorf("got versionPrefix %s, expected %s", res.versionPrefix, tc.expect.versionPrefix)