From a29af869f820d8181ba9918c80517bd3f7bde7c2 Mon Sep 17 00:00:00 2001 From: Matthieu Gallien Date: Thu, 17 Oct 2024 17:58:37 +0200 Subject: [PATCH] on receiving reply of a remote MOVE: always record it even if local item has disappeared, record the result of a remote MOVE when receiving the reply enable better state tracking when syncing rename or move operations Signed-off-by: Matthieu Gallien --- src/libsync/discovery.cpp | 2 +- src/libsync/propagateremotemove.cpp | 13 ++++--------- 2 files changed, 5 insertions(+), 10 deletions(-) diff --git a/src/libsync/discovery.cpp b/src/libsync/discovery.cpp index 57ef5ef81..e505c2587 100644 --- a/src/libsync/discovery.cpp +++ b/src/libsync/discovery.cpp @@ -1714,7 +1714,7 @@ void ProcessDirectoryJob::processFileFinalize( item->_instruction = CSyncEnums::CSYNC_INSTRUCTION_UPDATE_VFS_METADATA; } - if (path._original != path._target && (item->_instruction == CSYNC_INSTRUCTION_UPDATE_METADATA || item->_instruction == CSYNC_INSTRUCTION_NONE)) { + if (path._original != path._target && (item->_instruction == CSYNC_INSTRUCTION_UPDATE_VFS_METADATA || item->_instruction == CSYNC_INSTRUCTION_UPDATE_METADATA || item->_instruction == CSYNC_INSTRUCTION_NONE)) { ASSERT(_dirItem && _dirItem->_instruction == CSYNC_INSTRUCTION_RENAME); // This is because otherwise subitems are not updated! (ideally renaming a directory could // update the database for all items! See PropagateDirectory::slotSubJobsFinished) diff --git a/src/libsync/propagateremotemove.cpp b/src/libsync/propagateremotemove.cpp index 6d2c0a229..6a7538748 100644 --- a/src/libsync/propagateremotemove.cpp +++ b/src/libsync/propagateremotemove.cpp @@ -290,22 +290,17 @@ void PropagateRemoteMove::finalize() } } - if (!FileSystem::fileExists(targetFile)) { - propagator()->_journal->commit("Remote Rename"); - done(SyncFileItem::Success, {}, ErrorCategory::NoError); - return; - } - const auto result = propagator()->updateMetadata(newItem); - if (!result) { + if (!result && QFileInfo::exists(targetFile)) { done(SyncFileItem::FatalError, tr("Error updating metadata: %1").arg(result.error()), ErrorCategory::GenericError); return; } else if (*result == Vfs::ConvertToPlaceholderResult::Locked) { done(SyncFileItem::SoftError, tr("The file %1 is currently in use").arg(newItem._file), ErrorCategory::GenericError); return; } - if (pinState && *pinState != PinState::Inherited - && !vfs->setPinState(newItem._renameTarget, *pinState)) { + if (pinState && *pinState != PinState::Inherited && + !vfs->setPinState(newItem._renameTarget, *pinState) && + QFileInfo::exists(targetFile)) { done(SyncFileItem::NormalError, tr("Error setting pin state"), ErrorCategory::GenericError); return; }