From 286046e15a54a1adbefc141e1c64ad35b412b23c Mon Sep 17 00:00:00 2001 From: Gani Georgiev Date: Tue, 23 May 2023 11:35:46 +0300 Subject: [PATCH] improved update cmd version check --- plugins/ghupdate/ghupdate.go | 38 ++++++++++++++++++++++++++++++- plugins/ghupdate/ghupdate_test.go | 32 ++++++++++++++++++++++++++ 2 files changed, 69 insertions(+), 1 deletion(-) create mode 100644 plugins/ghupdate/ghupdate_test.go diff --git a/plugins/ghupdate/ghupdate.go b/plugins/ghupdate/ghupdate.go index bdd46348..4c92b09e 100644 --- a/plugins/ghupdate/ghupdate.go +++ b/plugins/ghupdate/ghupdate.go @@ -14,6 +14,7 @@ import ( "path" "path/filepath" "runtime" + "strconv" "strings" "github.com/fatih/color" @@ -138,7 +139,7 @@ func (p *plugin) update(withBackup bool) error { return err } - if strings.TrimPrefix(p.currentVersion, "v") >= strings.TrimPrefix(latest.Tag, "v") { + if compareVersions(strings.TrimPrefix(p.currentVersion, "v"), strings.TrimPrefix(latest.Tag, "v")) <= 0 { color.Green("You already have the latest PocketBase %s.", p.currentVersion) return nil } @@ -327,3 +328,38 @@ func archiveSuffix(goos, goarch string) string { return "" } + +func compareVersions(a, b string) int { + aSplit := strings.Split(a, ".") + aTotal := len(aSplit) + + bSplit := strings.Split(b, ".") + bTotal := len(bSplit) + + limit := aTotal + if bTotal > aTotal { + limit = bTotal + } + + for i := 0; i < limit; i++ { + var x, y int + + if i < aTotal { + x, _ = strconv.Atoi(aSplit[i]) + } + + if i < bTotal { + y, _ = strconv.Atoi(bSplit[i]) + } + + if x < y { + return 1 // b is newer + } + + if x > y { + return -1 // a is newer + } + } + + return 0 // equal +} diff --git a/plugins/ghupdate/ghupdate_test.go b/plugins/ghupdate/ghupdate_test.go new file mode 100644 index 00000000..55d5a1c5 --- /dev/null +++ b/plugins/ghupdate/ghupdate_test.go @@ -0,0 +1,32 @@ +package ghupdate + +import "testing" + +func TestCompareVersions(t *testing.T) { + scenarios := []struct { + a string + b string + expected int + }{ + {"", "", 0}, + {"0", "", 0}, + {"1", "1.0.0", 0}, + {"1.1", "1.1.0", 0}, + {"1.1", "1.1.1", 1}, + {"1.1", "1.0.1", -1}, + {"1.0", "1.0.1", 1}, + {"1.10", "1.9", -1}, + {"1.2", "1.12", 1}, + {"3.2", "1.6", -1}, + {"3.2", "4.0", 1}, + {"3.2.4", "3.2.3", -1}, + } + + for i, s := range scenarios { + result := compareVersions(s.a, s.b) + + if result != s.expected { + t.Fatalf("[%d] Expected %q vs %q to result in %d, got %d", i, s.a, s.b, s.expected, result) + } + } +}