From 641eddfbdf79d55eed33ae8543029f21ca03e4a3 Mon Sep 17 00:00:00 2001 From: Christian Kamm Date: Fri, 23 Feb 2018 12:13:42 +0100 Subject: [PATCH] INSTRUCTION_IGNORE now carries a direction This allows IssuesWidget to selectively wipe only the 'Up' ignores during selective local discovery. --- src/gui/issueswidget.cpp | 5 +++-- src/gui/protocolwidget.cpp | 1 + src/gui/syncrunfilelog.cpp | 3 ++- src/libsync/syncengine.cpp | 30 +++++++++++++++++++++++++----- src/libsync/syncresult.cpp | 6 ++---- 5 files changed, 33 insertions(+), 12 deletions(-) diff --git a/src/gui/issueswidget.cpp b/src/gui/issueswidget.cpp index 1ae3b234e5..95eccec090 100644 --- a/src/gui/issueswidget.cpp +++ b/src/gui/issueswidget.cpp @@ -148,8 +148,9 @@ void IssuesWidget::hideEvent(QHideEvent *ev) static bool persistsUntilLocalDiscovery(QTreeWidgetItem *item) { - const auto status = ProtocolItem::extraData(item).status; - return status == SyncFileItem::Conflict || status == SyncFileItem::FileIgnored; + const auto data = ProtocolItem::extraData(item); + return data.status == SyncFileItem::Conflict + || (data.status == SyncFileItem::FileIgnored && data.direction == SyncFileItem::Up); } void IssuesWidget::cleanItems(const std::function &shouldDelete) diff --git a/src/gui/protocolwidget.cpp b/src/gui/protocolwidget.cpp index 25c5c10d3f..086e7d205b 100644 --- a/src/gui/protocolwidget.cpp +++ b/src/gui/protocolwidget.cpp @@ -106,6 +106,7 @@ ProtocolItem *ProtocolItem::create(const QString &folder, const SyncFileItem &it data.folderName = folder; data.status = item._status; data.size = item._size; + data.direction = item._direction; ProtocolItem::setExtraData(twitem, data); return twitem; } diff --git a/src/gui/syncrunfilelog.cpp b/src/gui/syncrunfilelog.cpp index 73f801b5d2..add922cfc2 100644 --- a/src/gui/syncrunfilelog.cpp +++ b/src/gui/syncrunfilelog.cpp @@ -133,7 +133,8 @@ void SyncRunFileLog::start(const QString &folderPath) void SyncRunFileLog::logItem(const SyncFileItem &item) { // don't log the directory items that are in the list - if (item._direction == SyncFileItem::None) { + if (item._direction == SyncFileItem::None + || item._instruction == CSYNC_INSTRUCTION_IGNORE) { return; } QString ts = QString::fromLatin1(item._responseTimeStamp); diff --git a/src/libsync/syncengine.cpp b/src/libsync/syncengine.cpp index 0361d4a601..d914a24db7 100644 --- a/src/libsync/syncengine.cpp +++ b/src/libsync/syncengine.cpp @@ -272,13 +272,29 @@ bool SyncEngine::checkErrorBlacklisting(SyncFileItem &item) return true; } +static bool isFileTransferInstruction(csync_instructions_e instruction) +{ + return instruction == CSYNC_INSTRUCTION_CONFLICT + || instruction == CSYNC_INSTRUCTION_NEW + || instruction == CSYNC_INSTRUCTION_SYNC + || instruction == CSYNC_INSTRUCTION_TYPE_CHANGE; +} + +static bool isFileModifyingInstruction(csync_instructions_e instruction) +{ + return isFileTransferInstruction(instruction) + || instruction == CSYNC_INSTRUCTION_RENAME + || instruction == CSYNC_INSTRUCTION_REMOVE; +} + void SyncEngine::deleteStaleDownloadInfos(const SyncFileItemVector &syncItems) { // Find all downloadinfo paths that we want to preserve. QSet download_file_paths; foreach (const SyncFileItemPtr &it, syncItems) { if (it->_direction == SyncFileItem::Down - && it->_type == ItemTypeFile) { + && it->_type == ItemTypeFile + && isFileTransferInstruction(it->_instruction)) { download_file_paths.insert(it->_file); } } @@ -299,7 +315,8 @@ void SyncEngine::deleteStaleUploadInfos(const SyncFileItemVector &syncItems) QSet upload_file_paths; foreach (const SyncFileItemPtr &it, syncItems) { if (it->_direction == SyncFileItem::Up - && it->_type == ItemTypeFile) { + && it->_type == ItemTypeFile + && isFileTransferInstruction(it->_instruction)) { upload_file_paths.insert(it->_file); } } @@ -675,7 +692,6 @@ int SyncEngine::treewalkFile(csync_file_stat_t *file, csync_file_stat_t *other, dir = !remote ? SyncFileItem::Down : SyncFileItem::Up; break; case CSYNC_INSTRUCTION_CONFLICT: - case CSYNC_INSTRUCTION_IGNORE: case CSYNC_INSTRUCTION_ERROR: dir = SyncFileItem::None; break; @@ -703,6 +719,7 @@ int SyncEngine::treewalkFile(csync_file_stat_t *file, csync_file_stat_t *other, case CSYNC_INSTRUCTION_NEW: case CSYNC_INSTRUCTION_EVAL: case CSYNC_INSTRUCTION_STAT_ERROR: + case CSYNC_INSTRUCTION_IGNORE: default: dir = remote ? SyncFileItem::Down : SyncFileItem::Up; break; @@ -1040,7 +1057,9 @@ void SyncEngine::slotDiscoveryJobFinished(int discoveryResult) if (!invalidFilenamePattern.isEmpty()) { const QRegExp invalidFilenameRx(invalidFilenamePattern); for (auto it = syncItems.begin(); it != syncItems.end(); ++it) { - if ((*it)->_direction == SyncFileItem::Up && (*it)->destination().contains(invalidFilenameRx)) { + if ((*it)->_direction == SyncFileItem::Up + && isFileModifyingInstruction((*it)->_instruction) + && (*it)->destination().contains(invalidFilenameRx)) { (*it)->_errorString = tr("File name contains at least one invalid character"); (*it)->_instruction = CSYNC_INSTRUCTION_IGNORE; } @@ -1269,7 +1288,8 @@ void SyncEngine::checkForPermission(SyncFileItemVector &syncItems) SyncFileItemPtr needle; for (SyncFileItemVector::iterator it = syncItems.begin(); it != syncItems.end(); ++it) { - if ((*it)->_direction != SyncFileItem::Up) { + if ((*it)->_direction != SyncFileItem::Up + || !isFileModifyingInstruction((*it)->_instruction)) { // Currently we only check server-side permissions continue; } diff --git a/src/libsync/syncresult.cpp b/src/libsync/syncresult.cpp index 92af7fa82a..8550b4628e 100644 --- a/src/libsync/syncresult.cpp +++ b/src/libsync/syncresult.cpp @@ -185,10 +185,8 @@ void SyncResult::processCompletedItem(const SyncFileItemPtr &item) // nothing. break; } - } else if (item->_direction == SyncFileItem::None) { - if (item->_instruction == CSYNC_INSTRUCTION_IGNORE) { - _foundFilesNotSynced = true; - } + } else if (item->_instruction == CSYNC_INSTRUCTION_IGNORE) { + _foundFilesNotSynced = true; } } }