Implement manual -upgrade-to option
This commit is contained in:
@@ -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<b and 0 if they are equal
|
||||
func CompareVersions(a, b string) int {
|
||||
arel, apre := versionParts(a)
|
||||
|
||||
@@ -80,28 +80,33 @@ func upgradeTo(binary string, rel Release) error {
|
||||
}
|
||||
|
||||
if strings.HasPrefix(assetName, expectedRelease) {
|
||||
fname, err := readRelease(filepath.Dir(binary), asset.URL)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
old := binary + ".old"
|
||||
_ = os.Remove(old)
|
||||
err = os.Rename(binary, old)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
err = os.Rename(fname, binary)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
return nil
|
||||
upgradeToURL(binary, asset.URL)
|
||||
}
|
||||
}
|
||||
|
||||
return ErrVersionUnknown
|
||||
}
|
||||
|
||||
// Upgrade to the given release, saving the previous binary with a ".old" extension.
|
||||
func upgradeToURL(binary string, url string) error {
|
||||
fname, err := readRelease(filepath.Dir(binary), url)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
old := binary + ".old"
|
||||
_ = os.Remove(old)
|
||||
err = os.Rename(binary, old)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
err = os.Rename(fname, binary)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func readRelease(dir, url string) (string, error) {
|
||||
if debug {
|
||||
l.Debugf("loading %q", url)
|
||||
|
||||
@@ -17,7 +17,11 @@
|
||||
|
||||
package upgrade
|
||||
|
||||
func upgradeTo(path string, rel Release) error {
|
||||
func upgradeTo(binary string, rel Release) error {
|
||||
return ErrUpgradeUnsupported
|
||||
}
|
||||
|
||||
func upgradeToURL(binary, url string) error {
|
||||
return ErrUpgradeUnsupported
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user