operations: fix move when dst is nil and fdst is case-insensitive

Before this change, the MoveCaseInsensitive logic in operations.move made the
assumption that dst != nil && remote != "". After this change, it should work
correctly when either one is present without the other.
This commit is contained in:
nielash 2024-04-11 14:52:33 -04:00 committed by Nick Craig-Wood
parent f2e693f722
commit 5323a21898

View File

@ -446,6 +446,7 @@ func move(ctx context.Context, fdst fs.Fs, dst fs.Object, remote string, src fs.
if doMove := fdst.Features().Move; doMove != nil && (SameConfig(src.Fs(), fdst) || (SameRemoteType(src.Fs(), fdst) && (fdst.Features().ServerSideAcrossConfigs || ci.ServerSideAcrossConfigs))) {
// Delete destination if it exists and is not the same file as src (could be same file while seemingly different if the remote is case insensitive)
if dst != nil {
remote = dst.Remote()
if !SameObject(src, dst) {
err = DeleteFile(ctx, dst)
if err != nil {
@ -456,6 +457,10 @@ func move(ctx context.Context, fdst fs.Fs, dst fs.Object, remote string, src fs.
return MoveCaseInsensitive(ctx, fdst, fdst, remote, src.Remote(), false, src)
}
}
} else if needsMoveCaseInsensitive(fdst, fdst, remote, src.Remote(), false) {
doMove = func(ctx context.Context, src fs.Object, remote string) (fs.Object, error) {
return MoveCaseInsensitive(ctx, fdst, fdst, remote, src.Remote(), false, src)
}
}
// Move dst <- src
in := tr.Account(ctx, nil) // account the transfer