From 5d8355dd053a91872666ee7e911ba102b087410e Mon Sep 17 00:00:00 2001 From: nik Date: Sat, 15 Feb 2020 16:11:01 +0300 Subject: [PATCH] [devkit] update from sources action: allow to build enabled non-bundled plugins only "Build disabled and non-bundled plugins" option is replaced by "Build enabled plugins only". If the option is enabled, the scripts will build only those bundled and non-bundled plugins which are enabled in the current IDE instance greatly reducing build time. GitOrigin-RevId: 779777318ed254242f8d41b44666ccc885bd97b2 --- .../intellij/build/BuildOptions.groovy | 9 +++++ .../build/impl/DistributionJARsBuilder.groovy | 9 ++++- .../UpdateFromSourcesDialog.kt | 2 +- .../UpdateIdeFromSourcesAction.kt | 34 +++++++++++++------ 4 files changed, 42 insertions(+), 12 deletions(-) diff --git a/platform/build-scripts/groovy/org/jetbrains/intellij/build/BuildOptions.groovy b/platform/build-scripts/groovy/org/jetbrains/intellij/build/BuildOptions.groovy index ef5f025dd9fb..0893dae3ff23 100644 --- a/platform/build-scripts/groovy/org/jetbrains/intellij/build/BuildOptions.groovy +++ b/platform/build-scripts/groovy/org/jetbrains/intellij/build/BuildOptions.groovy @@ -138,6 +138,15 @@ class BuildOptions { */ List bundledPluginDirectoriesToSkip = System.getProperty("intellij.build.bundled.plugin.dirs.to.skip", "").split(",") as List + /** + * Specifies list of names of directories of non-bundled plugins (determined by {@link ProductModulesLayout#pluginsToPublish} and + * {@link ProductModulesLayout#buildAllCompatiblePlugins}) which should be actually built. This option can be used to speed up updating + * the IDE from sources. By default all plugins determined by {@link ProductModulesLayout#pluginsToPublish} and + * {@link ProductModulesLayout#buildAllCompatiblePlugins} are built. In order to skip building all non-bundled plugins, set the property to + * {@code none}. + */ + List nonBundledPluginDirectoriesToInclude = System.getProperty("intellij.build.non.bundled.plugin.dirs.to.include", "").split(",") as List + /** * Specifies JRE version to be bundled with distributions, 11 by default. */ diff --git a/platform/build-scripts/groovy/org/jetbrains/intellij/build/impl/DistributionJARsBuilder.groovy b/platform/build-scripts/groovy/org/jetbrains/intellij/build/impl/DistributionJARsBuilder.groovy index 482e51ef58f8..74eaf2070d65 100644 --- a/platform/build-scripts/groovy/org/jetbrains/intellij/build/impl/DistributionJARsBuilder.groovy +++ b/platform/build-scripts/groovy/org/jetbrains/intellij/build/impl/DistributionJARsBuilder.groovy @@ -48,7 +48,7 @@ class DistributionJARsBuilder { LinkedHashSet pluginsToPublish = []) { this.patchedApplicationInfo = patchedApplicationInfo this.buildContext = buildContext - this.pluginsToPublish = pluginsToPublish + this.pluginsToPublish = filterPluginsToPublish(pluginsToPublish) buildContext.ant.patternset(id: RESOURCES_INCLUDED) { include(name: "**/*Bundle*.properties") include(name: "**/*Messages.properties") @@ -198,6 +198,13 @@ class DistributionJARsBuilder { } } + LinkedHashSet filterPluginsToPublish(LinkedHashSet plugins) { + def toInclude = buildContext.options.nonBundledPluginDirectoriesToInclude as Set + if (toInclude.isEmpty()) return plugins + if (toInclude.size() == 1 && toInclude.contains("none")) return new LinkedHashSet() + return plugins.findAll { toInclude.contains(it.directoryName) } + } + private static Set getLibsToRemoveVersion() { return ["Trove4j", "Log4J", "jna", "jetbrains-annotations-java5", "JDOM"].toSet() } diff --git a/plugins/devkit/devkit-core/src/actions/updateFromSources/UpdateFromSourcesDialog.kt b/plugins/devkit/devkit-core/src/actions/updateFromSources/UpdateFromSourcesDialog.kt index 1238da5d1337..5840306c88c1 100644 --- a/plugins/devkit/devkit-core/src/actions/updateFromSources/UpdateFromSourcesDialog.kt +++ b/plugins/devkit/devkit-core/src/actions/updateFromSources/UpdateFromSourcesDialog.kt @@ -35,7 +35,7 @@ class UpdateFromSourcesDialog(private val project: Project, FileChooserDescriptorFactory.createSingleFolderDescriptor()) } row { - checkBox("Build disabled and non-bundled plugins", state::buildDisabledPlugins) + checkBox("Build enabled plugins only", { !state.buildDisabledPlugins }, { state.buildDisabledPlugins = !it }) } row { checkBox("Do not show this dialog again", { !state.showSettings }, { state.showSettings = !it }, diff --git a/plugins/devkit/devkit-core/src/actions/updateFromSources/UpdateIdeFromSourcesAction.kt b/plugins/devkit/devkit-core/src/actions/updateFromSources/UpdateIdeFromSourcesAction.kt index d925f328f4cb..3432d80f723a 100644 --- a/plugins/devkit/devkit-core/src/actions/updateFromSources/UpdateIdeFromSourcesAction.kt +++ b/plugins/devkit/devkit-core/src/actions/updateFromSources/UpdateIdeFromSourcesAction.kt @@ -75,23 +75,30 @@ internal open class UpdateIdeFromSourcesAction return error("The build scripts is out-of-date, please update to the latest 'master' sources.") } - val bundledPluginDirsToSkip: List = if (state.buildDisabledPlugins) { - emptyList() - } - else { + val bundledPluginDirsToSkip: List + val nonBundledPluginDirsToInclude: List + val buildEnabledPluginsOnly = !state.buildDisabledPlugins + if (buildEnabledPluginsOnly) { val pluginDirectoriesToSkip = LinkedHashSet(state.pluginDirectoriesForDisabledPlugins) pluginDirectoriesToSkip.removeAll(PluginManagerCore.getLoadedPlugins().asSequence().filter { it.isBundled }.map { it.path }.filter { it.isDirectory }.map { it.name }) PluginManagerCore.getPlugins().filter { it.isBundled && !it.isEnabled }.map { it.path }.filter { it.isDirectory }.mapTo(pluginDirectoriesToSkip) { it.name } val list = pluginDirectoriesToSkip.toMutableList() state.pluginDirectoriesForDisabledPlugins = list - list + bundledPluginDirsToSkip = list + nonBundledPluginDirsToInclude = PluginManagerCore.getPlugins().filter { + !it.isBundled && it.isEnabled && it.version != null && it.version.contains("SNAPSHOT") + }.map { it.path }.filter { it.isDirectory }.map { it.name } + } + else { + bundledPluginDirsToSkip = emptyList() + nonBundledPluginDirsToInclude = emptyList() } val deployDir = "$devIdeaHome/out/deploy" val distRelativePath = "dist" val backupDir = "$devIdeaHome/out/backup-before-update-from-sources" val params = createScriptJavaParameters(devIdeaHome, project, deployDir, distRelativePath, scriptFile, - bundledPluginDirsToSkip, state.buildDisabledPlugins) ?: return + buildEnabledPluginsOnly, bundledPluginDirsToSkip, nonBundledPluginDirsToInclude) ?: return ProjectTaskManager.getInstance(project) .buildAllModules() .onSuccess { @@ -268,8 +275,9 @@ internal open class UpdateIdeFromSourcesAction deployDir: String, @Suppress("SameParameterValue") distRelativePath: String, scriptFile: File, + buildEnabledPluginsOnly: Boolean, bundledPluginDirsToSkip: List, - buildNonBundledPlugins: Boolean): JavaParameters? { + nonBundledPluginDirsToInclude: List): JavaParameters? { val sdk = ProjectRootManager.getInstance(project).projectSdk if (sdk == null) { LOG.warn("Project SDK is not defined") @@ -310,10 +318,16 @@ internal open class UpdateIdeFromSourcesAction params.programParametersList.add("update-from-sources") params.vmParametersList.add("-D$includeBinAndRuntimeProperty=true") params.vmParametersList.add("-Dintellij.build.bundled.jre.prefix=jbrsdk-") - if (bundledPluginDirsToSkip.isNotEmpty()) { - params.vmParametersList.add("-Dintellij.build.bundled.plugin.dirs.to.skip=${bundledPluginDirsToSkip.joinToString(",")}") + + if (buildEnabledPluginsOnly) { + if (bundledPluginDirsToSkip.isNotEmpty()) { + params.vmParametersList.add("-Dintellij.build.bundled.plugin.dirs.to.skip=${bundledPluginDirsToSkip.joinToString(",")}") + } + val nonBundled = if (nonBundledPluginDirsToInclude.isNotEmpty()) nonBundledPluginDirsToInclude.joinToString(",") else "none" + params.vmParametersList.add("-Dintellij.build.non.bundled.plugin.dirs.to.include=$nonBundled") } - if (buildNonBundledPlugins) { + + if (!buildEnabledPluginsOnly || nonBundledPluginDirsToInclude.isNotEmpty()) { params.vmParametersList.add("-Dintellij.build.local.plugins.repository=true") } params.vmParametersList.add("-Dintellij.build.output.root=$deployDir")