diff --git a/backend/server/internal/server/server_test.go b/backend/server/internal/server/server_test.go index 265c1d0..57819d9 100644 --- a/backend/server/internal/server/server_test.go +++ b/backend/server/internal/server/server_test.go @@ -613,3 +613,32 @@ func deserializeSubmitResponse(t *testing.T, w *httptest.ResponseRecorder) share require.NoError(t, json.Unmarshal(w.Body.Bytes(), &submitResponse)) return submitResponse } + +func TestParseVersionString(t *testing.T) { + p, err := parseVersionString("v0.200") + require.NoError(t, err) + require.Equal(t, parsedVersion{majorVersion: 0, minorVersion: 200}, p) + p, err = parseVersionString("v1.200") + require.NoError(t, err) + require.Equal(t, parsedVersion{majorVersion: 1, minorVersion: 200}, p) + p, err = parseVersionString("v1.0") + require.NoError(t, err) + require.Equal(t, parsedVersion{majorVersion: 1, minorVersion: 0}, p) + p, err = parseVersionString("v0.216") + require.NoError(t, err) + require.Equal(t, parsedVersion{majorVersion: 0, minorVersion: 216}, p) + p, err = parseVersionString("v123.456") + require.NoError(t, err) + require.Equal(t, parsedVersion{majorVersion: 123, minorVersion: 456}, p) +} + +func TestVersionLessThan(t *testing.T) { + require.False(t, parsedVersion{0, 200}.lessThan(parsedVersion{0, 200})) + require.False(t, parsedVersion{1, 200}.lessThan(parsedVersion{1, 200})) + require.False(t, parsedVersion{0, 201}.lessThan(parsedVersion{0, 200})) + require.False(t, parsedVersion{1, 0}.lessThan(parsedVersion{0, 200})) + require.True(t, parsedVersion{0, 199}.lessThan(parsedVersion{0, 200})) + require.True(t, parsedVersion{0, 200}.lessThan(parsedVersion{0, 205})) + require.True(t, parsedVersion{1, 200}.lessThan(parsedVersion{1, 205})) + require.True(t, parsedVersion{0, 200}.lessThan(parsedVersion{1, 1})) +} diff --git a/backend/server/internal/server/util.go b/backend/server/internal/server/util.go index 218ac67..75077c3 100644 --- a/backend/server/internal/server/util.go +++ b/backend/server/internal/server/util.go @@ -6,6 +6,7 @@ import ( "net/http" pprofhttp "net/http/pprof" "os" + "regexp" "runtime" "strconv" @@ -98,3 +99,35 @@ func checkGormError(err error) { _, filename, line, _ := runtime.Caller(1) panic(fmt.Sprintf("DB error at %s:%d: %v", filename, line, err)) } + +type parsedVersion struct { + majorVersion int + minorVersion int +} + +func (pv parsedVersion) lessThan(other parsedVersion) bool { + if pv.majorVersion != other.majorVersion { + return pv.majorVersion < other.majorVersion + } + return pv.minorVersion < other.minorVersion +} + +func parseVersionString(versionString string) (parsedVersion, error) { + re := regexp.MustCompile(`v(\d+)[.](\d+)`) + matches := re.FindAllStringSubmatch(versionString, -1) + if len(matches) != 1 { + return parsedVersion{}, fmt.Errorf("failed to parse version=%#v (matches=%#v)", versionString, matches) + } + if len(matches[0]) != 3 { + return parsedVersion{}, fmt.Errorf("failed to parse version=%#v (matches[0]=%#v)", versionString, matches[0]) + } + majorVersion, err := strconv.Atoi(matches[0][1]) + if err != nil { + return parsedVersion{}, fmt.Errorf("failed to parse major version %#v", matches[0][1]) + } + minorVersion, err := strconv.Atoi(matches[0][2]) + if err != nil { + return parsedVersion{}, fmt.Errorf("failed to parse minor version %#v", matches[0][2]) + } + return parsedVersion{majorVersion, minorVersion}, nil +}