From a663d235efe668f3a1a915d9155c5e514bb25d0a Mon Sep 17 00:00:00 2001 From: Felix Weilbach Date: Mon, 11 Oct 2021 14:27:05 +0200 Subject: [PATCH] Add .sync-exclude.lst to exclude files Previously the .sync-exclude.lst file of the sync root directory was not added to the exclude files, because the current logic did only recognize .sync-exclude.lst files when their containing directory was discovered during the discovery phase. Therefore the sync root .sync-exclude.lst file was never discovered. See also ExcludedFiles::traversalPatternMatch(). Fix: #3830, #2728 Signed-off-by: Felix Weilbach --- src/csync/csync_exclude.cpp | 10 ++++------ src/libsync/syncengine.cpp | 5 +++++ 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/src/csync/csync_exclude.cpp b/src/csync/csync_exclude.cpp index 10f0b238a..c15fc5e01 100644 --- a/src/csync/csync_exclude.cpp +++ b/src/csync/csync_exclude.cpp @@ -232,18 +232,16 @@ ExcludedFiles::ExcludedFiles(const QString &localPath) // We're in a detached exclude probably coming from a partial sync or test if (_localPath.isEmpty()) return; - - // Load exclude file from base dir - QFileInfo fi(_localPath + QStringLiteral(".sync-exclude.lst")); - if (fi.isReadable()) - addInTreeExcludeFilePath(fi.absoluteFilePath()); } ExcludedFiles::~ExcludedFiles() = default; void ExcludedFiles::addExcludeFilePath(const QString &path) { - _excludeFiles[_localPath].append(path); + auto &excludeFilesLocalPath = _excludeFiles[_localPath]; + if (std::find(excludeFilesLocalPath.cbegin(), excludeFilesLocalPath.cend(), path) == excludeFilesLocalPath.cend()) { + excludeFilesLocalPath.append(path); + } } void ExcludedFiles::addInTreeExcludeFilePath(const QString &path) diff --git a/src/libsync/syncengine.cpp b/src/libsync/syncengine.cpp index e9f919f57..6cd745aef 100644 --- a/src/libsync/syncengine.cpp +++ b/src/libsync/syncengine.cpp @@ -544,6 +544,11 @@ void SyncEngine::startSync() _discoveryPhase.reset(new DiscoveryPhase); _discoveryPhase->_account = _account; _discoveryPhase->_excludes = _excludedFiles.data(); + const QString excludeFilePath = _localPath + QStringLiteral(".sync-exclude.lst"); + if (QFile::exists(excludeFilePath)) { + _discoveryPhase->_excludes->addExcludeFilePath(excludeFilePath); + _discoveryPhase->_excludes->reloadExcludeFiles(); + } _discoveryPhase->_statedb = _journal; _discoveryPhase->_localDir = _localPath; if (!_discoveryPhase->_localDir.endsWith('/'))