diff options
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.groovy | 41 |
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 { |