summaryrefslogtreecommitdiff
path: root/platform/platform-impl/src/com/intellij/openapi/diff/impl/external/ExtMergeFiles.java
diff options
context:
space:
mode:
Diffstat (limited to 'platform/platform-impl/src/com/intellij/openapi/diff/impl/external/ExtMergeFiles.java')
-rw-r--r--platform/platform-impl/src/com/intellij/openapi/diff/impl/external/ExtMergeFiles.java54
1 files changed, 52 insertions, 2 deletions
diff --git a/platform/platform-impl/src/com/intellij/openapi/diff/impl/external/ExtMergeFiles.java b/platform/platform-impl/src/com/intellij/openapi/diff/impl/external/ExtMergeFiles.java
index 82313a5c9c35..cfee691a1f1f 100644
--- a/platform/platform-impl/src/com/intellij/openapi/diff/impl/external/ExtMergeFiles.java
+++ b/platform/platform-impl/src/com/intellij/openapi/diff/impl/external/ExtMergeFiles.java
@@ -15,10 +15,21 @@
*/
package com.intellij.openapi.diff.impl.external;
+import com.intellij.execution.ExecutionException;
+import com.intellij.execution.configurations.GeneralCommandLine;
+import com.intellij.execution.util.ExecutionErrorDialog;
+import com.intellij.openapi.diff.DiffBundle;
import com.intellij.openapi.diff.DiffContent;
import com.intellij.openapi.diff.DiffRequest;
import com.intellij.openapi.diff.impl.mergeTool.MergeRequestImpl;
+import com.intellij.openapi.progress.ProgressIndicator;
+import com.intellij.openapi.progress.ProgressManager;
+import com.intellij.openapi.progress.Task;
+import com.intellij.openapi.ui.DialogWrapper;
+import com.intellij.openapi.ui.Messages;
import com.intellij.openapi.util.text.StringUtil;
+import com.intellij.util.TimeoutUtil;
+import org.jetbrains.annotations.NotNull;
import java.util.ArrayList;
import java.util.List;
@@ -34,7 +45,8 @@ public class ExtMergeFiles extends BaseExternalTool {
}
@Override
- public boolean isAvailable(DiffRequest request) {
+ public boolean isAvailable(@NotNull DiffRequest request) {
+ if (!(request instanceof MergeRequestImpl)) return false;
DiffContent[] contents = request.getContents();
if (contents.length != 3) return false;
if (externalize(request, 0) == null) return false;
@@ -45,7 +57,8 @@ public class ExtMergeFiles extends BaseExternalTool {
}
@Override
- protected List<String> getParameters(DiffRequest request) throws Exception {
+ @NotNull
+ protected List<String> getParameters(@NotNull DiffRequest request) throws Exception {
final List<String> params = new ArrayList<String>();
String result = ((MergeRequestImpl)request).getResultContent().getFile().getPath();
String left = externalize(request, 0).getContentFile().getPath();
@@ -60,4 +73,41 @@ public class ExtMergeFiles extends BaseExternalTool {
}
return params;
}
+
+ @Override
+ public void show(@NotNull DiffRequest request) {
+ saveContents(request);
+
+ int result = DialogWrapper.CANCEL_EXIT_CODE;
+
+ GeneralCommandLine commandLine = new GeneralCommandLine();
+ commandLine.setExePath(getToolPath());
+ try {
+ commandLine.addParameters(getParameters(request));
+ commandLine.createProcess();
+
+ ProgressManager.getInstance().run(new Task.Modal(request.getProject(), "Launching external tool", false) {
+ @Override
+ public void run(@NotNull ProgressIndicator indicator) {
+ indicator.setIndeterminate(true);
+ TimeoutUtil.sleep(1000);
+ }
+ });
+
+ if (Messages.YES == Messages.showYesNoDialog(request.getProject(),
+ "Press \"Mark as Resolved\" when you finish resolving conflicts in the external tool",
+ "Merge In External Tool", "Mark as Resolved", "Revert", null)) {
+ result = DialogWrapper.OK_EXIT_CODE;
+ }
+ ((MergeRequestImpl)request).getResultContent().getFile().refresh(false, false);
+ // We can actually check exit code of external tool, but some of them could work with tabs -> do not close at all
+ }
+ catch (Exception e) {
+ ExecutionErrorDialog
+ .show(new ExecutionException(e.getMessage()), DiffBundle.message("cant.launch.diff.tool.error.message"), request.getProject());
+ }
+ finally {
+ ((MergeRequestImpl)request).setResult(result);
+ }
+ }
}