diff --git a/changelog/unreleased/issue-2491 b/changelog/unreleased/issue-2491 new file mode 100644 index 000000000..ed1dbdac6 --- /dev/null +++ b/changelog/unreleased/issue-2491 @@ -0,0 +1,9 @@ +Bugfix: Don't require `self-update --output` placeholder file + +`restic self-update --output /path/to/new-restic` used to require that +new-restic was an existing file, to be overwritten. Now it's possible +to download an updated restic binary to a new path, without first +having to create a placeholder file. + +https://github.com/restic/restic/issues/2491 +https://github.com/restic/restic/pull/2937 diff --git a/cmd/restic/cmd_self_update.go b/cmd/restic/cmd_self_update.go index 310c5100f..f71bdf16b 100644 --- a/cmd/restic/cmd_self_update.go +++ b/cmd/restic/cmd_self_update.go @@ -4,6 +4,7 @@ package main import ( "os" + "path/filepath" "github.com/restic/restic/internal/errors" "github.com/restic/restic/internal/selfupdate" @@ -56,11 +57,18 @@ func runSelfUpdate(opts SelfUpdateOptions, gopts GlobalOptions, args []string) e fi, err := os.Lstat(opts.Output) if err != nil { - return err - } - - if !fi.Mode().IsRegular() { - return errors.Errorf("output file %v is not a normal file, use --output to specify a different file", opts.Output) + dirname := filepath.Dir(opts.Output) + di, err := os.Lstat(dirname) + if err != nil { + return err + } + if !di.Mode().IsDir() { + return errors.Fatalf("output parent path %v is not a directory, use --output to specify a different file path", dirname) + } + } else { + if !fi.Mode().IsRegular() { + return errors.Fatalf("output path %v is not a normal file, use --output to specify a different file path", opts.Output) + } } Printf("writing restic to %v\n", opts.Output)