summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAleksey Pivovarov <AMPivovarov@gmail.com>2022-06-08 00:22:10 +0200
committerintellij-monorepo-bot <intellij-monorepo-bot-no-reply@jetbrains.com>2022-06-19 19:09:14 +0000
commit117fce3cbf4f310bf3c4e6f753ccab701a06ba1d (patch)
tree35a5a65f94779ae90896784f1ae32e7c8e640a22
parent01d6848f0bcebd3d0208fecc2b800f878a7ce3f9 (diff)
downloadidea-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
-rw-r--r--platform/diff-impl/intellij.platform.diff.impl.iml1
-rw-r--r--platform/diff-impl/src/com/intellij/diff/tools/external/ExternalDiffSettings.kt10
-rw-r--r--platform/diff-impl/src/com/intellij/diff/tools/external/ExternalDiffTool.java45
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);