mirror of
https://github.com/cupcakearmy/autorestic.git
synced 2024-12-22 08:16:25 +00:00
refactor downloading of binaries
* If `/tmp` is a `tmpfs` or somehow not the same filesystem, `os.Rename()` will fail so use `io.Copy()` instead * don't defer cleanup of `to` as this removes the newly-created file if the operation is successful, making `install` and `upgrade` _functionally_ `uninstall` * defer cleanup of the temporary file since it will still be in place if `os.Rename()` fails Fixes: #130
This commit is contained in:
parent
e055e28cfe
commit
389f7c25dd
@ -87,9 +87,23 @@ func downloadAndInstallAsset(body GithubRelease, name string) error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
to := path.Join(INSTALL_PATH, name)
|
to := path.Join(INSTALL_PATH, name)
|
||||||
defer os.Remove(to) // Delete if current, ignore error if file does not exits.
|
defer os.Remove(tmp.Name()) // Cleanup temporary file after thread exits
|
||||||
if err := os.Rename(tmp.Name(), to); err != nil {
|
if err := os.Rename(tmp.Name(), to); err != nil {
|
||||||
return nil
|
colors.Error.Printf("os.Rename() failed (%v), retrying with io.Copy()\n", err.Error())
|
||||||
|
var src *os.File
|
||||||
|
var dst *os.File
|
||||||
|
if src, err = os.Open(tmp.Name()); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if dst, err = os.Create(to); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if _, err := io.Copy(dst, src); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if err := os.Chmod(to, 0755); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
colors.Success.Printf("Successfully installed '%s' under %s\n", name, INSTALL_PATH)
|
colors.Success.Printf("Successfully installed '%s' under %s\n", name, INSTALL_PATH)
|
||||||
|
Loading…
Reference in New Issue
Block a user