From 9f59a40bee4a6fe516a077e8d038eb911c5ec70d Mon Sep 17 00:00:00 2001 From: Kirill Likhodedov Date: Thu, 24 Sep 2015 19:06:47 +0300 Subject: [PATCH] [git] don't close the 'add remote' dialog if validation is cancelled or fails --- .../git4idea/push/GitDefineRemoteDialog.java | 60 ++++++++++++++++++- .../src/git4idea/push/GitPushTargetPanel.java | 39 +----------- 2 files changed, 59 insertions(+), 40 deletions(-) diff --git a/plugins/git4idea/src/git4idea/push/GitDefineRemoteDialog.java b/plugins/git4idea/src/git4idea/push/GitDefineRemoteDialog.java index 989e73edb9fc..945a7b8db8e8 100644 --- a/plugins/git4idea/src/git4idea/push/GitDefineRemoteDialog.java +++ b/plugins/git4idea/src/git4idea/push/GitDefineRemoteDialog.java @@ -15,13 +15,22 @@ */ package git4idea.push; -import com.intellij.openapi.project.Project; +import com.intellij.openapi.diagnostic.Logger; +import com.intellij.openapi.progress.ProcessCanceledException; +import com.intellij.openapi.progress.ProgressManager; import com.intellij.openapi.ui.DialogWrapper; +import com.intellij.openapi.ui.Messages; +import com.intellij.openapi.util.ThrowableComputable; import com.intellij.openapi.util.text.StringUtil; +import com.intellij.openapi.vfs.VfsUtilCore; import com.intellij.ui.components.JBLabel; import com.intellij.util.ui.GridBag; import com.intellij.util.ui.UIUtil; +import git4idea.commands.Git; +import git4idea.commands.GitCommandResult; import git4idea.repo.GitRemote; +import git4idea.repo.GitRepository; +import git4idea.validators.GitRefNameValidator; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -30,11 +39,18 @@ import java.awt.*; class GitDefineRemoteDialog extends DialogWrapper { + private static final Logger LOG = Logger.getInstance(GitDefineRemoteDialog.class); + + @NotNull private final GitRepository myRepository; + @NotNull private final Git myGit; + @NotNull private final JTextField myRemoteName; @NotNull private final JTextField myRemoteUrl; - GitDefineRemoteDialog(@NotNull Project project) { - super(project); + GitDefineRemoteDialog(@NotNull GitRepository repository, @NotNull Git git) { + super(repository.getProject()); + myRepository = repository; + myGit = git; myRemoteName = new JTextField(GitRemote.ORIGIN_NAME, 20); myRemoteUrl = new JTextField(20); setTitle("Define Remote"); @@ -71,4 +87,42 @@ class GitDefineRemoteDialog extends DialogWrapper { public JComponent getPreferredFocusedComponent() { return myRemoteUrl; } + + @Override + protected void doOKAction() { + try { + String name = getRemoteName(); + String url = getRemoteUrl(); + String error = validateRemoteUnderModal(name, url); + if (error != null) { + LOG.warn(String.format("Invalid remote. Name: [%s], URL: [%s], error: %s", name, url, error)); + Messages.showErrorDialog(myRepository.getProject(), error, "Invalid Remote URL"); + } + else { + super.doOKAction(); + } + } + catch (ProcessCanceledException pce) { + // let the dialog stay open + } + } + + @Nullable + private String validateRemoteUnderModal(final String name, final String url) { + if (url.isEmpty()) { + return "URL can't be empty"; + } + if (!GitRefNameValidator.getInstance().checkInput(name)) { + return "Remote name is invalid"; + } + + return ProgressManager.getInstance().runProcessWithProgressSynchronously(new ThrowableComputable() { + @Override + public String compute() throws ProcessCanceledException { + final GitCommandResult result = myGit.lsRemote(myRepository.getProject(), VfsUtilCore.virtualToIoFile(myRepository.getRoot()), url); + return !result.success() ? "Remote URL is invalid: " + result.getErrorOutputAsHtmlString() : null; + } + }, "Checking URL...", true, myRepository.getProject()); + } + } diff --git a/plugins/git4idea/src/git4idea/push/GitPushTargetPanel.java b/plugins/git4idea/src/git4idea/push/GitPushTargetPanel.java index ef36f95e59f6..fa0a7882b780 100644 --- a/plugins/git4idea/src/git4idea/push/GitPushTargetPanel.java +++ b/plugins/git4idea/src/git4idea/push/GitPushTargetPanel.java @@ -31,8 +31,6 @@ import com.intellij.openapi.ui.ValidationInfo; import com.intellij.openapi.ui.popup.ListPopup; import com.intellij.openapi.ui.popup.PopupStep; import com.intellij.openapi.ui.popup.util.BaseListPopupStep; -import com.intellij.openapi.util.Ref; -import com.intellij.openapi.vfs.VfsUtilCore; import com.intellij.openapi.wm.IdeFocusManager; import com.intellij.ui.ColoredTreeCellRenderer; import com.intellij.ui.SimpleTextAttributes; @@ -47,7 +45,6 @@ import git4idea.commands.Git; import git4idea.commands.GitCommandResult; import git4idea.repo.GitRemote; import git4idea.repo.GitRepository; -import git4idea.validators.GitRefNameValidator; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -162,44 +159,12 @@ public class GitPushTargetPanel extends PushTargetPanel { } private void showDefineRemoteDialog() { - GitDefineRemoteDialog dialog = new GitDefineRemoteDialog(myRepository.getProject()); + GitDefineRemoteDialog dialog = new GitDefineRemoteDialog(myRepository, myGit); if (dialog.showAndGet()) { - String name = dialog.getRemoteName(); - String url = dialog.getRemoteUrl(); - String error = validateRemoteUnderModal(name, url); - if (error != null) { - LOG.warn(String.format("Invalid remote. Name: [%s], URL: [%s], error: %s", name, url, error)); - Messages.showErrorDialog(myRepository.getProject(), error, "Invalid Remote URL"); - } - else { - addRemoteUnderModal(name, url); - } + addRemoteUnderModal(dialog.getRemoteName(), dialog.getRemoteUrl()); } } - @Nullable - private String validateRemoteUnderModal(final String name, final String url) { - if (url.isEmpty()) { - return "URL can't be empty"; - } - if (!GitRefNameValidator.getInstance().checkInput(name)) { - return "Remote name is invalid"; - } - - final Ref error = Ref.create(); - ProgressManager.getInstance().run(new Task.Modal(myRepository.getProject(), "Checking URL...", true) { - @Override - public void run(@NotNull ProgressIndicator indicator) { - indicator.setIndeterminate(true); - final GitCommandResult result = myGit.lsRemote(myRepository.getProject(), VfsUtilCore.virtualToIoFile(myRepository.getRoot()), url); - if (!result.success()) { - error.set("Remote URL is invalid: " + result.getErrorOutputAsHtmlString()); - } - } - }); - return error.get(); - } - private void addRemoteUnderModal(@NotNull final String remoteName, @NotNull final String remoteUrl) { ProgressManager.getInstance().run(new Task.Modal(myRepository.getProject(), "Adding remote...", true) { private GitCommandResult myResult;