diff --git a/client.go b/client.go index 57e089d..05cc9f3 100644 --- a/client.go +++ b/client.go @@ -279,14 +279,18 @@ func (c *Client) Copy(ctx context.Context, name, dest string, options *CopyOptio } // Move moves a file. -func (c *Client) Move(ctx context.Context, name, dest string, overwrite bool) error { +func (c *Client) Move(ctx context.Context, name, dest string, options *MoveOptions) error { + if options == nil { + options = new(MoveOptions) + } + req, err := c.ic.NewRequest("MOVE", name, nil) if err != nil { return err } req.Header.Set("Destination", c.ic.ResolveHref(dest).String()) - req.Header.Set("Overwrite", internal.FormatOverwrite(overwrite)) + req.Header.Set("Overwrite", internal.FormatOverwrite(!options.NoOverwrite)) resp, err := c.ic.Do(req.WithContext(ctx)) if err != nil { diff --git a/fs_local.go b/fs_local.go index b5a41da..201ae93 100644 --- a/fs_local.go +++ b/fs_local.go @@ -214,7 +214,7 @@ func (fs LocalFileSystem) Copy(ctx context.Context, src, dst string, options *Co return created, nil } -func (fs LocalFileSystem) Move(ctx context.Context, src, dst string, overwrite bool) (created bool, err error) { +func (fs LocalFileSystem) Move(ctx context.Context, src, dst string, options *MoveOptions) (created bool, err error) { srcPath, err := fs.localPath(src) if err != nil { return false, err @@ -230,7 +230,7 @@ func (fs LocalFileSystem) Move(ctx context.Context, src, dst string, overwrite b } created = true } else { - if !overwrite { + if options.NoOverwrite { return false, os.ErrExist } if err := os.RemoveAll(dstPath); err != nil { diff --git a/server.go b/server.go index 8b93808..3eeeb20 100644 --- a/server.go +++ b/server.go @@ -21,7 +21,7 @@ type FileSystem interface { RemoveAll(ctx context.Context, name string) error Mkdir(ctx context.Context, name string) error Copy(ctx context.Context, name, dest string, options *CopyOptions) (created bool, err error) - Move(ctx context.Context, name, dest string, overwrite bool) (created bool, err error) + Move(ctx context.Context, name, dest string, options *MoveOptions) (created bool, err error) } // Handler handles WebDAV HTTP requests. It can be used to create a WebDAV @@ -243,7 +243,10 @@ func (b *backend) Copy(r *http.Request, dest *internal.Href, recursive, overwrit } func (b *backend) Move(r *http.Request, dest *internal.Href, overwrite bool) (created bool, err error) { - created, err = b.FileSystem.Move(r.Context(), r.URL.Path, dest.Path, overwrite) + options := MoveOptions{ + NoOverwrite: !overwrite, + } + created, err = b.FileSystem.Move(r.Context(), r.URL.Path, dest.Path, &options) if os.IsExist(err) { return false, &internal.HTTPError{http.StatusPreconditionFailed, err} } diff --git a/webdav.go b/webdav.go index 73a9c7f..a3d1d77 100644 --- a/webdav.go +++ b/webdav.go @@ -21,3 +21,7 @@ type CopyOptions struct { NoRecursive bool NoOverwrite bool } + +type MoveOptions struct { + NoOverwrite bool +}