diff --git a/internal/release/version.go b/internal/release/version.go index 68a261f..cc7f06f 100644 --- a/internal/release/version.go +++ b/internal/release/version.go @@ -6,31 +6,37 @@ import ( ) // IsNewer возвращает true, если версия remote строго новее local. -// Понимает semver вида "MAJOR.MINOR.PATCH" (с опциональным префиксом "v" -// и суффиксом "-beta" — суффикс игнорируется при сравнении чисел). -// Некорректные/пустые версии считаются «старыми» (0.0.0). +// Сравнивает все числовые части: "MAJOR.MINOR.PATCH" и наши "ГГГГ.ММ.ДД.N" — четвёртая часть +// (номер сборки за день) значима: 2026.09.24.11 новее 2026.09.24.5. Префикс "v" и суффиксы +// "-beta", "+build" игнорируются. Недостающие части — нули; некорректные/пустые версии — «старые». func IsNewer(remote, local string) bool { rm := parseVer(remote) lc := parseVer(local) - for i := 0; i < 3; i++ { - if rm[i] != lc[i] { - return rm[i] > lc[i] + for i := 0; i < len(rm) || i < len(lc); i++ { + var r, l int + if i < len(rm) { + r = rm[i] + } + if i < len(lc) { + l = lc[i] + } + if r != l { + return r > l } } return false } -func parseVer(s string) [3]int { +func parseVer(s string) []int { s = strings.TrimSpace(s) s = strings.TrimPrefix(s, "v") if i := strings.IndexAny(s, "-+"); i >= 0 { s = s[:i] // отбрасываем -beta, +build } - var out [3]int - parts := strings.Split(s, ".") - for i := 0; i < 3 && i < len(parts); i++ { - n, _ := strconv.Atoi(parts[i]) - out[i] = n + var out []int + for _, p := range strings.Split(s, ".") { + n, _ := strconv.Atoi(p) + out = append(out, n) } return out } diff --git a/internal/release/version_4part_test.go b/internal/release/version_4part_test.go new file mode 100644 index 0000000..50bfe48 --- /dev/null +++ b/internal/release/version_4part_test.go @@ -0,0 +1,24 @@ +package release + +import "testing" + +func TestIsNewerBuildNumber(t *testing.T) { + cases := []struct { + r, l string + want bool + }{ + {"2026.09.24.11", "2026.09.24.5", true}, + {"2026.09.24.5", "2026.09.24.11", false}, + {"2026.09.24.1", "2026.09.24", true}, + {"2026.09.24", "2026.09.24.1", false}, + {"2026.09.25", "2026.09.24.11", true}, + {"2026.09.18-beta1", "2026.09.18", false}, + {"1.2.3", "1.2.3", false}, + {"v1.3.0", "1.2.9", true}, + } + for _, c := range cases { + if got := IsNewer(c.r, c.l); got != c.want { + t.Errorf("IsNewer(%q, %q) = %v, want %v", c.r, c.l, got, c.want) + } + } +}