From 0ca44829774627b2a5ea5e76bea6879ec9c221e2 Mon Sep 17 00:00:00 2001 From: Anderson Mesquita Date: Wed, 16 Dec 2015 14:29:37 -0500 Subject: [PATCH] Refactor upgrade and check upgrade cmdline options The main() function is growing too big (142 lines as of the date of this commit), so this attempts to extract some functionality out of there and into their own functions to make it easier to reason about them and keep functions short and concise. --- cmd/syncthing/main.go | 83 ++++++++++++++++++++++++------------------- 1 file changed, 47 insertions(+), 36 deletions(-) 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 {