[platform] making ConfigImportSettings the sole source of directory prefixes (IJPL-198038 preparation)

GitOrigin-RevId: 8878ff635a871b05a87084c736659bab840961db
This commit is contained in:
Roman Shevchenko
2025-09-24 18:11:03 +00:00
committed by intellij-monorepo-bot
parent 691497979c
commit c3c74cb81f
5 changed files with 23 additions and 27 deletions
@@ -169,8 +169,7 @@ public final class ConfigImportHelper {
return;
}
var otherProductPrefixes = settings != null ? settings.getProductsToImportFrom(args) : List.<String>of();
var guessedOldConfigDirs = findConfigDirectories(newConfigDir, settings, otherProductPrefixes);
var guessedOldConfigDirs = findConfigDirectories(newConfigDir, settings, args);
var tempBackup = (Path)null;
var vmOptionFileChanged = false;
var vmOptionsLines = (List<String>)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<String> otherProductPrefixes
@NotNull List<String> args
) {
var otherProductPrefixes = settings != null ? settings.getProductsToImportFrom(args) : List.<String>of();
var homes = new HashSet<Path>(); // 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
@@ -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<String> otherProductPrefixes) { }
default void importFinished(@NotNull Path newConfigDir, @Nullable Path oldConfigDir) { }
/**
* If there are no configs for previous versions of this product,
@@ -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());
@@ -40,8 +40,8 @@ abstract class ConfigImportHelperBaseTest : BareTestFixtureTestCase() {
Files.setLastModifiedTime(file, FileTime.from(lastModified.toInstant(ZoneOffset.UTC)))
}
protected fun findConfigDirectories(newConfigPath: Path): List<Path> =
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() {
@@ -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`() {