diff --git a/platform/platform-impl/src/com/intellij/platform/ide/impl/productInfo/IdeProductInfoImpl.kt b/platform/platform-impl/src/com/intellij/platform/ide/impl/productInfo/IdeProductInfoImpl.kt index 6ebe25c433bf..20acc693400a 100644 --- a/platform/platform-impl/src/com/intellij/platform/ide/impl/productInfo/IdeProductInfoImpl.kt +++ b/platform/platform-impl/src/com/intellij/platform/ide/impl/productInfo/IdeProductInfoImpl.kt @@ -15,7 +15,9 @@ import kotlinx.serialization.json.Json import kotlinx.serialization.json.decodeFromStream import java.nio.file.Path import kotlin.io.path.Path +import kotlin.io.path.exists import kotlin.io.path.inputStream +import kotlin.io.path.isDirectory import kotlin.io.path.name internal class IdeProductInfoImpl : IdeProductInfo { @@ -32,7 +34,7 @@ internal class IdeProductInfoImpl : IdeProductInfo { override fun loadProductInfo(ideHome: Path): ProductInfoData? { return try { - if (SystemInfo.isMac && ideHome.name != "Contents") { + if (SystemInfo.isMac && ideHome.name != "Contents" && ideHome.resolve("Contents").isDirectory()) { tryLoadingProductInfo(ideHome.resolve("Contents")) } else { @@ -47,7 +49,10 @@ internal class IdeProductInfoImpl : IdeProductInfo { @OptIn(ExperimentalSerializationApi::class) private fun tryLoadingProductInfo(ideHome: Path): ProductInfoData { - val productInfoRelativePath = if (SystemInfo.isMac) ApplicationEx.PRODUCT_INFO_FILE_NAME_MAC else ApplicationEx.PRODUCT_INFO_FILE_NAME + val productInfoRelativePath = + //cross-platform distribution used for plugin development has the product-info.json file at the root even on macOS + if (SystemInfo.isMac && ideHome.resolve(ApplicationEx.PRODUCT_INFO_FILE_NAME_MAC).exists()) ApplicationEx.PRODUCT_INFO_FILE_NAME_MAC + else ApplicationEx.PRODUCT_INFO_FILE_NAME val productInfoPath = ideHome.resolve(productInfoRelativePath) return productInfoPath.inputStream().buffered().use { json.decodeFromStream(ProductInfoData.serializer(), it) diff --git a/platform/platform-tests/testData/productInfo/idea-2025.1-cross-platform/product-info.json b/platform/platform-tests/testData/productInfo/idea-2025.1-cross-platform/product-info.json new file mode 100644 index 000000000000..f85a5d6fc87a --- /dev/null +++ b/platform/platform-tests/testData/productInfo/idea-2025.1-cross-platform/product-info.json @@ -0,0 +1,121 @@ +{ + "name": "IntelliJ IDEA", + "version": "2025.1", + "versionSuffix": "EAP", + "buildNumber": "251.21418.34", + "productCode": "IU", + "envVarBaseName": "IDEA", + "dataDirectoryName": "IntelliJIdea2025.1", + "svgIconPath": "bin/idea.svg", + "productVendor": "JetBrains", + "launch": [ + { + "os": "Windows", + "arch": "amd64", + "launcherPath": "bin/idea.bat", + "vmOptionsFilePath": "bin/win/idea64.exe.vmoptions", + "bootClassPathJarNames": [ + "platform-loader.jar", + "util-8.jar", + "util.jar" + ], + "additionalJvmArguments": [ + "-Xbootclasspath/a:%IDE_HOME%/lib/nio-fs.jar", + "-Djava.system.class.loader=com.intellij.util.lang.PathClassLoader" + ], + "mainClass": "com.intellij.idea.Main" + }, + { + "os": "Linux", + "arch": "amd64", + "launcherPath": "bin/idea.sh", + "vmOptionsFilePath": "bin/linux/idea64.vmoptions", + "startupWmClass": "jetbrains-idea", + "bootClassPathJarNames": [ + "platform-loader.jar", + "util-8.jar", + "util.jar" + ], + "additionalJvmArguments": [ + "-Xbootclasspath/a:$IDE_HOME/lib/nio-fs.jar", + "-Djava.system.class.loader=com.intellij.util.lang.PathClassLoader" + ], + "mainClass": "com.intellij.idea.Main" + }, + { + "os": "macOS", + "arch": "amd64", + "launcherPath": "bin/idea.sh", + "vmOptionsFilePath": "bin/mac/idea.vmoptions", + "bootClassPathJarNames": [ + "platform-loader.jar", + "util-8.jar", + "util.jar" + ], + "additionalJvmArguments": [ + "-Xbootclasspath/a:$APP_PACKAGE/lib/nio-fs.jar", + "-Djava.system.class.loader=com.intellij.util.lang.PathClassLoader" + ], + "mainClass": "com.intellij.idea.Main" + }, + { + "os": "Windows", + "arch": "aarch64", + "launcherPath": "bin/idea.bat", + "vmOptionsFilePath": "bin/win/idea64.exe.vmoptions", + "bootClassPathJarNames": [ + "platform-loader.jar", + "util-8.jar", + "util.jar" + ], + "additionalJvmArguments": [ + "-Xbootclasspath/a:%IDE_HOME%/lib/nio-fs.jar", + "-Djava.system.class.loader=com.intellij.util.lang.PathClassLoader" + ], + "mainClass": "com.intellij.idea.Main" + }, + { + "os": "Linux", + "arch": "aarch64", + "launcherPath": "bin/idea.sh", + "vmOptionsFilePath": "bin/linux/idea64.vmoptions", + "startupWmClass": "jetbrains-idea", + "bootClassPathJarNames": [ + "platform-loader.jar", + "util-8.jar", + "util.jar" + ], + "additionalJvmArguments": [ + "-Xbootclasspath/a:$IDE_HOME/lib/nio-fs.jar", + "-Djava.system.class.loader=com.intellij.util.lang.PathClassLoader" + ], + "mainClass": "com.intellij.idea.Main" + }, + { + "os": "macOS", + "arch": "aarch64", + "launcherPath": "bin/idea.sh", + "vmOptionsFilePath": "bin/mac/idea.vmoptions", + "bootClassPathJarNames": [ + "platform-loader.jar", + "util-8.jar" + ], + "additionalJvmArguments": [ + "-Xbootclasspath/a:$APP_PACKAGE/lib/nio-fs.jar", + "-Djava.system.class.loader=com.intellij.util.lang.PathClassLoader" + ], + "mainClass": "com.intellij.idea.Main" + } + ], + "bundledPlugins": [ + "AngularJS" + ], + "modules": [ + "com.intellij.java.frontback.impl" + ], + "fileExtensions": [ + "*.java" + ], + "layout": [ + ] +} \ No newline at end of file diff --git a/platform/platform-tests/testSrc/com/intellij/platform/ide/productInfo/IdeProductInfoTest.kt b/platform/platform-tests/testSrc/com/intellij/platform/ide/productInfo/IdeProductInfoTest.kt index 74035cdedbd1..5bbdc9bd3356 100644 --- a/platform/platform-tests/testSrc/com/intellij/platform/ide/productInfo/IdeProductInfoTest.kt +++ b/platform/platform-tests/testSrc/com/intellij/platform/ide/productInfo/IdeProductInfoTest.kt @@ -31,7 +31,12 @@ class IdeProductInfoTest { assertEquals("2024.3.1", loadProductInfo("idea-2024.3.1-macOS").version) assertEquals("2024.3.1", loadProductInfo("idea-2024.3.1-macOS/Contents").version) } - + + @Test + fun `idea 2025_1 cross platform`() { + assertEquals("2025.1", loadProductInfo("idea-2025.1-cross-platform").version) + } + @Test fun `idea community 2022_1_4`() { assumeTrue(SystemInfo.isLinux || SystemInfo.isWindows)