@@ -39,35 +39,38 @@ namespace OCC {
3939
4040Q_LOGGING_CATEGORY (lcDisco, " nextcloud.sync.discovery" , QtInfoMsg)
4141
42- ProcessDirectoryJob::ProcessDirectoryJob (DiscoveryPhase *data, PinState basePinState, qint64 lastSyncTimestamp, QObject *parent)
42+ ProcessDirectoryJob::ProcessDirectoryJob (DiscoveryPhase *data, PinState basePinState, qint64 lastSyncTimestamp, bool synchronizeSymlinks, QObject *parent)
4343 : QObject(parent)
4444 , _lastSyncTimestamp(lastSyncTimestamp)
4545 , _discoveryData(data)
46+ , _synchronizeSymlinks(synchronizeSymlinks)
4647{
4748 qCDebug (lcDisco) << data;
4849 computePinState (basePinState);
4950}
5051
51- ProcessDirectoryJob::ProcessDirectoryJob (const PathTuple &path, const SyncFileItemPtr &dirItem, QueryMode queryLocal, QueryMode queryServer, qint64 lastSyncTimestamp, ProcessDirectoryJob *parent)
52+ ProcessDirectoryJob::ProcessDirectoryJob (const PathTuple &path, const SyncFileItemPtr &dirItem, QueryMode queryLocal, QueryMode queryServer, qint64 lastSyncTimestamp, bool synchronizeSymlinks, ProcessDirectoryJob *parent)
5253 : QObject(parent)
5354 , _dirItem(dirItem)
5455 , _lastSyncTimestamp(lastSyncTimestamp)
5556 , _queryServer(queryServer)
5657 , _queryLocal(queryLocal)
5758 , _discoveryData(parent->_discoveryData)
5859 , _currentFolder(path)
60+ , _synchronizeSymlinks(synchronizeSymlinks)
5961{
6062 qCDebug (lcDisco) << path._server << queryServer << path._local << queryLocal << lastSyncTimestamp;
6163 computePinState (parent->_pinState );
6264}
6365
64- ProcessDirectoryJob::ProcessDirectoryJob (DiscoveryPhase *data, PinState basePinState, const PathTuple &path, const SyncFileItemPtr &dirItem, QueryMode queryLocal, qint64 lastSyncTimestamp, QObject *parent)
66+ ProcessDirectoryJob::ProcessDirectoryJob (DiscoveryPhase *data, PinState basePinState, const PathTuple &path, const SyncFileItemPtr &dirItem, QueryMode queryLocal, qint64 lastSyncTimestamp, bool synchronizeSymlinks, QObject *parent)
6567 : QObject(parent)
6668 , _dirItem(dirItem)
6769 , _lastSyncTimestamp(lastSyncTimestamp)
6870 , _queryLocal(queryLocal)
6971 , _discoveryData(data)
7072 , _currentFolder(path)
73+ , _synchronizeSymlinks(synchronizeSymlinks)
7174{
7275 computePinState (basePinState);
7376}
@@ -306,7 +309,9 @@ bool ProcessDirectoryJob::handleExcluded(const QString &path, const Entries &ent
306309 }
307310 }
308311
309- if (excluded == CSYNC_NOT_EXCLUDED) {
312+ bool isSymlink = entries.localEntry .isSymLink || entries.serverEntry .isSymLink ;
313+ // All not excluded files and additionally all symlinks if symlink synchronization is disabled
314+ if (excluded == CSYNC_NOT_EXCLUDED && !(_synchronizeSymlinks && isSymlink)) {
310315 return false ;
311316 } else if (excluded == CSYNC_FILE_SILENTLY_EXCLUDED || excluded == CSYNC_FILE_EXCLUDE_AND_REMOVE) {
312317 emit _discoveryData->silentlyExcluded (path);
@@ -326,7 +331,8 @@ bool ProcessDirectoryJob::handleExcluded(const QString &path, const Entries &ent
326331 return true ;
327332 }
328333
329- if (entries.localEntry .isSymLink ) {
334+ if (entries.localEntry .isSymLink && !_synchronizeSymlinks) {
335+ item->_errorString = tr (" Symbolic links are not supported in syncing." );
330336 } else {
331337 switch (excluded) {
332338 case CSYNC_NOT_EXCLUDED:
@@ -1649,7 +1655,7 @@ void ProcessDirectoryJob::processFileFinalize(
16491655 }
16501656 if (recurse) {
16511657 auto job = new ProcessDirectoryJob (path, item, recurseQueryLocal, recurseQueryServer,
1652- _lastSyncTimestamp, this );
1658+ _lastSyncTimestamp, _synchronizeSymlinks, this );
16531659 job->setInsideEncryptedTree (isInsideEncryptedTree () || item->isEncrypted ());
16541660 if (removed) {
16551661 job->setParent (_discoveryData);
@@ -1693,7 +1699,7 @@ void ProcessDirectoryJob::processBlacklisted(const PathTuple &path, const OCC::L
16931699 qCInfo (lcDisco) << " Discovered (blacklisted) " << item->_file << item->_instruction << item->_direction << item->isDirectory ();
16941700
16951701 if (item->isDirectory () && item->_instruction != CSYNC_INSTRUCTION_IGNORE) {
1696- auto job = new ProcessDirectoryJob (path, item, NormalQuery, InBlackList, _lastSyncTimestamp, this );
1702+ auto job = new ProcessDirectoryJob (path, item, NormalQuery, InBlackList, _lastSyncTimestamp, _synchronizeSymlinks, this );
16971703 connect (job, &ProcessDirectoryJob::finished, this , &ProcessDirectoryJob::subJobFinished);
16981704 _queuedJobs.push_back (job);
16991705 } else {
0 commit comments