main.go 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. // Copyright (C) 2019 The Syncthing Authors.
  2. //
  3. // This Source Code Form is subject to the terms of the Mozilla Public
  4. // License, v. 2.0. If a copy of the MPL was not distributed with this file,
  5. // You can obtain one at https://mozilla.org/MPL/2.0/.
  6. package main
  7. import (
  8. "encoding/json"
  9. "flag"
  10. "os"
  11. "sort"
  12. "github.com/syncthing/syncthing/lib/upgrade"
  13. )
  14. const defaultURL = "https://api.github.com/repos/syncthing/syncthing/releases?per_page=25"
  15. func main() {
  16. url := flag.String("u", defaultURL, "GitHub releases url")
  17. flag.Parse()
  18. rels := upgrade.FetchLatestReleases(*url, "")
  19. if rels == nil {
  20. // An error was already logged
  21. os.Exit(1)
  22. }
  23. sort.Sort(upgrade.SortByRelease(rels))
  24. rels = filterForLatest(rels)
  25. if err := json.NewEncoder(os.Stdout).Encode(rels); err != nil {
  26. os.Exit(1)
  27. }
  28. }
  29. // filterForLatest returns the latest stable and prerelease only. If the
  30. // stable version is newer (comes first in the list) there is no need to go
  31. // looking for a prerelease at all.
  32. func filterForLatest(rels []upgrade.Release) []upgrade.Release {
  33. var filtered []upgrade.Release
  34. var havePre bool
  35. for _, rel := range rels {
  36. if !rel.Prerelease {
  37. // We found a stable version, we're good now.
  38. filtered = append(filtered, rel)
  39. break
  40. }
  41. if rel.Prerelease && !havePre {
  42. // We remember the first prerelease we find.
  43. filtered = append(filtered, rel)
  44. havePre = true
  45. }
  46. }
  47. return filtered
  48. }