diff --git a/platform/platform-tests/testSrc/com/intellij/execution/wsl/WslSyncTest.kt b/platform/platform-tests/testSrc/com/intellij/execution/wsl/WslSyncTest.kt index dc019d673a53..55ac09c5da48 100644 --- a/platform/platform-tests/testSrc/com/intellij/execution/wsl/WslSyncTest.kt +++ b/platform/platform-tests/testSrc/com/intellij/execution/wsl/WslSyncTest.kt @@ -302,6 +302,36 @@ class WslSyncTest(private val linToWin: Boolean) { ) } + @Test + fun testRetainUnmatchedFiles() = runWithJob { + val windowsDir = winDirRule.newDirectoryPath() + val srcDir = if (linToWin) linuxDirAsPath else windowsDir + val dstDir = if (linToWin) windowsDir else linuxDirAsPath + + val sourceFiles = listOf("file1.txt", "file2.txt", "file3.txt") + for (fileName in sourceFiles) { + srcDir.resolve(fileName).writeText("Content of $fileName") + } + + val extraFile = "extra_file.txt" + dstDir.resolve(extraFile).writeText("Content of $extraFile") + WslSync.syncWslFolders(linuxDirRule.dir, windowsDir, wslRule.wsl, linToWin, retainUnmatchedFiles = false) + Assert.assertFalse("Extra file should be deleted", dstDir.resolve(extraFile).exists()) + dstDir.resolve(extraFile).writeText("Content of $extraFile") + + WslSync.syncWslFolders(linuxDirRule.dir, windowsDir, wslRule.wsl, linToWin, retainUnmatchedFiles = true) + + for (fileName in sourceFiles) { + Assert.assertTrue("Source file $fileName should be present", dstDir.resolve(fileName).exists()) + } + + Assert.assertTrue("Extra file should be retained", dstDir.resolve(extraFile).exists()) + + Assert.assertEquals("Content of extra file should be unchanged", + "Content of $extraFile", + dstDir.resolve(extraFile).readText()) + } + @Test fun syncWithIncludesAndStubs() = runWithJob { doSyncAndAssertFilePresence( diff --git a/platform/wsl-impl/src/com/intellij/execution/wsl/sync/WslSync.kt b/platform/wsl-impl/src/com/intellij/execution/wsl/sync/WslSync.kt index 6c503237b624..ee8950311f93 100644 --- a/platform/wsl-impl/src/com/intellij/execution/wsl/sync/WslSync.kt +++ b/platform/wsl-impl/src/com/intellij/execution/wsl/sync/WslSync.kt @@ -129,22 +129,22 @@ class WslSync private constructor(private val source: File val sourceHashAndName = sourceHashes[destRecord.fileLowerCase] if (sourceHashAndName != null) { - if (sourceHashAndName.hash == destRecord.hash) { - sourceHashes.remove(destRecord.fileLowerCase) - } else { - destFilesToRemove.add(destRecord.file) - } - } else { - if (!retainUnmatchedFiles) { - destFilesToRemove.add(destRecord.file) + if (sourceHashAndName.hash != destRecord.hash) { + filesToCopy.add(sourceHashAndName.file) } + sourceHashes.remove(destRecord.fileLowerCase) + } else if (!retainUnmatchedFiles) { + destFilesToRemove.add(destRecord.file) } } + // Add remaining files from source that don't exist in dest filesToCopy.addAll(sourceHashes.values.map { it.file }) - copyFilesInParallel(filesToCopy) - if (!retainUnmatchedFiles) { dest.removeFiles(destFilesToRemove) } + copyFilesInParallel(filesToCopy) + if (!retainUnmatchedFiles) { + dest.removeFiles(destFilesToRemove) + } syncLinks(sourceSyncData.links, destSyncData.links) syncStubs(sourceSyncData.stubs, destSyncData.stubs)