forked from TrueCloudLab/rclone
storj: implement server side Copy
This commit is contained in:
parent
beea4d5119
commit
b98d7f6634
2 changed files with 42 additions and 1 deletions
|
@ -160,6 +160,7 @@ var (
|
||||||
_ fs.ListRer = &Fs{}
|
_ fs.ListRer = &Fs{}
|
||||||
_ fs.PutStreamer = &Fs{}
|
_ fs.PutStreamer = &Fs{}
|
||||||
_ fs.Mover = &Fs{}
|
_ fs.Mover = &Fs{}
|
||||||
|
_ fs.Copier = &Fs{}
|
||||||
)
|
)
|
||||||
|
|
||||||
// NewFs creates a filesystem backed by Storj.
|
// NewFs creates a filesystem backed by Storj.
|
||||||
|
@ -720,3 +721,43 @@ func (f *Fs) Move(ctx context.Context, src fs.Object, remote string) (fs.Object,
|
||||||
// Read the new object
|
// Read the new object
|
||||||
return f.NewObject(ctx, remote)
|
return f.NewObject(ctx, remote)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Copy src to this remote using server-side copy operations.
|
||||||
|
//
|
||||||
|
// This is stored with the remote path given.
|
||||||
|
//
|
||||||
|
// It returns the destination Object and a possible error.
|
||||||
|
//
|
||||||
|
// Will only be called if src.Fs().Name() == f.Name()
|
||||||
|
//
|
||||||
|
// If it isn't possible then return fs.ErrorCantCopy
|
||||||
|
func (f *Fs) Copy(ctx context.Context, src fs.Object, remote string) (fs.Object, error) {
|
||||||
|
srcObj, ok := src.(*Object)
|
||||||
|
if !ok {
|
||||||
|
fs.Debugf(src, "Can't copy - not same remote type")
|
||||||
|
return nil, fs.ErrorCantCopy
|
||||||
|
}
|
||||||
|
|
||||||
|
// Copy parameters
|
||||||
|
srcBucket, srcKey := bucket.Split(srcObj.absolute)
|
||||||
|
dstBucket, dstKey := f.absolute(remote)
|
||||||
|
options := uplink.CopyObjectOptions{}
|
||||||
|
|
||||||
|
// Do the copy
|
||||||
|
newObject, err := f.project.CopyObject(ctx, srcBucket, srcKey, dstBucket, dstKey, &options)
|
||||||
|
if err != nil {
|
||||||
|
// Make sure destination bucket exists
|
||||||
|
_, err := f.project.EnsureBucket(ctx, dstBucket)
|
||||||
|
if err != nil {
|
||||||
|
return nil, fmt.Errorf("copy object failed to create destination bucket: %w", err)
|
||||||
|
}
|
||||||
|
// And try again
|
||||||
|
newObject, err = f.project.CopyObject(ctx, srcBucket, srcKey, dstBucket, dstKey, &options)
|
||||||
|
if err != nil {
|
||||||
|
return nil, fmt.Errorf("copy object failed: %w", err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Return the new object
|
||||||
|
return newObjectFromUplink(f, remote, newObject), nil
|
||||||
|
}
|
||||||
|
|
|
@ -504,7 +504,7 @@ upon backend-specific capabilities.
|
||||||
| Sia | No | No | No | No | No | No | Yes | No | No | Yes |
|
| Sia | No | No | No | No | No | No | Yes | No | No | Yes |
|
||||||
| SMB | No | No | Yes | Yes | No | No | Yes | No | No | Yes |
|
| SMB | No | No | Yes | Yes | No | No | Yes | No | No | Yes |
|
||||||
| SugarSync | Yes | Yes | Yes | Yes | No | No | Yes | Yes | No | Yes |
|
| SugarSync | Yes | Yes | Yes | Yes | No | No | Yes | Yes | No | Yes |
|
||||||
| Storj | Yes † | No | Yes | No | No | Yes | Yes | No | No | No |
|
| Storj | Yes † | Yes | Yes | No | No | Yes | Yes | No | No | No |
|
||||||
| Uptobox | No | Yes | Yes | Yes | No | No | No | No | No | No |
|
| Uptobox | No | Yes | Yes | Yes | No | No | No | No | No | No |
|
||||||
| WebDAV | Yes | Yes | Yes | Yes | No | No | Yes ‡ | No | Yes | Yes |
|
| WebDAV | Yes | Yes | Yes | Yes | No | No | Yes ‡ | No | Yes | Yes |
|
||||||
| Yandex Disk | Yes | Yes | Yes | Yes | Yes | No | Yes | Yes | Yes | Yes |
|
| Yandex Disk | Yes | Yes | Yes | Yes | Yes | No | Yes | Yes | Yes | Yes |
|
||||||
|
|
Loading…
Add table
Reference in a new issue