Also support nested folder scenarios.
authoralex-z <blackslayer4@gmail.com>
Sun, 21 Apr 2024 19:21:32 +0000 (21:21 +0200)
committerbackportbot[bot] <backportbot[bot]@users.noreply.github.com>
Tue, 23 Apr 2024 10:18:40 +0000 (10:18 +0000)
Signed-off-by: alex-z <blackslayer4@gmail.com>
src/libsync/discovery.cpp
src/libsync/owncloudpropagator.cpp
src/libsync/owncloudpropagator.h
src/libsync/propagatorjobs.cpp
src/libsync/syncfileitem.h

index 6f99d0d385a88b5ac1e0d0db53251f7204024b35..eb0eef7253085330abc75b15fc7fbec6eb03ed9e 100644 (file)
@@ -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;
index 0a65913f17bb269533a6491a7ff86295e5c6f90e..ac159c8d02c983db36cd29ae671b99759763df63 100644 (file)
@@ -1291,12 +1291,16 @@ void PropagatorCompositeJob::slotSubJobFinished(SyncFileItem::Status status)
     auto *subJob = dynamic_cast<PropagatorJob *>(sender());
     ASSERT(subJob);
 
-    if (!_isAnyChildInConflict) {
+    if (!_isAnyInvalidCharChild || !_isAnyCaseClashChild) {
+        SyncFileItemPtr childDirItem;
         if (const auto propagateDirectoryjob = qobject_cast<PropagateDirectory *>(subJob)) {
-            _isAnyChildInConflict = propagateDirectoryjob->_item && propagateDirectoryjob->_item->_status == SyncFileItem::FileNameClash;
+            childDirItem = propagateDirectoryjob->_item;
         } else if (const auto propagateIgnoreJob = qobject_cast<PropagateIgnoreJob *>(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;
index dc0de8c4c389b9c1dae909c32831afff9e74e6e6..d8f5f8eec022f9e600dff3644359a782931752ee 100644 (file)
@@ -246,7 +246,8 @@ public:
     QVector<PropagatorJob *> _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)
index 4c40b68278a506a81410515eb62a12b2dad00d90..4b18a944c7f61965455444d074eb944b3d187048 100644 (file)
@@ -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;
index 74cfe70bbc0516be09c2a2b4f03177f8f26f76c0..3f6a52898611d1118cf07ab755d2f17ff8fee2d6 100644 (file)
@@ -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)