collect remnant read-only folders during discovery
authorMatthieu Gallien <matthieu.gallien@nextcloud.com>
Fri, 30 Aug 2024 13:35:20 +0000 (15:35 +0200)
committerMatthieu Gallien <matthieu_gallien@yahoo.fr>
Thu, 12 Sep 2024 06:40:50 +0000 (08:40 +0200)
Signed-off-by: Matthieu Gallien <matthieu.gallien@nextcloud.com>
src/libsync/discovery.cpp
src/libsync/discoveryphase.h
src/libsync/syncengine.cpp
src/libsync/syncengine.h

index ba24802cf27567efe3a5724e032f9585ef84ad6f..0c228ca807876402df056604dd33b7ee4aede1a1 100644 (file)
@@ -1832,12 +1832,14 @@ bool ProcessDirectoryJob::checkPermissions(const OCC::SyncFileItemPtr &item)
 #if !defined(Q_OS_MACOS) || __MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_15
             qCWarning(lcDisco) << "unexpected new folder in a read-only folder will be made read-write" << localPath;
             FileSystem::setFolderPermissions(localPath, FileSystem::FolderPermissions::ReadWrite);
+            emit _discoveryData->remnantReadOnlyFolderDiscovered(item);
 #endif
             return false;
         } else if (!item->isDirectory() && !perms.hasPermission(RemotePermissions::CanAddFile)) {
             qCWarning(lcDisco) << "checkForPermission: ERROR" << item->_file;
             item->_instruction = CSYNC_INSTRUCTION_ERROR;
             item->_errorString = tr("Not allowed because you don't have permission to add files in that folder");
+            emit _discoveryData->remnantReadOnlyFolderDiscovered(item);
             return false;
         }
         break;
@@ -2038,6 +2040,7 @@ int ProcessDirectoryJob::processSubJobs(int nbJobs)
 #if !defined(Q_OS_MACOS) || __MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_15
                     qCWarning(lcDisco) << "unexpected new folder in a read-only folder will be made read-write" << localPath;
                     FileSystem::setFolderPermissions(localPath, FileSystem::FolderPermissions::ReadWrite);
+                    emit _discoveryData->remnantReadOnlyFolderDiscovered(_dirItem);
 #endif
                 }
 
index 89012df25f878654202455f9555f1c80dfe1d201..7d53f1336d698f9fcd4533d450028690734501c2 100644 (file)
@@ -357,6 +357,7 @@ signals:
 
     void addErrorToGui(const SyncFileItem::Status status, const QString &errorMessage, const QString &subject, const OCC::ErrorCategory category);
 
+    void remnantReadOnlyFolderDiscovered(const OCC::SyncFileItemPtr &item);
 private slots:
     void slotItemDiscovered(const OCC::SyncFileItemPtr &item);
 };
index 3f0cd9b3cd7115c09d505001a13dc24d6f533725..21d6b0c8b6bc33df7699d92d7528cceb59ed16b4 100644 (file)
@@ -630,6 +630,8 @@ void SyncEngine::startSync()
     _progressInfo->_status = ProgressInfo::Discovery;
     emit transmissionProgress(*_progressInfo);
 
+    _remnantReadOnlyFolders.clear();
+
     _discoveryPhase.reset(new DiscoveryPhase);
     _discoveryPhase->_leadingAndTrailingSpacesFilesAllowed = _leadingAndTrailingSpacesFilesAllowed;
     _discoveryPhase->_account = _account;
@@ -683,6 +685,7 @@ void SyncEngine::startSync()
     connect(_discoveryPhase.data(), &DiscoveryPhase::finished, this, &SyncEngine::slotDiscoveryFinished);
     connect(_discoveryPhase.data(), &DiscoveryPhase::silentlyExcluded,
         _syncFileStatusTracker.data(), &SyncFileStatusTracker::slotAddSilentlyExcluded);
+    connect(_discoveryPhase.data(), &DiscoveryPhase::remnantReadOnlyFolderDiscovered, this, &SyncEngine::remnantReadOnlyFolderDiscovered);
 
     ProcessDirectoryJob *discoveryJob = nullptr;
 
@@ -1486,6 +1489,11 @@ void SyncEngine::slotCleanupScheduledSyncTimers()
     }
 }
 
+void SyncEngine::remnantReadOnlyFolderDiscovered(const SyncFileItemPtr &item)
+{
+    _remnantReadOnlyFolders.push_back(item);
+}
+
 void SyncEngine::slotUnscheduleFilesDelayedSync()
 {
     if (!_discoveryPhase || _discoveryPhase->_filesUnscheduleSync.empty()) {
index ea9b3c21ad0043fbbfc78fabbe351639204a175b..2887c4bc1f65853cb5f16f0b10df930f49f921ba 100644 (file)
@@ -240,6 +240,8 @@ private slots:
     void slotUnscheduleFilesDelayedSync();
     void slotCleanupScheduledSyncTimers();
 
+    void remnantReadOnlyFolderDiscovered(const OCC::SyncFileItemPtr &item);
+
 private:
     // Some files need a sync run to be executed at a specified time after
     // their status is scheduled to change (e.g. lock status will expire in
@@ -404,6 +406,8 @@ private:
     QVector<QSharedPointer<ScheduledSyncTimer>> _scheduledSyncTimers;
 
     SingleItemDiscoveryOptions _singleItemDiscoveryOptions;
+
+    QList<SyncFileItemPtr> _remnantReadOnlyFolders;
 };
 }