Skip to content

Commit 47d16d3

Browse files
authored
Merge pull request #6871 from nextcloud/bugfix/trailing-space
Only check for leading/trailing space for files on Windows.
2 parents 2fc6f28 + 1d9b6e2 commit 47d16d3

File tree

3 files changed

+83
-7
lines changed

3 files changed

+83
-7
lines changed

src/libsync/discovery.cpp

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -262,7 +262,8 @@ bool ProcessDirectoryJob::handleExcluded(const QString &path, const Entries &ent
262262

263263
const auto fileName = path.mid(path.lastIndexOf('/') + 1);
264264

265-
if (excluded == CSYNC_NOT_EXCLUDED) {
265+
const auto osDoesNotSupportsSpaces = Utility::isWindows();
266+
if (excluded == CSYNC_NOT_EXCLUDED && osDoesNotSupportsSpaces) {
266267
const auto endsWithSpace = fileName.endsWith(QLatin1Char(' '));
267268
const auto startsWithSpace = fileName.startsWith(QLatin1Char(' '));
268269
if (startsWithSpace && endsWithSpace) {
@@ -276,9 +277,12 @@ bool ProcessDirectoryJob::handleExcluded(const QString &path, const Entries &ent
276277

277278
// we don't need to trigger a warning if trailing/leading space file is already on the server or has already been synced down
278279
// only if the OS supports trailing/leading spaces
279-
const auto wasSyncedAlreadyAndOsSupportsSpaces = !Utility::isWindows() && (entries.serverEntry.isValid() || entries.dbEntry.isValid());
280-
if ((excluded == CSYNC_FILE_EXCLUDE_LEADING_SPACE || excluded == CSYNC_FILE_EXCLUDE_TRAILING_SPACE || excluded == CSYNC_FILE_EXCLUDE_LEADING_AND_TRAILING_SPACE)
281-
&& (wasSyncedAlreadyAndOsSupportsSpaces || _discoveryData->_leadingAndTrailingSpacesFilesAllowed.contains(_discoveryData->_localDir + path))) {
280+
const auto wasSyncedAlready = entries.serverEntry.isValid() || entries.dbEntry.isValid();
281+
const auto hasLeadingOrTrailingSpaces = excluded == CSYNC_FILE_EXCLUDE_LEADING_SPACE
282+
|| excluded == CSYNC_FILE_EXCLUDE_TRAILING_SPACE
283+
|| excluded == CSYNC_FILE_EXCLUDE_LEADING_AND_TRAILING_SPACE;
284+
const auto leadingAndTrailingSpacesFilesAllowed = _discoveryData->_leadingAndTrailingSpacesFilesAllowed.contains(_discoveryData->_localDir + path);
285+
if (hasLeadingOrTrailingSpaces && ((!osDoesNotSupportsSpaces && wasSyncedAlready) || leadingAndTrailingSpacesFilesAllowed)) {
282286
excluded = CSYNC_NOT_EXCLUDED;
283287
}
284288

test/testlocaldiscovery.cpp

Lines changed: 57 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -358,13 +358,23 @@ private slots:
358358

359359
QVERIFY(fakeFolder.syncOnce());
360360

361+
#if defined Q_OS_WINDOWS
361362
QCOMPARE(completeSpy.findItem(fileWithSpaces1)->_status, SyncFileItem::Status::FileNameInvalid);
362363
QCOMPARE(completeSpy.findItem(fileWithSpaces2)->_status, SyncFileItem::Status::FileNameInvalid);
363364
QCOMPARE(completeSpy.findItem(fileWithSpaces3)->_status, SyncFileItem::Status::FileNameInvalid);
364365
QCOMPARE(completeSpy.findItem(fileWithSpaces4)->_status, SyncFileItem::Status::FileNameInvalid);
365366
QCOMPARE(completeSpy.findItem(fileWithSpaces5)->_status, SyncFileItem::Status::FileNameInvalid);
366367
QCOMPARE(completeSpy.findItem(fileWithSpaces6)->_status, SyncFileItem::Status::FileNameInvalid);
367368
QCOMPARE(completeSpy.findItem(QStringLiteral(" with spaces "))->_status, SyncFileItem::Status::FileNameInvalid);
369+
#else
370+
QCOMPARE(completeSpy.findItem(fileWithSpaces1)->_status, SyncFileItem::Status::Success);
371+
QCOMPARE(completeSpy.findItem(fileWithSpaces2)->_status, SyncFileItem::Status::Success);
372+
QCOMPARE(completeSpy.findItem(fileWithSpaces3)->_status, SyncFileItem::Status::Success);
373+
QCOMPARE(completeSpy.findItem(fileWithSpaces4)->_status, SyncFileItem::Status::Success);
374+
QCOMPARE(completeSpy.findItem(fileWithSpaces5)->_status, SyncFileItem::Status::Success);
375+
QCOMPARE(completeSpy.findItem(fileWithSpaces6)->_status, SyncFileItem::Status::Success);
376+
QCOMPARE(completeSpy.findItem(QStringLiteral(" with spaces "))->_status, SyncFileItem::Status::Success);
377+
#endif
368378

369379
fakeFolder.syncEngine().addAcceptedInvalidFileName(fakeFolder.localPath() + fileWithSpaces1);
370380
fakeFolder.syncEngine().addAcceptedInvalidFileName(fakeFolder.localPath() + fileWithSpaces2);
@@ -379,16 +389,14 @@ private slots:
379389
fakeFolder.syncEngine().setLocalDiscoveryOptions(LocalDiscoveryStyle::DatabaseAndFilesystem, {QStringLiteral("foo"), QStringLiteral("bar"), QStringLiteral("bla"), QStringLiteral("A/foo"), QStringLiteral("A/bar"), QStringLiteral("A/bla")});
380390
QVERIFY(fakeFolder.syncOnce());
381391

392+
#if defined Q_OS_WINDOWS
382393
QCOMPARE(completeSpy.findItem(fileWithSpaces1)->_status, SyncFileItem::Status::Success);
383394
QCOMPARE(completeSpy.findItem(fileWithSpaces2)->_status, SyncFileItem::Status::Success);
384395
QCOMPARE(completeSpy.findItem(fileWithSpaces3)->_status, SyncFileItem::Status::Success);
385396
QCOMPARE(completeSpy.findItem(fileWithSpaces4)->_status, SyncFileItem::Status::Success);
386397
QCOMPARE(completeSpy.findItem(fileWithSpaces5)->_status, SyncFileItem::Status::Success);
387398
QCOMPARE(completeSpy.findItem(fileWithSpaces6)->_status, SyncFileItem::Status::Success);
388-
#ifdef Q_OS_WINDOWS
389399
QCOMPARE(completeSpy.findItem(QStringLiteral(" with spaces "))->_status, SyncFileItem::Status::NormalError);
390-
#else
391-
QCOMPARE(completeSpy.findItem(QStringLiteral(" with spaces "))->_status, SyncFileItem::Status::Success);
392400
#endif
393401
}
394402

@@ -422,6 +430,44 @@ private slots:
422430
}
423431
}
424432

433+
void testCreateLocalPathsWithLeadingAndTrailingSpaces_syncOnSupportingOs()
434+
{
435+
FakeFolder fakeFolder{FileInfo()};
436+
fakeFolder.localModifier().mkdir("A");
437+
QVERIFY(fakeFolder.syncOnce());
438+
QCOMPARE(fakeFolder.currentLocalState(), fakeFolder.currentRemoteState());
439+
440+
const QString fileWithSpaces1("A/ space");
441+
const QString fileWithSpaces2("A/ space ");
442+
const QString fileWithSpaces3("A/space ");
443+
const QString folderWithSpaces1("A ");
444+
const QString folderWithSpaces2(" B ");
445+
446+
fakeFolder.localModifier().insert(fileWithSpaces1);
447+
fakeFolder.localModifier().insert(fileWithSpaces2);
448+
fakeFolder.localModifier().insert(fileWithSpaces3);
449+
fakeFolder.localModifier().mkdir(folderWithSpaces1);
450+
fakeFolder.localModifier().mkdir(folderWithSpaces2);
451+
452+
ItemCompletedSpy completeSpy(fakeFolder);
453+
completeSpy.clear();
454+
455+
QVERIFY(fakeFolder.syncOnce());
456+
457+
#if !defined Q_OS_WINDOWS
458+
QCOMPARE(completeSpy.findItem(fileWithSpaces1)->_status, SyncFileItem::Status::Success);
459+
QCOMPARE(completeSpy.findItem(fileWithSpaces2)->_status, SyncFileItem::Status::Success);
460+
QCOMPARE(completeSpy.findItem(fileWithSpaces3)->_status, SyncFileItem::Status::Success);
461+
QCOMPARE(completeSpy.findItem(folderWithSpaces1)->_status, SyncFileItem::Status::Success);
462+
QCOMPARE(completeSpy.findItem(folderWithSpaces2)->_status, SyncFileItem::Status::Success);
463+
QVERIFY(fakeFolder.remoteModifier().find(fileWithSpaces1));
464+
QVERIFY(fakeFolder.remoteModifier().find(fileWithSpaces2));
465+
QVERIFY(fakeFolder.remoteModifier().find(fileWithSpaces3));
466+
QVERIFY(fakeFolder.remoteModifier().find(folderWithSpaces1));
467+
QVERIFY(fakeFolder.remoteModifier().find(folderWithSpaces2));
468+
#endif
469+
}
470+
425471
void testCreateFileWithTrailingSpaces_remoteGetRenamedManually()
426472
{
427473
// On Windows we can't create files/folders with leading/trailing spaces locally. So, we have to fail those items. On other OSs - we just sync them down normally.
@@ -481,7 +527,15 @@ private slots:
481527
QVERIFY(fakeFolder.syncOnce());
482528

483529
QVERIFY(fakeFolder.currentRemoteState().find(fileTrimmed));
530+
531+
#if defined Q_OS_WINDOWS
532+
// no file with spaces on Windows
484533
QVERIFY(!fakeFolder.currentRemoteState().find(fileWithSpaces));
534+
#else
535+
//Linux/Mac OS allows spaces
536+
QVERIFY(fakeFolder.currentRemoteState().find(fileWithSpaces));
537+
#endif
538+
485539
QVERIFY(fakeFolder.currentLocalState().find(fileWithSpaces));
486540
QVERIFY(fakeFolder.currentLocalState().find(fileTrimmed));
487541
}

test/testsyncvirtualfiles.cpp

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -835,12 +835,21 @@ private slots:
835835

836836
QVERIFY(fakeFolder.syncOnce());
837837

838+
#if defined Q_OS_WINDOWS
838839
QCOMPARE(completeSpy.findItem(fileWithSpaces1)->_status, SyncFileItem::Status::FileNameInvalid);
839840
QCOMPARE(completeSpy.findItem(fileWithSpaces2)->_status, SyncFileItem::Status::FileNameInvalid);
840841
QCOMPARE(completeSpy.findItem(fileWithSpaces3)->_status, SyncFileItem::Status::FileNameInvalid);
841842
QCOMPARE(completeSpy.findItem(fileWithSpaces4)->_status, SyncFileItem::Status::FileNameInvalid);
842843
QCOMPARE(completeSpy.findItem(fileWithSpaces5)->_status, SyncFileItem::Status::FileNameInvalid);
843844
QCOMPARE(completeSpy.findItem(fileWithSpaces6)->_status, SyncFileItem::Status::FileNameInvalid);
845+
#else
846+
QCOMPARE(completeSpy.findItem(fileWithSpaces1)->_status, SyncFileItem::Status::Success);
847+
QCOMPARE(completeSpy.findItem(fileWithSpaces2)->_status, SyncFileItem::Status::Success);
848+
QCOMPARE(completeSpy.findItem(fileWithSpaces3)->_status, SyncFileItem::Status::Success);
849+
QCOMPARE(completeSpy.findItem(fileWithSpaces4)->_status, SyncFileItem::Status::Success);
850+
QCOMPARE(completeSpy.findItem(fileWithSpaces5)->_status, SyncFileItem::Status::Success);
851+
QCOMPARE(completeSpy.findItem(fileWithSpaces6)->_status, SyncFileItem::Status::Success);
852+
#endif
844853

845854
fakeFolder.syncEngine().addAcceptedInvalidFileName(fakeFolder.localPath() + fileWithSpaces1);
846855
fakeFolder.syncEngine().addAcceptedInvalidFileName(fakeFolder.localPath() + fileWithSpaces2);
@@ -853,12 +862,21 @@ private slots:
853862

854863
QVERIFY(fakeFolder.syncOnce());
855864

865+
#if defined Q_OS_WINDOWS
856866
QCOMPARE(completeSpy.findItem(fileWithSpaces1)->_status, SyncFileItem::Status::Success);
857867
QCOMPARE(completeSpy.findItem(fileWithSpaces2)->_status, SyncFileItem::Status::Success);
858868
QCOMPARE(completeSpy.findItem(fileWithSpaces3)->_status, SyncFileItem::Status::Success);
859869
QCOMPARE(completeSpy.findItem(fileWithSpaces4)->_status, SyncFileItem::Status::Success);
860870
QCOMPARE(completeSpy.findItem(fileWithSpaces5)->_status, SyncFileItem::Status::Success);
861871
QCOMPARE(completeSpy.findItem(fileWithSpaces6)->_status, SyncFileItem::Status::Success);
872+
#else
873+
QCOMPARE(completeSpy.findItem(fileWithSpaces1)->_status, SyncFileItem::Status::NoStatus);
874+
QCOMPARE(completeSpy.findItem(fileWithSpaces2)->_status, SyncFileItem::Status::NoStatus);
875+
QCOMPARE(completeSpy.findItem(fileWithSpaces3)->_status, SyncFileItem::Status::NoStatus);
876+
QCOMPARE(completeSpy.findItem(fileWithSpaces4)->_status, SyncFileItem::Status::NoStatus);
877+
QCOMPARE(completeSpy.findItem(fileWithSpaces5)->_status, SyncFileItem::Status::NoStatus);
878+
QCOMPARE(completeSpy.findItem(fileWithSpaces6)->_status, SyncFileItem::Status::NoStatus);
879+
#endif
862880
}
863881

864882
void testCreateFileWithTrailingSpaces_remoteDontGetRenamedAutomatically()

0 commit comments

Comments
 (0)