From: Olivier Goffart Date: Tue, 9 Oct 2018 10:49:21 +0000 (+0200) Subject: New Discovery algorithm: Split the process function even further X-Git-Tag: archive/raspbian/3.16.7-1_deb13u1+rpi1~1^2~12^2~21^2~468^2~499 X-Git-Url: https://dgit.raspbian.org/?a=commitdiff_plain;h=ef542ac83dce295eb64093c88645a346c132b35a;p=nextcloud-desktop.git New Discovery algorithm: Split the process function even further 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 --- diff --git a/src/libsync/discovery.cpp b/src/libsync/discovery.cpp index 7f8ef447f..a63cf35c5 100644 --- a/src/libsync/discovery.cpp +++ b/src/libsync/discovery.cpp @@ -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); diff --git a/src/libsync/discovery.h b/src/libsync/discovery.h index ca819e76f..4677b1ab4 100644 --- a/src/libsync/discovery.h +++ b/src/libsync/discovery.h @@ -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