summaryrefslogtreecommitdiff
path: root/platform/build-scripts/groovy/org/jetbrains/intellij/build/impl/PluginLayout.groovy
diff options
context:
space:
mode:
Diffstat (limited to 'platform/build-scripts/groovy/org/jetbrains/intellij/build/impl/PluginLayout.groovy')
-rw-r--r--platform/build-scripts/groovy/org/jetbrains/intellij/build/impl/PluginLayout.groovy41
1 files changed, 41 insertions, 0 deletions
diff --git a/platform/build-scripts/groovy/org/jetbrains/intellij/build/impl/PluginLayout.groovy b/platform/build-scripts/groovy/org/jetbrains/intellij/build/impl/PluginLayout.groovy
index 3effeea54e80..a636e8c183b2 100644
--- a/platform/build-scripts/groovy/org/jetbrains/intellij/build/impl/PluginLayout.groovy
+++ b/platform/build-scripts/groovy/org/jetbrains/intellij/build/impl/PluginLayout.groovy
@@ -2,6 +2,7 @@
package org.jetbrains.intellij.build.impl
import com.intellij.openapi.util.Pair
+import com.intellij.util.containers.MultiMap
import groovy.transform.CompileStatic
import org.jetbrains.annotations.NotNull
import org.jetbrains.intellij.build.BuildContext
@@ -132,6 +133,38 @@ final class PluginLayout extends BaseLayout {
}, ""))
}
+ void mergeServiceFiles() {
+ patchers.add(new BiConsumer<ModuleOutputPatcher, BuildContext>() {
+ @Override
+ void accept(ModuleOutputPatcher patcher, BuildContext context) {
+ MultiMap<String, Pair<String, Path>> discoveredServiceFiles = MultiMap.createLinkedSet()
+
+ moduleJars.get(mainJarName).each { String moduleName ->
+ Path path = context.findFileInModuleSources(moduleName, "META-INF/services")
+ if (path == null) return
+
+ Files.list(path).each { Path serviceFile ->
+ if (!Files.isRegularFile(serviceFile)) return
+ discoveredServiceFiles.putValue(serviceFile.fileName.toString(), Pair.create(moduleName, serviceFile))
+ }
+ }
+
+ discoveredServiceFiles.entrySet().each { Map.Entry<String, Collection<Pair<String, Path>>> entry ->
+ String serviceFileName = entry.key
+ Collection<Pair<String, Path>> serviceFiles = entry.value
+
+ if (serviceFiles.size() <= 1) return
+ String content = serviceFiles.collect { Files.readString(it.second) }.join("\n")
+
+ context.messages.info("Merging service file " + serviceFileName + " (" + serviceFiles.collect { it.first }.join(", ") + ")")
+ patcher.patchModuleOutput(serviceFiles.first().first, // first one wins
+ "META-INF/services/$serviceFileName",
+ content)
+ }
+ }
+ })
+ }
+
@CompileStatic
static final class PluginLayoutSpec extends BaseLayoutSpec {
final PluginLayout layout
@@ -368,6 +401,14 @@ final class PluginLayout extends BaseLayout {
void filterScrambleClasspath(BiPredicate<BuildContext, Path> filter) {
layout.scrambleClasspathFilter = filter
}
+
+ /**
+ * Concatenates `META-INF/services` files with the same name from different modules together.
+ * By default the first service file silently wins.
+ */
+ void mergeServiceFiles() {
+ layout.mergeServiceFiles()
+ }
}
interface VersionEvaluator {