diff --git a/internal/update/update.go b/internal/update/update.go index 547ba5a20f9..b647d5a5c18 100644 --- a/internal/update/update.go +++ b/internal/update/update.go @@ -3,6 +3,9 @@ package update import ( "fmt" "io/ioutil" + "regexp" + "strconv" + "strings" "time" "github.com/cli/cli/api" @@ -11,6 +14,8 @@ import ( "gopkg.in/yaml.v3" ) +var gitDescribeSuffixRE = regexp.MustCompile(`\d+-\d+-g[a-f0-9]{8}$`) + // ReleaseInfo stores information about a release type ReleaseInfo struct { Version string `json:"tag_name"` @@ -83,6 +88,12 @@ func setStateEntry(stateFilePath string, t time.Time, r ReleaseInfo) error { } func versionGreaterThan(v, w string) bool { + w = gitDescribeSuffixRE.ReplaceAllStringFunc(w, func(m string) string { + idx := strings.IndexRune(m, '-') + n, _ := strconv.Atoi(m[0:idx]) + return fmt.Sprintf("%d-pre.0", n+1) + }) + vv, ve := version.NewVersion(v) vw, we := version.NewVersion(w) diff --git a/internal/update/update_test.go b/internal/update/update_test.go index 024122983a2..15759c50059 100644 --- a/internal/update/update_test.go +++ b/internal/update/update_test.go @@ -33,6 +33,27 @@ func TestCheckForUpdate(t *testing.T) { LatestURL: "https://www.spacejam.com/archive/spacejam/movie/jam.htm", ExpectsResult: true, }, + { + Name: "current is built from source", + CurrentVersion: "v1.2.3-123-gdeadbeef", + LatestVersion: "v1.2.3", + LatestURL: "https://www.spacejam.com/archive/spacejam/movie/jam.htm", + ExpectsResult: false, + }, + { + Name: "current is built from source after a prerelease", + CurrentVersion: "v1.2.3-rc.1-123-gdeadbeef", + LatestVersion: "v1.2.3", + LatestURL: "https://www.spacejam.com/archive/spacejam/movie/jam.htm", + ExpectsResult: true, + }, + { + Name: "latest is newer than version build from source", + CurrentVersion: "v1.2.3-123-gdeadbeef", + LatestVersion: "v1.2.4", + LatestURL: "https://www.spacejam.com/archive/spacejam/movie/jam.htm", + ExpectsResult: true, + }, { Name: "latest is current", CurrentVersion: "v1.0.0",