diff --git a/cmd/syncthing/main.go b/cmd/syncthing/main.go index cdd1d18e6..27bf9dae3 100644 --- a/cmd/syncthing/main.go +++ b/cmd/syncthing/main.go @@ -305,43 +305,14 @@ func main() { return } - if doUpgrade || doUpgradeCheck { - releasesURL := "https://api.github.com/repos/syncthing/syncthing/releases?per_page=30" - if cfg, _, err := loadConfig(locations[locConfigFile]); err == nil { - releasesURL = cfg.Options().ReleasesURL - } - rel, err := upgrade.LatestRelease(releasesURL, Version) - if err != nil { - l.Fatalln("Upgrade:", err) // exits 1 - } - - if upgrade.CompareVersions(rel.Tag, Version) <= 0 { - l.Infof("No upgrade available (current %q >= latest %q).", Version, rel.Tag) - os.Exit(exitNoUpgradeAvailable) - } - - l.Infof("Upgrade available (current %q < latest %q)", Version, rel.Tag) - - if doUpgrade { - // Use leveldb database locks to protect against concurrent upgrades - _, err = db.Open(locations[locDatabase]) - if err != nil { - l.Infoln("Attempting upgrade through running Syncthing...") - err = upgradeViaRest() - if err != nil { - l.Fatalln("Upgrade:", err) - } - l.Okln("Syncthing upgrading") - return - } - - err = upgrade.To(rel) - if err != nil { - l.Fatalln("Upgrade:", err) // exits 1 - } - l.Okf("Upgraded to %q", rel.Tag) - } + if doUpgradeCheck { + checkUpgrade() + return + } + if doUpgrade { + release := checkUpgrade() + performUpgrade(release) return } @@ -429,6 +400,46 @@ func debugFacilities() string { return b.String() } +func checkUpgrade() upgrade.Release { + releasesURL := "https://api.github.com/repos/syncthing/syncthing/releases?per_page=30" + if cfg, _, err := loadConfig(locations[locConfigFile]); err == nil { + releasesURL = cfg.Options().ReleasesURL + } + release, err := upgrade.LatestRelease(releasesURL, Version) + if err != nil { + l.Fatalln("Upgrade:", err) + } + + if upgrade.CompareVersions(release.Tag, Version) <= 0 { + noUpgradeMessage := "No upgrade available (current %q >= latest %q)." + l.Infof(noUpgradeMessage, Version, release.Tag) + os.Exit(exitNoUpgradeAvailable) + } + + l.Infof("Upgrade available (current %q < latest %q)", Version, release.Tag) + return release +} + +func performUpgrade(release upgrade.Release) { + // Use leveldb database locks to protect against concurrent upgrades + _, err := db.Open(locations[locDatabase]) + if err == nil { + err = upgrade.To(release) + if err != nil { + l.Fatalln("Upgrade:", err) + } + l.Okf("Upgraded to %q", release.Tag) + } else { + l.Infoln("Attempting upgrade through running Syncthing...") + err = upgradeViaRest() + if err != nil { + l.Fatalln("Upgrade:", err) + } + l.Okln("Syncthing upgrading") + os.Exit(exitUpgrading) + } +} + func upgradeViaRest() error { cfg, err := config.Load(locations[locConfigFile], protocol.LocalDeviceID) if err != nil {