From: alex-z Date: Sun, 21 Apr 2024 19:21:32 +0000 (+0200) Subject: Also support nested folder scenarios. X-Git-Tag: archive/raspbian/3.16.7-1_deb13u1+rpi1~1^2~12^2~7^2~43^2~3 X-Git-Url: https://dgit.raspbian.org/?a=commitdiff_plain;h=0479d49140c63e97217bfdfc4125b68d4a4c6669;p=nextcloud-desktop.git Also support nested folder scenarios. Signed-off-by: alex-z --- diff --git a/src/libsync/discovery.cpp b/src/libsync/discovery.cpp index 6f99d0d38..eb0eef725 100644 --- a/src/libsync/discovery.cpp +++ b/src/libsync/discovery.cpp @@ -404,11 +404,12 @@ bool ProcessDirectoryJob::handleExcluded(const QString &path, const Entries &ent } } - if (item->_status == SyncFileItem::FileNameInvalid && !item->isDirectory()) { + if (item->_status == SyncFileItem::FileNameInvalid) { _dirItem->_isAnyInvalidCharChild = true; + } else if (item->_status == SyncFileItem::FileNameClash) { + _dirItem->_isAnyCaseClashChild = true; } - _childIgnored = true; emit _discoveryData->itemDiscovered(item); return true; diff --git a/src/libsync/owncloudpropagator.cpp b/src/libsync/owncloudpropagator.cpp index 0a65913f1..ac159c8d0 100644 --- a/src/libsync/owncloudpropagator.cpp +++ b/src/libsync/owncloudpropagator.cpp @@ -1291,12 +1291,16 @@ void PropagatorCompositeJob::slotSubJobFinished(SyncFileItem::Status status) auto *subJob = dynamic_cast(sender()); ASSERT(subJob); - if (!_isAnyChildInConflict) { + if (!_isAnyInvalidCharChild || !_isAnyCaseClashChild) { + SyncFileItemPtr childDirItem; if (const auto propagateDirectoryjob = qobject_cast(subJob)) { - _isAnyChildInConflict = propagateDirectoryjob->_item && propagateDirectoryjob->_item->_status == SyncFileItem::FileNameClash; + childDirItem = propagateDirectoryjob->_item; } else if (const auto propagateIgnoreJob = qobject_cast(subJob)) { - _isAnyChildInConflict = - propagateIgnoreJob->_item && propagateIgnoreJob->_item->_status == SyncFileItem::FileNameInvalid; + childDirItem = propagateIgnoreJob->_item; + } + if (childDirItem) { + _isAnyCaseClashChild = _isAnyCaseClashChild || childDirItem->_status == SyncFileItem::FileNameClash || childDirItem->_isAnyCaseClashChild; + _isAnyInvalidCharChild = _isAnyInvalidCharChild || childDirItem->_status == SyncFileItem::FileNameInvalid || childDirItem->_isAnyInvalidCharChild; } } @@ -1416,6 +1420,8 @@ void PropagateDirectory::slotFirstJobFinished(SyncFileItem::Status status) void PropagateDirectory::slotSubJobsFinished(SyncFileItem::Status status) { if (!_item->isEmpty() && status == SyncFileItem::Success) { + _item->_isAnyCaseClashChild = _item->_isAnyCaseClashChild || _subJobs._isAnyCaseClashChild; + _item->_isAnyInvalidCharChild = _item->_isAnyInvalidCharChild || _subJobs._isAnyInvalidCharChild; // If a directory is renamed, recursively delete any stale items // that may still exist below the old path. if (_item->_instruction == CSYNC_INSTRUCTION_RENAME && _item->_originalFile != _item->_renameTarget) { @@ -1505,7 +1511,7 @@ void PropagateDirectory::slotSubJobsFinished(SyncFileItem::Status status) } } #endif - if (!_subJobs._isAnyChildInConflict) { + if (!_item->_isAnyCaseClashChild && !_item->_isAnyInvalidCharChild) { 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 dc0de8c4c..d8f5f8eec 100644 --- a/src/libsync/owncloudpropagator.h +++ b/src/libsync/owncloudpropagator.h @@ -246,7 +246,8 @@ public: QVector _runningJobs; SyncFileItem::Status _hasError = SyncFileItem::NoStatus; // NoStatus, or NormalError / SoftError if there was an error quint64 _abortsCount = 0; - bool _isAnyChildInConflict = false; + bool _isAnyCaseClashChild = false; + bool _isAnyInvalidCharChild = false; explicit PropagatorCompositeJob(OwncloudPropagator *propagator) : PropagatorJob(propagator) diff --git a/src/libsync/propagatorjobs.cpp b/src/libsync/propagatorjobs.cpp index 4c40b6827..4b18a944c 100644 --- a/src/libsync/propagatorjobs.cpp +++ b/src/libsync/propagatorjobs.cpp @@ -183,7 +183,6 @@ void PropagateLocalMkdir::startLocalMkdir() } if (Utility::fsCasePreserving() && propagator()->localFileNameClash(_item->_file)) { - _item->_isCaseClashFolder = true; qCWarning(lcPropagateLocalMkdir) << "New folder to create locally already exists with different case:" << _item->_file; done(SyncFileItem::FileNameClash, tr("Folder %1 cannot be created because of a local file or folder name clash!").arg(newDirStr), ErrorCategory::GenericError); return; diff --git a/src/libsync/syncfileitem.h b/src/libsync/syncfileitem.h index 74cfe70bb..3f6a52898 100644 --- a/src/libsync/syncfileitem.h +++ b/src/libsync/syncfileitem.h @@ -336,9 +336,8 @@ public: bool _isEncryptedMetadataNeedUpdate = false; - bool _isCaseClashFolder = false; - bool _isAnyInvalidCharChild = false; + bool _isAnyCaseClashChild = false; }; inline bool operator<(const SyncFileItemPtr &item1, const SyncFileItemPtr &item2)