[Mercurial] IDEA-55926: validating hg executable before each command; returning null...
authorKirill Likhodedov <kirill.likhodedov@jetbrains.com>
Tue, 22 Jun 2010 11:39:34 +0000 (15:39 +0400)
committerKirill Likhodedov <kirill.likhodedov@jetbrains.com>
Tue, 22 Jun 2010 11:39:34 +0000 (15:39 +0400)
plugins/hg4idea/src/org/zmlx/hg4idea/HgExecutableValidator.java
plugins/hg4idea/src/org/zmlx/hg4idea/action/HgInit.java
plugins/hg4idea/src/org/zmlx/hg4idea/command/HgCommandService.java
plugins/hg4idea/src/org/zmlx/hg4idea/command/HgInitCommand.java

index 175538e7bb31df73fbeeccf1eb0382e6215a43c4..d775d7fbec7c4a12cc5e95f99f6a3166ba380c56 100644 (file)
@@ -16,7 +16,7 @@ import com.intellij.openapi.project.Project;
 import org.zmlx.hg4idea.command.HgVersionCommand;
 import org.zmlx.hg4idea.ui.HgSetExecutableDialog;
 
-class HgExecutableValidator {
+public class HgExecutableValidator {
 
   private final Project project;
 
index a5171d0bb50f6917cdb466f153d176ecbc6cb63c..57c61e8634e1c4f07ceae8feea211571d2c6e296 100644 (file)
@@ -113,11 +113,12 @@ public class HgInit extends DumbAwareAction {
   }
 
   private void createRepository(VirtualFile selectedRoot) {
-    (new HgInitCommand(myProject)).execute(selectedRoot);
-    Notifications.Bus.notify(new Notification(HgVcs.NOTIFICATION_GROUP_ID,
+    if ((new HgInitCommand(myProject)).execute(selectedRoot)) {
+      Notifications.Bus.notify(new Notification(HgVcs.NOTIFICATION_GROUP_ID,
                                               HgVcsMessages.message("hg4idea.init.created.notification.title"),
                                               HgVcsMessages.message("hg4idea.init.created.notification.description", selectedRoot.getPresentableUrl()),
                                               NotificationType.INFORMATION), myProject);
+    }
   }
   
 }
index 550d99d2762594b5ccff73671dc92da16d777eac..5efd3bba869c202d735d068c5f0cfdf27735485c 100644 (file)
@@ -19,10 +19,8 @@ import com.intellij.openapi.diagnostic.Logger;
 import com.intellij.openapi.project.Project;
 import com.intellij.openapi.vfs.VirtualFile;
 import com.intellij.vcsUtil.VcsUtil;
-import org.zmlx.hg4idea.HgGlobalSettings;
-import org.zmlx.hg4idea.HgUtil;
-import org.zmlx.hg4idea.HgVcs;
-import org.zmlx.hg4idea.HgVcsMessages;
+import org.jetbrains.annotations.Nullable;
+import org.zmlx.hg4idea.*;
 
 import javax.swing.*;
 import java.awt.*;
@@ -46,36 +44,46 @@ public final class HgCommandService {
     "--config", "ui.merge=internal:merge"
   );
 
-  private final Project project;
-  private final HgGlobalSettings settings;
+  private final Project myProject;
+  private final HgGlobalSettings mySettings;
+  private HgExecutableValidator validator;
 
   public HgCommandService(Project project, HgGlobalSettings settings) {
-    this.project = project;
-    this.settings = settings;
+    myProject = project;
+    mySettings = settings;
     if (PROMPT_HOOKS_PLUGIN == null) {
       PROMPT_HOOKS_PLUGIN = HgUtil.getTemporaryPythonFile("prompthooks");
     }
+    validator = new HgExecutableValidator(myProject);
   }
 
   public static HgCommandService getInstance(Project project) {
     return ServiceManager.getService(project, HgCommandService.class);
   }
 
+  @Nullable
   HgCommandResult execute(VirtualFile repo, String operation, List<String> arguments) {
     return execute(
       repo, DEFAULT_OPTIONS, operation, arguments, Charset.defaultCharset()
     );
   }
 
+  @Nullable
   HgCommandResult execute(VirtualFile repo, List<String> hgOptions,
     String operation, List<String> arguments) {
     return execute(repo, hgOptions, operation, arguments, Charset.defaultCharset());
   }
 
+  @Nullable
   HgCommandResult execute(VirtualFile repo, List<String> hgOptions,
     String operation, List<String> arguments, Charset charset) {
+
+    if (!validator.check(mySettings)) {
+      return null;
+    }
+
     List<String> cmdLine = new LinkedList<String>();
-    cmdLine.add(HgVcs.getInstance(project).getHgExecutable());
+    cmdLine.add(HgVcs.getInstance(myProject).getHgExecutable());
     if (repo != null) {
       cmdLine.add("--repository");
       cmdLine.add(repo.getPath());
@@ -101,7 +109,9 @@ public final class HgCommandService {
       cmdLine.add("--config");
       cmdLine.add("extensions.mq=");
     } catch (IOException e) {
-      throw new RuntimeException(e); //TODO implement catch clause
+      showError(e);
+      LOG.error("IOException during preparing command", e);
+      return null;
     }
     cmdLine.addAll(hgOptions);
     cmdLine.add(operation);
@@ -117,7 +127,7 @@ public final class HgCommandService {
     } catch (ShellCommandException e) {
       showError(e);
       LOG.error(e.getMessage(), e);
-      result = HgCommandResult.EMPTY;
+      return null;
     } finally {
       promptServer.stop();
       warningServer.stop();
@@ -131,13 +141,13 @@ public final class HgCommandService {
   private void showError(Exception e) {
     StringBuilder message = new StringBuilder();
     message.append(HgVcsMessages.message("hg4idea.command.executable.error",
-      HgVcs.getInstance(project).getHgExecutable()))
+      HgVcs.getInstance(myProject).getHgExecutable()))
       .append("\n")
       .append("Original Error:\n")
       .append(e.getMessage());
 
     VcsUtil.showErrorMessage(
-      project,
+      myProject,
       message.toString(),
       HgVcsMessages.message("hg4idea.error")
     );
index 5df82d22dfbccfa35fe421f30e5d1c046ea98080..96f738793349fc653ee25435ec20353ef61e0f1a 100644 (file)
@@ -15,8 +15,8 @@ public class HgInitCommand {
     myProject = project;
   }
 
-  public void execute(@NotNull VirtualFile repositoryRoot) {
-    HgCommandService.getInstance(myProject).execute(repositoryRoot, "init", null);
+  public boolean execute(@NotNull VirtualFile repositoryRoot) {
+    return HgCommandService.getInstance(myProject).execute(repositoryRoot, "init", null) != null;
   }
 
 }