diff options
author | Aleksey Pivovarov <AMPivovarov@gmail.com> | 2022-06-08 00:22:10 +0200 |
---|---|---|
committer | intellij-monorepo-bot <intellij-monorepo-bot-no-reply@jetbrains.com> | 2022-06-19 19:09:14 +0000 |
commit | 117fce3cbf4f310bf3c4e6f753ccab701a06ba1d (patch) | |
tree | 35a5a65f94779ae90896784f1ae32e7c8e640a22 | |
parent | 01d6848f0bcebd3d0208fecc2b800f878a7ce3f9 (diff) | |
download | idea-117fce3cbf4f310bf3c4e6f753ccab701a06ba1d.tar.gz |
IDEA-295565 diff: fix External Diff Tool for files with unknown FileType
Ex: his prevents external tools to work with directory diff.
Fix regression after: b517038a6ec3b99d644623f225980585ebea9d1c
(cherry picked from commit f3a3692b6d4538d022be81434b6636c30aaea8ce)
IJ-CR-25441
GitOrigin-RevId: db2ff42b1b17bb4eb9e52862d4c226c3b3d47a82
3 files changed, 41 insertions, 15 deletions
diff --git a/platform/diff-impl/intellij.platform.diff.impl.iml b/platform/diff-impl/intellij.platform.diff.impl.iml index afc78f576e8d..5d1b8d7fe421 100644 --- a/platform/diff-impl/intellij.platform.diff.impl.iml +++ b/platform/diff-impl/intellij.platform.diff.impl.iml @@ -23,6 +23,5 @@ <orderEntry type="library" name="fastutil-min" level="project" /> <orderEntry type="module" module-name="intellij.platform.ide.util.io.impl" /> <orderEntry type="library" name="kotlinx-coroutines-jdk8" level="project" /> - <orderEntry type="library" name="StreamEx" level="project" /> </component> </module>
\ No newline at end of file diff --git a/platform/diff-impl/src/com/intellij/diff/tools/external/ExternalDiffSettings.kt b/platform/diff-impl/src/com/intellij/diff/tools/external/ExternalDiffSettings.kt index 8dcfcc26d45c..dd3c98dd0d7e 100644 --- a/platform/diff-impl/src/com/intellij/diff/tools/external/ExternalDiffSettings.kt +++ b/platform/diff-impl/src/com/intellij/diff/tools/external/ExternalDiffSettings.kt @@ -98,6 +98,16 @@ class ExternalDiffSettings : BaseState(), PersistentStateComponent<ExternalDiffS get() = FileTypeManager.getInstance() @JvmStatic + fun findDefaultDiffTool(): ExternalTool? { + val diffToolName = instance.defaultToolConfiguration.diffToolName + + if (diffToolName == ExternalToolConfiguration.BUILTIN_TOOL) return null + val diffTools = instance.externalTools[ExternalToolGroup.DIFF_TOOL] ?: return null + + return findTool(diffTools, diffToolName) + } + + @JvmStatic fun findDiffTool(fileType: FileType): ExternalTool? { val diffToolName = findToolConfiguration(fileType)?.diffToolName ?: instance.defaultToolConfiguration.diffToolName diff --git a/platform/diff-impl/src/com/intellij/diff/tools/external/ExternalDiffTool.java b/platform/diff-impl/src/com/intellij/diff/tools/external/ExternalDiffTool.java index 1c3643482ece..e5f9eb381a85 100644 --- a/platform/diff-impl/src/com/intellij/diff/tools/external/ExternalDiffTool.java +++ b/platform/diff-impl/src/com/intellij/diff/tools/external/ExternalDiffTool.java @@ -14,12 +14,14 @@ import com.intellij.openapi.ListSelection; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.diff.DiffBundle; import com.intellij.openapi.fileTypes.FileTypeManager; +import com.intellij.openapi.fileTypes.UnknownFileType; import com.intellij.openapi.progress.ProcessCanceledException; import com.intellij.openapi.progress.ProgressIndicator; import com.intellij.openapi.progress.ProgressManager; import com.intellij.openapi.progress.Task; import com.intellij.openapi.project.Project; import com.intellij.openapi.ui.Messages; +import com.intellij.openapi.util.Conditions; import com.intellij.openapi.util.NlsContexts; import com.intellij.openapi.util.UserDataHolderBase; import com.intellij.openapi.util.io.FileUtilRt; @@ -29,12 +31,13 @@ import com.intellij.util.ThrowableConvertor; import com.intellij.util.concurrency.annotations.RequiresBackgroundThread; import com.intellij.util.concurrency.annotations.RequiresEdt; import com.intellij.util.containers.ContainerUtil; -import one.util.streamex.StreamEx; +import com.intellij.util.containers.JBIterable; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.io.IOException; import java.util.ArrayList; +import java.util.Comparator; import java.util.List; public final class ExternalDiffTool { @@ -52,12 +55,32 @@ public final class ExternalDiffTool { if (isDefault()) return true; FileTypeManager fileTypeManager = FileTypeManager.getInstance(); - return diffProducers.stream() - .map(DiffRequestProducer::getName) - .filter(filePath -> !FileUtilRt.getExtension(filePath).equals("tmp")) - .map(filePath -> fileTypeManager.getFileTypeByFileName(filePath)) - .distinct() - .anyMatch(fileType -> ExternalDiffSettings.findDiffTool(fileType) != null); + return JBIterable.from(diffProducers) + .map(DiffRequestProducer::getName) + .filter(filePath -> !FileUtilRt.getExtension(filePath).equals("tmp")) + .map(filePath -> fileTypeManager.getFileTypeByFileName(filePath)) + .unique() + .map(fileType -> ExternalDiffSettings.findDiffTool(fileType)) + .filter(Conditions.notNull()) + .first() != null; + } + + @Nullable + private static ExternalDiffSettings.ExternalTool getExternalToolFor(@NotNull ContentDiffRequest request) { + ExternalDiffSettings.ExternalTool diffTool = JBIterable.from(request.getContents()) + .map(content -> content.getContentType()) + .filter(Conditions.notNull()) + .unique() + .sort(Comparator.comparing(fileType -> fileType != UnknownFileType.INSTANCE ? -1 : 1)) + .map(fileType -> ExternalDiffSettings.findDiffTool(fileType)) + .filter(Conditions.notNull()) + .first(); + if (diffTool != null) return diffTool; + + if (isDefault()) { + return ExternalDiffSettings.findDefaultDiffTool(); + } + return null; } public static boolean showIfNeeded(@Nullable Project project, @@ -120,13 +143,7 @@ public final class ExternalDiffTool { throws IOException, ExecutionException { if (!canShow(request)) return false; - List<DiffContent> contents = ((ContentDiffRequest)request).getContents(); - ExternalDiffSettings.ExternalTool externalTool = StreamEx.of(contents) - .map(content -> content.getContentType()) - .nonNull() - .map(fileType -> ExternalDiffSettings.findDiffTool(fileType)) - .nonNull() - .findFirst().orElse(null); + ExternalDiffSettings.ExternalTool externalTool = getExternalToolFor(((ContentDiffRequest)request)); if (externalTool == null) return false; showRequest(project, request, externalTool); |