diff options
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.java | 54 |
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); + } + } } |