From 68d1fa1a5ed937ce3662dca460b03b70a88b42f1 Mon Sep 17 00:00:00 2001 From: "Reece H. Dunn" Date: Tue, 23 May 2023 16:51:00 +0100 Subject: [PATCH 1/5] Define an IntellijProductType enumeration type. --- .../rhdunn/intellij/IntellijProductType.kt | 66 +++++++++++++++++++ 1 file changed, 66 insertions(+) create mode 100644 buildSrc/src/main/kotlin/io/github/rhdunn/intellij/IntellijProductType.kt diff --git a/buildSrc/src/main/kotlin/io/github/rhdunn/intellij/IntellijProductType.kt b/buildSrc/src/main/kotlin/io/github/rhdunn/intellij/IntellijProductType.kt new file mode 100644 index 0000000000..a88769cee4 --- /dev/null +++ b/buildSrc/src/main/kotlin/io/github/rhdunn/intellij/IntellijProductType.kt @@ -0,0 +1,66 @@ +// Copyright (C) 2023 Reece H. Dunn. SPDX-License-Identifier: Apache-2.0 +package io.github.rhdunn.intellij + +/** + * The IntelliJ product type. + * + * @param productName The name of the product. + * + * @see Gradle IntelliJ Plugin type property + */ +enum class IntellijProductType(val productName: String) { + /** + * IntelliJ IDEA Community Edition + */ + IC("IntelliJ IDEA Community Edition"), + + /** + * IntelliJ IDEA Ultimate Edition + */ + IU("IntelliJ IDEA Ultimate Edition"), + + /** + * CLion + */ + CL("CLion"), + + /** + * PyCharm Professional Edition + */ + PY("PyCharm Professional Edition"), + + /** + * PyCharm Community Edition + */ + PC("PyCharm Community Edition"), + + /** + * PhpStorm + */ + PS("PhpStorm"), + + /** + * Rider + */ + RD("Rider"), + + /** + * GoLand + */ + GO("GoLand"), + + /** + * Android Studio + */ + AI("Android Studio"), + + /** + * JPS-only + */ + JPS("JPS-only"), + + /** + * Gateway + */ + GW("Gateway"), +} From d7be847098cf36ffedd0fa4ccaa348d727776785 Mon Sep 17 00:00:00 2001 From: "Reece H. Dunn" Date: Tue, 23 May 2023 19:32:33 +0100 Subject: [PATCH 2/5] Support parsing IntelliJ version number strings. --- buildSrc/build.gradle.kts | 9 ++++ .../github/rhdunn/intellij/IntellijVersion.kt | 48 +++++++++++++++++++ .../rhdunn/test/intellij/IntellijVersion.kt | 44 +++++++++++++++++ 3 files changed, 101 insertions(+) create mode 100644 buildSrc/src/main/kotlin/io/github/rhdunn/intellij/IntellijVersion.kt create mode 100644 buildSrc/src/test/kotlin/io/github/rhdunn/test/intellij/IntellijVersion.kt diff --git a/buildSrc/build.gradle.kts b/buildSrc/build.gradle.kts index b15bc2bd80..8aa476e3cb 100644 --- a/buildSrc/build.gradle.kts +++ b/buildSrc/build.gradle.kts @@ -6,3 +6,12 @@ repositories { mavenLocal() mavenCentral() } + +dependencies { + testImplementation(kotlin("test")) + testImplementation("org.junit.jupiter:junit-jupiter:5.9.2") +} + +tasks.test { + useJUnitPlatform() +} diff --git a/buildSrc/src/main/kotlin/io/github/rhdunn/intellij/IntellijVersion.kt b/buildSrc/src/main/kotlin/io/github/rhdunn/intellij/IntellijVersion.kt new file mode 100644 index 0000000000..90b9b1627b --- /dev/null +++ b/buildSrc/src/main/kotlin/io/github/rhdunn/intellij/IntellijVersion.kt @@ -0,0 +1,48 @@ +// Copyright (C) 2023 Reece H. Dunn. SPDX-License-Identifier: Apache-2.0 +package io.github.rhdunn.intellij + +import org.gradle.api.GradleException + +/** + * An IntelliJ version number. + * + * @see Gradle IntelliJ Plugin version property + */ +data class IntellijVersion( + /** + * The product type. + */ + val productType: IntellijProductType?, + + /** + * The major version in the YYR (Y=Year, R=Release) format. + */ + val majorVersion: Int, + + /** + * The full version number string. + */ + val version: String +) + +private val VERSION_NUMBER = Regex("(([A-Z]+)-)?20([0-9][0-9]).([1-3])(.[0-9]+)?") + +/** + * An IntelliJ version number. + * + * @param version the full version number string + * + * @see Gradle IntelliJ Plugin version property + */ +fun IntellijVersion(version: String): IntellijVersion { + VERSION_NUMBER.matchEntire(version)?.let { match -> + val productType = when (val type = match.groupValues[2]) { + "" -> null + else -> IntellijProductType.valueOf(type) + } + val majorVersion = "${match.groupValues[3]}${match.groupValues[4]}" + return IntellijVersion(productType, majorVersion.toInt(), version) + } + + throw GradleException("Unsupported IntellijVersion: $version") +} diff --git a/buildSrc/src/test/kotlin/io/github/rhdunn/test/intellij/IntellijVersion.kt b/buildSrc/src/test/kotlin/io/github/rhdunn/test/intellij/IntellijVersion.kt new file mode 100644 index 0000000000..a4f4f46e05 --- /dev/null +++ b/buildSrc/src/test/kotlin/io/github/rhdunn/test/intellij/IntellijVersion.kt @@ -0,0 +1,44 @@ +// Copyright (C) 2023 Reece H. Dunn. SPDX-License-Identifier: Apache-2.0 +package io.github.rhdunn.test.intellij + +import io.github.rhdunn.intellij.IntellijProductType +import io.github.rhdunn.intellij.IntellijVersion +import org.junit.jupiter.api.DisplayName +import org.junit.jupiter.api.Test +import kotlin.test.assertEquals + +@DisplayName("The IntellijVersion class") +class IntellijVersionTest { + @Test + fun `should parse year-version version number strings`() { + assertEquals( + IntellijVersion(null, 213, "2021.3"), + IntellijVersion("2021.3") + ) + assertEquals( + IntellijVersion(null, 173, "2017.3.4"), + IntellijVersion("2017.3.4") + ) + } + + @Test + fun `should parse type-year-version version number strings`() { + assertEquals( + IntellijVersion(IntellijProductType.IC, 213, "IC-2021.3"), + IntellijVersion("IC-2021.3") + ) + assertEquals( + IntellijVersion(IntellijProductType.IC, 173, "IC-2017.3.4"), + IntellijVersion("IC-2017.3.4") + ) + + assertEquals( + IntellijVersion(IntellijProductType.IU, 213, "IU-2021.3"), + IntellijVersion("IU-2021.3") + ) + assertEquals( + IntellijVersion(IntellijProductType.IU, 173, "IU-2017.3.4"), + IntellijVersion("IU-2017.3.4") + ) + } +} From 8d49fed6af991352558de3d31cbe976fcd09f610 Mon Sep 17 00:00:00 2001 From: "Reece H. Dunn" Date: Tue, 23 May 2023 19:40:08 +0100 Subject: [PATCH 3/5] Support parsing IntelliJ build number strings. --- .../github/rhdunn/intellij/IntellijVersion.kt | 10 +++++ .../rhdunn/test/intellij/IntellijVersion.kt | 37 ++++++++++++++++++- 2 files changed, 45 insertions(+), 2 deletions(-) diff --git a/buildSrc/src/main/kotlin/io/github/rhdunn/intellij/IntellijVersion.kt b/buildSrc/src/main/kotlin/io/github/rhdunn/intellij/IntellijVersion.kt index 90b9b1627b..c0debbc680 100644 --- a/buildSrc/src/main/kotlin/io/github/rhdunn/intellij/IntellijVersion.kt +++ b/buildSrc/src/main/kotlin/io/github/rhdunn/intellij/IntellijVersion.kt @@ -26,6 +26,7 @@ data class IntellijVersion( ) private val VERSION_NUMBER = Regex("(([A-Z]+)-)?20([0-9][0-9]).([1-3])(.[0-9]+)?") +private val BUILD_NUMBER = Regex("(([A-Z]+)-)?([0-9][0-9][0-9]).[0-9]+(.[0-9]+)?") /** * An IntelliJ version number. @@ -44,5 +45,14 @@ fun IntellijVersion(version: String): IntellijVersion { return IntellijVersion(productType, majorVersion.toInt(), version) } + BUILD_NUMBER.matchEntire(version)?.let { match -> + val productType = when (val type = match.groupValues[2]) { + "" -> null + else -> IntellijProductType.valueOf(type) + } + val majorVersion = match.groupValues[3] + return IntellijVersion(productType, majorVersion.toInt(), version) + } + throw GradleException("Unsupported IntellijVersion: $version") } diff --git a/buildSrc/src/test/kotlin/io/github/rhdunn/test/intellij/IntellijVersion.kt b/buildSrc/src/test/kotlin/io/github/rhdunn/test/intellij/IntellijVersion.kt index a4f4f46e05..07a023de3e 100644 --- a/buildSrc/src/test/kotlin/io/github/rhdunn/test/intellij/IntellijVersion.kt +++ b/buildSrc/src/test/kotlin/io/github/rhdunn/test/intellij/IntellijVersion.kt @@ -10,7 +10,7 @@ import kotlin.test.assertEquals @DisplayName("The IntellijVersion class") class IntellijVersionTest { @Test - fun `should parse year-version version number strings`() { + fun `should parse version number strings without product types`() { assertEquals( IntellijVersion(null, 213, "2021.3"), IntellijVersion("2021.3") @@ -22,7 +22,7 @@ class IntellijVersionTest { } @Test - fun `should parse type-year-version version number strings`() { + fun `should parse version number strings with product types`() { assertEquals( IntellijVersion(IntellijProductType.IC, 213, "IC-2021.3"), IntellijVersion("IC-2021.3") @@ -41,4 +41,37 @@ class IntellijVersionTest { IntellijVersion("IU-2017.3.4") ) } + + @Test + fun `should parse build number strings without product types`() { + assertEquals( + IntellijVersion(null, 213, "213.53"), + IntellijVersion("213.53") + ) + assertEquals( + IntellijVersion(null, 173, "173.4.5"), + IntellijVersion("173.4.5") + ) + } + + @Test + fun `should parse build number strings with product types`() { + assertEquals( + IntellijVersion(IntellijProductType.IC, 213, "IC-213.57"), + IntellijVersion("IC-213.57") + ) + assertEquals( + IntellijVersion(IntellijProductType.IC, 173, "IC-173.4.5"), + IntellijVersion("IC-173.4.5") + ) + + assertEquals( + IntellijVersion(IntellijProductType.IU, 213, "IU-213.45"), + IntellijVersion("IU-213.45") + ) + assertEquals( + IntellijVersion(IntellijProductType.IU, 173, "IU-173.4.5"), + IntellijVersion("IU-173.4.5") + ) + } } From 20f2c2b5ddd19cde89f0bbe8acc96a437fbed27d Mon Sep 17 00:00:00 2001 From: "Reece H. Dunn" Date: Wed, 24 May 2023 09:25:50 +0100 Subject: [PATCH 4/5] Support parsing IntelliJ snapshot strings with a build number. --- .../kotlin/io/github/rhdunn/intellij/IntellijVersion.kt | 6 ++++++ .../io/github/rhdunn/test/intellij/IntellijVersion.kt | 8 ++++++++ 2 files changed, 14 insertions(+) diff --git a/buildSrc/src/main/kotlin/io/github/rhdunn/intellij/IntellijVersion.kt b/buildSrc/src/main/kotlin/io/github/rhdunn/intellij/IntellijVersion.kt index c0debbc680..39c13b9f7e 100644 --- a/buildSrc/src/main/kotlin/io/github/rhdunn/intellij/IntellijVersion.kt +++ b/buildSrc/src/main/kotlin/io/github/rhdunn/intellij/IntellijVersion.kt @@ -27,6 +27,7 @@ data class IntellijVersion( private val VERSION_NUMBER = Regex("(([A-Z]+)-)?20([0-9][0-9]).([1-3])(.[0-9]+)?") private val BUILD_NUMBER = Regex("(([A-Z]+)-)?([0-9][0-9][0-9]).[0-9]+(.[0-9]+)?") +private val EAP_SNAPSHOT = Regex("([0-9][0-9][0-9])-EAP-SNAPSHOT") /** * An IntelliJ version number. @@ -54,5 +55,10 @@ fun IntellijVersion(version: String): IntellijVersion { return IntellijVersion(productType, majorVersion.toInt(), version) } + EAP_SNAPSHOT.matchEntire(version)?.let { match -> + val majorVersion = match.groupValues[1] + return IntellijVersion(null, majorVersion.toInt(), version) + } + throw GradleException("Unsupported IntellijVersion: $version") } diff --git a/buildSrc/src/test/kotlin/io/github/rhdunn/test/intellij/IntellijVersion.kt b/buildSrc/src/test/kotlin/io/github/rhdunn/test/intellij/IntellijVersion.kt index 07a023de3e..532ee4e915 100644 --- a/buildSrc/src/test/kotlin/io/github/rhdunn/test/intellij/IntellijVersion.kt +++ b/buildSrc/src/test/kotlin/io/github/rhdunn/test/intellij/IntellijVersion.kt @@ -74,4 +74,12 @@ class IntellijVersionTest { IntellijVersion("IU-173.4.5") ) } + + @Test + fun `should parse snapshot strings with build numbers`() { + assertEquals( + IntellijVersion(null, 193, "193-EAP-SNAPSHOT"), + IntellijVersion("193-EAP-SNAPSHOT") + ) + } } From 4b236a16a07bf98a1936ad59c05079955b9862f2 Mon Sep 17 00:00:00 2001 From: "Reece H. Dunn" Date: Wed, 24 May 2023 10:29:16 +0100 Subject: [PATCH 5/5] Support parsing IntelliJ LATEST-EAP-SNAPSHOT snapshot strings. --- .../github/rhdunn/intellij/IntellijVersion.kt | 48 +++++++++++++++---- .../rhdunn/test/intellij/IntellijVersion.kt | 17 +++++++ 2 files changed, 57 insertions(+), 8 deletions(-) diff --git a/buildSrc/src/main/kotlin/io/github/rhdunn/intellij/IntellijVersion.kt b/buildSrc/src/main/kotlin/io/github/rhdunn/intellij/IntellijVersion.kt index 39c13b9f7e..3f6ae61e75 100644 --- a/buildSrc/src/main/kotlin/io/github/rhdunn/intellij/IntellijVersion.kt +++ b/buildSrc/src/main/kotlin/io/github/rhdunn/intellij/IntellijVersion.kt @@ -2,6 +2,8 @@ package io.github.rhdunn.intellij import org.gradle.api.GradleException +import java.io.File +import java.net.URL /** * An IntelliJ version number. @@ -23,27 +25,55 @@ data class IntellijVersion( * The full version number string. */ val version: String -) +) { + companion object { + private const val REPOSITORY_PATH = + "https://www.jetbrains.com/intellij-repository/snapshots/com/jetbrains/intellij/idea/BUILD" + + /** + * Download and extract the build from an IntelliJ snapshot build file. + * + * @param version the version name corresponding to a build file + */ + fun build(version: String): IntellijVersion { + val build = File("build/BUILD-$version.txt") + if (!build.exists()) { + build.parentFile.mkdirs() + + val downloadUrl = URL("$REPOSITORY_PATH/$version/BUILD-$version.txt") + println("Downloading build version file '$downloadUrl' to '${build.absolutePath}'") + + downloadUrl.openStream().use { input -> + build.outputStream().use { output -> + input.copyTo(output) + } + } + } + return IntellijVersion(build.readLines()[0], version) + } + } +} private val VERSION_NUMBER = Regex("(([A-Z]+)-)?20([0-9][0-9]).([1-3])(.[0-9]+)?") private val BUILD_NUMBER = Regex("(([A-Z]+)-)?([0-9][0-9][0-9]).[0-9]+(.[0-9]+)?") -private val EAP_SNAPSHOT = Regex("([0-9][0-9][0-9])-EAP-SNAPSHOT") +private val EAP_SNAPSHOT = Regex("([0-9][0-9][0-9]|LATEST)-EAP-SNAPSHOT") /** * An IntelliJ version number. * * @param version the full version number string + * @param versionAlias the version alias, e.g. EAP version string * * @see Gradle IntelliJ Plugin version property */ -fun IntellijVersion(version: String): IntellijVersion { +fun IntellijVersion(version: String, versionAlias: String? = null): IntellijVersion { VERSION_NUMBER.matchEntire(version)?.let { match -> val productType = when (val type = match.groupValues[2]) { "" -> null else -> IntellijProductType.valueOf(type) } val majorVersion = "${match.groupValues[3]}${match.groupValues[4]}" - return IntellijVersion(productType, majorVersion.toInt(), version) + return IntellijVersion(productType, majorVersion.toInt(), versionAlias ?: version) } BUILD_NUMBER.matchEntire(version)?.let { match -> @@ -52,13 +82,15 @@ fun IntellijVersion(version: String): IntellijVersion { else -> IntellijProductType.valueOf(type) } val majorVersion = match.groupValues[3] - return IntellijVersion(productType, majorVersion.toInt(), version) + return IntellijVersion(productType, majorVersion.toInt(), versionAlias ?: version) } EAP_SNAPSHOT.matchEntire(version)?.let { match -> - val majorVersion = match.groupValues[1] - return IntellijVersion(null, majorVersion.toInt(), version) + return when (val majorVersion = match.groupValues[1]) { + "LATEST" -> IntellijVersion.build(version) + else -> IntellijVersion(null, majorVersion.toInt(), versionAlias ?: version) + } } - throw GradleException("Unsupported IntellijVersion: $version") + throw GradleException("Unsupported IntelliJ version: $version") } diff --git a/buildSrc/src/test/kotlin/io/github/rhdunn/test/intellij/IntellijVersion.kt b/buildSrc/src/test/kotlin/io/github/rhdunn/test/intellij/IntellijVersion.kt index 532ee4e915..2d64f0dd8e 100644 --- a/buildSrc/src/test/kotlin/io/github/rhdunn/test/intellij/IntellijVersion.kt +++ b/buildSrc/src/test/kotlin/io/github/rhdunn/test/intellij/IntellijVersion.kt @@ -5,7 +5,9 @@ import io.github.rhdunn.intellij.IntellijProductType import io.github.rhdunn.intellij.IntellijVersion import org.junit.jupiter.api.DisplayName import org.junit.jupiter.api.Test +import java.io.File import kotlin.test.assertEquals +import kotlin.test.assertTrue @DisplayName("The IntellijVersion class") class IntellijVersionTest { @@ -82,4 +84,19 @@ class IntellijVersionTest { IntellijVersion("193-EAP-SNAPSHOT") ) } + + @Test + fun `should parse snapshot string LATEST-EAP-SNAPSHOT`() { + val build = File("build/BUILD-LATEST-EAP-SNAPSHOT.txt") + val version = IntellijVersion("LATEST-EAP-SNAPSHOT") + + assertTrue(build.exists(), "The ${build.path} file exists.") + + val buildNumber = build.readLines()[0].split('.')[0].toInt() + + assertEquals( + IntellijVersion(null, buildNumber, "LATEST-EAP-SNAPSHOT"), + version + ) + } }