From e59dc81658d77af0538f6fdbc7a8fc4cfb0021ca Mon Sep 17 00:00:00 2001 From: Nick Craig-Wood Date: Wed, 22 Feb 2017 19:28:22 +0000 Subject: [PATCH] Stop --track-renames deleting case folded source files - fixes #1094 What was happening is that when Move was implemented as Copy + Delete, MoveFile was seeing the files didn't need transferring (because they were identical) then deleted the source. The fix uses Move instead and patches onedrive to disallow a case folded identical copy (which errors with 500 error) --- fs/sync.go | 8 +++++++- onedrive/onedrive.go | 4 ++++ 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/fs/sync.go b/fs/sync.go index 0e0fd596b..754badd0a 100644 --- a/fs/sync.go +++ b/fs/sync.go @@ -593,17 +593,23 @@ func (s *syncCopyMove) tryRename(src Object) bool { Stats.Checking(src.Remote()) defer Stats.DoneChecking(src.Remote()) + // Calculate the hash of the src object hash := s.renameHash(src) if hash == "" { return false } + // Get a match on fdst dst := s.popRenameMap(hash) if dst == nil { return false } - err := MoveFile(s.fdst, s.fdst, src.Remote(), dst.Remote()) + // Find dst object we are about to overwrite if it exists + dstOverwritten, _ := s.fdst.NewObject(src.Remote()) + + // Rename dst to have name src.Remote() + err := Move(s.fdst, dstOverwritten, src.Remote(), dst) if err != nil { Debugf(src, "Failed to rename to %q: %v", dst.Remote(), err) return false diff --git a/onedrive/onedrive.go b/onedrive/onedrive.go index ae230763c..c40b9f9d3 100644 --- a/onedrive/onedrive.go +++ b/onedrive/onedrive.go @@ -600,6 +600,10 @@ func (f *Fs) Copy(src fs.Object, remote string) (fs.Object, error) { return nil, err } + if strings.ToLower(srcObj.remote) == strings.ToLower(remote) { + return nil, errors.Errorf("can't copy %q -> %q as are same name when lowercase", srcObj.remote, remote) + } + // Create temporary object dstObj, leaf, directoryID, err := f.createObject(remote, srcObj.modTime, srcObj.size) if err != nil {