cmd/syncthing, gui, lib/config, lib/upgrade: Add option to upgrade to pre-releases
GitHub-Pull-Request: https://github.com/syncthing/syncthing/pull/3939
This commit is contained in:
committed by
Audrius Butkevicius
parent
e03be9158b
commit
35e87e23fd
@@ -84,10 +84,10 @@ func insecureGet(url, version string) (*http.Response, error) {
|
||||
return insecureHTTP.Do(req)
|
||||
}
|
||||
|
||||
// FetchLatestReleases returns the latest releases, including prereleases or
|
||||
// not depending on the argument
|
||||
func FetchLatestReleases(releasesURL, version string) []Release {
|
||||
resp, err := insecureGet(releasesURL, version)
|
||||
// FetchLatestReleases returns the latest releases. The "current" parameter
|
||||
// is used for setting the User-Agent only.
|
||||
func FetchLatestReleases(releasesURL, current string) []Release {
|
||||
resp, err := insecureGet(releasesURL, current)
|
||||
if err != nil {
|
||||
l.Infoln("Couldn't fetch release information:", err)
|
||||
return nil
|
||||
@@ -119,24 +119,22 @@ func (s SortByRelease) Less(i, j int) bool {
|
||||
return CompareVersions(s[i].Tag, s[j].Tag) > 0
|
||||
}
|
||||
|
||||
func LatestRelease(releasesURL, version string) (Release, error) {
|
||||
rels := FetchLatestReleases(releasesURL, version)
|
||||
return SelectLatestRelease(version, rels)
|
||||
func LatestRelease(releasesURL, current string, upgradeToPreReleases bool) (Release, error) {
|
||||
rels := FetchLatestReleases(releasesURL, current)
|
||||
return SelectLatestRelease(rels, current, upgradeToPreReleases)
|
||||
}
|
||||
|
||||
func SelectLatestRelease(version string, rels []Release) (Release, error) {
|
||||
func SelectLatestRelease(rels []Release, current string, upgradeToPreReleases bool) (Release, error) {
|
||||
if len(rels) == 0 {
|
||||
return Release{}, ErrNoVersionToSelect
|
||||
}
|
||||
|
||||
// Sort the releases, lowest version number first
|
||||
sort.Sort(sort.Reverse(SortByRelease(rels)))
|
||||
// Check for a beta build
|
||||
beta := strings.Contains(version, "-")
|
||||
|
||||
var selected Release
|
||||
for _, rel := range rels {
|
||||
switch CompareVersions(rel.Tag, version) {
|
||||
switch CompareVersions(rel.Tag, current) {
|
||||
case Older, MajorOlder:
|
||||
// This is older than what we're already running
|
||||
continue
|
||||
@@ -145,7 +143,7 @@ func SelectLatestRelease(version string, rels []Release) (Release, error) {
|
||||
// We've found a new major version. That's fine, but if we've
|
||||
// already found a minor upgrade that is acceptable we should go
|
||||
// with that one first and then revisit in the future.
|
||||
if selected.Tag != "" && CompareVersions(selected.Tag, version) == Newer {
|
||||
if selected.Tag != "" && CompareVersions(selected.Tag, current) == Newer {
|
||||
return selected, nil
|
||||
}
|
||||
// else it may be viable, do the needful below
|
||||
@@ -154,7 +152,7 @@ func SelectLatestRelease(version string, rels []Release) (Release, error) {
|
||||
// New minor release, do the usual processing
|
||||
}
|
||||
|
||||
if rel.Prerelease && !beta {
|
||||
if rel.Prerelease && !upgradeToPreReleases {
|
||||
continue
|
||||
}
|
||||
for _, asset := range rel.Assets {
|
||||
|
||||
@@ -58,7 +58,7 @@ func TestCompareVersions(t *testing.T) {
|
||||
}
|
||||
|
||||
func TestErrorRelease(t *testing.T) {
|
||||
_, err := SelectLatestRelease("v0.11.0-beta", nil)
|
||||
_, err := SelectLatestRelease(nil, "v0.11.0-beta", false)
|
||||
if err == nil {
|
||||
t.Error("Should return an error when no release were available")
|
||||
}
|
||||
@@ -66,22 +66,25 @@ func TestErrorRelease(t *testing.T) {
|
||||
|
||||
func TestSelectedRelease(t *testing.T) {
|
||||
testcases := []struct {
|
||||
current string
|
||||
candidates []string
|
||||
selected string
|
||||
current string
|
||||
upgradeToPre bool
|
||||
candidates []string
|
||||
selected string
|
||||
}{
|
||||
// Within the same "major" (minor, in this case) select the newest
|
||||
{"v0.12.24", []string{"v0.12.23", "v0.12.24", "v0.12.25", "v0.12.26"}, "v0.12.26"},
|
||||
// Do no select beta versions when we are not a beta
|
||||
{"v0.12.24", []string{"v0.12.26", "v0.12.27-beta.42"}, "v0.12.26"},
|
||||
// Do select beta versions when we are a beta
|
||||
{"v0.12.24-beta.0", []string{"v0.12.26", "v0.12.27-beta.42"}, "v0.12.27-beta.42"},
|
||||
{"v0.12.24", false, []string{"v0.12.23", "v0.12.24", "v0.12.25", "v0.12.26"}, "v0.12.26"},
|
||||
// Do no select beta versions when we are not allowed to
|
||||
{"v0.12.24", false, []string{"v0.12.26", "v0.12.27-beta.42"}, "v0.12.26"},
|
||||
{"v0.12.24-beta.0", false, []string{"v0.12.26", "v0.12.27-beta.42"}, "v0.12.26"},
|
||||
// Do select beta versions when we can
|
||||
{"v0.12.24", true, []string{"v0.12.26", "v0.12.27-beta.42"}, "v0.12.27-beta.42"},
|
||||
{"v0.12.24-beta.0", true, []string{"v0.12.26", "v0.12.27-beta.42"}, "v0.12.27-beta.42"},
|
||||
// Select the best within the current major when there is a minor upgrade available
|
||||
{"v0.12.24", []string{"v0.12.23", "v0.12.24", "v0.12.25", "v0.13.0"}, "v0.12.25"},
|
||||
{"v1.12.24", []string{"v1.12.23", "v1.12.24", "v1.14.2", "v2.0.0"}, "v1.14.2"},
|
||||
{"v0.12.24", false, []string{"v0.12.23", "v0.12.24", "v0.12.25", "v0.13.0"}, "v0.12.25"},
|
||||
{"v1.12.24", false, []string{"v1.12.23", "v1.12.24", "v1.14.2", "v2.0.0"}, "v1.14.2"},
|
||||
// Select the next major when we are at the best minor
|
||||
{"v0.12.25", []string{"v0.12.23", "v0.12.24", "v0.12.25", "v0.13.0"}, "v0.13.0"},
|
||||
{"v1.14.2", []string{"v0.12.23", "v0.12.24", "v1.14.2", "v2.0.0"}, "v2.0.0"},
|
||||
{"v0.12.25", true, []string{"v0.12.23", "v0.12.24", "v0.12.25", "v0.13.0"}, "v0.13.0"},
|
||||
{"v1.14.2", true, []string{"v0.12.23", "v0.12.24", "v1.14.2", "v2.0.0"}, "v2.0.0"},
|
||||
}
|
||||
|
||||
for i, tc := range testcases {
|
||||
@@ -99,7 +102,7 @@ func TestSelectedRelease(t *testing.T) {
|
||||
}
|
||||
|
||||
// Check the selection
|
||||
sel, err := SelectLatestRelease(tc.current, rels)
|
||||
sel, err := SelectLatestRelease(rels, tc.current, tc.upgradeToPre)
|
||||
if err != nil {
|
||||
t.Fatal("Unexpected error:", err)
|
||||
}
|
||||
|
||||
@@ -18,6 +18,6 @@ func upgradeToURL(archiveName, binary, url string) error {
|
||||
return ErrUpgradeUnsupported
|
||||
}
|
||||
|
||||
func LatestRelease(releasesURL, version string) (Release, error) {
|
||||
func LatestRelease(releasesURL, current string, upgradeToPreRelease bool) (Release, error) {
|
||||
return Release{}, ErrUpgradeUnsupported
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user