Compare commits

..

No commits in common. "66695a04740b792aadefb871758efd512e770849" and "6cc637519b857618aa7c94c2d23767ea59024bcd" have entirely different histories.

4 changed files with 22 additions and 110 deletions

View file

@ -1,2 +1,2 @@
VERSION_PREFIX=v VERSION_PREFIX=v
GIT_SIGN=true GIT_SIGN=false

View file

@ -8,7 +8,7 @@ version is implemented using https://github.com/Masterminds/semver to parse and
## Installation ## Installation
```bash ```bash
go install github.com/ray1729/git-semver@v0.2.2 go install github.com/ray1729/git-semver
``` ```
## Usage ## 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 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. 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.

34
main.go
View file

@ -132,8 +132,6 @@ func nextVersion(inc string) func(*cli.Context) error {
newVer = v.IncMinor() newVer = v.IncMinor()
case "major": case "major":
newVer = v.IncMajor() newVer = v.IncMajor()
default:
newVer = *v
} }
} }
if c.IsSet("pre-release") { if c.IsSet("pre-release") {
@ -235,15 +233,11 @@ func parseConfig(f io.Reader) (config, error) {
} }
k, v, ok := strings.Cut(t, "=") k, v, ok := strings.Cut(t, "=")
if !ok { if !ok {
return conf, fmt.Errorf("error parsing %s: invalid syntax", t) return conf, fmt.Errorf("invalid configuration: %s", t)
} }
k, v = strings.TrimSpace(k), strings.TrimSpace(v) k, v = strings.TrimSpace(k), strings.TrimSpace(v)
if len(v) >= 2 && strings.HasPrefix(v, "\"") && strings.HasSuffix(v, "\"") { if len(v) >= 2 && strings.HasPrefix(v, "\"") && strings.HasSuffix(v, "\"") {
unquotedV, err := strconv.Unquote(v) v = strings.Trim(v, "\"")
if err != nil {
return conf, fmt.Errorf("error parsing %s: invalid quoted string", t)
}
v = unquotedV
} }
switch strings.ToUpper(k) { switch strings.ToUpper(k) {
case "VERSION_PREFIX": case "VERSION_PREFIX":
@ -251,14 +245,17 @@ func parseConfig(f io.Reader) (config, error) {
case "GIT_SIGN": case "GIT_SIGN":
b, err := strconv.ParseBool(v) b, err := strconv.ParseBool(v)
if err != nil { if err != nil {
return conf, fmt.Errorf("error parsing %s: invalid boolean value", t) return conf, fmt.Errorf("error parsing GIT_SIGN %q: %v", v, err)
} }
conf.sign = b conf.sign = b
default: default:
return conf, fmt.Errorf("error parsing %s: unrecognized variable", t) return conf, fmt.Errorf("unrecognized configuration variable: %s", k)
} }
} }
return conf, s.Err() if err := s.Err(); err != nil {
return conf, err
}
return conf, nil
} }
func createTag(tagName string, sign bool) error { func createTag(tagName string, sign bool) error {
@ -266,18 +263,25 @@ func createTag(tagName string, sign bool) error {
if sign { if sign {
signFlag = "-s" signFlag = "-s"
} }
out, err := exec.Command("git", "tag", signFlag, "-m", "Version "+tagName, tagName).CombinedOutput() cmd := exec.Command("git", "tag", signFlag, "-m", "Version "+tagName, tagName)
stderr, err := cmd.StderrPipe()
if err != nil { if err != nil {
fmt.Fprintln(os.Stderr, string(out)) 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 {
return err return err
} }
return nil return nil
} }
func getVersion(versionPrefix string) (*semver.Version, error) { func getVersion(versionPrefix string) (*semver.Version, error) {
out, err := exec.Command("git", "tag").CombinedOutput() out, err := exec.Command("git", "tag").Output()
if err != nil { if err != nil {
fmt.Fprintln(os.Stderr, string(out))
return nil, err return nil, err
} }
var latest *semver.Version var latest *semver.Version

View file

@ -1,92 +0,0 @@
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: "# 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},
},
{
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)
return
}
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)
}
}
})
}
}