diff --git a/fs/operations/operations.go b/fs/operations/operations.go index 13c3794b3..c9a331702 100644 --- a/fs/operations/operations.go +++ b/fs/operations/operations.go @@ -2628,11 +2628,15 @@ func SetDirModTime(ctx context.Context, f fs.Fs, dst fs.Directory, dir string, m if dst != nil { if do, ok := dst.(fs.SetModTimer); ok { err := do.SetModTime(ctx, modTime) - if err != nil { + if errors.Is(err, fs.ErrorNotImplemented) { + // Fall through and run the code below if not implemented + // This can happen for fs.DirWrapper instances + } else if err != nil { return dst, err + } else { + fs.Infof(logName, "Set directory modification time (using SetModTime)") + return dst, nil } - fs.Infof(logName, "Set directory modification time (using SetModTime)") - return dst, nil } } diff --git a/fs/operations/operations_test.go b/fs/operations/operations_test.go index 9bba6ffff..d14678f13 100644 --- a/fs/operations/operations_test.go +++ b/fs/operations/operations_test.go @@ -1787,6 +1787,13 @@ func TestSetDirModTime(t *testing.T) { fstest.CheckDirModTime(ctx, t, r.Fremote, newDst, t2) } fstest.CheckDirModTime(ctx, t, r.Fremote, fstest.NewDirectory(ctx, t, r.Fremote, name), t2) + + // Now wrap the directory to make the SetModTime method return fs.ErrorNotImplemented and check that it falls back correctly + wrappedDir := fs.NewDirWrapper(existingDir.Remote(), fs.NewDir(existingDir.Remote(), existingDir.ModTime(ctx))) + newDst, err = operations.SetDirModTime(ctx, r.Fremote, wrappedDir, "SHOULD BE IGNORED", t1) + require.NoError(t, err) + require.NotNil(t, newDst) + fstest.CheckDirModTime(ctx, t, r.Fremote, fstest.NewDirectory(ctx, t, r.Fremote, name), t1) } func TestDirsEqual(t *testing.T) {