[hg] HgCommandService is not a service anymore
authorKirill Likhodedov <kirill.likhodedov@jetbrains.com>
Wed, 6 Apr 2011 07:24:22 +0000 (11:24 +0400)
committerKirill Likhodedov <kirill.likhodedov@jetbrains.com>
Fri, 8 Apr 2011 10:22:15 +0000 (14:22 +0400)
Due to a large amount of configuration options, better to instantiate HgCommandService each time before executing a command.
prompthooks.py preparation is made in HgVcs#activate(), so no long operation is done in HgCommandService().

plugins/hg4idea/src/META-INF/plugin.xml
plugins/hg4idea/src/org/zmlx/hg4idea/HgVcs.java
plugins/hg4idea/src/org/zmlx/hg4idea/command/HgCommandService.java

index ec09509d7c6c5d8c0b87cac63e18db2abd2f3d8e..87a1284b36cae3c67875fbbfc674727420790bff 100644 (file)
@@ -17,8 +17,6 @@
                         serviceImplementation="org.zmlx.hg4idea.HgGlobalSettings"/>
     <projectService serviceInterface="org.zmlx.hg4idea.HgProjectSettings"
                     serviceImplementation="org.zmlx.hg4idea.HgProjectSettings"/>
-    <projectService serviceInterface="org.zmlx.hg4idea.command.HgCommandService"
-                    serviceImplementation="org.zmlx.hg4idea.command.HgCommandService"/>
     <projectService serviceInterface="org.zmlx.hg4idea.HgRootsHandler"
                     serviceImplementation="org.zmlx.hg4idea.HgRootsHandler" />
   </extensions>
index 6aff4dfc7c5e8831e36a6598749353cc784d26f2..294b6855d2d17bb75c70f5e9d41d043797668db4 100644 (file)
@@ -14,6 +14,8 @@ package org.zmlx.hg4idea;
 
 import com.intellij.concurrency.JobScheduler;
 import com.intellij.openapi.application.ApplicationManager;
+import com.intellij.openapi.application.ApplicationNamesInfo;
+import com.intellij.openapi.diagnostic.Logger;
 import com.intellij.openapi.diff.impl.patch.formove.FilePathComparator;
 import com.intellij.openapi.editor.markup.TextAttributes;
 import com.intellij.openapi.fileEditor.FileEditorManagerAdapter;
@@ -46,6 +48,7 @@ import com.intellij.util.containers.ComparatorDelegate;
 import com.intellij.util.containers.Convertor;
 import com.intellij.util.messages.MessageBusConnection;
 import com.intellij.util.messages.Topic;
+import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
 import org.zmlx.hg4idea.provider.*;
 import org.zmlx.hg4idea.provider.annotate.HgAnnotationProvider;
@@ -72,6 +75,7 @@ public class HgVcs extends AbstractVcs<CommittedChangeList> {
 
   private static final Icon INCOMING_ICON = IconLoader.getIcon("/actions/moveDown.png");
   private static final Icon OUTGOING_ICON = IconLoader.getIcon("/actions/moveUp.png");
+  private static final Logger LOG = Logger.getInstance(HgVcs.class);
 
   public static final String VCS_NAME = "hg4idea";
   public static final String NOTIFICATION_GROUP_ID = "Mercurial";
@@ -102,6 +106,7 @@ public class HgVcs extends AbstractVcs<CommittedChangeList> {
   private final HgMergeProvider myMergeProvider;
   private HgExecutableValidator myExecutableValidator;
   private final Object myExecutableValidatorLock = new Object();
+  private File myPromptHooksExtensionFile;
 
   public HgVcs(Project project,
     HgGlobalSettings globalSettings, HgProjectSettings projectSettings,
@@ -236,12 +241,26 @@ public class HgVcs extends AbstractVcs<CommittedChangeList> {
     return HgUtil.getNearestHgRoot(dir) != null;
   }
 
+  /**
+   * @return the prompthooks.py extension used for capturing prompts from Mercurial and requesting IDEA's user about authentication.
+   */
+  public @NotNull File getPromptHooksExtensionFile() {
+    return myPromptHooksExtensionFile;
+  }
+
   @Override
   public void activate() {
     // validate hg executable on start
     if (!ApplicationManager.getApplication().isUnitTestMode()) {
       getExecutableValidator().checkExecutableAndShowDialogIfNeeded();
     }
+
+    // check that hooks are available
+    myPromptHooksExtensionFile = HgUtil.getTemporaryPythonFile("prompthooks");
+    if (myPromptHooksExtensionFile == null || !myPromptHooksExtensionFile.exists()) {
+      LOG.error("prompthooks.py Mercurial extension is not found. Please reinstall " + ApplicationNamesInfo.getInstance().getProductName());
+    }
+
     // status bar
     StatusBar statusBar = WindowManager.getInstance().getStatusBar(myProject);
     if (statusBar != null) {
index 532f50e31027c28f5e7ee091772f5d993e3bc8ef..4672cbb81e8b193e188157520f2d9e81ce969e77 100644 (file)
@@ -14,20 +14,21 @@ package org.zmlx.hg4idea.command;
 
 import com.intellij.execution.ui.ConsoleViewContentType;
 import com.intellij.openapi.application.ApplicationManager;
-import com.intellij.openapi.components.ServiceManager;
 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.apache.commons.lang.StringUtils;
 import org.jetbrains.annotations.Nullable;
-import org.zmlx.hg4idea.*;
+import org.zmlx.hg4idea.HgExecutableValidator;
+import org.zmlx.hg4idea.HgGlobalSettings;
+import org.zmlx.hg4idea.HgVcs;
+import org.zmlx.hg4idea.HgVcsMessages;
 
 import javax.swing.*;
 import java.awt.*;
 import java.io.DataInputStream;
 import java.io.DataOutputStream;
-import java.io.File;
 import java.io.IOException;
 import java.lang.reflect.InvocationTargetException;
 import java.net.Socket;
@@ -40,51 +41,48 @@ import java.util.List;
 
 public final class HgCommandService {
   
-  private File myPromptHooksExtensionFile;
-
-  static final Logger LOG = Logger.getInstance(HgCommandService.class.getName());
-
   static final List<String> DEFAULT_OPTIONS = Arrays.asList(
     "--config", "ui.merge=internal:merge"
   );
 
+  private static final Logger LOG = Logger.getInstance(HgCommandService.class.getName());
+
   private final Project myProject;
   private final HgGlobalSettings mySettings;
-  private HgExecutableValidator myValidator;
-  private HgVcs myVcs;
+  private final HgExecutableValidator myValidator;
+  private final HgVcs myVcs;
+
+  private Charset myCharset;
+  private boolean myIsSilent;
+  private List<String> myOptions = DEFAULT_OPTIONS;
 
   public HgCommandService(Project project, HgGlobalSettings settings) {
     myProject = project;
     mySettings = settings;
-    if (myPromptHooksExtensionFile == null) {
-      myPromptHooksExtensionFile = HgUtil.getTemporaryPythonFile("prompthooks");
-    }
     myVcs = HgVcs.getInstance(myProject);
-    LOG.assertTrue(myVcs != null);
     myValidator = myVcs.getExecutableValidator();
+    myCharset = Charset.defaultCharset();
+    myIsSilent = false;
   }
 
-  public static HgCommandService getInstance(Project project) {
-    return ServiceManager.getService(project, HgCommandService.class);
+  public void setCharset(Charset charset) {
+    myCharset = charset;
   }
 
-  @Nullable
-  HgCommandResult execute(VirtualFile repo, String operation, List<String> arguments) {
-    return execute(
-      repo, DEFAULT_OPTIONS, operation, arguments, Charset.defaultCharset()
-    );
+  public void setSilent(boolean isSilent) {
+    myIsSilent = isSilent;
   }
 
-  @Nullable
-  HgCommandResult execute(VirtualFile repo, List<String> hgOptions,
-    String operation, List<String> arguments) {
-    return execute(repo, hgOptions, operation, arguments, Charset.defaultCharset());
+  @Deprecated
+  public static HgCommandService getInstance(Project project) {
+    return new HgCommandService(project, HgVcs.getInstance(project).getGlobalSettings());
   }
 
   @Nullable
-  HgCommandResult execute(VirtualFile repo, List<String> hgOptions,
-    String operation, List<String> arguments, Charset charset) {
-    return execute(repo, hgOptions, operation, arguments, charset, false);
+  HgCommandResult execute(VirtualFile repo, String operation, List<String> arguments) {
+    return execute(
+      repo, DEFAULT_OPTIONS, operation, arguments, Charset.defaultCharset(), false
+    );
   }
 
   @Nullable
@@ -117,15 +115,12 @@ public final class HgCommandService {
     SocketServer warningServer = new SocketServer(warningReceiver);
     SocketServer passServer = new SocketServer(passReceiver);
     
-    if (myPromptHooksExtensionFile == null) {
-      throw new RuntimeException("Could not hook into the prompt mechanism of Mercurial");
-    }
     try {
       int promptPort = promptServer.start();
       int warningPort = warningServer.start();
       int passPort = passServer.start();
       cmdLine.add("--config");
-      cmdLine.add("extensions.hg4ideapromptextension=" + myPromptHooksExtensionFile.getAbsolutePath());
+      cmdLine.add("extensions.hg4ideapromptextension=" + myVcs.getPromptHooksExtensionFile().getAbsolutePath());
       cmdLine.add("--config");
       cmdLine.add("hg4ideaprompt.port=" + promptPort);
       cmdLine.add("--config");