void DiscoveryPhase::startJob(ProcessDirectoryJob *job)
{
ENFORCE(!_currentRootJob);
+ connect(this, &DiscoveryPhase::itemDiscovered, this, &DiscoveryPhase::slotItemDiscovered, Qt::UniqueConnection);
connect(job, &ProcessDirectoryJob::finished, this, [this, job] {
ENFORCE(_currentRootJob == sender());
_currentRootJob = nullptr;
}
}
+void DiscoveryPhase::slotItemDiscovered(const OCC::SyncFileItemPtr &item)
+{
+ if (item->_instruction == CSYNC_INSTRUCTION_ERROR && item->_direction == SyncFileItem::Up) {
+ _hasUploadErrorItems = true;
+ }
+ if (item->_instruction == CSYNC_INSTRUCTION_REMOVE && item->_direction == SyncFileItem::Down) {
+ _hasDownloadRemovedItems = true;
+ }
+}
+
DiscoverySingleLocalDirectoryJob::DiscoverySingleLocalDirectoryJob(const AccountPtr &account, const QString &localPath, OCC::Vfs *vfs, QObject *parent)
: QObject(parent), QRunnable(), _localPath(localPath), _account(account), _vfs(vfs)
{
QStringList _listExclusiveFiles;
+ bool _hasUploadErrorItems = false;
+ bool _hasDownloadRemovedItems = false;
+
signals:
void fatalError(const QString &errorString, const OCC::ErrorCategory errorCategory);
void itemDiscovered(const OCC::SyncFileItemPtr &item);
void silentlyExcluded(const QString &folderPath);
void addErrorToGui(const SyncFileItem::Status status, const QString &errorMessage, const QString &subject, const OCC::ErrorCategory category);
+
+private slots:
+ void slotItemDiscovered(const OCC::SyncFileItemPtr &item);
};
/// Implementation of DiscoveryPhase::adjustRenamedPath
} while (index > 0);
}
}
- items.erase(std::remove_if(items.begin(), items.end(), [&names](auto i) {
- return !names.contains(QStringRef { &i->_file });
- }),
- items.end());
+ items.erase(std::remove_if(items.begin(),
+ items.end(),
+ [&names](auto i) {
+ return !names.contains(QStringRef{&i->_file});
+ }),
+ items.end());
}
QStringList files;
slotUnscheduleFilesDelayedSync();
}
+ if (_discoveryPhase->_hasDownloadRemovedItems && _discoveryPhase->_hasUploadErrorItems) {
+ for (const auto &item : _syncItems) {
+ if (item->_instruction == CSYNC_INSTRUCTION_ERROR && item->_direction == SyncFileItem::Up) {
+ item->_instruction = CSYNC_INSTRUCTION_IGNORE;
+ }
+ }
+ _anotherSyncNeeded = ImmediateFollowUp;
+ }
+
Q_ASSERT(std::is_sorted(_syncItems.begin(), _syncItems.end()));
qCInfo(lcEngine) << "#### Reconcile (aboutToPropagate) #################################################### " << _stopWatch.addLapTime(QStringLiteral("Reconcile (aboutToPropagate)")) << "ms";