forked from TrueCloudLab/restic
Merge pull request #4163 from MichaelEischer/fix-windows-self-upgrade
self-upgrade: Fix handling of `--output` on windows
This commit is contained in:
commit
bb018fbc3e
3 changed files with 63 additions and 0 deletions
12
changelog/unreleased/pull-4163
Normal file
12
changelog/unreleased/pull-4163
Normal file
|
@ -0,0 +1,12 @@
|
||||||
|
Bugfix: Repair `self-update --output new-file.exe` on Windows
|
||||||
|
|
||||||
|
Since restic 0.14.0 `self-update` did not work when a custom output filename
|
||||||
|
was specified via the `--output` option. This has been fixed.
|
||||||
|
|
||||||
|
As a workaround either use an older restic version to run the self-update or
|
||||||
|
create an empty file with the output filename before updating e.g. using CMD:
|
||||||
|
`type nul > new-file.exe`
|
||||||
|
`restic self-update --output new-file.exe`
|
||||||
|
|
||||||
|
https://github.com/restic/restic/pull/4163
|
||||||
|
https://forum.restic.net/t/self-update-windows-started-failing-after-release-of-0-15/5836
|
44
internal/selfupdate/download_test.go
Normal file
44
internal/selfupdate/download_test.go
Normal file
|
@ -0,0 +1,44 @@
|
||||||
|
package selfupdate
|
||||||
|
|
||||||
|
import (
|
||||||
|
"archive/zip"
|
||||||
|
"bytes"
|
||||||
|
"os"
|
||||||
|
"path/filepath"
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
rtest "github.com/restic/restic/internal/test"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestExtractToFileZip(t *testing.T) {
|
||||||
|
printf := func(string, ...interface{}) {}
|
||||||
|
dir := t.TempDir()
|
||||||
|
|
||||||
|
ext := "zip"
|
||||||
|
data := []byte("Hello World!")
|
||||||
|
|
||||||
|
// create dummy archive
|
||||||
|
var archive bytes.Buffer
|
||||||
|
zw := zip.NewWriter(&archive)
|
||||||
|
w, err := zw.CreateHeader(&zip.FileHeader{
|
||||||
|
Name: "example.exe",
|
||||||
|
UncompressedSize64: uint64(len(data)),
|
||||||
|
})
|
||||||
|
rtest.OK(t, err)
|
||||||
|
_, err = w.Write(data[:])
|
||||||
|
rtest.OK(t, err)
|
||||||
|
rtest.OK(t, zw.Close())
|
||||||
|
|
||||||
|
// run twice to test creating a new file and overwriting
|
||||||
|
for i := 0; i < 2; i++ {
|
||||||
|
outfn := filepath.Join(dir, ext+"-out")
|
||||||
|
rtest.OK(t, extractToFile(archive.Bytes(), "src."+ext, outfn, printf))
|
||||||
|
|
||||||
|
outdata, err := os.ReadFile(outfn)
|
||||||
|
rtest.OK(t, err)
|
||||||
|
rtest.Assert(t, bytes.Equal(data[:], outdata), "%v contains wrong data", outfn)
|
||||||
|
|
||||||
|
// overwrite to test the file is properly overwritten
|
||||||
|
rtest.OK(t, os.WriteFile(outfn, []byte{1, 2, 3}, 0))
|
||||||
|
}
|
||||||
|
}
|
|
@ -7,11 +7,18 @@ import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"os"
|
"os"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
|
|
||||||
|
"github.com/restic/restic/internal/errors"
|
||||||
)
|
)
|
||||||
|
|
||||||
// Rename (rather than remove) the running version. The running binary will be locked
|
// Rename (rather than remove) the running version. The running binary will be locked
|
||||||
// on Windows and cannot be removed while still executing.
|
// on Windows and cannot be removed while still executing.
|
||||||
func removeResticBinary(dir, target string) error {
|
func removeResticBinary(dir, target string) error {
|
||||||
|
// nothing to do if the target does not exist
|
||||||
|
if _, err := os.Stat(target); errors.Is(err, os.ErrNotExist) {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
backup := filepath.Join(dir, filepath.Base(target)+".bak")
|
backup := filepath.Join(dir, filepath.Base(target)+".bak")
|
||||||
if _, err := os.Stat(backup); err == nil {
|
if _, err := os.Stat(backup); err == nil {
|
||||||
_ = os.Remove(backup)
|
_ = os.Remove(backup)
|
||||||
|
|
Loading…
Reference in a new issue