New Discovery algorithm: Split the process function even further
authorOlivier Goffart <ogoffart@woboq.com>
Tue, 9 Oct 2018 10:49:21 +0000 (12:49 +0200)
committerKevin Ottens <kevin.ottens@nextcloud.com>
Tue, 15 Dec 2020 09:58:07 +0000 (10:58 +0100)
Move the finialization in its own function.
This allow to save a bit of code duplication.

Also change the order of the parameter in the constructor for consistency

src/libsync/discovery.cpp
src/libsync/discovery.h

index 7f8ef447f394ee2a43d3cc04962f7f4c39f1efb8..a63cf35c5f929fae1810d68549ee5abf37ccb2b7 100644 (file)
@@ -574,18 +574,7 @@ void ProcessDirectoryJob::processFileAnalyzeRemoteInfo(
 
                             postProcessRename(path);
                         }
-
-                        qCInfo(lcDisco) << "Discovered" << item->_file << item->_instruction << item->_direction << item->isDirectory();
-                        if (item->isDirectory()) {
-                            auto job = new ProcessDirectoryJob(item, _queryServer,
-                                item->_instruction == CSYNC_INSTRUCTION_RENAME ? NormalQuery : ParentDontExist,
-                                _discoveryData, this);
-                            job->_currentFolder = path;
-                            connect(job, &ProcessDirectoryJob::finished, this, &ProcessDirectoryJob::subJobFinished);
-                            _queuedJobs.push_back(job);
-                        } else {
-                            emit _discoveryData->itemDiscovered(item);
-                        }
+                        processFileFinalize(item, path, item->isDirectory(), item->_instruction == CSYNC_INSTRUCTION_RENAME ? NormalQuery : ParentDontExist, _queryServer);
                         _pendingAsyncJobs--;
                         progress();
                     });
@@ -935,17 +924,7 @@ void ProcessDirectoryJob::processFileAnalyzeLocalInfo(
                             processRename(path);
                             recurseQueryServer = *etag == base._etag ? ParentNotChanged : NormalQuery;
                         }
-
-                        qCInfo(lcDisco) << "Discovered" << item->_file << item->_instruction << item->_direction << item->isDirectory();
-                        bool recurse = checkPermissions(item);
-                        if (recurse && item->isDirectory()) {
-                            auto job = new ProcessDirectoryJob(item, recurseQueryServer, NormalQuery, _discoveryData, this);
-                            job->_currentFolder = path;
-                            connect(job, &ProcessDirectoryJob::finished, this, &ProcessDirectoryJob::subJobFinished);
-                            _queuedJobs.push_back(job);
-                        } else {
-                            emit _discoveryData->itemDiscovered(item);
-                        }
+                        processFileFinalize(item, path, item->isDirectory(), NormalQuery, recurseQueryServer);
                         _pendingAsyncJobs--;
                         progress();
                     });
@@ -1014,6 +993,18 @@ void ProcessDirectoryJob::processFileAnalyzeLocalInfo(
         }
     }
 
+    bool recurse = item->isDirectory() || localEntry.isDirectory || serverEntry.isDirectory;
+    if (_queryLocal != NormalQuery && _queryServer != NormalQuery && !item->_isRestoration)
+        recurse = false;
+
+    auto recurseQueryLocal = _queryLocal == ParentNotChanged ? ParentNotChanged : localEntry.isDirectory || item->_instruction == CSYNC_INSTRUCTION_RENAME ? NormalQuery : ParentDontExist;
+    processFileFinalize(item, path, recurse, recurseQueryLocal, recurseQueryServer);
+}
+
+void ProcessDirectoryJob::processFileFinalize(
+    const SyncFileItemPtr &item, PathTuple path, bool recurse,
+    QueryMode recurseQueryLocal, QueryMode recurseQueryServer)
+{
     if (path._original != path._target && (item->_instruction == CSYNC_INSTRUCTION_UPDATE_METADATA || item->_instruction == CSYNC_INSTRUCTION_NONE)) {
         ASSERT(_dirItem && _dirItem->_instruction == CSYNC_INSTRUCTION_RENAME);
         // This is because otherwise subitems are not updated!  (ideally renaming a directory could
@@ -1027,17 +1018,10 @@ void ProcessDirectoryJob::processFileAnalyzeLocalInfo(
 
     if (item->isDirectory() && item->_instruction == CSYNC_INSTRUCTION_SYNC)
         item->_instruction = CSYNC_INSTRUCTION_UPDATE_METADATA;
-
-
-    bool recurse = item->isDirectory() || localEntry.isDirectory || serverEntry.isDirectory;
     if (!checkPermissions(item))
         recurse = false;
-    if (_queryLocal != NormalQuery && _queryServer != NormalQuery && !item->_isRestoration)
-        recurse = false;
     if (recurse) {
-        auto job = new ProcessDirectoryJob(item, recurseQueryServer,
-            _queryLocal == ParentNotChanged ? ParentNotChanged : localEntry.isDirectory || item->_instruction == CSYNC_INSTRUCTION_RENAME ? NormalQuery : ParentDontExist,
-            _discoveryData, this);
+        auto job = new ProcessDirectoryJob(item, recurseQueryLocal, recurseQueryServer, _discoveryData, this);
         job->_currentFolder = path;
         if (item->_instruction == CSYNC_INSTRUCTION_REMOVE) {
             job->setParent(_discoveryData);
@@ -1080,7 +1064,7 @@ void ProcessDirectoryJob::processBlacklisted(const PathTuple &path, const OCC::L
     qCInfo(lcDisco) << "Discovered (blacklisted) " << item->_file << item->_instruction << item->_direction << item->isDirectory();
 
     if (item->isDirectory() && item->_instruction != CSYNC_INSTRUCTION_IGNORE) {
-        auto job = new ProcessDirectoryJob(item, InBlackList, NormalQuery, _discoveryData, this);
+        auto job = new ProcessDirectoryJob(item, NormalQuery, InBlackList, _discoveryData, this);
         job->_currentFolder = path;
         connect(job, &ProcessDirectoryJob::finished, this, &ProcessDirectoryJob::subJobFinished);
         _queuedJobs.push_back(job);
index ca819e76f4ee46a55b816e1fc01d331dbd02bbe9..4677b1ab4c61910a5b54450f4ec7acd446351435 100644 (file)
@@ -35,7 +35,7 @@ public:
         InBlackList // Do not query this folder because it is in th blacklist (remote entries only)
     };
     Q_ENUM(QueryMode)
-    explicit ProcessDirectoryJob(const SyncFileItemPtr &dirItem, QueryMode queryServer, QueryMode queryLocal,
+    explicit ProcessDirectoryJob(const SyncFileItemPtr &dirItem, QueryMode queryLocal, QueryMode queryServer,
         DiscoveryPhase *data, QObject *parent)
         : QObject(parent)
         , _dirItem(dirItem)
@@ -76,6 +76,7 @@ private:
     void processFile(PathTuple, const LocalInfo &, const RemoteInfo &, const SyncJournalFileRecord &);
     void processFileAnalyzeRemoteInfo(const SyncFileItemPtr &item, PathTuple, const LocalInfo &, const RemoteInfo &, const SyncJournalFileRecord &);
     void processFileAnalyzeLocalInfo(const SyncFileItemPtr &item, PathTuple, const LocalInfo &, const RemoteInfo &, const SyncJournalFileRecord &, QueryMode recurseQueryServer);
+    void processFileFinalize(const SyncFileItemPtr &item, PathTuple, bool recurse, QueryMode recurseQueryLocal, QueryMode recurseQueryServer);
 
 
     // Return false if there is an error and that a directory must not be recursively be taken