diff --git a/CHANGELOG.md b/CHANGELOG.md index 61fe1a5c25..8ad9eb547e 100755 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,7 @@ ### Fixed - Fixed issue #1778 by removing a hash of the absolute artifact path appended to the end of the version string. That hash made artifact version different on different PCs and also breaks Gradle dependency locking. +- #1779 Fixes compatibility with Gradle dependency verification. Previously it was failing with "Failed to create MD5 hash for file". ## [2.1.0] diff --git a/api/IntelliJPlatformGradlePlugin.api b/api/IntelliJPlatformGradlePlugin.api index a2d9c836a7..109281b0f4 100644 --- a/api/IntelliJPlatformGradlePlugin.api +++ b/api/IntelliJPlatformGradlePlugin.api @@ -69,7 +69,9 @@ public final class org/jetbrains/intellij/platform/gradle/Constants$Configuratio } public final class org/jetbrains/intellij/platform/gradle/Constants$Configurations$Dependencies { + public static final field BUNDLED_MODULE_ARTIFACT_GROUP Ljava/lang/String; public static final field BUNDLED_MODULE_GROUP Ljava/lang/String; + public static final field BUNDLED_PLUGIN_ARTIFACT_GROUP Ljava/lang/String; public static final field BUNDLED_PLUGIN_GROUP Ljava/lang/String; public static final field INSTANCE Lorg/jetbrains/intellij/platform/gradle/Constants$Configurations$Dependencies; public static final field LOCAL_IDE_GROUP Ljava/lang/String; @@ -164,6 +166,11 @@ public final class org/jetbrains/intellij/platform/gradle/Constants$Plugins$Exte public static final field KOTLIN Ljava/lang/String; } +public final class org/jetbrains/intellij/platform/gradle/Constants$RepositoryNames { + public static final field INSTANCE Lorg/jetbrains/intellij/platform/gradle/Constants$RepositoryNames; + public static final field LOCAL_IVY Ljava/lang/String; +} + public final class org/jetbrains/intellij/platform/gradle/Constants$Sandbox { public static final field CONFIG Ljava/lang/String; public static final field CONTAINER Ljava/lang/String; @@ -461,7 +468,7 @@ public abstract class org/jetbrains/intellij/platform/gradle/attributes/Distribu public abstract class org/jetbrains/intellij/platform/gradle/extensions/IntelliJPlatformDependenciesExtension { public static final field Companion Lorg/jetbrains/intellij/platform/gradle/extensions/IntelliJPlatformDependenciesExtension$Companion; - public fun (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 fun (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 fun androidStudio (Ljava/lang/String;)V public final fun androidStudio (Ljava/lang/String;Z)V public final fun androidStudio (Lorg/gradle/api/provider/Provider;)V @@ -685,7 +692,7 @@ public final class org/jetbrains/intellij/platform/gradle/extensions/IntelliJPla } public final class org/jetbrains/intellij/platform/gradle/extensions/IntelliJPlatformDependenciesHelper { - public fun (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 fun (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 abstract class org/jetbrains/intellij/platform/gradle/extensions/IntelliJPlatformExtension : org/gradle/api/plugins/ExtensionAware { @@ -806,7 +813,7 @@ public final class org/jetbrains/intellij/platform/gradle/extensions/IntelliJPla public abstract class org/jetbrains/intellij/platform/gradle/extensions/IntelliJPlatformExtension$PluginVerification$Ides { public static final field Companion Lorg/jetbrains/intellij/platform/gradle/extensions/IntelliJPlatformExtension$PluginVerification$Ides$Companion; - public fun (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;Lorg/gradle/api/provider/Provider;)V + public fun (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;Lorg/gradle/api/provider/Provider;)V public final fun ProductReleasesValueSource (Lkotlin/jvm/functions/Function1;)Lorg/gradle/api/provider/Provider; public static synthetic fun ProductReleasesValueSource$default (Lorg/jetbrains/intellij/platform/gradle/extensions/IntelliJPlatformExtension$PluginVerification$Ides;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lorg/gradle/api/provider/Provider; public final fun ide (Ljava/lang/String;)V @@ -875,7 +882,7 @@ public abstract interface class org/jetbrains/intellij/platform/gradle/extension public abstract class org/jetbrains/intellij/platform/gradle/extensions/IntelliJPlatformPluginsExtension : org/gradle/api/plugins/ExtensionAware { public static final field Companion Lorg/jetbrains/intellij/platform/gradle/extensions/IntelliJPlatformPluginsExtension$Companion; - public fun (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 fun (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 fun disablePlugin (Ljava/lang/String;)V public final fun disablePlugin (Lorg/gradle/api/provider/Provider;)V public final fun disablePlugins (Ljava/util/List;)V @@ -952,9 +959,14 @@ 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 (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 final fun updateLocalIvyRepoArtifactPattern (Ljava/nio/file/Path;Lorg/gradle/api/artifacts/dsl/RepositoryHandler;)V +} + 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 (Lorg/gradle/api/Project;)V diff --git a/src/integrationTest/kotlin/org/jetbrains/intellij/platform/gradle/DependencyLockingAndVerificationIntegrationTest.kt b/src/integrationTest/kotlin/org/jetbrains/intellij/platform/gradle/DependencyLockingAndVerificationIntegrationTest.kt index 62c00269af..762bedc516 100644 --- a/src/integrationTest/kotlin/org/jetbrains/intellij/platform/gradle/DependencyLockingAndVerificationIntegrationTest.kt +++ b/src/integrationTest/kotlin/org/jetbrains/intellij/platform/gradle/DependencyLockingAndVerificationIntegrationTest.kt @@ -20,7 +20,6 @@ class DependencyLockingAndVerificationIntegrationTest : IntelliJPlatformIntegrat ) { @Test - @Ignore("https://github.com/JetBrains/intellij-platform-gradle-plugin/issues/1779") fun `build plugin with dependency locks & hash verification`() { build( Tasks.External.CLEAN, @@ -44,7 +43,6 @@ class DependencyLockingAndVerificationIntegrationTest : IntelliJPlatformIntegrat } @Test - @Ignore("https://github.com/JetBrains/intellij-platform-gradle-plugin/issues/1779") fun `build plugin with dependency locks, hash & signature verification`() { build( Tasks.External.CLEAN, diff --git a/src/integrationTest/kotlin/org/jetbrains/intellij/platform/gradle/DependencyVerificationIgnoreIntellijIntegrationTest.kt b/src/integrationTest/kotlin/org/jetbrains/intellij/platform/gradle/DependencyVerificationIgnoreIntellijIntegrationTest.kt index d6c5d3b613..0c8c37ba90 100644 --- a/src/integrationTest/kotlin/org/jetbrains/intellij/platform/gradle/DependencyVerificationIgnoreIntellijIntegrationTest.kt +++ b/src/integrationTest/kotlin/org/jetbrains/intellij/platform/gradle/DependencyVerificationIgnoreIntellijIntegrationTest.kt @@ -44,7 +44,6 @@ class DependencyVerificationIgnoreIntellijIntegrationTest : IntelliJPlatformInte } @Test - @Ignore("https://github.com/JetBrains/intellij-platform-gradle-plugin/issues/1779") fun `build plugin with dependency locks, hash & signature verification ignoring intellij artifacts`() { build( Tasks.External.CLEAN, diff --git a/src/main/kotlin/org/jetbrains/intellij/platform/gradle/Constants.kt b/src/main/kotlin/org/jetbrains/intellij/platform/gradle/Constants.kt index 137afb2730..289a155eee 100644 --- a/src/main/kotlin/org/jetbrains/intellij/platform/gradle/Constants.kt +++ b/src/main/kotlin/org/jetbrains/intellij/platform/gradle/Constants.kt @@ -111,6 +111,8 @@ object Constants { const val LOCAL_JETBRAINS_RUNTIME_GROUP = "localJetBrainsRuntime" const val BUNDLED_MODULE_GROUP = "bundledModule" const val BUNDLED_PLUGIN_GROUP = "bundledPlugin" + const val BUNDLED_PLUGIN_ARTIFACT_GROUP = "bundledPluginArtifact" + const val BUNDLED_MODULE_ARTIFACT_GROUP = "bundledModuleArtifact" const val MARKETPLACE_GROUP = "com.jetbrains.plugins" } @@ -174,6 +176,10 @@ object Constants { const val LOG = "log" } + object RepositoryNames { + const val LOCAL_IVY = "Local IntelliJ Platform Artifacts Repository" + } + object Locations { const val CACHE_REDIRECTOR = "https://cache-redirector.jetbrains.com" const val CACHE_REDIRECTOR_INTELLIJ_DEPENDENCIES_REPOSITORY = "$CACHE_REDIRECTOR/intellij-dependencies" diff --git a/src/main/kotlin/org/jetbrains/intellij/platform/gradle/artifacts/transform/CollectorTransformer.kt b/src/main/kotlin/org/jetbrains/intellij/platform/gradle/artifacts/transform/CollectorTransformer.kt index ef9c87c4fb..93eeb1c23d 100644 --- a/src/main/kotlin/org/jetbrains/intellij/platform/gradle/artifacts/transform/CollectorTransformer.kt +++ b/src/main/kotlin/org/jetbrains/intellij/platform/gradle/artifacts/transform/CollectorTransformer.kt @@ -87,12 +87,9 @@ abstract class CollectorTransformer : TransformAction { - plugin.originalFile?.let { pluginPath -> - collectJars( - pluginPath.resolve("lib"), - pluginPath.resolve("lib/modules"), - ).forEach { outputs.file(it) } - } + // Nothing to do, see: + // IntelliJPlatformRepositoriesHelper.Companion.updateLocalIvyRepoArtifactPattern + outputs.file(inputArtifact) } else -> throw GradleException("Unknown input: $path") diff --git a/src/main/kotlin/org/jetbrains/intellij/platform/gradle/extensions/IntelliJPlatformDependenciesExtension.kt b/src/main/kotlin/org/jetbrains/intellij/platform/gradle/extensions/IntelliJPlatformDependenciesExtension.kt index 093b109912..923248a8ab 100644 --- a/src/main/kotlin/org/jetbrains/intellij/platform/gradle/extensions/IntelliJPlatformDependenciesExtension.kt +++ b/src/main/kotlin/org/jetbrains/intellij/platform/gradle/extensions/IntelliJPlatformDependenciesExtension.kt @@ -7,6 +7,7 @@ import org.gradle.api.artifacts.ConfigurationContainer import org.gradle.api.artifacts.Dependency import org.gradle.api.artifacts.ProjectDependency import org.gradle.api.artifacts.dsl.DependencyHandler +import org.gradle.api.artifacts.dsl.RepositoryHandler import org.gradle.api.file.Directory import org.gradle.api.file.ProjectLayout import org.gradle.api.model.ObjectFactory @@ -51,6 +52,7 @@ import kotlin.io.path.absolute @Suppress("unused", "MemberVisibilityCanBePrivate") @IntelliJPlatform abstract class IntelliJPlatformDependenciesExtension @Inject constructor( + repositories: RepositoryHandler, configurations: ConfigurationContainer, dependencies: DependencyHandler, layout: ProjectLayout, @@ -60,7 +62,7 @@ abstract class IntelliJPlatformDependenciesExtension @Inject constructor( rootProjectDirectory: Path, ) { - private val delegate = IntelliJPlatformDependenciesHelper(configurations, dependencies, layout, objects, providers, resources, rootProjectDirectory) + private val delegate = IntelliJPlatformDependenciesHelper(repositories, configurations, dependencies, layout, objects, providers, resources, rootProjectDirectory) /** * Adds a dependency on the IntelliJ Platform. @@ -1309,6 +1311,7 @@ abstract class IntelliJPlatformDependenciesExtension @Inject constructor( override fun register(project: Project, target: Any) = target.configureExtension( Extensions.INTELLIJ_PLATFORM, + project.repositories, project.configurations, project.dependencies, project.layout, diff --git a/src/main/kotlin/org/jetbrains/intellij/platform/gradle/extensions/IntelliJPlatformDependenciesHelper.kt b/src/main/kotlin/org/jetbrains/intellij/platform/gradle/extensions/IntelliJPlatformDependenciesHelper.kt index 95ede4e796..5973827705 100644 --- a/src/main/kotlin/org/jetbrains/intellij/platform/gradle/extensions/IntelliJPlatformDependenciesHelper.kt +++ b/src/main/kotlin/org/jetbrains/intellij/platform/gradle/extensions/IntelliJPlatformDependenciesHelper.kt @@ -11,6 +11,7 @@ import org.gradle.api.artifacts.ConfigurationContainer import org.gradle.api.artifacts.Dependency import org.gradle.api.artifacts.ProjectDependency import org.gradle.api.artifacts.dsl.DependencyHandler +import org.gradle.api.artifacts.dsl.RepositoryHandler import org.gradle.api.file.Directory import org.gradle.api.file.ProjectLayout import org.gradle.api.model.ObjectFactory @@ -55,6 +56,7 @@ import kotlin.io.path.* * @param rootProjectDirectory The root directory of the Gradle project. */ class IntelliJPlatformDependenciesHelper( + private val repositories: RepositoryHandler, private val configurations: ConfigurationContainer, private val dependencies: DependencyHandler, private val layout: ProjectLayout, @@ -129,6 +131,11 @@ class IntelliJPlatformDependenciesHelper( get() = platformPath.map { it.productInfo() } private val bundledPlugins by lazy { + // Update artifact pattern in our Local Ivy Repo to use the extracted IDE path. + // It has to be done lazily here, since the IDE is unzipped by ExtractorTransformer during artifact resolution, + // and that path is not available when we register this repo initially. + IntelliJPlatformRepositoriesHelper.updateLocalIvyRepoArtifactPattern(platformPath.get(), repositories) + platformPath.get() .resolve("plugins") .listDirectoryEntries() @@ -742,6 +749,8 @@ class IntelliJPlatformDependenciesHelper( */ private fun DependencyHandler.createIntelliJPlatformBundledPlugin(id: String): Dependency { val plugin = bundledPlugins[id] + val platformPath by lazy { platformPath.get() } + requireNotNull(plugin) { val unresolvedPluginId = when (id) { "copyright" -> "Use correct plugin ID 'com.intellij.copyright' instead of 'copyright'." @@ -769,8 +778,8 @@ class IntelliJPlatformDependenciesHelper( module = id, revision = version, ), - publications = listOf(artifactPath.toIvyArtifact()), - dependencies = plugin.collectDependencies(), + publications = artifactPath.toBundledPluginIvyArtifacts(platformPath), + dependencies = plugin.collectBundledPluginDependencies(), ) } @@ -791,7 +800,9 @@ class IntelliJPlatformDependenciesHelper( .find { layout -> layout.name == id } .let { requireNotNull(it) { "Specified bundledModule '$id' doesn't exist." } } val platformPath = platformPath.get() - val artifactPaths = bundledModule.classPath.map { path -> platformPath.resolve(path).toIvyArtifact() } + val artifactPaths = bundledModule.classPath.flatMap { path -> + platformPath.resolve(path).toBundledModuleIvyArtifacts(platformPath) + } val version = baseVersion.orElse(productInfo.map { it.version }).get() writeIvyModule(Dependencies.BUNDLED_MODULE_GROUP, id, version) { @@ -818,7 +829,7 @@ class IntelliJPlatformDependenciesHelper( * * @param path IDs of already traversed plugins or modules. */ - private fun IdePlugin.collectDependencies(path: List = emptyList()): List { + private fun IdePlugin.collectBundledPluginDependencies(path: List = emptyList()): List { val id = requireNotNull(pluginId) val dependencyIds = (dependencies.map { it.id } + optionalDescriptors.map { it.dependency.id } + modulesDescriptors.map { it.name } - id).toSet() val buildNumber by lazy { productInfo.get().buildNumber } @@ -835,10 +846,10 @@ class IntelliJPlatformDependenciesHelper( writeIvyModule(group, name, version) { IvyModule( info = IvyModule.Info(group, name, version), - publications = listOf(artifactPath.toIvyArtifact()), + publications = artifactPath.toBundledPluginIvyArtifacts(platformPath), dependencies = when { id in path -> emptyList() - else -> plugin.collectDependencies(path + id) + else -> plugin.collectBundledPluginDependencies(path + id) }, ) } @@ -855,7 +866,9 @@ class IntelliJPlatformDependenciesHelper( .mapNotNull { layoutItems.find { layout -> layout.name == it } } .filterNot { it.classPath.isEmpty() } .map { - val artifactPaths = it.classPath.map { path -> platformPath.resolve(path).toIvyArtifact() } + val artifactPaths = it.classPath.flatMap { path -> + platformPath.resolve(path).toBundledModuleIvyArtifacts(platformPath) + } val group = Dependencies.BUNDLED_MODULE_GROUP val name = it.name val version = buildNumber @@ -904,7 +917,7 @@ class IntelliJPlatformDependenciesHelper( module = name, revision = version, ), - publications = listOf(artifactPath.toIvyArtifact()), + publications = artifactPath.toLocalPluginIvyArtifacts(), ) } diff --git a/src/main/kotlin/org/jetbrains/intellij/platform/gradle/extensions/IntelliJPlatformExtension.kt b/src/main/kotlin/org/jetbrains/intellij/platform/gradle/extensions/IntelliJPlatformExtension.kt index ab5a9bf6ab..6ce554f923 100644 --- a/src/main/kotlin/org/jetbrains/intellij/platform/gradle/extensions/IntelliJPlatformExtension.kt +++ b/src/main/kotlin/org/jetbrains/intellij/platform/gradle/extensions/IntelliJPlatformExtension.kt @@ -8,6 +8,7 @@ import org.gradle.api.Action import org.gradle.api.Project import org.gradle.api.artifacts.ConfigurationContainer import org.gradle.api.artifacts.dsl.DependencyHandler +import org.gradle.api.artifacts.dsl.RepositoryHandler import org.gradle.api.file.Directory import org.gradle.api.file.DirectoryProperty import org.gradle.api.file.ProjectLayout @@ -767,6 +768,7 @@ abstract class IntelliJPlatformExtension @Inject constructor( */ @IntelliJPlatform abstract class Ides @Inject constructor( + repositories: RepositoryHandler, configurations: ConfigurationContainer, dependencies: DependencyHandler, layout: ProjectLayout, @@ -778,6 +780,7 @@ abstract class IntelliJPlatformExtension @Inject constructor( ) { private val delegate = IntelliJPlatformDependenciesHelper( + repositories, configurations, dependencies, layout, @@ -950,6 +953,7 @@ abstract class IntelliJPlatformExtension @Inject constructor( override fun register(project: Project, target: Any) = target.configureExtension( Extensions.IDES, + project.repositories, project.configurations, project.dependencies, project.layout, diff --git a/src/main/kotlin/org/jetbrains/intellij/platform/gradle/extensions/IntelliJPlatformPluginsExtension.kt b/src/main/kotlin/org/jetbrains/intellij/platform/gradle/extensions/IntelliJPlatformPluginsExtension.kt index 0a227036ef..0babaa90bd 100644 --- a/src/main/kotlin/org/jetbrains/intellij/platform/gradle/extensions/IntelliJPlatformPluginsExtension.kt +++ b/src/main/kotlin/org/jetbrains/intellij/platform/gradle/extensions/IntelliJPlatformPluginsExtension.kt @@ -6,6 +6,7 @@ import org.gradle.api.Project import org.gradle.api.artifacts.ConfigurationContainer import org.gradle.api.artifacts.ProjectDependency import org.gradle.api.artifacts.dsl.DependencyHandler +import org.gradle.api.artifacts.dsl.RepositoryHandler import org.gradle.api.file.Directory import org.gradle.api.file.ProjectLayout import org.gradle.api.model.ObjectFactory @@ -32,6 +33,7 @@ import javax.inject.Inject */ @IntelliJPlatform abstract class IntelliJPlatformPluginsExtension @Inject constructor( + repositories: RepositoryHandler, configurations: ConfigurationContainer, dependencies: DependencyHandler, layout: ProjectLayout, @@ -45,6 +47,7 @@ abstract class IntelliJPlatformPluginsExtension @Inject constructor( internal val intellijPlatformPluginLocalConfigurationName = objects.property() private val delegate = IntelliJPlatformDependenciesHelper( + repositories, configurations, dependencies, layout, @@ -242,6 +245,7 @@ abstract class IntelliJPlatformPluginsExtension @Inject constructor( override fun register(project: Project, target: Any) = target.configureExtension( Extensions.PLUGINS, + project.repositories, project.configurations, project.dependencies, project.layout, diff --git a/src/main/kotlin/org/jetbrains/intellij/platform/gradle/extensions/IntelliJPlatformRepositoriesExtension.kt b/src/main/kotlin/org/jetbrains/intellij/platform/gradle/extensions/IntelliJPlatformRepositoriesExtension.kt index d5b4584ba4..21d42974ec 100644 --- a/src/main/kotlin/org/jetbrains/intellij/platform/gradle/extensions/IntelliJPlatformRepositoriesExtension.kt +++ b/src/main/kotlin/org/jetbrains/intellij/platform/gradle/extensions/IntelliJPlatformRepositoriesExtension.kt @@ -16,6 +16,7 @@ import org.gradle.api.model.ObjectFactory import org.gradle.api.plugins.ExtensionAware import org.gradle.api.provider.ProviderFactory import org.gradle.kotlin.dsl.support.serviceOf +import org.jetbrains.intellij.platform.gradle.Constants import org.jetbrains.intellij.platform.gradle.Constants.Extensions import org.jetbrains.intellij.platform.gradle.Constants.Locations import org.jetbrains.intellij.platform.gradle.CustomPluginRepositoryType @@ -212,7 +213,7 @@ abstract class IntelliJPlatformRepositoriesExtension @Inject constructor( */ @JvmOverloads fun localPlatformArtifacts(action: IvyRepositoryAction = {}) = delegate.createLocalIvyRepository( - repositoryName = "Local IntelliJ Platform Artifacts Repository", + repositoryName = Constants.RepositoryNames.LOCAL_IVY, action = action, ) diff --git a/src/main/kotlin/org/jetbrains/intellij/platform/gradle/extensions/IntelliJPlatformRepositoriesHelper.kt b/src/main/kotlin/org/jetbrains/intellij/platform/gradle/extensions/IntelliJPlatformRepositoriesHelper.kt index 9258ea0985..5023018c7b 100644 --- a/src/main/kotlin/org/jetbrains/intellij/platform/gradle/extensions/IntelliJPlatformRepositoriesHelper.kt +++ b/src/main/kotlin/org/jetbrains/intellij/platform/gradle/extensions/IntelliJPlatformRepositoriesHelper.kt @@ -2,17 +2,20 @@ package org.jetbrains.intellij.platform.gradle.extensions +import org.gradle.api.Project import org.gradle.api.artifacts.dsl.RepositoryHandler import org.gradle.api.credentials.HttpHeaderCredentials import org.gradle.api.credentials.PasswordCredentials import org.gradle.api.flow.FlowProviders import org.gradle.api.flow.FlowScope +import org.gradle.api.internal.artifacts.repositories.DefaultIvyArtifactRepository import org.gradle.api.invocation.Gradle import org.gradle.api.model.ObjectFactory import org.gradle.api.provider.ProviderFactory import org.gradle.authentication.http.HttpHeaderAuthentication import org.gradle.internal.os.OperatingSystem import org.gradle.kotlin.dsl.* +import org.jetbrains.intellij.platform.gradle.Constants import org.jetbrains.intellij.platform.gradle.Constants.Configurations import org.jetbrains.intellij.platform.gradle.CustomPluginRepositoryType import org.jetbrains.intellij.platform.gradle.GradleProperties @@ -20,8 +23,10 @@ import org.jetbrains.intellij.platform.gradle.artifacts.repositories.PluginArtif import org.jetbrains.intellij.platform.gradle.flow.StopShimServerAction import org.jetbrains.intellij.platform.gradle.get import org.jetbrains.intellij.platform.gradle.services.ShimManagerService +import org.jetbrains.kotlin.util.removeSuffixIfPresent import java.net.URI import java.nio.file.Path +import kotlin.io.path.absolutePathString import kotlin.io.path.pathString private const val SHIM_MANAGER = "shimManager" @@ -149,8 +154,8 @@ class IntelliJPlatformRepositoriesHelper( val localPlatformArtifactsPath = providers.localPlatformArtifactsPath(rootProjectDirectory) ivyPattern("${localPlatformArtifactsPath.pathString}/[organization]-[module]-[revision].[ext]") - // As all artifacts defined in Ivy repositories have a full artifact path set as their names, we can use them to locate artifact files - artifactPattern("/[artifact]") + // Later updated by updateLocalIvyRepoArtifactPattern when IDE is unzipped and its path is known. + //artifactPattern("/[artifact]") /** * Because artifact paths always start with `/` (see [toPublication] for details), @@ -168,7 +173,19 @@ class IntelliJPlatformRepositoriesHelper( includeGroup(Configurations.Dependencies.LOCAL_IDE_GROUP) includeGroup(Configurations.Dependencies.LOCAL_PLUGIN_GROUP) includeGroup(Configurations.Dependencies.LOCAL_JETBRAINS_RUNTIME_GROUP) + includeGroup(Configurations.Dependencies.BUNDLED_PLUGIN_ARTIFACT_GROUP) + includeGroup(Configurations.Dependencies.BUNDLED_MODULE_ARTIFACT_GROUP) } action() } + + companion object { + fun updateLocalIvyRepoArtifactPattern(platformPath: Path, repositories: RepositoryHandler) { + val absolutePathString = platformPath.absolutePathString().removeSuffixIfPresent("/") + val localIvyRepo = repositories[Constants.RepositoryNames.LOCAL_IVY] + (localIvyRepo as DefaultIvyArtifactRepository).artifactPattern( + "${absolutePathString}/[type]/[artifact].[ext]" + ) + } + } } diff --git a/src/main/kotlin/org/jetbrains/intellij/platform/gradle/models/IvyModule.kt b/src/main/kotlin/org/jetbrains/intellij/platform/gradle/models/IvyModule.kt index 9eedc342a3..80f57277f4 100644 --- a/src/main/kotlin/org/jetbrains/intellij/platform/gradle/models/IvyModule.kt +++ b/src/main/kotlin/org/jetbrains/intellij/platform/gradle/models/IvyModule.kt @@ -7,10 +7,9 @@ import nl.adaptivity.xmlutil.serialization.XmlChildrenName import nl.adaptivity.xmlutil.serialization.XmlElement import nl.adaptivity.xmlutil.serialization.XmlSerialName import org.jetbrains.intellij.platform.gradle.extensions.IntelliJPlatformRepositoriesExtension +import org.jetbrains.intellij.platform.gradle.resolvers.path.takeIfExists import java.nio.file.Path -import kotlin.io.path.extension -import kotlin.io.path.invariantSeparatorsPathString -import kotlin.io.path.isDirectory +import kotlin.io.path.* @Serializable @XmlSerialName("ivy-module") @@ -42,6 +41,9 @@ data class IvyModule( val type: String? = null, val ext: String? = null, val conf: String? = "default", + // Does not seem to be supported by Gradle: + // https://ant.apache.org/ivy/history/2.4.0/ivyfile/artifact.html + // https://docs.gradle.org/current/javadoc/org/gradle/api/publish/ivy/IvyArtifact.html val url: String? = null, val packaging: String? = null, ) @@ -88,10 +90,71 @@ data class IvyModule( * * @see IntelliJPlatformRepositoriesExtension.jetbrainsIdeInstallers */ -internal fun Path.toIvyArtifact() = IvyModule.Artifact( - name = invariantSeparatorsPathString.replaceFirst(Regex("^[a-zA-Z]:/"), "/"), - type = when { - isDirectory() -> "directory" - else -> extension - }, -) +internal fun Path.toIvyArtifact(): IvyModule.Artifact { + return IvyModule.Artifact( + name = invariantSeparatorsPathString.replaceFirst(Regex("^[a-zA-Z]:/"), "/"), + type = when { + isDirectory() -> "directory" + else -> extension + }, + ) +} + +internal fun Path.toBundledPluginIvyArtifacts(platformPath: Path): List { + val jars: List = collectJars( + this.resolve("lib"), + ) + + return jars.map { it: Path -> + var platformAbsPath = platformPath.absolutePathString() + if (!platformAbsPath.endsWith("/")) { + platformAbsPath += "/" + } + + val pluginRelativePath = it.invariantSeparatorsPathString.replaceFirst(platformAbsPath, "", false) + // E.g. + IvyModule.Artifact( + type = pluginRelativePath.substringBeforeLast("/"), + name = pluginRelativePath.substringAfterLast("/").substringBeforeLast(".jar"), + ext = it.extension, + ) + } +} + +internal fun Path.toBundledModuleIvyArtifacts(platformPath: Path): List { + val jars: List = collectJars( + this.resolve("lib/modules") + ) + + return jars.map { it: Path -> + var platformAbsPath = platformPath.absolutePathString() + if (!platformAbsPath.endsWith("/")) { + platformAbsPath += "/" + } + + val pluginRelativePath = it.invariantSeparatorsPathString.replaceFirst(platformAbsPath, "", false) + IvyModule.Artifact( + type = pluginRelativePath.substringBeforeLast("/"), + name = pluginRelativePath.substringAfterLast("/").substringBeforeLast(".jar"), + ext = it.extension, + ) + } +} + +internal fun Path.toLocalPluginIvyArtifacts(): List { + if (this.isDirectory()) { + val jars: List = collectJars( + this.resolve("lib"), + ) + + return jars.map { it: Path -> + it.toIvyArtifact() + } + } else { + return listOf(this.toIvyArtifact()) + } +} + +internal fun collectJars(vararg paths: Path?) = paths + .mapNotNull { it?.takeIfExists() } + .flatMap { it.listDirectoryEntries("*.jar") } diff --git a/src/main/kotlin/org/jetbrains/intellij/platform/gradle/plugins/project/IntelliJPlatformBasePlugin.kt b/src/main/kotlin/org/jetbrains/intellij/platform/gradle/plugins/project/IntelliJPlatformBasePlugin.kt index be0f470984..a19e218056 100644 --- a/src/main/kotlin/org/jetbrains/intellij/platform/gradle/plugins/project/IntelliJPlatformBasePlugin.kt +++ b/src/main/kotlin/org/jetbrains/intellij/platform/gradle/plugins/project/IntelliJPlatformBasePlugin.kt @@ -315,8 +315,8 @@ abstract class IntelliJPlatformBasePlugin : Plugin { Publishing.register(project, target = intelliJPlatform) } - IntelliJPlatformDependenciesExtension.register(project, target = project.dependencies) IntelliJPlatformRepositoriesExtension.register(project, target = project.repositories) + IntelliJPlatformDependenciesExtension.register(project, target = project.dependencies) project.tasks.matching { when (it) {