From cde8ef56e561153cbb56f8d9454d740577c94d69 Mon Sep 17 00:00:00 2001 From: Jakob Borg Date: Mon, 22 Dec 2014 12:07:04 +0100 Subject: [PATCH] Implement manual -upgrade-to option --- cmd/syncthing/main.go | 11 ++++++++ internal/upgrade/upgrade_common.go | 20 +++++++++++++++ internal/upgrade/upgrade_supported.go | 37 +++++++++++++++------------ internal/upgrade/upgrade_unsupp.go | 6 ++++- 4 files changed, 57 insertions(+), 17 deletions(-) diff --git a/cmd/syncthing/main.go b/cmd/syncthing/main.go index b81d83cd..8dace043 100644 --- a/cmd/syncthing/main.go +++ b/cmd/syncthing/main.go @@ -182,6 +182,7 @@ var ( showVersion bool doUpgrade bool doUpgradeCheck bool + upgradeTo string noBrowser bool noConsole bool generateDir string @@ -227,6 +228,7 @@ func main() { flag.BoolVar(&doUpgrade, "upgrade", false, "Perform upgrade") flag.BoolVar(&doUpgradeCheck, "upgrade-check", false, "Check for available upgrade") flag.BoolVar(&showVersion, "version", false, "Show version") + flag.StringVar(&upgradeTo, "upgrade-to", upgradeTo, "Force upgrade directly from specified URL") flag.Usage = usageFor(flag.CommandLine, usage, fmt.Sprintf(extraUsage, defConfDir)) flag.Parse() @@ -315,6 +317,15 @@ func main() { // Ensure that our home directory exists. ensureDir(confDir, 0700) + if upgradeTo != "" { + err := upgrade.ToURL(upgradeTo) + if err != nil { + l.Fatalln("Upgrade:", err) // exits 1 + } + l.Okln("Upgraded from", upgradeTo) + return + } + if doUpgrade || doUpgradeCheck { rel, err := upgrade.LatestRelease(IsBeta) if err != nil { diff --git a/internal/upgrade/upgrade_common.go b/internal/upgrade/upgrade_common.go index 5ad69754..d447eef1 100644 --- a/internal/upgrade/upgrade_common.go +++ b/internal/upgrade/upgrade_common.go @@ -67,6 +67,26 @@ func To(rel Release) error { } } +// A wrapper around actual implementations +func ToURL(url string) error { + select { + case <-upgradeUnlocked: + path, err := osext.Executable() + if err != nil { + upgradeUnlocked <- true + return err + } + err = upgradeToURL(path, url) + // If we've failed to upgrade, unlock so that another attempt could be made + if err != nil { + upgradeUnlocked <- true + } + return err + default: + return ErrUpgradeInProgress + } +} + // Returns 1 if a>b, -1 if a