From 1379d9c985ecd784f5610270f6c4548adb9fedf8 Mon Sep 17 00:00:00 2001 From: Nikita Iarychenko Date: Thu, 28 Nov 2024 08:05:15 +0000 Subject: [PATCH] OPENIDE #8 Build OpenIDE with bundled amplicode --- .idea/modules.xml | 1 + build/intellij.idea.community.build.iml | 1 + ...penSourceCommunityInstallersBuildTarget.kt | 2 + .../intellij/build/OpenIdeProperties.kt | 5 ++ openide/openide.iml | 16 ++++++ .../src/ru/openide/OpenIdePluginBundler.kt | 57 +++++++++++++++++++ .../src/com/intellij/util/io/WhiteListUrls.kt | 1 + 7 files changed, 83 insertions(+) create mode 100644 openide/openide.iml create mode 100644 openide/src/ru/openide/OpenIdePluginBundler.kt diff --git a/.idea/modules.xml b/.idea/modules.xml index c4be54c09d05..9ecaecacf38c 100644 --- a/.idea/modules.xml +++ b/.idea/modules.xml @@ -1288,6 +1288,7 @@ + diff --git a/build/intellij.idea.community.build.iml b/build/intellij.idea.community.build.iml index c8e0d3c3a29e..4447c346da9c 100644 --- a/build/intellij.idea.community.build.iml +++ b/build/intellij.idea.community.build.iml @@ -26,5 +26,6 @@ + \ No newline at end of file diff --git a/build/src/OpenSourceCommunityInstallersBuildTarget.kt b/build/src/OpenSourceCommunityInstallersBuildTarget.kt index c22f1f855255..41daa0d92845 100644 --- a/build/src/OpenSourceCommunityInstallersBuildTarget.kt +++ b/build/src/OpenSourceCommunityInstallersBuildTarget.kt @@ -8,6 +8,7 @@ import org.jetbrains.intellij.build.createCommunityBuildContext import org.jetbrains.intellij.build.impl.buildDistributions import org.jetbrains.intellij.build.telemetry.TraceManager.spanBuilder import org.jetbrains.intellij.build.telemetry.use +import ru.openide.OpenIdePluginBundler internal object OpenSourceCommunityInstallersBuildTarget { @JvmStatic @@ -22,6 +23,7 @@ internal object OpenSourceCommunityInstallersBuildTarget { runBlocking(Dispatchers.Default) { val context = createCommunityBuildContext(options) + OpenIdePluginBundler.bundleAmplicodePlugin(context) CompilationTasks.create(context).compileModules(moduleNames = null, includingTestsInModules = listOf("intellij.platform.jps.build.tests")) buildDistributions(context) spanBuilder("build standalone JPS").use { diff --git a/build/src/org/jetbrains/intellij/build/OpenIdeProperties.kt b/build/src/org/jetbrains/intellij/build/OpenIdeProperties.kt index e2b128c41287..1db2081ed9e3 100644 --- a/build/src/org/jetbrains/intellij/build/OpenIdeProperties.kt +++ b/build/src/org/jetbrains/intellij/build/OpenIdeProperties.kt @@ -3,6 +3,7 @@ package org.jetbrains.intellij.build import org.jetbrains.intellij.build.kotlin.KotlinBinaries +import ru.openide.OpenIdePluginBundler import java.nio.file.Path open class OpenIdeProperties(val communityHomeDir: Path): IdeaCommunityProperties(communityHomeDir) { @@ -79,4 +80,8 @@ open class OpenIdeProperties(val communityHomeDir: Path): IdeaCommunityPropertie override fun getBaseArtifactName(appInfo: ApplicationInfoProperties, buildNumber: String) = "openIDE-$buildNumber" override fun getOutputDirectoryName(appInfo: ApplicationInfoProperties) = "open-ide" + + override fun getAdditionalPluginPaths(context: BuildContext): List { + return OpenIdePluginBundler.getBundlePluginPaths(context) + } } \ No newline at end of file diff --git a/openide/openide.iml b/openide/openide.iml new file mode 100644 index 000000000000..ad4d55e61a39 --- /dev/null +++ b/openide/openide.iml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/openide/src/ru/openide/OpenIdePluginBundler.kt b/openide/src/ru/openide/OpenIdePluginBundler.kt new file mode 100644 index 000000000000..8b3b35f7064a --- /dev/null +++ b/openide/src/ru/openide/OpenIdePluginBundler.kt @@ -0,0 +1,57 @@ +// Copyright (c) Haulmont 2024. All Rights Reserved. +// Use is subject to license terms. +package ru.openide + +import com.intellij.openapi.util.JDOMUtil +import com.intellij.util.io.HttpRequests +import org.jdom.Element +import org.jetbrains.intellij.build.BuildContext +import org.jetbrains.intellij.build.dependencies.BuildDependenciesDownloader +import org.jetbrains.intellij.build.dependencies.BuildDependenciesExtractOptions +import org.jetbrains.intellij.build.BuildPaths.Companion.COMMUNITY_ROOT +import java.net.URI +import java.nio.file.Path + +object OpenIdePluginBundler { + + private const val PLUGINS_DIR = "build/download/plugins" + private const val AMPLICODE_URL = "https://amplicode.ru" + private const val AMPLICODE_MARKETPLACE_URL = "https://amplicode.ru/jetbrains-marketplace" + + fun getBundlePluginPaths(context: BuildContext): List { + val communityHomeDir = context.paths.communityHomeDir + return listOf(Path.of("${communityHomeDir}/$PLUGINS_DIR/amplicode")) + } + + fun bundleAmplicodePlugin(context: BuildContext) { + val majorVersion = context.buildNumber.substringBefore('.') + val uri = resolveAmplicodeUri(majorVersion) + val archivePath = BuildDependenciesDownloader.downloadFileToCacheLocation(COMMUNITY_ROOT, uri) + val targetDir = context.paths.communityHomeDir.resolve("$PLUGINS_DIR/amplicode") + BuildDependenciesDownloader.extractFile(archivePath, targetDir, COMMUNITY_ROOT, BuildDependenciesExtractOptions.STRIP_ROOT) + } + + private fun resolveAmplicodeUri(majorVersion: String): URI { + val result = runCatching { + HttpRequests.request(AMPLICODE_MARKETPLACE_URL) + .connect { JDOMUtil.load(it.getReader()) } + .let { findFragmentUrl(it, majorVersion) } + } + + val specificUrl = result.getOrThrow().substring(1) + return URI.create("$AMPLICODE_URL$specificUrl") + } + + private fun findFragmentUrl(element: Element?, majorVersion: String): String { + return element?.getChildren("plugin") + ?.firstOrNull { it.getAttributeValue("version").extractMajorVersion() == majorVersion } + ?.getAttributeValue("url") + ?: throw RuntimeException("Amlicode plugin url not found for $majorVersion version") + } + + private fun String.extractMajorVersion(): String? { + val regex = Regex("""-(\d+?)-""") + val match = regex.find(this) + return match?.groupValues?.get(1) + } +} \ No newline at end of file diff --git a/platform/ide-core/src/com/intellij/util/io/WhiteListUrls.kt b/platform/ide-core/src/com/intellij/util/io/WhiteListUrls.kt index fa744c4d782b..2e1c55d83467 100644 --- a/platform/ide-core/src/com/intellij/util/io/WhiteListUrls.kt +++ b/platform/ide-core/src/com/intellij/util/io/WhiteListUrls.kt @@ -21,6 +21,7 @@ object WhiteListUrls { "https://plugins.jetbrains.com", // TODO [OpenIDE]: replace url "https://downloads.marketplace.jetbrains.com/files", // TODO [OpenIDE]: replace url "https://repo1.maven.org/maven2/net/sourceforge/plantuml/plantuml/1.2023.10/plantuml-1.2023.10.jar", + "https://amplicode.ru" ) @JvmStatic