mirror of
https://github.com/1f349/go-webdav.git
synced 2024-12-22 08:14:15 +00:00
webdav: introduce CopyOptions
This commit is contained in:
parent
b043bbd965
commit
4493704689
20
client.go
20
client.go
@ -247,16 +247,28 @@ func (c *Client) Mkdir(ctx context.Context, name string) error {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// CopyAll copies a file. If the file is a directory, all of its descendants
|
// Copy copies a file.
|
||||||
// are recursively copied as well.
|
//
|
||||||
func (c *Client) CopyAll(ctx context.Context, name, dest string, overwrite bool) error {
|
// By default, if the file is a directory, all descendants are recursively
|
||||||
|
// copied as well.
|
||||||
|
func (c *Client) Copy(ctx context.Context, name, dest string, options *CopyOptions) error {
|
||||||
|
if options == nil {
|
||||||
|
options = new(CopyOptions)
|
||||||
|
}
|
||||||
|
|
||||||
req, err := c.ic.NewRequest("COPY", name, nil)
|
req, err := c.ic.NewRequest("COPY", name, nil)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
depth := internal.DepthInfinity
|
||||||
|
if options.NoRecursive {
|
||||||
|
depth = internal.DepthZero
|
||||||
|
}
|
||||||
|
|
||||||
req.Header.Set("Destination", c.ic.ResolveHref(dest).String())
|
req.Header.Set("Destination", c.ic.ResolveHref(dest).String())
|
||||||
req.Header.Set("Overwrite", internal.FormatOverwrite(overwrite))
|
req.Header.Set("Overwrite", internal.FormatOverwrite(!options.NoOverwrite))
|
||||||
|
req.Header.Set("Depth", depth.String())
|
||||||
|
|
||||||
resp, err := c.ic.Do(req.WithContext(ctx))
|
resp, err := c.ic.Do(req.WithContext(ctx))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -154,7 +154,7 @@ func copyRegularFile(src, dst string, perm os.FileMode) error {
|
|||||||
return dstFile.Close()
|
return dstFile.Close()
|
||||||
}
|
}
|
||||||
|
|
||||||
func (fs LocalFileSystem) Copy(ctx context.Context, src, dst string, recursive, overwrite bool) (created bool, err error) {
|
func (fs LocalFileSystem) Copy(ctx context.Context, src, dst string, options *CopyOptions) (created bool, err error) {
|
||||||
srcPath, err := fs.localPath(src)
|
srcPath, err := fs.localPath(src)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return false, err
|
return false, err
|
||||||
@ -179,7 +179,7 @@ func (fs LocalFileSystem) Copy(ctx context.Context, src, dst string, recursive,
|
|||||||
}
|
}
|
||||||
created = true
|
created = true
|
||||||
} else {
|
} else {
|
||||||
if !overwrite {
|
if options.NoOverwrite {
|
||||||
return false, os.ErrExist
|
return false, os.ErrExist
|
||||||
}
|
}
|
||||||
if err := os.RemoveAll(dstPath); err != nil {
|
if err := os.RemoveAll(dstPath); err != nil {
|
||||||
@ -202,7 +202,7 @@ func (fs LocalFileSystem) Copy(ctx context.Context, src, dst string, recursive,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if fi.IsDir() && !recursive {
|
if fi.IsDir() && options.NoRecursive {
|
||||||
return filepath.SkipDir
|
return filepath.SkipDir
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
|
@ -20,7 +20,7 @@ type FileSystem interface {
|
|||||||
Create(ctx context.Context, name string) (io.WriteCloser, error)
|
Create(ctx context.Context, name string) (io.WriteCloser, error)
|
||||||
RemoveAll(ctx context.Context, name string) error
|
RemoveAll(ctx context.Context, name string) error
|
||||||
Mkdir(ctx context.Context, name string) error
|
Mkdir(ctx context.Context, name string) error
|
||||||
Copy(ctx context.Context, name, dest string, recursive, overwrite bool) (created bool, err error)
|
Copy(ctx context.Context, name, dest string, options *CopyOptions) (created bool, err error)
|
||||||
MoveAll(ctx context.Context, name, dest string, overwrite bool) (created bool, err error)
|
MoveAll(ctx context.Context, name, dest string, overwrite bool) (created bool, err error)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -231,7 +231,11 @@ func (b *backend) Mkcol(r *http.Request) error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (b *backend) Copy(r *http.Request, dest *internal.Href, recursive, overwrite bool) (created bool, err error) {
|
func (b *backend) Copy(r *http.Request, dest *internal.Href, recursive, overwrite bool) (created bool, err error) {
|
||||||
created, err = b.FileSystem.Copy(r.Context(), r.URL.Path, dest.Path, recursive, overwrite)
|
options := CopyOptions{
|
||||||
|
NoRecursive: !recursive,
|
||||||
|
NoOverwrite: !overwrite,
|
||||||
|
}
|
||||||
|
created, err = b.FileSystem.Copy(r.Context(), r.URL.Path, dest.Path, &options)
|
||||||
if os.IsExist(err) {
|
if os.IsExist(err) {
|
||||||
return false, &internal.HTTPError{http.StatusPreconditionFailed, err}
|
return false, &internal.HTTPError{http.StatusPreconditionFailed, err}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user