diff --git a/pkg/app/app.go b/pkg/app/app.go index 617e2dd0e..e9ba81f59 100644 --- a/pkg/app/app.go +++ b/pkg/app/app.go @@ -8,6 +8,7 @@ import ( "io/ioutil" "os" "path/filepath" + "regexp" "strconv" "strings" @@ -138,19 +139,33 @@ func (app *App) validateGitVersion() error { if err != nil { return minVersionError } - // output should be something like: 'git version 2.23.0' - // first number in the string should be greater than 0 - split := strings.Split(output, " ") - gitVersion := split[len(split)-1] - majorVersion, err := strconv.Atoi(gitVersion[0:1]) - if err != nil { - return minVersionError - } - if majorVersion < 2 { - return minVersionError + + if isGitVersionValid(output) { + return nil } - return nil + return minVersionError +} + +func isGitVersionValid(versionStr string) bool { + // output should be something like: 'git version 2.23.0 (blah)' + re := regexp.MustCompile(`[^\d]+([\d\.]+)`) + matches := re.FindStringSubmatch(versionStr) + + if len(matches) == 0 { + return false + } + + gitVersion := matches[1] + majorVersion, err := strconv.Atoi(gitVersion[0:1]) + if err != nil { + return false + } + if majorVersion < 2 { + return false + } + + return true } func (app *App) setupRepo() (bool, error) { diff --git a/pkg/app/app_test.go b/pkg/app/app_test.go new file mode 100644 index 000000000..1ec46f0f7 --- /dev/null +++ b/pkg/app/app_test.go @@ -0,0 +1,44 @@ +package app + +import ( + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestIsGitVersionValid(t *testing.T) { + type scenario struct { + versionStr string + expectedResult bool + } + + scenarios := []scenario{ + { + "", + false, + }, + { + "git version 1.9.0", + false, + }, + { + "git version 1.9.0 (Apple Git-128)", + false, + }, + { + "git version 2.4.0", + true, + }, + { + "git version 2.24.3 (Apple Git-128)", + true, + }, + } + + for _, s := range scenarios { + t.Run(s.versionStr, func(t *testing.T) { + result := isGitVersionValid(s.versionStr) + assert.Equal(t, result, s.expectedResult) + }) + } +}