diff --git a/src/cli/upgrade.go b/src/cli/upgrade.go index 53952588..1c7c0bff 100644 --- a/src/cli/upgrade.go +++ b/src/cli/upgrade.go @@ -57,6 +57,13 @@ var upgradeCmd = &cobra.Command{ version := fmt.Sprintf("v%s", build.Version) + if upgrade.IsMajorUpgrade(build.Version, latest) { + message := terminal.StopProgress() + message += fmt.Sprintf("\n🚨 major upgrade available: %s -> %s, use oh-my-posh upgrade --force to upgrade\n\n", version, latest) + fmt.Print(message) + return + } + if version != latest { executeUpgrade(latest) return diff --git a/src/upgrade/cli.go b/src/upgrade/cli.go index 69e20f44..2cb359b9 100644 --- a/src/upgrade/cli.go +++ b/src/upgrade/cli.go @@ -2,6 +2,7 @@ package upgrade import ( "fmt" + "strings" "github.com/charmbracelet/bubbles/spinner" tea "github.com/charmbracelet/bubbletea" @@ -144,3 +145,15 @@ func Run(latest string) error { return programModel.error } + +func IsMajorUpgrade(current, latest string) bool { + if len(current) == 0 { + return false + } + + getMajorNumber := func(version string) string { + return strings.Split(version, ".")[0] + } + + return getMajorNumber(current) != getMajorNumber(latest) +} diff --git a/src/upgrade/cli_test.go b/src/upgrade/cli_test.go new file mode 100644 index 00000000..c0a0bde3 --- /dev/null +++ b/src/upgrade/cli_test.go @@ -0,0 +1,25 @@ +package upgrade + +import ( + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestIsMajorUpgrade(t *testing.T) { + cases := []struct { + Case string + Expected bool + CurrentVersion string + LatestVersion string + }{ + {Case: "Same version", Expected: false, CurrentVersion: "v3.0.0", LatestVersion: "v3.0.0"}, + {Case: "Breaking change", Expected: true, CurrentVersion: "v3.0.0", LatestVersion: "v4.0.0"}, + {Case: "Empty version, mostly development build", Expected: false, LatestVersion: "v4.0.0"}, + } + + for _, tc := range cases { + canUpgrade := IsMajorUpgrade(tc.CurrentVersion, tc.LatestVersion) + assert.Equal(t, tc.Expected, canUpgrade, tc.Case) + } +}