Skip to content

Commit

Permalink
Improved build performance by pre-creating Ivy XML files in the extra…
Browse files Browse the repository at this point in the history
…cted IDE location.
  • Loading branch information
AlexanderBartash committed Oct 5, 2024
1 parent da91bdb commit c8d6d46
Show file tree
Hide file tree
Showing 6 changed files with 476 additions and 220 deletions.
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@

### Changed

- Improved build performance by pre-creating Ivy XML files in the extracted IDE location.
- Improved build performance by making the local Ivy repository first in the list and prefixing all "fake" artifact groups with "com.jetbrains.localhost-only" and excluding that group from already declared remote repositories.

### Fixed
Expand Down
10 changes: 9 additions & 1 deletion api/IntelliJPlatformGradlePlugin.api
Original file line number Diff line number Diff line change
Expand Up @@ -432,7 +432,7 @@ public abstract interface class org/jetbrains/intellij/platform/gradle/artifacts

public abstract class org/jetbrains/intellij/platform/gradle/artifacts/transform/ExtractorTransformer : org/gradle/api/artifacts/transform/TransformAction {
public static final field Companion Lorg/jetbrains/intellij/platform/gradle/artifacts/transform/ExtractorTransformer$Companion;
public fun <init> (Lorg/gradle/api/file/ArchiveOperations;Lorg/gradle/process/ExecOperations;Lorg/gradle/api/model/ObjectFactory;Lorg/gradle/api/file/FileSystemOperations;)V
public fun <init> (Lorg/gradle/api/file/ArchiveOperations;Lorg/gradle/process/ExecOperations;Lorg/gradle/api/model/ObjectFactory;Lorg/gradle/api/provider/ProviderFactory;Lorg/gradle/api/file/FileSystemOperations;)V
public abstract fun getInputArtifact ()Lorg/gradle/api/provider/Provider;
public fun transform (Lorg/gradle/api/artifacts/transform/TransformOutputs;)V
}
Expand Down Expand Up @@ -688,9 +688,13 @@ public final class org/jetbrains/intellij/platform/gradle/extensions/IntelliJPla
}

public final class org/jetbrains/intellij/platform/gradle/extensions/IntelliJPlatformDependenciesHelper {
public static final field Companion Lorg/jetbrains/intellij/platform/gradle/extensions/IntelliJPlatformDependenciesHelper$Companion;
public fun <init> (Lorg/gradle/api/artifacts/dsl/RepositoryHandler;Lorg/gradle/api/artifacts/ConfigurationContainer;Lorg/gradle/api/artifacts/dsl/DependencyHandler;Lorg/gradle/api/file/ProjectLayout;Lorg/gradle/api/model/ObjectFactory;Lorg/gradle/api/provider/ProviderFactory;Lorg/gradle/api/resources/ResourceHandler;Ljava/nio/file/Path;)V
}

public final class org/jetbrains/intellij/platform/gradle/extensions/IntelliJPlatformDependenciesHelper$Companion {
}

public abstract class org/jetbrains/intellij/platform/gradle/extensions/IntelliJPlatformExtension : org/gradle/api/plugins/ExtensionAware {
public static final field Companion Lorg/jetbrains/intellij/platform/gradle/extensions/IntelliJPlatformExtension$Companion;
public fun <init> (Lorg/gradle/api/artifacts/ConfigurationContainer;Lorg/gradle/api/provider/ProviderFactory;Ljava/nio/file/Path;)V
Expand Down Expand Up @@ -955,9 +959,13 @@ public final class org/jetbrains/intellij/platform/gradle/extensions/IntelliJPla
}

public final class org/jetbrains/intellij/platform/gradle/extensions/IntelliJPlatformRepositoriesHelper {
public static final field Companion Lorg/jetbrains/intellij/platform/gradle/extensions/IntelliJPlatformRepositoriesHelper$Companion;
public fun <init> (Lorg/gradle/api/artifacts/dsl/RepositoryHandler;Lorg/gradle/api/provider/ProviderFactory;Lorg/gradle/api/model/ObjectFactory;Lorg/gradle/api/flow/FlowScope;Lorg/gradle/api/flow/FlowProviders;Lorg/gradle/api/invocation/Gradle;Ljava/nio/file/Path;)V
}

public final class org/jetbrains/intellij/platform/gradle/extensions/IntelliJPlatformRepositoriesHelper$Companion {
}

public abstract class org/jetbrains/intellij/platform/gradle/extensions/IntelliJPlatformTestingExtension : org/gradle/api/plugins/ExtensionAware {
public static final field Companion Lorg/jetbrains/intellij/platform/gradle/extensions/IntelliJPlatformTestingExtension$Companion;
public fun <init> (Lorg/gradle/api/Project;)V
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

package org.jetbrains.intellij.platform.gradle.artifacts.transform

import com.jetbrains.plugin.structure.intellij.plugin.IdePluginManager
import org.gradle.api.artifacts.Configuration
import org.gradle.api.artifacts.dsl.DependencyHandler
import org.gradle.api.artifacts.transform.InputArtifact
Expand All @@ -14,11 +15,19 @@ import org.gradle.api.file.FileSystemOperations
import org.gradle.api.file.FileTree
import org.gradle.api.model.ObjectFactory
import org.gradle.api.provider.Provider
import org.gradle.api.provider.ProviderFactory
import org.gradle.api.tasks.Classpath
import org.gradle.kotlin.dsl.registerTransform
import org.gradle.process.ExecOperations
import org.gradle.work.DisableCachingByDefault
import org.jetbrains.intellij.platform.gradle.Constants
import org.jetbrains.intellij.platform.gradle.Constants.Configurations.Attributes
import org.jetbrains.intellij.platform.gradle.extensions.IntelliJPlatformDependenciesHelper
import org.jetbrains.intellij.platform.gradle.extensions.IntelliJPlatformDependenciesHelper.Companion.collectBundledPluginDependencies
import org.jetbrains.intellij.platform.gradle.extensions.IntelliJPlatformDependenciesHelper.Companion.getBundledPlugins
import org.jetbrains.intellij.platform.gradle.models.IvyModule
import org.jetbrains.intellij.platform.gradle.models.productInfo
import org.jetbrains.intellij.platform.gradle.models.toBundledIvyArtifacts
import org.jetbrains.intellij.platform.gradle.utils.Logger
import org.jetbrains.intellij.platform.gradle.utils.asPath
import org.jetbrains.intellij.platform.gradle.utils.resolvePlatformPath
Expand All @@ -36,6 +45,7 @@ abstract class ExtractorTransformer @Inject constructor(
private val archiveOperations: ArchiveOperations,
private val execOperations: ExecOperations,
private val objectFactory: ObjectFactory,
private val providerFactory: ProviderFactory,
private val fileSystemOperations: FileSystemOperations,
) : TransformAction<TransformParameters.None> {

Expand Down Expand Up @@ -105,9 +115,13 @@ abstract class ExtractorTransformer @Inject constructor(
execOperations.exec {
commandLine("hdiutil", "detach", "-force", "-quiet", tempDirectory)
}

createIvyXmls(tempDirectory)
}

else -> {}
else -> {
createIvyXmls(targetDirectory)
}
}

log.info("Extracting to '$targetDirectory' completed.")
Expand All @@ -116,6 +130,60 @@ abstract class ExtractorTransformer @Inject constructor(
}
}

/**
* Pre-create Ivy XML files so that later this directory can be used as an Ivy repository without having to discover
* modules & plugins each time the build is run.
*/
private fun createIvyXmls(platformPath: Path) {
val isIde = platformPath.listDirectoryEntries().map { it.name }.containsAll(
listOf("bin", "lib", "plugins", "product-info.json")
)
if (!isIde) {
log.info("The directory '$platformPath' is not an IDE, Ivy repository is not needed there.")
return
}

log.info("Creating an Ivy repository in '$platformPath'.")

val writtenIvyModules = HashSet<String>()
val productInfo = platformPath.productInfo()
val version = productInfo.buildNumber

val pluginManager = IdePluginManager.createManager(createTempDirectory())
val plugins = platformPath.getBundledPlugins(pluginManager)

for (plugin in plugins.values) {
val pluginId = plugin.pluginId
val pluginVersion = plugin.pluginVersion
val pluginPath = plugin.originalFile
if (null == pluginId || null == pluginVersion || null == pluginPath) {
continue
}

val group = Constants.Configurations.Dependencies.BUNDLED_PLUGIN_GROUP

IntelliJPlatformDependenciesHelper.writeIvyModule(
group, pluginId, version, writtenIvyModules, providerFactory, platformPath
) {
IvyModule(
info = IvyModule.Info(group, pluginId, pluginVersion),
publications = pluginPath.toBundledIvyArtifacts(platformPath),
dependencies = plugin.collectBundledPluginDependencies(
emptyList(),
productInfo,
platformPath,
plugins,
writtenIvyModules,
providerFactory,
platformPath
),
)
}
}

log.info("Creation of an Ivy repository in '$platformPath' finished.")
}

private fun dmgTree(path: Path): FileTree {
log.info("Extracting DMG archive '$path' to temporary directory.")

Expand Down Expand Up @@ -153,7 +221,7 @@ abstract class ExtractorTransformer @Inject constructor(
// such as `.background` meta-directory we have to exclude.
it.file.run {
(name == "Applications" && Files.isSymbolicLink(toPath()))
|| it.relativePath.startsWith('.')
|| it.relativePath.startsWith('.')
}
}
}
Expand All @@ -167,8 +235,7 @@ abstract class ExtractorTransformer @Inject constructor(
intellijPlatformTestClasspath: Configuration,
) {
Attributes.ArtifactType.Archives.forEach {
dependencies.artifactTypes.maybeCreate(it.toString())
.attributes.attribute(Attributes.extracted, false)
dependencies.artifactTypes.maybeCreate(it.toString()).attributes.attribute(Attributes.extracted, false)
}

listOf(compileClasspathConfiguration, testCompileClasspathConfiguration, intellijPlatformTestClasspath).forEach {
Expand Down
Loading

0 comments on commit c8d6d46

Please sign in to comment.