From d2bfb59d6a5de13d4b5b47fe6dd35e8489782bde Mon Sep 17 00:00:00 2001 From: alex-z Date: Sun, 21 Apr 2024 20:06:28 +0200 Subject: [PATCH] Bugfix. Folder invalid char conflict. Do not update parent folder record if it contains conflicted subfolders. Signed-off-by: alex-z --- src/libsync/discovery.cpp | 5 +++++ src/libsync/owncloudpropagator.cpp | 10 +++++++--- src/libsync/owncloudpropagator.h | 2 +- src/libsync/syncfileitem.h | 2 ++ 4 files changed, 15 insertions(+), 4 deletions(-) diff --git a/src/libsync/discovery.cpp b/src/libsync/discovery.cpp index ef0644ca14..6f99d0d385 100644 --- a/src/libsync/discovery.cpp +++ b/src/libsync/discovery.cpp @@ -404,6 +404,11 @@ bool ProcessDirectoryJob::handleExcluded(const QString &path, const Entries &ent } } + if (item->_status == SyncFileItem::FileNameInvalid && !item->isDirectory()) { + _dirItem->_isAnyInvalidCharChild = true; + } + + _childIgnored = true; emit _discoveryData->itemDiscovered(item); return true; diff --git a/src/libsync/owncloudpropagator.cpp b/src/libsync/owncloudpropagator.cpp index 7016c8d185..0a65913f17 100644 --- a/src/libsync/owncloudpropagator.cpp +++ b/src/libsync/owncloudpropagator.cpp @@ -1291,11 +1291,15 @@ void PropagatorCompositeJob::slotSubJobFinished(SyncFileItem::Status status) auto *subJob = dynamic_cast(sender()); ASSERT(subJob); - if (!_isAnyCaseClashSubFolder) { + if (!_isAnyChildInConflict) { if (const auto propagateDirectoryjob = qobject_cast(subJob)) { - _isAnyCaseClashSubFolder = propagateDirectoryjob->_item && propagateDirectoryjob->_item->_isCaseClashFolder; + _isAnyChildInConflict = propagateDirectoryjob->_item && propagateDirectoryjob->_item->_status == SyncFileItem::FileNameClash; + } else if (const auto propagateIgnoreJob = qobject_cast(subJob)) { + _isAnyChildInConflict = + propagateIgnoreJob->_item && propagateIgnoreJob->_item->_status == SyncFileItem::FileNameInvalid; } } + // Delete the job and remove it from our list of jobs. subJob->deleteLater(); int i = _runningJobs.indexOf(subJob); @@ -1501,7 +1505,7 @@ void PropagateDirectory::slotSubJobsFinished(SyncFileItem::Status status) } } #endif - if (!_subJobs._isAnyCaseClashSubFolder) { + if (!_subJobs._isAnyChildInConflict) { const auto result = propagator()->updateMetadata(*_item); if (!result) { status = _item->_status = SyncFileItem::FatalError; diff --git a/src/libsync/owncloudpropagator.h b/src/libsync/owncloudpropagator.h index 5c5efa5cfb..dc0de8c4c3 100644 --- a/src/libsync/owncloudpropagator.h +++ b/src/libsync/owncloudpropagator.h @@ -246,7 +246,7 @@ public: QVector _runningJobs; SyncFileItem::Status _hasError = SyncFileItem::NoStatus; // NoStatus, or NormalError / SoftError if there was an error quint64 _abortsCount = 0; - bool _isAnyCaseClashSubFolder = false; + bool _isAnyChildInConflict = false; explicit PropagatorCompositeJob(OwncloudPropagator *propagator) : PropagatorJob(propagator) diff --git a/src/libsync/syncfileitem.h b/src/libsync/syncfileitem.h index de01c1c4d9..74cfe70bbc 100644 --- a/src/libsync/syncfileitem.h +++ b/src/libsync/syncfileitem.h @@ -337,6 +337,8 @@ public: bool _isEncryptedMetadataNeedUpdate = false; bool _isCaseClashFolder = false; + + bool _isAnyInvalidCharChild = false; }; inline bool operator<(const SyncFileItemPtr &item1, const SyncFileItemPtr &item2)