diff --git a/platform/platform-impl/src/com/intellij/openapi/application/ConfigImportHelper.java b/platform/platform-impl/src/com/intellij/openapi/application/ConfigImportHelper.java index 79273e021b09..c739f8603593 100644 --- a/platform/platform-impl/src/com/intellij/openapi/application/ConfigImportHelper.java +++ b/platform/platform-impl/src/com/intellij/openapi/application/ConfigImportHelper.java @@ -169,8 +169,7 @@ public final class ConfigImportHelper { return; } - var otherProductPrefixes = settings != null ? settings.getProductsToImportFrom(args) : List.of(); - var guessedOldConfigDirs = findConfigDirectories(newConfigDir, settings, otherProductPrefixes); + var guessedOldConfigDirs = findConfigDirectories(newConfigDir, settings, args); var tempBackup = (Path)null; var vmOptionFileChanged = false; var vmOptionsLines = (List)null; @@ -302,7 +301,8 @@ public final class ConfigImportHelper { } if (settings != null) { - settings.importFinished(newConfigDir, otherProductPrefixes); + var oldConfigDir = oldConfigDirAndOldIdePath != null ? oldConfigDirAndOldIdePath.first : null; + settings.importFinished(newConfigDir, oldConfigDir); } ImportOldConfigsUsagesCollector.INSTANCE.reportImportScenario(importScenarioStatistics); @@ -578,10 +578,6 @@ public final class ConfigImportHelper { } } - static @NotNull ConfigDirsSearchResult findConfigDirectories(@NotNull Path newConfigDir) { - return findConfigDirectories(newConfigDir, null, List.of()); - } - public static @Nullable FileTime getConfigLastModifiedTime(@NotNull Path configDir) { var max = (FileTime)null; for (var name : OPTIONS) { @@ -596,12 +592,13 @@ public final class ConfigImportHelper { return max; } - @VisibleForTesting public static @NotNull ConfigDirsSearchResult findConfigDirectories( @NotNull Path newConfigDir, @Nullable ConfigImportSettings settings, - @NotNull List otherProductPrefixes + @NotNull List args ) { + var otherProductPrefixes = settings != null ? settings.getProductsToImportFrom(args) : List.of(); + var homes = new HashSet(); // looking for existing config directories ... homes.add(newConfigDir.getParent()); // ... in the vicinity of the new config directory homes.add(newConfigDir.getFileSystem().getPath(PathManager.getDefaultConfigPathFor("X")).getParent()); // ... in the default location diff --git a/platform/platform-impl/src/com/intellij/openapi/application/ConfigImportSettings.java b/platform/platform-impl/src/com/intellij/openapi/application/ConfigImportSettings.java index 3d0c452b3acd..057f964a8bb3 100644 --- a/platform/platform-impl/src/com/intellij/openapi/application/ConfigImportSettings.java +++ b/platform/platform-impl/src/com/intellij/openapi/application/ConfigImportSettings.java @@ -16,9 +16,9 @@ import java.util.Set; public interface ConfigImportSettings { /** * Called after configuration import is finished, even when there was nothing to import from. - * In the latter case, {@link ConfigImportHelper#isConfigImported()} returns {@code false}. + * In the latter case, {@code oldConfigDir} is {@code null} and {@link ConfigImportHelper#isConfigImported()} returns {@code false}. */ - default void importFinished(@NotNull Path newConfigPath, @NotNull List otherProductPrefixes) { } + default void importFinished(@NotNull Path newConfigDir, @Nullable Path oldConfigDir) { } /** * If there are no configs for previous versions of this product, diff --git a/platform/platform-impl/src/com/intellij/openapi/application/OldDirectoryCleaner.java b/platform/platform-impl/src/com/intellij/openapi/application/OldDirectoryCleaner.java index 5c838e23d0ea..dd6068f6ef4e 100644 --- a/platform/platform-impl/src/com/intellij/openapi/application/OldDirectoryCleaner.java +++ b/platform/platform-impl/src/com/intellij/openapi/application/OldDirectoryCleaner.java @@ -94,7 +94,7 @@ public final class OldDirectoryCleaner { @RequiresBackgroundThread public void seekAndDestroy(@Nullable Project project, @Nullable ProgressIndicator indicator) { - var result = ConfigImportHelper.findConfigDirectories(PathManager.getConfigDir()); + var result = ConfigImportHelper.findConfigDirectories(PathManager.getConfigDir(), null, List.of()); var groups = collectDirectoryData(result, indicator); if (myLogger.isDebugEnabled()) { myLogger.debug("configs: " + result.getPaths()); diff --git a/platform/platform-tests/testSrc/com/intellij/openapi/application/ConfigImportHelperBaseTest.kt b/platform/platform-tests/testSrc/com/intellij/openapi/application/ConfigImportHelperBaseTest.kt index b41789fbe4b8..05fca2a6c0c7 100644 --- a/platform/platform-tests/testSrc/com/intellij/openapi/application/ConfigImportHelperBaseTest.kt +++ b/platform/platform-tests/testSrc/com/intellij/openapi/application/ConfigImportHelperBaseTest.kt @@ -40,8 +40,8 @@ abstract class ConfigImportHelperBaseTest : BareTestFixtureTestCase() { Files.setLastModifiedTime(file, FileTime.from(lastModified.toInstant(ZoneOffset.UTC))) } - protected fun findConfigDirectories(newConfigPath: Path): List = - ConfigImportHelper.findConfigDirectories(newConfigPath, null, emptyList()).paths + protected fun findConfigDirectories(newConfigPath: Path): ConfigImportHelper.ConfigDirsSearchResult = + ConfigImportHelper.findConfigDirectories(newConfigPath, ConfigImportHelper.findCustomConfigImportSettings(), /*args =*/ emptyList()) // disables broken plugins fetcher from the Marketplace by default class ConfigImportMarketplaceStub : ExternalResource() { diff --git a/platform/platform-tests/testSrc/com/intellij/openapi/application/ConfigImportHelperTest.kt b/platform/platform-tests/testSrc/com/intellij/openapi/application/ConfigImportHelperTest.kt index 556dee50d6a7..b1fd59d86161 100644 --- a/platform/platform-tests/testSrc/com/intellij/openapi/application/ConfigImportHelperTest.kt +++ b/platform/platform-tests/testSrc/com/intellij/openapi/application/ConfigImportHelperTest.kt @@ -74,7 +74,7 @@ class ConfigImportHelperTest : ConfigImportHelperBaseTest() { @Test fun `find pre-migration config directory`() { val cfg201 = createConfigDir("2020.1", modern = false) val newConfigPath = createConfigDir("2020.1", modern = true) - assertThat(findConfigDirectories(newConfigPath)).containsExactly(cfg201) + assertThat(findConfigDirectories(newConfigPath).paths).containsExactly(cfg201) } @Test fun `find both historic and current config directories`() { @@ -83,7 +83,7 @@ class ConfigImportHelperTest : ConfigImportHelperBaseTest() { val cfg201 = createConfigDir("2020.1", storageTS = LocalDateTime.of(2020, 4, 1, 10, 0)) val newConfigPath = createConfigDir("2020.2") - assertThat(findConfigDirectories(newConfigPath)).containsExactly(cfg201, cfg193, cfg15) + assertThat(findConfigDirectories(newConfigPath).paths).containsExactly(cfg201, cfg193, cfg15) } @Test fun `find recent config directory`() { @@ -93,10 +93,10 @@ class ConfigImportHelperTest : ConfigImportHelperBaseTest() { val cfg221 = createConfigDir("2022.1", storageTS = now.minusSeconds(1)) val newConfigPath = createConfigDir("2022.3") - assertThat(findConfigDirectories(newConfigPath)).containsExactly(cfg221, cfg211, cfg201) + assertThat(findConfigDirectories(newConfigPath).paths).containsExactly(cfg221, cfg211, cfg201) writeStorageFile(cfg211, now) - assertThat(findConfigDirectories(newConfigPath)).containsExactly(cfg211, cfg221, cfg201) + assertThat(findConfigDirectories(newConfigPath).paths).containsExactly(cfg211, cfg221, cfg201) } @Test fun `sort if no anchor files`() { @@ -105,7 +105,7 @@ class ConfigImportHelperTest : ConfigImportHelperBaseTest() { val cfg221 = createConfigDir("2022.1") val newConfigPath = createConfigDir("2022.3") - assertThat(findConfigDirectories(newConfigPath)).containsExactly(cfg221, cfg211, cfg201) + assertThat(findConfigDirectories(newConfigPath).paths).containsExactly(cfg221, cfg211, cfg201) } @Test fun `sort some real historic config dirs`() { @@ -122,7 +122,7 @@ class ConfigImportHelperTest : ConfigImportHelperBaseTest() { val cfg173 = createConfigDir("2017.3", product = "DataGrip", storageTS = LocalDateTime.of(2019, 2, 2, 8, 52)) val newConfigPath = createConfigDir("2020.1", product = "DataGrip") - assertThat(findConfigDirectories(newConfigPath)).containsExactly( + assertThat(findConfigDirectories(newConfigPath).paths).containsExactly( cfg173, cfg191, cfg182, cfg183, cfg181, cfg163, cfg172, cfg171, cfg161, cfg162, cfg10) } @@ -469,7 +469,7 @@ class ConfigImportHelperTest : ConfigImportHelperBaseTest() { } val current = createConfigDir("2021.2") - val result = ConfigImportHelper.findConfigDirectories(current, null, emptyList()) + val result = findConfigDirectories(current) assertThat(result.paths).containsExactlyInAnyOrder(cfg191, cfg192, cfg193, cfg201, cfg202, cfg203) val related = result.paths.map { result.findRelatedDirectories(it, false) } @@ -485,34 +485,33 @@ class ConfigImportHelperTest : ConfigImportHelperBaseTest() { val defaultProjectPath = "${SystemProperties.getUserHome()}/PhpstormProjects" Files.createDirectories(memoryFs.fs.getPath(defaultProjectPath)) val current = createConfigDir("2021.2", product = "PhpStorm") - val result = ConfigImportHelper.findConfigDirectories(current, null, emptyList()) - assertThat(result.paths).isEmpty() + assertThat(findConfigDirectories(current).paths).isEmpty() } @Test fun `suffix-less directories are excluded`() { createConfigDir(product = "Rider", version = "", modern = true) val current = createConfigDir(product = "Rider", version = "2022.1") - assertThat(findConfigDirectories(current)).isEmpty() + assertThat(findConfigDirectories(current).paths).isEmpty() } @Test fun `suffix-less directories are excluded case-insensitively`() { createConfigDir(product = "RIDER", version = "", modern = true) val current = createConfigDir(product = "Rider", version = "2022.1") - assertThat(findConfigDirectories(current)).isEmpty() + assertThat(findConfigDirectories(current).paths).isEmpty() } @Test fun `non-versioned directories are excluded_Rider`() { createConfigDir(product = "RiderFlow", version = "", modern = true) createConfigDir(product = "RiderRemoteDebugger", version = "", modern = true) val current = createConfigDir(product = "Rider", version = "2023.2") - assertThat(findConfigDirectories(current)).isEmpty() + assertThat(findConfigDirectories(current).paths).isEmpty() } @Test fun `non-versioned directories are excluded_CLion`() { createConfigDir(product = ".clion-vcpkg", version = "", modern = false) // was created at the user dir by older versions createConfigDir(product = "CLionNova", version = "2023.2", modern = true) // "CLion" + RADLER_SUFFIX = "CLionNova" val current = createConfigDir(product = "CLion", version = "2023.2") - assertThat(findConfigDirectories(current)).isEmpty() + assertThat(findConfigDirectories(current).paths).isEmpty() } @Test fun `merging VM options`() {