diff --git a/cmd/stupgrades/main.go b/cmd/stupgrades/main.go new file mode 100644 index 000000000..429f026e3 --- /dev/null +++ b/cmd/stupgrades/main.go @@ -0,0 +1,57 @@ +// Copyright (C) 2019 The Syncthing Authors. +// +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this file, +// You can obtain one at https://mozilla.org/MPL/2.0/. + +package main + +import ( + "encoding/json" + "flag" + "os" + "sort" + + "github.com/syncthing/syncthing/lib/upgrade" +) + +const defaultURL = "https://api.github.com/repos/syncthing/syncthing/releases?per_page=25" + +func main() { + url := flag.String("u", defaultURL, "GitHub releases url") + flag.Parse() + + rels := upgrade.FetchLatestReleases(*url, "") + if rels == nil { + // An error was already logged + os.Exit(1) + } + + sort.Sort(upgrade.SortByRelease(rels)) + rels = filterForLatest(rels) + + if err := json.NewEncoder(os.Stdout).Encode(rels); err != nil { + os.Exit(1) + } +} + +// filterForLatest returns the latest stable and prerelease only. If the +// stable version is newer (comes first in the list) there is no need to go +// looking for a prerelease at all. +func filterForLatest(rels []upgrade.Release) []upgrade.Release { + var filtered []upgrade.Release + var havePre bool + for _, rel := range rels { + if !rel.Prerelease { + // We found a stable version, we're good now. + filtered = append(filtered, rel) + break + } + if rel.Prerelease && !havePre { + // We remember the first prerelease we find. + filtered = append(filtered, rel) + havePre = true + } + } + return filtered +}