From 350c673764326175293900d72d0e3facdfd5a13c Mon Sep 17 00:00:00 2001 From: zuevav Date: Thu, 24 Sep 2026 18:01:00 +0300 Subject: [PATCH] =?UTF-8?q?release.IsNewer:=20=D1=81=D1=80=D0=B0=D0=B2?= =?UTF-8?q?=D0=BD=D0=B8=D0=B2=D0=B0=D1=82=D1=8C=20=D0=B2=D1=81=D0=B5=20?= =?UTF-8?q?=D1=87=D0=B0=D1=81=D1=82=D0=B8=20=D0=B2=D0=B5=D1=80=D1=81=D0=B8?= =?UTF-8?q?=D0=B8=20=E2=80=94=20=D0=BD=D0=BE=D0=BC=D0=B5=D1=80=20=D1=81?= =?UTF-8?q?=D0=B1=D0=BE=D1=80=D0=BA=D0=B8=20=D0=B7=D0=B0=20=D0=B4=D0=B5?= =?UTF-8?q?=D0=BD=D1=8C=20=D0=B7=D0=BD=D0=B0=D1=87=D0=B8=D0=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Раньше 2026.09.24.11 и 2026.09.24.5 считались одной версией, и обновление в пределах одного дня не предлагалось. Исправление выпускается как 2026.09.25.1, чтобы его увидели установки со старым сравнением. Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_014FsEKyJrYF69Cj9ZXzFLRi --- internal/release/version.go | 30 +++++++++++++++----------- internal/release/version_4part_test.go | 24 +++++++++++++++++++++ 2 files changed, 42 insertions(+), 12 deletions(-) create mode 100644 internal/release/version_4part_test.go 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) + } + } +}