mirror of
https://github.com/rclone/rclone.git
synced 2025-11-23 21:44:49 +02:00
Add context propagation to rclone
- Change rclone/fs interfaces to accept context.Context - Update interface implementations to use context.Context - Change top level usage to propagate context to lover level functions Context propagation is needed for stopping transfers and passing other request-scoped values.
This commit is contained in:
committed by
Nick Craig-Wood
parent
a2c317b46e
commit
f78cd1e043
@@ -5,6 +5,7 @@ package fstest
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"context"
|
||||
"flag"
|
||||
"fmt"
|
||||
"io"
|
||||
@@ -127,7 +128,7 @@ func (i *Item) CheckHashes(t *testing.T, obj fs.Object) {
|
||||
types := obj.Fs().Hashes().Array()
|
||||
for _, Hash := range types {
|
||||
// Check attributes
|
||||
sum, err := obj.Hash(Hash)
|
||||
sum, err := obj.Hash(context.Background(), Hash)
|
||||
require.NoError(t, err)
|
||||
assert.True(t, hash.Equals(i.Hashes[Hash], sum), fmt.Sprintf("%s/%s: %v hash incorrect - expecting %q got %q", obj.Fs().String(), obj.Remote(), Hash, i.Hashes[Hash], sum))
|
||||
}
|
||||
@@ -137,7 +138,7 @@ func (i *Item) CheckHashes(t *testing.T, obj fs.Object) {
|
||||
func (i *Item) Check(t *testing.T, obj fs.Object, precision time.Duration) {
|
||||
i.CheckHashes(t, obj)
|
||||
assert.Equal(t, i.Size, obj.Size(), fmt.Sprintf("%s: size incorrect file=%d vs obj=%d", i.Path, i.Size, obj.Size()))
|
||||
i.CheckModTime(t, obj, obj.ModTime(), precision)
|
||||
i.CheckModTime(t, obj, obj.ModTime(context.Background()), precision)
|
||||
}
|
||||
|
||||
// WinPath converts a path into a windows safe path
|
||||
@@ -282,8 +283,9 @@ func CheckListingWithPrecision(t *testing.T, f fs.Fs, items []Item, expectedDirs
|
||||
wantListing1, wantListing2 := makeListingFromItems(items)
|
||||
gotListing := "<unset>"
|
||||
listingOK := false
|
||||
ctx := context.Background()
|
||||
for i := 1; i <= retries; i++ {
|
||||
objs, dirs, err = walk.GetAll(f, "", true, -1)
|
||||
objs, dirs, err = walk.GetAll(ctx, f, "", true, -1)
|
||||
if err != nil && err != fs.ErrorDirNotFound {
|
||||
t.Fatalf("Error listing: %v", err)
|
||||
}
|
||||
@@ -456,23 +458,24 @@ func RandomRemote(remoteName string, subdir bool) (fs.Fs, string, func(), error)
|
||||
//
|
||||
// It logs errors rather than returning them
|
||||
func Purge(f fs.Fs) {
|
||||
ctx := context.Background()
|
||||
var err error
|
||||
doFallbackPurge := true
|
||||
if doPurge := f.Features().Purge; doPurge != nil {
|
||||
doFallbackPurge = false
|
||||
fs.Debugf(f, "Purge remote")
|
||||
err = doPurge()
|
||||
err = doPurge(ctx)
|
||||
if err == fs.ErrorCantPurge {
|
||||
doFallbackPurge = true
|
||||
}
|
||||
}
|
||||
if doFallbackPurge {
|
||||
dirs := []string{""}
|
||||
err = walk.ListR(f, "", true, -1, walk.ListAll, func(entries fs.DirEntries) error {
|
||||
err = walk.ListR(ctx, f, "", true, -1, walk.ListAll, func(entries fs.DirEntries) error {
|
||||
var err error
|
||||
entries.ForObject(func(obj fs.Object) {
|
||||
fs.Debugf(f, "Purge object %q", obj.Remote())
|
||||
err = obj.Remove()
|
||||
err = obj.Remove(ctx)
|
||||
if err != nil {
|
||||
log.Printf("purge failed to remove %q: %v", obj.Remote(), err)
|
||||
}
|
||||
@@ -486,7 +489,7 @@ func Purge(f fs.Fs) {
|
||||
for i := len(dirs) - 1; i >= 0; i-- {
|
||||
dir := dirs[i]
|
||||
fs.Debugf(f, "Purge dir %q", dir)
|
||||
err := f.Rmdir(dir)
|
||||
err := f.Rmdir(ctx, dir)
|
||||
if err != nil {
|
||||
log.Printf("purge failed to rmdir %q: %v", dir, err)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user