git4idea: Added read/write locking functionality to git command wrapper
authorConstantine Plotnikov <Constantine.Plotnikov@jetbrains.com>
Tue, 22 Dec 2009 15:33:27 +0000 (18:33 +0300)
committerConstantine Plotnikov <Constantine.Plotnikov@jetbrains.com>
Wed, 13 Jan 2010 14:53:48 +0000 (17:53 +0300)
52 files changed:
plugins/git4idea/src/git4idea/GitBranch.java
plugins/git4idea/src/git4idea/GitContentRevision.java
plugins/git4idea/src/git4idea/GitFileRevision.java
plugins/git4idea/src/git4idea/GitRemote.java
plugins/git4idea/src/git4idea/GitRevisionNumber.java
plugins/git4idea/src/git4idea/GitTag.java
plugins/git4idea/src/git4idea/GitUtil.java
plugins/git4idea/src/git4idea/GitVcs.java
plugins/git4idea/src/git4idea/actions/GitAbstractRebaseResumeAction.java
plugins/git4idea/src/git4idea/actions/GitInit.java
plugins/git4idea/src/git4idea/actions/GitRebaseAbort.java
plugins/git4idea/src/git4idea/actions/GitRebaseActionBase.java
plugins/git4idea/src/git4idea/annotate/GitAnnotationProvider.java
plugins/git4idea/src/git4idea/changes/ChangeCollector.java
plugins/git4idea/src/git4idea/changes/GitChangeUtils.java
plugins/git4idea/src/git4idea/checkin/GitCheckinEnvironment.java
plugins/git4idea/src/git4idea/checkin/GitConvertFilesDialog.java
plugins/git4idea/src/git4idea/checkin/GitPushActiveBranchesDialog.java
plugins/git4idea/src/git4idea/checkin/GitPushDialog.java
plugins/git4idea/src/git4idea/checkin/GitPushRebaseProcess.java
plugins/git4idea/src/git4idea/checkin/GitPushUtils.java
plugins/git4idea/src/git4idea/checkout/GitCheckoutDialog.java
plugins/git4idea/src/git4idea/checkout/GitCheckoutProvider.java
plugins/git4idea/src/git4idea/checkout/GitCloneDialog.java
plugins/git4idea/src/git4idea/commands/GitCommand.java [new file with mode: 0644]
plugins/git4idea/src/git4idea/commands/GitFileUtils.java
plugins/git4idea/src/git4idea/commands/GitHandler.java
plugins/git4idea/src/git4idea/commands/GitHandlerUtil.java
plugins/git4idea/src/git4idea/commands/GitLineHandler.java
plugins/git4idea/src/git4idea/commands/GitSimpleHandler.java
plugins/git4idea/src/git4idea/config/GitConfigUtil.java
plugins/git4idea/src/git4idea/diff/GitTreeDiffProvider.java
plugins/git4idea/src/git4idea/history/GitHistoryUtils.java
plugins/git4idea/src/git4idea/merge/GitMergeDialog.java
plugins/git4idea/src/git4idea/merge/GitMergeProvider.java
plugins/git4idea/src/git4idea/merge/GitPullDialog.java
plugins/git4idea/src/git4idea/merge/MergeChangeCollector.java
plugins/git4idea/src/git4idea/rebase/GitInteractiveRebaseEditorHandler.java
plugins/git4idea/src/git4idea/rebase/GitRebaseDialog.java
plugins/git4idea/src/git4idea/rebase/GitRebaseEditorHandler.java
plugins/git4idea/src/git4idea/rebase/GitRebaseEditorService.java
plugins/git4idea/src/git4idea/rollback/GitRollbackEnvironment.java
plugins/git4idea/src/git4idea/ui/GitFetchDialog.java
plugins/git4idea/src/git4idea/ui/GitRefspecAddRefsDialog.java
plugins/git4idea/src/git4idea/ui/GitResetDialog.java
plugins/git4idea/src/git4idea/ui/GitStashDialog.java
plugins/git4idea/src/git4idea/ui/GitTagDialog.java
plugins/git4idea/src/git4idea/ui/GitUnstashDialog.java
plugins/git4idea/src/git4idea/update/GitBaseRebaseProcess.java
plugins/git4idea/src/git4idea/update/GitStashUtils.java
plugins/git4idea/src/git4idea/update/GitUpdateLocallyModifiedDialog.java
plugins/git4idea/src/git4idea/update/GitUpdateProcess.java

index e5ad45503d90a2e4865921d34a4ff8f674ed5ec0..0650bbf8d50968040c54cbb4a1eae3e3476b4464 100644 (file)
@@ -18,7 +18,7 @@ package git4idea;
 import com.intellij.openapi.project.Project;
 import com.intellij.openapi.vcs.VcsException;
 import com.intellij.openapi.vfs.VirtualFile;
-import git4idea.commands.GitHandler;
+import git4idea.commands.GitCommand;
 import git4idea.commands.GitSimpleHandler;
 import git4idea.commands.StringScanner;
 import git4idea.config.GitConfigUtil;
@@ -92,7 +92,7 @@ public class GitBranch extends GitReference {
    */
   @Nullable
   public static GitBranch current(Project project, VirtualFile root) throws VcsException {
-    GitSimpleHandler h = new GitSimpleHandler(project, root, GitHandler.BRANCH);
+    GitSimpleHandler h = new GitSimpleHandler(project, root, GitCommand.BRANCH);
     h.setNoSSH(true);
     h.setSilent(true);
     h.addParameters("--no-color");
@@ -130,7 +130,7 @@ public class GitBranch extends GitReference {
       // no need to run handler
       return;
     }
-    GitSimpleHandler handler = new GitSimpleHandler(project, root, GitHandler.BRANCH);
+    GitSimpleHandler handler = new GitSimpleHandler(project, root, GitCommand.BRANCH);
     handler.setNoSSH(true);
     handler.setSilent(true);
     handler.addParameters("--no-color");
@@ -297,7 +297,7 @@ public class GitBranch extends GitReference {
   @Nullable
   public GitRevisionNumber getMergeBase(@NotNull Project project, @NotNull VirtualFile root, @NotNull GitBranch branch)
     throws VcsException {
-    GitSimpleHandler h = new GitSimpleHandler(project, root, GitHandler.MERGE_BASE);
+    GitSimpleHandler h = new GitSimpleHandler(project, root, GitCommand.MERGE_BASE);
     h.setNoSSH(true);
     h.setSilent(true);
     h.addParameters(this.getFullName(), branch.getFullName());
index e7cbb2a0ef92e8dcb2d3655d99f57c7aa364a3ed..9533b2f22eb0f5e67aafe65ab81b96080e3a8d87 100644 (file)
@@ -24,7 +24,7 @@ import com.intellij.openapi.vcs.changes.CurrentContentRevision;
 import com.intellij.openapi.vcs.history.VcsRevisionNumber;
 import com.intellij.openapi.vfs.VirtualFile;
 import com.intellij.vcsUtil.VcsUtil;
-import git4idea.commands.GitHandler;
+import git4idea.commands.GitCommand;
 import git4idea.commands.GitSimpleHandler;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
@@ -69,7 +69,7 @@ public class GitContentRevision implements ContentRevision {
       return null;
     }
     VirtualFile root = GitUtil.getGitRoot(myFile);
-    GitSimpleHandler h = new GitSimpleHandler(myProject, root, GitHandler.SHOW);
+    GitSimpleHandler h = new GitSimpleHandler(myProject, root, GitCommand.SHOW);
     h.setCharset(myCharset);
     h.setNoSSH(true);
     h.setSilent(true);
@@ -126,7 +126,8 @@ public class GitContentRevision implements ContentRevision {
     }
   }
 
-  public static ContentRevision createRevision(final VirtualFile file, final VcsRevisionNumber revisionNumber, final Project project) throws VcsException {
+  public static ContentRevision createRevision(final VirtualFile file, final VcsRevisionNumber revisionNumber, final Project project)
+    throws VcsException {
     final FilePathImpl filePath = new FilePathImpl(file);
     if (revisionNumber != null) {
       return new GitContentRevision(filePath, (GitRevisionNumber)revisionNumber, project);
index 296e52ae396a1f5142ca1b7206534195918856d3..81911bce43f9a622411903b98d6152b143e200eb 100644 (file)
@@ -21,7 +21,7 @@ import com.intellij.openapi.vcs.VcsException;
 import com.intellij.openapi.vcs.history.VcsFileRevision;
 import com.intellij.openapi.vcs.history.VcsRevisionNumber;
 import com.intellij.openapi.vfs.VirtualFile;
-import git4idea.commands.GitHandler;
+import git4idea.commands.GitCommand;
 import git4idea.commands.GitSimpleHandler;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
@@ -94,7 +94,7 @@ public class GitFileRevision implements VcsFileRevision, Comparable<VcsFileRevis
 
   public synchronized void loadContent() throws VcsException {
     final VirtualFile root = GitUtil.getGitRoot(path);
-    GitSimpleHandler h = new GitSimpleHandler(project, root, GitHandler.SHOW);
+    GitSimpleHandler h = new GitSimpleHandler(project, root, GitCommand.SHOW);
     h.setNoSSH(true);
     h.setCharset(BIN_ENCODING);
     h.setSilent(true);
index f13bb8df0428919351a2c23a40a9102015a1fcd4..f14de347a04ccb30fd944656d1feb146f8899ae4 100644 (file)
@@ -21,7 +21,7 @@ import com.intellij.openapi.util.io.FileUtil;
 import com.intellij.openapi.vcs.VcsException;
 import com.intellij.openapi.vfs.VfsUtil;
 import com.intellij.openapi.vfs.VirtualFile;
-import git4idea.commands.GitHandler;
+import git4idea.commands.GitCommand;
 import git4idea.commands.GitSimpleHandler;
 import git4idea.commands.StringScanner;
 import git4idea.config.GitConfigUtil;
@@ -159,7 +159,7 @@ public final class GitRemote {
    * @throws VcsException in case of git error
    */
   public static List<GitRemote> list(Project project, VirtualFile root) throws VcsException {
-    GitSimpleHandler handler = new GitSimpleHandler(project, root, GitHandler.REMOTE);
+    GitSimpleHandler handler = new GitSimpleHandler(project, root, GitCommand.REMOTE);
     handler.setNoSSH(true);
     handler.setSilent(true);
     handler.addParameters("-v");
@@ -222,7 +222,7 @@ public final class GitRemote {
    */
   @Nullable
   public static GitRemote find(Project project, VirtualFile root, String name) throws VcsException {
-    GitSimpleHandler handler = new GitSimpleHandler(project, root, GitHandler.REMOTE);
+    GitSimpleHandler handler = new GitSimpleHandler(project, root, GitCommand.REMOTE);
     handler.setNoSSH(true);
     handler.setSilent(true);
     handler.ignoreErrorCode(1);
@@ -281,7 +281,7 @@ public final class GitRemote {
    * @throws VcsException if there is a problem with running git
    */
   public Info localInfo(Project project, VirtualFile root) throws VcsException {
-    GitSimpleHandler handler = new GitSimpleHandler(project, root, GitHandler.REMOTE);
+    GitSimpleHandler handler = new GitSimpleHandler(project, root, GitCommand.REMOTE);
     handler.setNoSSH(true);
     handler.setSilent(true);
     handler.addParameters("show", "-n", myName);
index 9b81ba013cc4accd27793fe235b67ab34e50e901..93d81c35d9e1dae710b6e5cea09f9c3d41bc575e 100644 (file)
@@ -19,7 +19,7 @@ import com.intellij.openapi.project.Project;
 import com.intellij.openapi.vcs.VcsException;
 import com.intellij.openapi.vcs.history.VcsRevisionNumber;
 import com.intellij.openapi.vfs.VirtualFile;
-import git4idea.commands.GitHandler;
+import git4idea.commands.GitCommand;
 import git4idea.commands.GitSimpleHandler;
 import org.jetbrains.annotations.NonNls;
 import org.jetbrains.annotations.NotNull;
@@ -233,7 +233,7 @@ public class GitRevisionNumber implements VcsRevisionNumber {
    * @throws VcsException if there is a problem with running git
    */
   public static GitRevisionNumber resolve(Project project, VirtualFile vcsRoot, @NonNls String rev) throws VcsException {
-    GitSimpleHandler h = new GitSimpleHandler(project, vcsRoot, GitHandler.REV_LIST);
+    GitSimpleHandler h = new GitSimpleHandler(project, vcsRoot, GitCommand.REV_LIST);
     h.setNoSSH(true);
     h.setSilent(true);
     h.addParameters("--timestamp", "--max-count=1", rev);
index 79557e85f887c4e12fd2959c788c619ffc8c64cb..b8803d2cd8fa2a4da19b1f3a465770a94ec0656c 100644 (file)
@@ -18,7 +18,7 @@ package git4idea;
 import com.intellij.openapi.project.Project;
 import com.intellij.openapi.vcs.VcsException;
 import com.intellij.openapi.vfs.VirtualFile;
-import git4idea.commands.GitHandler;
+import git4idea.commands.GitCommand;
 import git4idea.commands.GitSimpleHandler;
 import org.jetbrains.annotations.NonNls;
 import org.jetbrains.annotations.NotNull;
@@ -61,7 +61,7 @@ public class GitTag extends GitReference {
    * @throws VcsException if there is a problem with running git
    */
   public static void listAsStrings(final Project project, final VirtualFile root, final Collection<String> tags) throws VcsException {
-    GitSimpleHandler handler = new GitSimpleHandler(project, root, GitHandler.TAG);
+    GitSimpleHandler handler = new GitSimpleHandler(project, root, GitCommand.TAG);
     handler.setNoSSH(true);
     handler.setSilent(true);
     handler.addParameters("-l");
index 738b5eab2145c2629828b7af712b6b94d81c69a8..3e2261334d0ecbff7048e950c84ebebb0bd108a9 100644 (file)
@@ -30,7 +30,7 @@ import com.intellij.openapi.vfs.VirtualFile;
 import com.intellij.util.Consumer;
 import com.intellij.vcsUtil.VcsUtil;
 import git4idea.changes.GitChangeUtils;
-import git4idea.commands.GitHandler;
+import git4idea.commands.GitCommand;
 import git4idea.commands.GitSimpleHandler;
 import git4idea.commands.StringScanner;
 import git4idea.config.GitConfigUtil;
@@ -660,7 +660,7 @@ public class GitUtil {
     throws VcsException {
     final List<CommittedChangeList> rc = new ArrayList<CommittedChangeList>();
 
-    GitSimpleHandler h = new GitSimpleHandler(project, root, GitHandler.LOG);
+    GitSimpleHandler h = new GitSimpleHandler(project, root, GitCommand.LOG);
     h.setNoSSH(true);
     h.addParameters("--pretty=format:%x0C%n" + GitChangeUtils.COMMITTED_CHANGELIST_FORMAT, "--name-status");
     parametersSpecifier.consume(h);
index cc7e914ed408f65292f64366a6af8f1d7c78aa2d..0b42f5453877ae74a8e8574ce29f6d795ee12fc7 100644 (file)
@@ -47,7 +47,7 @@ import git4idea.changes.GitCommittedChangeListProvider;
 import git4idea.changes.GitOutgoingChangesProvider;
 import git4idea.checkin.GitCheckinEnvironment;
 import git4idea.checkin.GitCommitAndPushExecutor;
-import git4idea.commands.GitHandler;
+import git4idea.commands.GitCommand;
 import git4idea.commands.GitSimpleHandler;
 import git4idea.config.GitVcsConfigurable;
 import git4idea.config.GitVcsSettings;
@@ -69,6 +69,8 @@ import java.text.SimpleDateFormat;
 import java.util.Collections;
 import java.util.Date;
 import java.util.List;
+import java.util.concurrent.locks.ReadWriteLock;
+import java.util.concurrent.locks.ReentrantReadWriteLock;
 
 /**
  * Git VCS implementation
@@ -178,6 +180,10 @@ public class GitVcs extends AbstractVcs {
    * The queue that is used to schedule background task from actions
    */
   private final BackgroundTaskQueue myTaskQueue;
+  /**
+   * The command read/write lock
+   */
+  private final ReadWriteLock myCommandLock = new ReentrantReadWriteLock(true);
 
   private final TreeDiffProvider myTreeDiffProvider;
 
@@ -216,6 +222,13 @@ public class GitVcs extends AbstractVcs {
     myTaskQueue = new BackgroundTaskQueue(myProject, GitBundle.getString("task.queue.title"));
   }
 
+  /**
+   * @return the command lock
+   */
+  public ReadWriteLock getCommandLock() {
+    return myCommandLock;
+  }
+
   /**
    * Run task in background using the common queue (per project)
    *
@@ -575,7 +588,7 @@ public class GitVcs extends AbstractVcs {
    */
   public static String version(Project project) throws VcsException {
     final String s;
-    GitSimpleHandler h = new GitSimpleHandler(project, new File("."), GitHandler.VERSION);
+    GitSimpleHandler h = new GitSimpleHandler(project, new File("."), GitCommand.VERSION);
     h.setNoSSH(true);
     h.setSilent(true);
     s = h.run();
index 588dc50c3b07bd5db2d22d6912abb7331df58673..54f27590a3321ee602feed2a5b1f856cf9a3fe4c 100644 (file)
@@ -18,7 +18,7 @@ package git4idea.actions;
 import com.intellij.openapi.project.Project;
 import com.intellij.openapi.ui.Messages;
 import com.intellij.openapi.vfs.VirtualFile;
-import git4idea.commands.GitHandler;
+import git4idea.commands.GitCommand;
 import git4idea.commands.GitLineHandler;
 import git4idea.i18n.GitBundle;
 import git4idea.rebase.GitInteractiveRebaseEditorHandler;
@@ -61,7 +61,7 @@ public abstract class GitAbstractRebaseResumeAction extends GitRebaseActionBase
         return null;
       }
     }
-    GitLineHandler h = new GitLineHandler(project, root, GitHandler.REBASE);
+    GitLineHandler h = new GitLineHandler(project, root, GitCommand.REBASE);
     h.addParameters(getOptionName());
     return h;
   }
index 5985ea5b1afccf11a19069b96f55966bac6ad00c..27ab1fc1588b78161ca14f61df06cfd41f26d24a 100644 (file)
@@ -30,7 +30,7 @@ import com.intellij.openapi.vcs.VcsDirectoryMapping;
 import com.intellij.openapi.vfs.VirtualFile;
 import git4idea.GitUtil;
 import git4idea.GitVcs;
-import git4idea.commands.GitHandler;
+import git4idea.commands.GitCommand;
 import git4idea.commands.GitHandlerUtil;
 import git4idea.commands.GitLineHandler;
 import git4idea.i18n.GitBundle;
@@ -69,7 +69,7 @@ public class GitInit extends DumbAwareAction {
                                GitBundle.getString("init.error.title"));
       return;
     }
-    GitLineHandler h = new GitLineHandler(project, root, GitHandler.INIT);
+    GitLineHandler h = new GitLineHandler(project, root, GitCommand.INIT);
     h.setNoSSH(true);
     GitHandlerUtil.doSynchronously(h, GitBundle.getString("initializing.title"), h.printableCommandLine());
     if (!h.errors().isEmpty()) {
index 635e84dc5a0d05bb8a1f6fd9f216adb3a40b23bb..61f74918f95eed9711e26290ef4f9a219abf7f9e 100644 (file)
@@ -19,7 +19,7 @@ import com.intellij.openapi.project.Project;
 import com.intellij.openapi.ui.Messages;
 import com.intellij.openapi.vcs.VcsException;
 import com.intellij.openapi.vfs.VirtualFile;
-import git4idea.commands.GitHandler;
+import git4idea.commands.GitCommand;
 import git4idea.commands.GitHandlerUtil;
 import git4idea.commands.GitSimpleHandler;
 import git4idea.i18n.GitBundle;
@@ -69,7 +69,7 @@ public class GitRebaseAbort extends GitRepositoryAction {
       }
     }
     affectedRoots.add(root);
-    GitSimpleHandler h = new GitSimpleHandler(project, root, GitHandler.REBASE);
+    GitSimpleHandler h = new GitSimpleHandler(project, root, GitCommand.REBASE);
     h.addParameters("--abort");
     GitHandlerUtil.doSynchronously(h, getActionName(), h.printableCommandLine());
   }
index 530df73b7f15b727288451f6958e76e609da7e76..6131b761d392f6092d74d80b52f9968c9fb4c8bc 100644 (file)
@@ -49,7 +49,7 @@ public abstract class GitRebaseActionBase extends GitRepositoryAction {
     }
     final VirtualFile root = h.workingDirectoryFile();
     GitRebaseEditorService service = GitRebaseEditorService.getInstance();
-    GitInteractiveRebaseEditorHandler editor = new GitInteractiveRebaseEditorHandler(service, project, root);
+    GitInteractiveRebaseEditorHandler editor = new GitInteractiveRebaseEditorHandler(service, project, root, h);
     GitRebaseLineListener resultListener = new GitRebaseLineListener();
     h.addLineListener(resultListener);
     configureEditor(editor);
index 1c00728a75305eca21df3e7991e65b33af256873..d0a158cc2880b154270eb0f83e7b1eee4b03f07b 100644 (file)
@@ -29,7 +29,7 @@ import com.intellij.vcsUtil.VcsUtil;
 import git4idea.GitFileRevision;
 import git4idea.GitRevisionNumber;
 import git4idea.GitUtil;
-import git4idea.commands.GitHandler;
+import git4idea.commands.GitCommand;
 import git4idea.commands.GitSimpleHandler;
 import git4idea.commands.StringScanner;
 import git4idea.history.GitHistoryUtils;
@@ -139,7 +139,7 @@ public class GitAnnotationProvider implements AnnotationProvider {
                                      final VcsFileRevision revision,
                                      final List<VcsFileRevision> revisions,
                                      final VirtualFile file) throws VcsException {
-    GitSimpleHandler h = new GitSimpleHandler(myProject, GitUtil.getGitRoot(repositoryFilePath), GitHandler.ANNOTATE);
+    GitSimpleHandler h = new GitSimpleHandler(myProject, GitUtil.getGitRoot(repositoryFilePath), GitCommand.ANNOTATE);
     h.setNoSSH(true);
     h.setStdoutSuppressed(true);
     h.setCharset(file.getCharset());
index 03cfec3d1bae9793f3476cec97de62b962e7b7a1..58f637e1fc6e6f36a5b021eb9ed45f795f9f4e68 100644 (file)
@@ -28,7 +28,7 @@ import com.intellij.vcsUtil.VcsUtil;
 import git4idea.GitContentRevision;
 import git4idea.GitRevisionNumber;
 import git4idea.GitUtil;
-import git4idea.commands.GitHandler;
+import git4idea.commands.GitCommand;
 import git4idea.commands.GitSimpleHandler;
 import git4idea.commands.StringScanner;
 
@@ -130,7 +130,7 @@ class ChangeCollector {
   }
 
   private void updateIndex() throws VcsException {
-    GitSimpleHandler handler = new GitSimpleHandler(myProject, myVcsRoot, GitHandler.UPDATE_INDEX);
+    GitSimpleHandler handler = new GitSimpleHandler(myProject, myVcsRoot, GitCommand.UPDATE_INDEX);
     handler.addParameters("--refresh", "--ignore-missing");
     handler.setSilent(true);
     handler.setNoSSH(true);
@@ -220,7 +220,7 @@ class ChangeCollector {
     if (dirtyPaths.isEmpty()) {
       return;
     }
-    GitSimpleHandler handler = new GitSimpleHandler(myProject, myVcsRoot, GitHandler.DIFF);
+    GitSimpleHandler handler = new GitSimpleHandler(myProject, myVcsRoot, GitCommand.DIFF);
     handler.addParameters("--name-status", "--diff-filter=ADCMRUX", "-M", "HEAD");
     handler.setNoSSH(true);
     handler.setSilent(true);
@@ -236,7 +236,7 @@ class ChangeCollector {
       if (!GitChangeUtils.isHeadMissing(ex)) {
         throw ex;
       }
-      handler = new GitSimpleHandler(myProject, myVcsRoot, GitHandler.LS_FILES);
+      handler = new GitSimpleHandler(myProject, myVcsRoot, GitCommand.LS_FILES);
       handler.addParameters("--cached");
       handler.setNoSSH(true);
       handler.setSilent(true);
@@ -267,7 +267,7 @@ class ChangeCollector {
       return;
     }
     // prepare handler
-    GitSimpleHandler handler = new GitSimpleHandler(myProject, myVcsRoot, GitHandler.LS_FILES);
+    GitSimpleHandler handler = new GitSimpleHandler(myProject, myVcsRoot, GitCommand.LS_FILES);
     handler.addParameters("-v", "--unmerged");
     handler.setSilent(true);
     handler.setNoSSH(true);
@@ -275,7 +275,7 @@ class ChangeCollector {
     // run handler and collect changes
     parseFiles(handler.run());
     // prepare handler
-    handler = new GitSimpleHandler(myProject, myVcsRoot, GitHandler.LS_FILES);
+    handler = new GitSimpleHandler(myProject, myVcsRoot, GitCommand.LS_FILES);
     handler.addParameters("-v", "--others", "--exclude-standard");
     handler.setSilent(true);
     handler.setNoSSH(true);
index 20823c17051db4f9d0d4fd52a2e82e1e7720d2d0..58cf81abe20293055826e8e3ced0c79d24211e46 100644 (file)
@@ -28,7 +28,7 @@ import com.intellij.openapi.vfs.VirtualFile;
 import git4idea.GitContentRevision;
 import git4idea.GitRevisionNumber;
 import git4idea.GitUtil;
-import git4idea.commands.GitHandler;
+import git4idea.commands.GitCommand;
 import git4idea.commands.GitSimpleHandler;
 import git4idea.commands.StringScanner;
 import org.jetbrains.annotations.NonNls;
@@ -54,15 +54,15 @@ public class GitChangeUtils {
   /**
    * Parse changes from lines
    *
-   * @param project        the context project
-   * @param root        the git root
+   * @param project the context project
+   * @param root    the git root
    * @return a set of unmerged files
    * @throws VcsException if the input format does not matches expected format
    */
   public static List<VirtualFile> unmergedFiles(Project project, VirtualFile root) throws VcsException {
     HashSet<VirtualFile> unmerged = new HashSet<VirtualFile>();
     String rootPath = root.getPath();
-    GitSimpleHandler h = new GitSimpleHandler(project, root, GitHandler.LS_FILES);
+    GitSimpleHandler h = new GitSimpleHandler(project, root, GitCommand.LS_FILES);
     h.setNoSSH(true);
     h.setSilent(true);
     h.addParameters("--unmerged");
@@ -80,9 +80,10 @@ public class GitChangeUtils {
       file.refresh(false, false);
       unmerged.add(file);
     }
-    if(unmerged.size() == 0) {
+    if (unmerged.size() == 0) {
       return Collections.emptyList();
-    } else {
+    }
+    else {
       ArrayList<VirtualFile> rc = new ArrayList<VirtualFile>(unmerged.size());
       rc.addAll(unmerged);
       Collections.sort(rc, GitUtil.VIRTUAL_FILE_COMPARATOR);
@@ -217,7 +218,7 @@ public class GitChangeUtils {
   @SuppressWarnings({"SameParameterValue"})
   public static GitRevisionNumber loadRevision(final Project project, final VirtualFile vcsRoot, @NonNls final String revisionNumber)
     throws VcsException {
-    GitSimpleHandler handler = new GitSimpleHandler(project, vcsRoot, GitHandler.REV_LIST);
+    GitSimpleHandler handler = new GitSimpleHandler(project, vcsRoot, GitCommand.REV_LIST);
     handler.addParameters("--timestamp", "--max-count=1", revisionNumber);
     handler.endOptions();
     handler.setNoSSH(true);
@@ -255,7 +256,7 @@ public class GitChangeUtils {
    * @throws VcsException in case of problem with running git
    */
   public static CommittedChangeList getRevisionChanges(Project project, VirtualFile root, String revisionName) throws VcsException {
-    GitSimpleHandler h = new GitSimpleHandler(project, root, GitHandler.SHOW);
+    GitSimpleHandler h = new GitSimpleHandler(project, root, GitCommand.SHOW);
     h.setNoSSH(true);
     h.setSilent(true);
     h.addParameters("--name-status", "--no-abbrev", "-M", "--pretty=format:" + COMMITTED_CHANGELIST_FORMAT, "--encoding=UTF-8",
@@ -332,7 +333,7 @@ public class GitChangeUtils {
             continue;
           }
         }
-        GitSimpleHandler diffHandler = new GitSimpleHandler(project, root, GitHandler.DIFF);
+        GitSimpleHandler diffHandler = new GitSimpleHandler(project, root, GitCommand.DIFF);
         diffHandler.setNoSSH(true);
         diffHandler.setSilent(true);
         diffHandler.addParameters("--name-status", "-M", parentRevision.getRev(), thisRevision.getRev());
index f0c50b177b66d6578c8eeef72d544da3cb2998d2..9f81d7a1ffdb023e226fccd4c5143fe17e990e01 100644 (file)
@@ -268,7 +268,7 @@ public class GitCheckinEnvironment implements CheckinEnvironment {
     HashSet<FilePath> realAdded = new HashSet<FilePath>();
     HashSet<FilePath> realRemoved = new HashSet<FilePath>();
     // perform diff
-    GitSimpleHandler diff = new GitSimpleHandler(project, root, GitHandler.DIFF);
+    GitSimpleHandler diff = new GitSimpleHandler(project, root, GitCommand.DIFF);
     diff.setNoSSH(true);
     diff.setSilent(true);
     diff.setStdoutSuppressed(true);
@@ -350,7 +350,7 @@ public class GitCheckinEnvironment implements CheckinEnvironment {
     }
     // perform merge commit
     try {
-      GitSimpleHandler handler = new GitSimpleHandler(project, root, GitHandler.COMMIT);
+      GitSimpleHandler handler = new GitSimpleHandler(project, root, GitCommand.COMMIT);
       handler.setNoSSH(true);
       handler.addParameters("-F", messageFile.getAbsolutePath());
       if (author != null) {
@@ -415,7 +415,7 @@ public class GitCheckinEnvironment implements CheckinEnvironment {
     }
     if (!removed.isEmpty()) {
       try {
-        GitSimpleHandler handler = new GitSimpleHandler(project, root, GitHandler.RM);
+        GitSimpleHandler handler = new GitSimpleHandler(project, root, GitCommand.RM);
         handler.addParameters("--ignore-unmatch");
         handler.endOptions();
         handler.addRelativePaths(removed);
@@ -494,7 +494,7 @@ public class GitCheckinEnvironment implements CheckinEnvironment {
                                          Collection<FilePath> files,
                                          File message,
                                          final String nextCommitAuthor) {
-    GitSimpleHandler handler = new GitSimpleHandler(project, root, GitHandler.COMMIT);
+    GitSimpleHandler handler = new GitSimpleHandler(project, root, GitCommand.COMMIT);
     handler.setNoSSH(true);
     handler.addParameters("--only", "-F", message.getAbsolutePath());
     if (nextCommitAuthor != null) {
index 9198194033ccfc6307cd068a9d480a7a8badbe7a..085751d98494186317f5d045989da2877f15830b 100644 (file)
@@ -31,7 +31,7 @@ import com.intellij.util.ui.UIUtil;
 import com.intellij.util.ui.tree.TreeUtil;
 import git4idea.GitUtil;
 import git4idea.GitVcs;
-import git4idea.commands.GitHandler;
+import git4idea.commands.GitCommand;
 import git4idea.commands.GitSimpleHandler;
 import git4idea.commands.StringScanner;
 import git4idea.config.GitVcsSettings;
@@ -258,7 +258,7 @@ public class GitConvertFilesDialog extends DialogWrapper {
     boolean stdin = CHECK_ATTR_STDIN_SUPPORTED.isLessOrEqual(GitVcs.getInstance(project).version());
     for (final Map.Entry<VirtualFile, Set<VirtualFile>> e : files.entrySet()) {
       final VirtualFile r = e.getKey();
-      GitSimpleHandler h = new GitSimpleHandler(project, r, GitHandler.CHECK_ATTR);
+      GitSimpleHandler h = new GitSimpleHandler(project, r, GitCommand.CHECK_ATTR);
       if (stdin) {
         h.addParameters("--stdin", "-z");
       }
index 127b9206710c12a22b56ad9947ababe46e8e7d9f..eb81d505820c1245506f979e1722ef25e7669598 100644 (file)
@@ -436,14 +436,14 @@ public class GitPushActiveBranchesDialog extends DialogWrapper {
               r.remoteBranch = b.getTrackedBranchName(project, root);
               if (r.remote != null) {
                 if (fetchData && !r.remote.equals(".")) {
-                  GitLineHandler fetch = new GitLineHandler(project, root, GitHandler.FETCH);
+                  GitLineHandler fetch = new GitLineHandler(project, root, GitCommand.FETCH);
                   fetch.addParameters(r.remote, "-v");
                   Collection<VcsException> exs = GitHandlerUtil.doSynchronouslyWithExceptions(fetch);
                   exceptions.addAll(exs);
                 }
                 GitBranch tracked = b.tracked(project, root);
                 assert tracked != null : "Tracked branch cannot be null here";
-                GitSimpleHandler unmerged = new GitSimpleHandler(project, root, GitHandler.LOG);
+                GitSimpleHandler unmerged = new GitSimpleHandler(project, root, GitCommand.LOG);
                 unmerged.addParameters("--pretty=format:%H", r.branch + ".." + tracked.getFullName());
                 unmerged.setNoSSH(true);
                 unmerged.setStdoutSuppressed(true);
@@ -453,7 +453,7 @@ public class GitPushActiveBranchesDialog extends DialogWrapper {
                     r.remoteCommits++;
                   }
                 }
-                GitSimpleHandler toPush = new GitSimpleHandler(project, root, GitHandler.LOG);
+                GitSimpleHandler toPush = new GitSimpleHandler(project, root, GitCommand.LOG);
                 toPush.addParameters("--pretty=format:%H%x20%ct%x20%at%x20%s%n%P", tracked.getFullName() + ".." + r.branch);
                 toPush.setNoSSH(true);
                 toPush.setStdoutSuppressed(true);
@@ -530,7 +530,7 @@ public class GitPushActiveBranchesDialog extends DialogWrapper {
       manager.runProcessWithProgressSynchronously(new Runnable() {
         public void run() {
           for (Root r : rootsToPush) {
-            GitLineHandler h = new GitLineHandler(project, r.root, GitHandler.PUSH);
+            GitLineHandler h = new GitLineHandler(project, r.root, GitCommand.PUSH);
             String src = r.commitToPush != null ? r.commitToPush : r.branch;
             h.addParameters("-v", r.remote, src + ":" + r.remoteBranch);
             GitPushUtils.trackPushRejectedAsError(h, "Rejected push (" + r.root.getPresentableUrl() + "): ");
index 1c9bf34d186b0e3891398825a2cab00eb166c9fc..e2a55198876b19ff056384ba639972597ec6f2d4 100644 (file)
@@ -27,7 +27,7 @@ import com.intellij.util.containers.HashMap;
 import git4idea.GitBranch;
 import git4idea.GitRemote;
 import git4idea.GitTag;
-import git4idea.commands.GitHandler;
+import git4idea.commands.GitCommand;
 import git4idea.commands.GitLineHandler;
 import git4idea.config.GitConfigUtil;
 import git4idea.i18n.GitBundle;
@@ -152,7 +152,7 @@ public class GitPushDialog extends DialogWrapper {
    * @return a prepared handler for push operation
    */
   public GitLineHandler handler() {
-    GitLineHandler h = new GitLineHandler(myProject, getGitRoot(), GitHandler.PUSH);
+    GitLineHandler h = new GitLineHandler(myProject, getGitRoot(), GitCommand.PUSH);
     String policy = (String)myPushPolicy.getSelectedItem();
     if (PUSH_POLICY_ALL.equals(policy)) {
       h.addParameters("--all");
index 1837e1902d915d37426ead4d3d6ff2fca3097010..6994116b46fa3457148743737265dad145890109 100644 (file)
@@ -23,6 +23,7 @@ import com.intellij.openapi.vfs.VirtualFile;
 import git4idea.GitBranch;
 import git4idea.GitUtil;
 import git4idea.GitVcs;
+import git4idea.commands.GitCommand;
 import git4idea.commands.GitHandler;
 import git4idea.commands.GitLineHandler;
 import git4idea.commands.StringScanner;
@@ -96,10 +97,10 @@ public class GitPushRebaseProcess extends GitBaseRebaseProcess {
   protected GitLineHandler makeStartHandler(VirtualFile root) throws VcsException {
     List<String> commits = myReorderedCommits.get(root);
     boolean hasMerges = myRootsWithMerges.contains(root);
-    GitLineHandler h = new GitLineHandler(myProject, root, GitHandler.REBASE);
+    GitLineHandler h = new GitLineHandler(myProject, root, GitCommand.REBASE);
     if (commits != null || hasMerges) {
       h.addParameters("-i");
-      PushRebaseEditor pushRebaseEditor = new PushRebaseEditor(root, commits, hasMerges);
+      PushRebaseEditor pushRebaseEditor = new PushRebaseEditor(root, commits, hasMerges, h);
       myRebaseEditorNo = pushRebaseEditor.getHandlerNo();
       myRebaseEditorService.configureHandler(h, myRebaseEditorNo);
       if (hasMerges) {
@@ -131,7 +132,7 @@ public class GitPushRebaseProcess extends GitBaseRebaseProcess {
    */
   @Override
   protected void configureRebaseEditor(VirtualFile root, GitLineHandler h) {
-    GitInteractiveRebaseEditorHandler editorHandler = new GitInteractiveRebaseEditorHandler(myRebaseEditorService, myProject, root);
+    GitInteractiveRebaseEditorHandler editorHandler = new GitInteractiveRebaseEditorHandler(myRebaseEditorService, myProject, root, h);
     editorHandler.setRebaseEditorShown();
     myRebaseEditorNo = editorHandler.getHandlerNo();
     myRebaseEditorService.configureHandler(h, myRebaseEditorNo);
@@ -175,8 +176,8 @@ public class GitPushRebaseProcess extends GitBaseRebaseProcess {
      * @param commits   the reordered commits
      * @param hasMerges if true, the vcs root has merges
      */
-    public PushRebaseEditor(final VirtualFile root, List<String> commits, boolean hasMerges) {
-      super(myRebaseEditorService, myProject, root);
+    public PushRebaseEditor(final VirtualFile root, List<String> commits, boolean hasMerges, GitHandler h) {
+      super(myRebaseEditorService, myProject, root, h);
       myCommits = commits;
       myHasMerges = hasMerges;
     }
index c324bb08ffdb910a4cf77381537ebcc64cd6937b..21aeb01c7a62dabd1a13751ac8814aaf765371b8 100644 (file)
@@ -21,7 +21,7 @@ import com.intellij.openapi.util.Key;
 import com.intellij.openapi.vcs.VcsException;
 import com.intellij.openapi.vfs.VirtualFile;
 import git4idea.GitBranch;
-import git4idea.commands.GitHandler;
+import git4idea.commands.GitCommand;
 import git4idea.commands.GitLineHandler;
 import git4idea.commands.GitLineHandlerAdapter;
 import org.jetbrains.annotations.Nullable;
@@ -58,7 +58,7 @@ public class GitPushUtils {
     if (tracked == null) {
       return null;
     }
-    final GitLineHandler rc = new GitLineHandler(project, vcsRoot, GitHandler.PUSH);
+    final GitLineHandler rc = new GitLineHandler(project, vcsRoot, GitCommand.PUSH);
     rc.addParameters("-v", remote, current.getFullName() + ":" + tracked);
     trackPushRejectedAsError(rc, "Rejected push (" + vcsRoot.getPresentableUrl() + "): ");
     return rc;
index eb9cfa0071576c19afac51f4dfa4aebcb369de7b..a091baa13131825bd5588d67bb0b1a01d7695442 100644 (file)
@@ -23,7 +23,7 @@ import com.intellij.ui.DocumentAdapter;
 import git4idea.GitBranch;
 import git4idea.GitTag;
 import git4idea.GitVcs;
-import git4idea.commands.GitHandler;
+import git4idea.commands.GitCommand;
 import git4idea.commands.GitLineHandler;
 import git4idea.commands.GitSimpleHandler;
 import git4idea.config.GitVcsSettings;
@@ -276,7 +276,7 @@ public class GitCheckoutDialog extends DialogWrapper {
     if (branch.length() == 0) {
       return null;
     }
-    GitSimpleHandler h = new GitSimpleHandler(myProject, gitRoot(), GitHandler.BRANCH);
+    GitSimpleHandler h = new GitSimpleHandler(myProject, gitRoot(), GitCommand.BRANCH);
     h.setNoSSH(true);
     if (myTrackBranchCheckBox.isSelected()) {
       h.addParameters("--track");
@@ -295,7 +295,7 @@ public class GitCheckoutDialog extends DialogWrapper {
    * @return a handler that checkouts branch
    */
   public GitLineHandler checkoutHandler() {
-    GitLineHandler h = new GitLineHandler(myProject, gitRoot(), GitHandler.CHECKOUT);
+    GitLineHandler h = new GitLineHandler(myProject, gitRoot(), GitCommand.CHECKOUT);
     h.setNoSSH(true);
     final String newBranch = myNewBranchName.getText();
     if (newBranch.length() == 0) {
index 13a5ca0e83e4ad1d3de80f42eca4fd0623ca0f0a..a5ee194b0ddf353cba1dded0fc936b2e5a2956e1 100644 (file)
@@ -22,7 +22,7 @@ import com.intellij.openapi.vfs.LocalFileSystem;
 import com.intellij.openapi.vfs.VirtualFile;
 import git4idea.GitVcs;
 import git4idea.actions.BasicAction;
-import git4idea.commands.GitHandler;
+import git4idea.commands.GitCommand;
 import git4idea.commands.GitHandlerUtil;
 import git4idea.commands.GitLineHandler;
 import git4idea.config.GitVersion;
@@ -98,7 +98,7 @@ public class GitCheckoutProvider implements CheckoutProvider {
    * @return a handler for clone operation
    */
   public static GitLineHandler clone(Project project, final String url, final File directory, final String name, final String originName) {
-    GitLineHandler handler = new GitLineHandler(project, directory, GitHandler.CLONE);
+    GitLineHandler handler = new GitLineHandler(project, directory, GitCommand.CLONE);
     if (VERBOSE_CLONE_SUPPORTED.isLessOrEqual(GitVcs.getInstance(project).version())) {
       handler.addParameters("-v");
     }
index d91653c30a2293b7120148416bd3937ad89a112d..f18126c7358c4a8e0b3d9628522aca2f46035bd8 100644 (file)
@@ -19,6 +19,7 @@ import com.intellij.openapi.fileChooser.FileChooserDescriptor;
 import com.intellij.openapi.project.Project;
 import com.intellij.openapi.ui.*;
 import com.intellij.openapi.vfs.VirtualFile;
+import git4idea.commands.GitCommand;
 import git4idea.commands.GitHandlerUtil;
 import git4idea.commands.GitSimpleHandler;
 import git4idea.i18n.GitBundle;
@@ -209,8 +210,7 @@ public class GitCloneDialog extends DialogWrapper {
       public void actionPerformed(final ActionEvent e) {
         myTestURL = myRepositoryURL.getText();
         String output = GitHandlerUtil
-          .doSynchronously(GitSimpleHandler.checkRepository(myProject, myTestURL), GitBundle.message("clone.testing", myTestURL),
-                           "connection test");
+          .doSynchronously(checkRepository(myProject, myTestURL), GitBundle.message("clone.testing", myTestURL), "connection test");
         if (output != null) {
           Messages.showInfoMessage(myTestButton, GitBundle.message("clone.test.success.message", myTestURL),
                                    GitBundle.getString("clone.test.success"));
@@ -390,4 +390,20 @@ public class GitCloneDialog extends DialogWrapper {
   protected String getHelpId() {
     return "reference.VersionControl.Git.CloneRepository";
   }
+
+  /**
+   * Prepare check repository handler. To do this ls-remote command is executed and attempts to match
+   * master tag. This will likely return only single entry or none, if there is no master
+   * branch. Stdout output is ignored. Stderr is used to construct exception message and shown
+   * in error message box if exit is negative.
+   *
+   * @param project the project
+   * @param url     the url to check
+   * @return a simple handler that does the task
+   */
+  private static GitSimpleHandler checkRepository(Project project, final String url) {
+    GitSimpleHandler handler = new GitSimpleHandler(project, new File("."), GitCommand.LS_REMOTE);
+    handler.addParameters(url, "master");
+    return handler;
+  }
 }
diff --git a/plugins/git4idea/src/git4idea/commands/GitCommand.java b/plugins/git4idea/src/git4idea/commands/GitCommand.java
new file mode 100644 (file)
index 0000000..35fe8b0
--- /dev/null
@@ -0,0 +1,267 @@
+/*
+ * Copyright 2000-2009 JetBrains s.r.o.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package git4idea.commands;
+
+import org.jetbrains.annotations.NonNls;
+import org.jetbrains.annotations.NotNull;
+
+/**
+ * The descriptor of git command. It contains policy information about myLocking and GUI thread policy.
+ */
+public class GitCommand {
+
+  /**
+   * The constant for git command
+   */
+  public static final GitCommand STASH = write("stash");
+  /**
+   * The constant for git command
+   */
+  public static final GitCommand CLONE = write("clone");
+  /**
+   * The constant for git command
+   */
+  public static final GitCommand RM = write("rm");
+  /**
+   * The constant for git command
+   */
+  public static final GitCommand ADD = write("add");
+  /**
+   * The constant for git command
+   */
+  public static final GitCommand ANNOTATE = read("annotate");
+  /**
+   * The constant for git command
+   */
+  public static final GitCommand COMMIT = write("commit");
+  /**
+   * The constant for git command
+   */
+  public static final GitCommand CONFIG = meta("config");
+  /**
+   * The constant for git command
+   */
+  public static final GitCommand FETCH = write("fetch");
+  /**
+   * The constant for git command
+   */
+  public static final GitCommand SHOW = write("show");
+  /**
+   * The constant for git command
+   */
+  public static final GitCommand LOG = meta("log");
+  /**
+   * The constant for git command
+   */
+  public static final GitCommand INIT = write("init");
+  /**
+   * The constant for git command
+   */
+  public static final GitCommand BRANCH = meta("branch");
+  /**
+   * The constant for git command
+   */
+  public static final GitCommand MERGE = write("merge");
+  /**
+   * The constant for git command
+   */
+  public static final GitCommand MERGE_BASE = meta("merge-base");
+  /**
+   * The constant for git command
+   */
+  public static final GitCommand PUSH = write("push");
+  /**
+   * The constant for git command
+   */
+  public static final GitCommand LS_REMOTE = meta("ls-remote");
+  /**
+   * The constant for git command
+   */
+  public static final GitCommand REMOTE = meta("remote");
+  /**
+   * The constant for git command
+   */
+  public static final GitCommand REV_LIST = meta("rev-list");
+  /**
+   * The constant for git command
+   */
+  public static final GitCommand CHECKOUT = write("checkout");
+  /**
+   * The constant for git command
+   */
+  public static final GitCommand TAG = meta("tag");
+  /**
+   * The constant for git command
+   */
+  public static final GitCommand PULL = write("pull");
+  /**
+   * The constant for git command
+   */
+  public static final GitCommand LS_FILES = read("ls-files");
+  /**
+   * The constant for git command
+   */
+  public static final GitCommand DIFF = read("diff");
+  /**
+   * The constant for git command
+   */
+  public static final GitCommand VERSION = meta("version");
+  /**
+   * The constant for git command
+   */
+  public static final GitCommand REBASE = writeSuspendable("rebase");
+  /**
+   * The constant for git command
+   */
+  public static final GitCommand RESET = write("reset");
+  /**
+   * The constant for git command
+   */
+  public static final GitCommand UPDATE_INDEX = write("update-index");
+  /**
+   * Check attributes command
+   */
+  public static final GitCommand CHECK_ATTR = read("check-attr");
+  /**
+   * Name of environment variable that specifies editor for the git
+   */
+  public static final String GIT_EDITOR_ENV = "GIT_EDITOR";
+
+  /**
+   * The command myName
+   */
+  @NotNull @NonNls private final String myName;
+  /**
+   * Locking policy for the command
+   */
+  @NotNull private final LockingPolicy myLocking;
+  /**
+   * Thread policy for the command
+   */
+  @NotNull private final ThreadPolicy myThreading;
+
+  /**
+   * The constructor
+   *
+   * @param name      the command myName
+   * @param locking   the myLocking policy
+   * @param threading the thread policy
+   */
+  private GitCommand(@NonNls @NotNull String name, @NotNull LockingPolicy locking, @NotNull ThreadPolicy threading) {
+    this.myLocking = locking;
+    this.myName = name;
+    this.myThreading = threading;
+  }
+
+  /**
+   * Create command descriptor that performs metadata operations only
+   *
+   * @param name the command myName
+   * @return the created command object
+   */
+  private static GitCommand meta(String name) {
+    return new GitCommand(name, LockingPolicy.META, ThreadPolicy.ANY);
+  }
+
+  /**
+   * Create command descriptor that performs reads from index
+   *
+   * @param name the command myName
+   * @return the create command objects
+   */
+  private static GitCommand read(String name) {
+    return new GitCommand(name, LockingPolicy.READ, ThreadPolicy.BACKGROUND_ONLY);
+  }
+
+  /**
+   * Create command descriptor that performs write operations
+   *
+   * @param name the command myName
+   * @return the created command object
+   */
+  private static GitCommand write(String name) {
+    return new GitCommand(name, LockingPolicy.WRITE, ThreadPolicy.BACKGROUND_ONLY);
+  }
+
+  /**
+   * Create command descriptor that performs write operations
+   *
+   * @param name the command myName
+   * @return the created command object
+   */
+  private static GitCommand writeSuspendable(String name) {
+    return new GitCommand(name, LockingPolicy.WRITE_SUSPENDABLE, ThreadPolicy.BACKGROUND_ONLY);
+  }
+
+  /**
+   * @return the command name
+   */
+  @NotNull
+  public String name() {
+    return myName;
+  }
+
+  /**
+   * @return the locking policy for the command
+   */
+  @NotNull
+  public LockingPolicy lockingPolicy() {
+    return myLocking;
+  }
+
+  /**
+   * @return the locking policy for the command
+   */
+  @NotNull
+  public ThreadPolicy threadingPolicy() {
+    return myThreading;
+  }
+
+  /**
+   * The myLocking policy for the command
+   */
+  enum LockingPolicy {
+    /**
+     * Read lock should be acquired for the command
+     */
+    READ,
+    /**
+     * Write lock should be acquired for the command
+     */
+    WRITE,
+    /**
+     * Write lock should be acquired for the command, and it could be acquired in several intervals
+     */
+    WRITE_SUSPENDABLE,
+    /**
+     * Metadata read/write command
+     */
+    META, }
+
+  /**
+   * Thread policy for command
+   */
+  enum ThreadPolicy {
+    /**
+     * Any thread could be used
+     */
+    ANY,
+    /**
+     * Only background thread could be used
+     */
+    BACKGROUND_ONLY
+  }
+}
index 5c0d8015af84761087e14e75ed9fbc3b632e6a9f..08f8ada6330df99de248582fe4872bc0d91c5fd0 100644 (file)
@@ -45,7 +45,7 @@ public class GitFileUtils {
    * @throws VcsException in case of git problem
    */
   public static String delete(Project project, VirtualFile root, List<FilePath> files) throws VcsException {
-    GitSimpleHandler handler = new GitSimpleHandler(project, root, GitHandler.RM);
+    GitSimpleHandler handler = new GitSimpleHandler(project, root, GitCommand.RM);
     handler.endOptions();
     handler.addRelativePaths(files);
     handler.setNoSSH(true);
@@ -62,7 +62,7 @@ public class GitFileUtils {
    * @throws VcsException in case of git problem
    */
   public static String deleteFiles(Project project, VirtualFile root, List<VirtualFile> files) throws VcsException {
-    GitSimpleHandler handler = new GitSimpleHandler(project, root, GitHandler.RM);
+    GitSimpleHandler handler = new GitSimpleHandler(project, root, GitCommand.RM);
     handler.endOptions();
     handler.addRelativeFiles(files);
     handler.setNoSSH(true);
@@ -92,7 +92,7 @@ public class GitFileUtils {
    * @throws VcsException in case of git problem
    */
   public static String addFiles(Project project, VirtualFile root, Collection<VirtualFile> files) throws VcsException {
-    GitSimpleHandler handler = new GitSimpleHandler(project, root, GitHandler.ADD);
+    GitSimpleHandler handler = new GitSimpleHandler(project, root, GitCommand.ADD);
     handler.endOptions();
     handler.addRelativeFiles(files);
     handler.setNoSSH(true);
@@ -122,7 +122,7 @@ public class GitFileUtils {
    * @throws VcsException in case of git problem
    */
   public static String addPaths(Project project, VirtualFile root, Collection<FilePath> files) throws VcsException {
-    GitSimpleHandler handler = new GitSimpleHandler(project, root, GitHandler.ADD);
+    GitSimpleHandler handler = new GitSimpleHandler(project, root, GitCommand.ADD);
     handler.endOptions();
     handler.addRelativePaths(files);
     handler.setNoSSH(true);
index 4779dcee1ca70caea0f9da92a472e2b8fde360dc..78665ea764c84b53df81a941f3e046e71cfdbe6a 100644 (file)
@@ -83,6 +83,10 @@ public abstract class GitHandler {
    * the context project (might be a default project)
    */
   private final Project myProject;
+  /**
+   * The descriptor for the command to be executed
+   */
+  protected final GitCommand myCommand;
   /**
    * the working directory
    */
@@ -124,120 +128,7 @@ public abstract class GitHandler {
    * if true, the command execution is not logged in version control view
    */
   @SuppressWarnings({"FieldAccessedSynchronizedAndUnsynchronized"}) private boolean mySilent;
-  /**
-   * The constant for git command {@value}
-   */
-  @NonNls public static final String CLONE = "clone";
-  /**
-   * The constant for git command {@value}
-   */
-  @NonNls public static final String RM = "rm";
-  /**
-   * The constant for git command {@value}
-   */
-  @NonNls public static final String ADD = "add";
-  /**
-   * The constant for git command {@value}
-   */
-  @NonNls public static final String ANNOTATE = "annotate";
-  /**
-   * The constant for git command {@value}
-   */
-  @NonNls public static final String COMMIT = "commit";
-  /**
-   * The constant for git command {@value}
-   */
-  @NonNls public static final String CONFIG = "config";
-  /**
-   * The constant for git command {@value}
-   */
-  @NonNls public static final String FETCH = "fetch";
-  /**
-   * The constant for git command {@value}
-   */
-  @NonNls public static final String SHOW = "show";
-  /**
-   * The constant for git command {@value}
-   */
-  @NonNls public static final String LOG = "log";
-  /**
-   * The constant for git command {@value}
-   */
-  @NonNls public static final String INIT = "init";
-  /**
-   * The constant for git command {@value}
-   */
-  @NonNls public static final String BRANCH = "branch";
-  /**
-   * The constant for git command {@value}
-   */
-  @NonNls public static final String MERGE = "merge";
-  /**
-   * The constant for git command {@value}
-   */
-  @NonNls public static final String MERGE_BASE = "merge-base";
-  /**
-   * The constant for git command {@value}
-   */
-  @NonNls public static final String PUSH = "push";
-  /**
-   * The constant for git command {@value}
-   */
-  @NonNls public static final String LS_REMOTE = "ls-remote";
-  /**
-   * The constant for git command {@value}
-   */
-  @NonNls public static final String REMOTE = "remote";
-  /**
-   * The constant for git command {@value}
-   */
-  @NonNls public static final String REV_LIST = "rev-list";
-  /**
-   * The constant for git command {@value}
-   */
-  @NonNls public static final String CHECKOUT = "checkout";
-  /**
-   * The constant for git command {@value}
-   */
-  @NonNls public static final String TAG = "tag";
-  /**
-   * The constant for git command {@value}
-   */
-  @NonNls public static final String PULL = "pull";
-  /**
-   * The constant for git command {@value}
-   */
-  @NonNls public static final String LS_FILES = "ls-files";
-  /**
-   * The constant for git command {@value}
-   */
-  @NonNls public static final String DIFF = "diff";
-  /**
-   * The constant for git command {@value}
-   */
-  @NonNls public static final String VERSION = "version";
-  /**
-   * The constant for git command {@value}
-   */
-  @NonNls public static final String STASH = "stash";
-  /**
-   * The constant for git command {@value}
-   */
-  @NonNls public static final String REBASE = "rebase";
-  /**
-   * The constant for git command {@value}
-   */
-  @NonNls public static final String RESET = "reset";
 
-  @NonNls public static final String UPDATE_INDEX = "update-index";
-  /**
-   * Check attributes command
-   */
-  @NonNls public static final String CHECK_ATTR = "check-attr";
-  /**
-   * Name of environment variable that specifies editor for the git
-   */
-  @NonNls public static final String GIT_EDITOR_ENV = "GIT_EDITOR";
   /**
    * The vcs object
    */
@@ -250,6 +141,14 @@ public abstract class GitHandler {
    * The settings object
    */
   private GitVcsSettings mySettings;
+  /**
+   * Suspend action used by {@link #suspendWriteLock()}
+   */
+  private Runnable mySuspendAction;
+  /**
+   * Resume action used by {@link #resumeWriteLock()}
+   */
+  private Runnable myResumeAction;
 
 
   /**
@@ -259,8 +158,9 @@ public abstract class GitHandler {
    * @param directory a process directory
    * @param command   a command to execute (if empty string, the parameter is ignored)
    */
-  protected GitHandler(@NotNull Project project, @NotNull File directory, @NotNull String command) {
+  protected GitHandler(@NotNull Project project, @NotNull File directory, @NotNull GitCommand command) {
     myProject = project;
+    myCommand = command;
     mySettings = GitVcsSettings.getInstanceChecked(project);
     myEnv = new HashMap<String, String>(System.getenv());
     if (!myEnv.containsKey("HOME")) {
@@ -277,8 +177,8 @@ public abstract class GitHandler {
     myCommandLine = new GeneralCommandLine();
     myCommandLine.setExePath(mySettings.GIT_EXECUTABLE);
     myCommandLine.setWorkingDirectory(myWorkingDirectory);
-    if (command.length() > 0) {
-      myCommandLine.addParameter(command);
+    if (command.name().length() > 0) {
+      myCommandLine.addParameter(command.name());
     }
   }
 
@@ -289,7 +189,7 @@ public abstract class GitHandler {
    * @param vcsRoot a process directory
    * @param command a command to execute
    */
-  protected GitHandler(final Project project, final VirtualFile vcsRoot, final String command) {
+  protected GitHandler(final Project project, final VirtualFile vcsRoot, final GitCommand command) {
     this(project, VfsUtil.virtualToIoFile(vcsRoot), command);
   }
 
@@ -725,4 +625,31 @@ public abstract class GitHandler {
   public void setInputProcessor(Processor<OutputStream> inputProcessor) {
     myInputProcessor = inputProcessor;
   }
+
+  /**
+   * Set suspend/resume actions
+   *
+   * @param suspend the suspend action
+   * @param resume  the resume action
+   */
+  synchronized void setSuspendResume(Runnable suspend, Runnable resume) {
+    mySuspendAction = suspend;
+    myResumeAction = resume;
+  }
+
+  /**
+   * Suspend write lock held by the handler
+   */
+  public synchronized void suspendWriteLock() {
+    assert mySuspendAction != null;
+    mySuspendAction.run();
+  }
+
+  /**
+   * Resume write lock held by the handler
+   */
+  public synchronized void resumeWriteLock() {
+    assert mySuspendAction != null;
+    myResumeAction.run();
+  }
 }
index 137842fffb03e00fde5197d3ac8bbe686158b4ec..dd1cb060b3f7ffeaad814bd5fd01a7be1beda709 100644 (file)
@@ -15,6 +15,8 @@
  */
 package git4idea.commands;
 
+import com.intellij.openapi.application.ApplicationManager;
+import com.intellij.openapi.diagnostic.Logger;
 import com.intellij.openapi.progress.ProgressIndicator;
 import com.intellij.openapi.progress.ProgressManager;
 import com.intellij.openapi.progress.Task;
@@ -28,11 +30,17 @@ import org.jetbrains.annotations.Nullable;
 
 import java.awt.*;
 import java.util.Collection;
+import java.util.concurrent.LinkedBlockingQueue;
 
 /**
  * Handler utilities that allow running handlers with progress indicators
  */
 public class GitHandlerUtil {
+  /**
+   * The logger instance
+   */
+  private final static Logger LOG = Logger.getInstance(GitHandlerUtil.class.getName());
+
   /**
    * a private constructor for utility class
    */
@@ -150,15 +158,130 @@ public class GitHandlerUtil {
    * @param setIndeterminateFlag if true handler is configured as indeterminate
    */
   private static void runInCurrentThread(final GitHandler handler, final ProgressIndicator indicator, final boolean setIndeterminateFlag) {
-    handler.start();
-    if (indicator != null) {
-      indicator.setText(GitBundle.message("git.running", handler.printableCommandLine()));
-      if (setIndeterminateFlag) {
-        indicator.setIndeterminate(true);
+    runInCurrentThread(handler, new Runnable() {
+      public void run() {
+        if (indicator != null) {
+          indicator.setText(GitBundle.message("git.running", handler.printableCommandLine()));
+          if (setIndeterminateFlag) {
+            indicator.setIndeterminate(true);
+          }
+        }
       }
+    });
+  }
+
+  /**
+   * Run handler in the current thread
+   *
+   * @param handler         a handler to run
+   * @param postStartAction an action that is executed
+   */
+  static void runInCurrentThread(final GitHandler handler, @Nullable final Runnable postStartAction) {
+    boolean suspendable = false;
+    switch (handler.myCommand.lockingPolicy()) {
+      case META:
+        // do nothing no locks are taken for metadata
+        break;
+      case READ:
+        handler.myVcs.getCommandLock().readLock().lock();
+        break;
+      case WRITE_SUSPENDABLE:
+        suspendable = true;
+      case WRITE:
+        handler.myVcs.getCommandLock().writeLock().lock();
+        break;
     }
-    if (handler.isStarted()) {
-      handler.waitFor();
+    try {
+      if (suspendable) {
+        final Object EXIT = new Object();
+        final Object SUSPEND = new Object();
+        final Object RESUME = new Object();
+        final LinkedBlockingQueue<Object> queue = new LinkedBlockingQueue<Object>();
+        boolean suspended = false;
+        Runnable suspend = new Runnable() {
+          public void run() {
+            queue.add(SUSPEND);
+          }
+        };
+        Runnable resume = new Runnable() {
+          public void run() {
+            queue.add(RESUME);
+          }
+        };
+        handler.setSuspendResume(suspend, resume);
+        handler.start();
+        if (handler.isStarted()) {
+          if (postStartAction != null) {
+            postStartAction.run();
+          }
+          ApplicationManager.getApplication().executeOnPooledThread(new Runnable() {
+            public void run() {
+              handler.waitFor();
+              queue.add(EXIT);
+            }
+          });
+          while (true) {
+            Object action;
+            while (true) {
+              try {
+                action = queue.take();
+                break;
+              }
+              catch (InterruptedException e) {
+                if (LOG.isDebugEnabled()) {
+                  LOG.debug("queue.take() is interrupted", e);
+                }
+              }
+            }
+            if (action == EXIT) {
+              if (suspended) {
+                LOG.error("Exiting while RW lock is suspended (reacquiring W-lock command)");
+                handler.myVcs.getCommandLock().writeLock().lock();
+              }
+              break;
+            }
+            else if (action == SUSPEND) {
+              if (suspended) {
+                LOG.error("Suspending suspended W-lock (ignoring command)");
+              }
+              else {
+                handler.myVcs.getCommandLock().writeLock().unlock();
+              }
+            }
+            else if (action == RESUME) {
+              if (!suspended) {
+                LOG.error("Resuming not suspended W-lock (ignoring command)");
+              }
+              else {
+                handler.myVcs.getCommandLock().writeLock().lock();
+              }
+            }
+          }
+        }
+      }
+      else {
+        handler.start();
+        if (handler.isStarted()) {
+          if (postStartAction != null) {
+            postStartAction.run();
+          }
+          handler.waitFor();
+        }
+      }
+    }
+    finally {
+      switch (handler.myCommand.lockingPolicy()) {
+        case META:
+          // do nothing no locks are taken for metadata
+          break;
+        case READ:
+          handler.myVcs.getCommandLock().readLock().unlock();
+          break;
+        case WRITE_SUSPENDABLE:
+        case WRITE:
+          handler.myVcs.getCommandLock().writeLock().unlock();
+          break;
+      }
     }
   }
 
index a3948a2ab3dbdb9c4694e8486a8e84ee694b7b8a..f6b11f2be466a1bba0673fad6274a2e716674ea2 100644 (file)
@@ -52,7 +52,7 @@ public class GitLineHandler extends GitHandler {
    * @param command   a command to execute
    */
   @SuppressWarnings({"WeakerAccess"})
-  public GitLineHandler(@NotNull Project project, @NotNull File directory, @NotNull String command) {
+  public GitLineHandler(@NotNull Project project, @NotNull File directory, @NotNull GitCommand command) {
     super(project, directory, command);
   }
 
@@ -63,7 +63,7 @@ public class GitLineHandler extends GitHandler {
    * @param vcsRoot a process directory
    * @param command a command to execute
    */
-  public GitLineHandler(@NotNull final Project project, @NotNull final VirtualFile vcsRoot, @NotNull final String command) {
+  public GitLineHandler(@NotNull final Project project, @NotNull final VirtualFile vcsRoot, @NotNull final GitCommand command) {
     super(project, vcsRoot, command);
   }
 
index 3ca45b4320c2d893b3222386f12f16d94c4c561d..3cbf8b19cd49f4761d5e4eff230fec9dd2c64b57 100644 (file)
@@ -58,7 +58,7 @@ public class GitSimpleHandler extends GitHandler {
    * @param command   a command to execute
    */
   @SuppressWarnings({"WeakerAccess"})
-  public GitSimpleHandler(@NotNull Project project, @NotNull File directory, @NotNull String command) {
+  public GitSimpleHandler(@NotNull Project project, @NotNull File directory, @NotNull GitCommand command) {
     super(project, directory, command);
   }
 
@@ -70,7 +70,7 @@ public class GitSimpleHandler extends GitHandler {
    * @param command   a command to execute
    */
   @SuppressWarnings({"WeakerAccess"})
-  public GitSimpleHandler(@NotNull final Project project, @NotNull final VirtualFile directory, @NotNull final String command) {
+  public GitSimpleHandler(@NotNull final Project project, @NotNull final VirtualFile directory, @NotNull final GitCommand command) {
     super(project, directory, command);
   }
 
@@ -211,30 +211,10 @@ public class GitSimpleHandler extends GitHandler {
         ex[0] = new VcsException("Process failed to start: " + exception.toString(), exception);
       }
     });
-    start();
-    if (isStarted()) {
-      waitFor();
-    }
+    GitHandlerUtil.runInCurrentThread(this, null);
     if (ex[0] != null) {
       throw ex[0];
     }
     return result[0];
   }
-
-  /**
-   * Prepare check repository handler. To do this ls-remote command is executed and attempts to match
-   * master tag. This will likely return only single entry or none, if there is no master
-   * branch. Stdout output is ignored. Stderr is used to construct exception message and shown
-   * in error message box if exit is negative.
-   *
-   * @param project the project
-   * @param url     the url to check
-   * @return a simple handler that does the task
-   */
-  public static GitSimpleHandler checkRepository(Project project, final String url) {
-    GitSimpleHandler handler = new GitSimpleHandler(project, new File("."), LS_REMOTE);
-    handler.addParameters(url, "master");
-    return handler;
-  }
-
 }
index 111729ff8a235e01d59ed41832cdae0da7720679..3dbe7cf81a9910d1e421c6f737e7711286ea0460 100644 (file)
@@ -20,7 +20,7 @@ import com.intellij.openapi.util.Pair;
 import com.intellij.openapi.vcs.VcsException;
 import com.intellij.openapi.vfs.VirtualFile;
 import git4idea.GitUtil;
-import git4idea.commands.GitHandler;
+import git4idea.commands.GitCommand;
 import git4idea.commands.GitSimpleHandler;
 import org.jetbrains.annotations.NonNls;
 import org.jetbrains.annotations.Nullable;
@@ -50,7 +50,7 @@ public class GitConfigUtil {
    * @throws VcsException if there is a problem with running git
    */
   public static void getValues(Project project, VirtualFile root, String keyMask, Map<String, String> result) throws VcsException {
-    GitSimpleHandler h = new GitSimpleHandler(project, root, GitHandler.CONFIG);
+    GitSimpleHandler h = new GitSimpleHandler(project, root, GitCommand.CONFIG);
     h.setNoSSH(true);
     h.setSilent(true);
     h.addParameters("--null", "--get-regexp", keyMask);
@@ -80,7 +80,7 @@ public class GitConfigUtil {
    */
   public static List<Pair<String, String>> getAllValues(Project project, VirtualFile root, @NonNls String key) throws VcsException {
     List<Pair<String, String>> result = new ArrayList<Pair<String, String>>();
-    GitSimpleHandler h = new GitSimpleHandler(project, root, GitHandler.CONFIG);
+    GitSimpleHandler h = new GitSimpleHandler(project, root, GitCommand.CONFIG);
     h.setNoSSH(true);
     h.setSilent(true);
     h.addParameters("--null", "--get-all", key);
@@ -107,7 +107,7 @@ public class GitConfigUtil {
    */
   @Nullable
   public static String getValue(Project project, VirtualFile root, @NonNls String key) throws VcsException {
-    GitSimpleHandler h = new GitSimpleHandler(project, root, GitHandler.CONFIG);
+    GitSimpleHandler h = new GitSimpleHandler(project, root, GitCommand.CONFIG);
     h.setNoSSH(true);
     h.setSilent(true);
     h.ignoreErrorCode(1);
@@ -216,7 +216,7 @@ public class GitConfigUtil {
    * @throws VcsException if there is a problem with running git
    */
   public static void unsetValue(Project project, VirtualFile root, String key) throws VcsException {
-    GitSimpleHandler h = new GitSimpleHandler(project, root, GitHandler.CONFIG);
+    GitSimpleHandler h = new GitSimpleHandler(project, root, GitCommand.CONFIG);
     h.setNoSSH(true);
     h.setSilent(true);
     h.ignoreErrorCode(1);
@@ -234,7 +234,7 @@ public class GitConfigUtil {
    * @throws VcsException if there is a problem with running git
    */
   public static void setValue(Project project, VirtualFile root, String key, String value) throws VcsException {
-    GitSimpleHandler h = new GitSimpleHandler(project, root, GitHandler.CONFIG);
+    GitSimpleHandler h = new GitSimpleHandler(project, root, GitCommand.CONFIG);
     h.setNoSSH(true);
     h.setSilent(true);
     h.ignoreErrorCode(1);
index 5af09b846fcdd8e98bc71318efc6d9a73a506e12..b126f247f2b2997b3620d343ca8157181c7fb116 100644 (file)
@@ -23,7 +23,7 @@ import com.intellij.openapi.vcs.VcsException;
 import com.intellij.openapi.vfs.VirtualFile;
 import git4idea.GitBranchesSearcher;
 import git4idea.changes.GitChangeUtils;
-import git4idea.commands.GitHandler;
+import git4idea.commands.GitCommand;
 import git4idea.commands.GitSimpleHandler;
 import git4idea.commands.StringScanner;
 
@@ -45,7 +45,7 @@ public class GitTreeDiffProvider implements TreeDiffProvider {
       final GitBranchesSearcher searcher = new GitBranchesSearcher(myProject, vcsRoot, true);
       if (searcher.getLocal() == null || searcher.getRemote() == null) return Collections.emptyList();
 
-      GitSimpleHandler handler = new GitSimpleHandler(myProject, vcsRoot, GitHandler.DIFF);
+      GitSimpleHandler handler = new GitSimpleHandler(myProject, vcsRoot, GitCommand.DIFF);
       handler.addParameters("--name-status", "--diff-filter=ADCMRUX", "-M", "HEAD..." + searcher.getRemote().getFullName());
       handler.setNoSSH(true);
       handler.setSilent(true);
index 42491fdee436c4e53873c29ed5f7823923aa6058..ab229b64f4596863e460c624f04147d70a362c39 100644 (file)
@@ -28,7 +28,7 @@ import com.intellij.openapi.vfs.VirtualFile;
 import com.intellij.util.text.StringTokenizer;
 import com.intellij.vcsUtil.VcsUtil;
 import git4idea.*;
-import git4idea.commands.GitHandler;
+import git4idea.commands.GitCommand;
 import git4idea.commands.GitSimpleHandler;
 import org.jetbrains.annotations.Nullable;
 
@@ -62,7 +62,7 @@ public class GitHistoryUtils {
   @Nullable
   public static VcsRevisionNumber getCurrentRevision(final Project project, FilePath filePath) throws VcsException {
     filePath = getLastCommitName(project, filePath);
-    GitSimpleHandler h = new GitSimpleHandler(project, GitUtil.getGitRoot(filePath), GitHandler.LOG);
+    GitSimpleHandler h = new GitSimpleHandler(project, GitUtil.getGitRoot(filePath), GitCommand.LOG);
     h.setNoSSH(true);
     h.setSilent(true);
     h.addParameters("-n1", "--pretty=format:%H%n%ct%n");
@@ -95,7 +95,7 @@ public class GitHistoryUtils {
       return new ItemLatestState(getCurrentRevision(project, filePath), true, false);
     }
     filePath = getLastCommitName(project, filePath);
-    GitSimpleHandler h = new GitSimpleHandler(project, root, GitHandler.LOG);
+    GitSimpleHandler h = new GitSimpleHandler(project, root, GitCommand.LOG);
     h.setNoSSH(true);
     h.setSilent(true);
     h.addParameters("-n1", "--pretty=format:%H%n%ct", "--name-status", t.getFullName());
@@ -128,7 +128,7 @@ public class GitHistoryUtils {
     // adjust path using change manager
     path = getLastCommitName(project, path);
     final VirtualFile root = GitUtil.getGitRoot(path);
-    GitSimpleHandler h = new GitSimpleHandler(project, root, GitHandler.LOG);
+    GitSimpleHandler h = new GitSimpleHandler(project, root, GitCommand.LOG);
     h.setNoSSH(true);
     h.setStdoutSuppressed(true);
     h.addParameters("-M", "--follow", "--name-only",
index f7ff3d79117b7cf543d19fa0185d4eba40174eef..1e86dce8d3daa4e54397dfd0e8308a9fdce2585a 100644 (file)
@@ -21,7 +21,7 @@ import com.intellij.openapi.ui.DialogWrapper;
 import com.intellij.openapi.vcs.VcsException;
 import com.intellij.openapi.vfs.VirtualFile;
 import git4idea.GitVcs;
-import git4idea.commands.GitHandler;
+import git4idea.commands.GitCommand;
 import git4idea.commands.GitLineHandler;
 import git4idea.commands.GitSimpleHandler;
 import git4idea.i18n.GitBundle;
@@ -148,7 +148,7 @@ public class GitMergeDialog extends DialogWrapper {
   private void updateBranches() {
     try {
       VirtualFile root = getSelectedRoot();
-      GitSimpleHandler handler = new GitSimpleHandler(myProject, root, GitHandler.BRANCH);
+      GitSimpleHandler handler = new GitSimpleHandler(myProject, root, GitCommand.BRANCH);
       handler.setNoSSH(true);
       handler.setSilent(true);
       handler.addParameters("--no-color", "-a", "--no-merged");
@@ -172,7 +172,7 @@ public class GitMergeDialog extends DialogWrapper {
       throw new IllegalStateException("The handler could be retrieved only if dialog was completed successfully.");
     }
     VirtualFile root = (VirtualFile)myGitRoot.getSelectedItem();
-    GitLineHandler h = new GitLineHandler(myProject, root, GitHandler.MERGE);
+    GitLineHandler h = new GitLineHandler(myProject, root, GitCommand.MERGE);
     // ignore merge failure
     h.ignoreErrorCode(1);
     h.setNoSSH(true);
index 1a3c4474e8af7f4f190d54dff35d2f79a616738e..965c262ba3157c109a35edf65f0ba6c5da475b66 100644 (file)
@@ -29,8 +29,8 @@ import com.intellij.vcsUtil.VcsUtil;
 import git4idea.GitFileRevision;
 import git4idea.GitRevisionNumber;
 import git4idea.GitUtil;
+import git4idea.commands.GitCommand;
 import git4idea.commands.GitFileUtils;
-import git4idea.commands.GitHandler;
 import git4idea.commands.GitSimpleHandler;
 import git4idea.commands.StringScanner;
 import git4idea.i18n.GitBundle;
@@ -208,7 +208,7 @@ public class GitMergeProvider implements MergeProvider2 {
           Map<String, Conflict> cs = new HashMap<String, Conflict>();
           VirtualFile root = e.getKey();
           List<VirtualFile> files = e.getValue();
-          GitSimpleHandler h = new GitSimpleHandler(myProject, root, GitHandler.LS_FILES);
+          GitSimpleHandler h = new GitSimpleHandler(myProject, root, GitCommand.LS_FILES);
           h.setNoSSH(true);
           h.setStdoutSuppressed(true);
           h.addParameters("--exclude-standard", "--unmerged", "-t", "-z");
@@ -270,7 +270,7 @@ public class GitMergeProvider implements MergeProvider2 {
      * @param files the files to describe
      */
     public void collectConflicts(VirtualFile root, List<VirtualFile> files) {
-      GitSimpleHandler h = new GitSimpleHandler(myProject, root, GitHandler.LS_FILES);
+      GitSimpleHandler h = new GitSimpleHandler(myProject, root, GitCommand.LS_FILES);
       h.setNoSSH(true);
       h.addParameters("-t", "--exclude-standard", "--unmerged");
       h.endOptions();
index f87ac516f8dd9f7726e6cc0a405cbb061270aa92..f52c7b6b34cc3f33ecb27ea31200f2038a721741 100644 (file)
@@ -24,7 +24,7 @@ import com.intellij.ui.DocumentAdapter;
 import com.intellij.util.ArrayUtil;
 import git4idea.GitRemote;
 import git4idea.GitVcs;
-import git4idea.commands.GitHandler;
+import git4idea.commands.GitCommand;
 import git4idea.commands.GitHandlerUtil;
 import git4idea.commands.GitLineHandler;
 import git4idea.commands.GitSimpleHandler;
@@ -165,7 +165,7 @@ public class GitPullDialog extends DialogWrapper {
     listener.changedUpdate(null);
     myGetBranchesButton.addActionListener(new ActionListener() {
       public void actionPerformed(final ActionEvent e) {
-        GitSimpleHandler h = new GitSimpleHandler(myProject, gitRoot(), GitHandler.LS_REMOTE);
+        GitSimpleHandler h = new GitSimpleHandler(myProject, gitRoot(), GitCommand.LS_REMOTE);
         h.addParameters("--heads", myRemote.getSelectedItem().toString());
         String output = GitHandlerUtil.doSynchronously(h, GitBundle.getString("pull.getting.remote.branches"), h.printableCommandLine());
         if (output == null) {
@@ -190,7 +190,7 @@ public class GitPullDialog extends DialogWrapper {
    * @return a pull handler configured according to dialog options
    */
   public GitLineHandler pullHandler() {
-    GitLineHandler h = new GitLineHandler(myProject, gitRoot(), GitHandler.PULL);
+    GitLineHandler h = new GitLineHandler(myProject, gitRoot(), GitCommand.PULL);
     // ignore merge failure for the pull
     h.ignoreErrorCode(1);
     h.addParameters("--no-stat");
index 822f6e038fb58013d7c6d68e9c5f7c7c07cb8440..fdff0690303fdddaf51983e9b0263add82d5f5cf 100644 (file)
@@ -25,7 +25,7 @@ import com.intellij.openapi.vfs.VirtualFile;
 import git4idea.GitRevisionNumber;
 import git4idea.GitUtil;
 import git4idea.GitVcs;
-import git4idea.commands.GitHandler;
+import git4idea.commands.GitCommand;
 import git4idea.commands.GitSimpleHandler;
 import git4idea.commands.StringScanner;
 
@@ -85,7 +85,7 @@ public class MergeChangeCollector {
     try {
       // collect unmerged
       String root = myRoot.getPath();
-      GitSimpleHandler h = new GitSimpleHandler(myProject, myRoot, GitHandler.LS_FILES);
+      GitSimpleHandler h = new GitSimpleHandler(myProject, myRoot, GitCommand.LS_FILES);
       h.setNoSSH(true);
       h.setSilent(true);
       h.addParameters("--unmerged");
@@ -159,7 +159,7 @@ public class MergeChangeCollector {
    */
   private void processDiff(String root, TreeSet<String> updated, TreeSet<String> created, TreeSet<String> removed, String revisions)
     throws VcsException {
-    GitSimpleHandler h = new GitSimpleHandler(myProject, myRoot, GitHandler.DIFF);
+    GitSimpleHandler h = new GitSimpleHandler(myProject, myRoot, GitCommand.DIFF);
     h.setSilent(true);
     h.setNoSSH(true);
     // note that moves are not detected here
index 1bf0d34c1917d518db7252bd13aa101b8c4cb0e0..37507cc16c61f42027a721d04694a09b13eb39a9 100644 (file)
@@ -20,6 +20,7 @@ import com.intellij.openapi.project.Project;
 import com.intellij.openapi.util.Ref;
 import com.intellij.openapi.vfs.VirtualFile;
 import com.intellij.util.ui.UIUtil;
+import git4idea.commands.GitHandler;
 import org.jetbrains.annotations.NotNull;
 
 import java.io.Closeable;
@@ -46,6 +47,10 @@ public class GitInteractiveRebaseEditorHandler implements Closeable, GitRebaseEd
    * The git repository root
    */
   private final VirtualFile myRoot;
+  /**
+   * The handler that specified this editor
+   */
+  private GitHandler myHandler;
   /**
    * The handler number
    */
@@ -66,16 +71,26 @@ public class GitInteractiveRebaseEditorHandler implements Closeable, GitRebaseEd
    * @param service the service object that has created this handler
    * @param project the context project
    * @param root    the git repository root
+   * @param handler the handler for process that needs this editor
    */
   public GitInteractiveRebaseEditorHandler(@NotNull final GitRebaseEditorService service,
                                            @NotNull final Project project,
-                                           @NotNull final VirtualFile root) {
+                                           @NotNull final VirtualFile root,
+                                           @NotNull GitHandler handler) {
     myService = service;
     myProject = project;
     myRoot = root;
+    myHandler = handler;
     myHandlerNo = service.registerHandler(this);
   }
 
+  /**
+   * @return the handler for the process that started this editor
+   */
+  public GitHandler getHandler() {
+    return myHandler;
+  }
+
   /**
    * Edit commits request
    *
index 09ab20f857f96535b07586f56fac9ad5f3cc6277..6737397086e952768585494829c288b6421ab669 100644 (file)
@@ -22,7 +22,7 @@ import com.intellij.openapi.vfs.VirtualFile;
 import com.intellij.ui.DocumentAdapter;
 import git4idea.GitBranch;
 import git4idea.GitTag;
-import git4idea.commands.GitHandler;
+import git4idea.commands.GitCommand;
 import git4idea.commands.GitLineHandler;
 import git4idea.config.GitConfigUtil;
 import git4idea.i18n.GitBundle;
@@ -156,7 +156,7 @@ public class GitRebaseDialog extends DialogWrapper {
   }
 
   public GitLineHandler handler() {
-    GitLineHandler h = new GitLineHandler(myProject, gitRoot(), GitHandler.REBASE);
+    GitLineHandler h = new GitLineHandler(myProject, gitRoot(), GitCommand.REBASE);
     h.setNoSSH(true);
     if (myInteractiveCheckBox.isSelected() && myInteractiveCheckBox.isEnabled()) {
       h.addParameters("-i");
index f280b437cbfa369c329f0ff52d94c0c8e22507cf..5a9ca12bbf2e70864f5b3030999bf1cf182873e1 100644 (file)
@@ -15,6 +15,8 @@
  */
 package git4idea.rebase;
 
+import git4idea.commands.GitHandler;
+
 /**
  * The interface
  */
@@ -26,4 +28,9 @@ public interface GitRebaseEditorHandler {
    * @return the exit code to be returned from editor
    */
   int editCommits(String path);
+
+  /**
+   * @return the handler for the git process
+   */
+  GitHandler getHandler();
 }
index cc46f744b7f0050ebe31246205919a937f5d6fbc..10d47162efabae2c891c9b94a2e647f8fbf62e66 100644 (file)
@@ -18,6 +18,7 @@ package git4idea.rebase;
 import com.intellij.ide.XmlRpcServer;
 import com.intellij.openapi.components.ApplicationComponent;
 import com.intellij.openapi.components.ServiceManager;
+import git4idea.commands.GitCommand;
 import git4idea.commands.GitHandler;
 import git4idea.commands.GitLineHandler;
 import git4idea.commands.ScriptGenerator;
@@ -194,7 +195,7 @@ public class GitRebaseEditorService implements ApplicationComponent {
    * @param editorNo the editor number
    */
   public void configureHandler(GitLineHandler h, int editorNo) {
-    h.setEnvironment(GitHandler.GIT_EDITOR_ENV, getEditorCommand());
+    h.setEnvironment(GitCommand.GIT_EDITOR_ENV, getEditorCommand());
     h.setEnvironment(GitRebaseEditorMain.IDEA_REBASE_HANDER_NO, Integer.toString(editorNo));
   }
 
@@ -212,7 +213,15 @@ public class GitRebaseEditorService implements ApplicationComponent {
      */
     @SuppressWarnings({"UnusedDeclaration"})
     public int editCommits(int handlerNo, String path) {
-      return getHandler(handlerNo).editCommits(path);
+      GitRebaseEditorHandler editor = getHandler(handlerNo);
+      GitHandler handler = editor.getHandler();
+      handler.suspendWriteLock();
+      try {
+        return editor.editCommits(path);
+      }
+      finally {
+        handler.resumeWriteLock();
+      }
     }
   }
 }
index d1c19a483096aa342ea26bb4d877dda650274cd1..dd4d483cd463e50c9c6233865372acdd1a726dc1 100644 (file)
@@ -24,7 +24,7 @@ import com.intellij.openapi.vcs.rollback.RollbackEnvironment;
 import com.intellij.openapi.vcs.rollback.RollbackProgressListener;
 import com.intellij.openapi.vfs.VirtualFile;
 import git4idea.GitUtil;
-import git4idea.commands.GitHandler;
+import git4idea.commands.GitCommand;
 import git4idea.commands.GitSimpleHandler;
 import git4idea.i18n.GitBundle;
 import org.jetbrains.annotations.NotNull;
@@ -167,7 +167,7 @@ public class GitRollbackEnvironment implements RollbackEnvironment {
    * @throws VcsException Id it breaks.
    */
   public void revert(final VirtualFile root, final List<FilePath> files) throws VcsException {
-    GitSimpleHandler handler = new GitSimpleHandler(myProject, root, GitHandler.CHECKOUT);
+    GitSimpleHandler handler = new GitSimpleHandler(myProject, root, GitCommand.CHECKOUT);
     handler.setNoSSH(true);
     handler.addParameters("HEAD");
     handler.endOptions();
@@ -183,7 +183,7 @@ public class GitRollbackEnvironment implements RollbackEnvironment {
    * @throws VcsException if there is a problem with running git
    */
   private void unindex(final VirtualFile root, final List<FilePath> files) throws VcsException {
-    GitSimpleHandler handler = new GitSimpleHandler(myProject, root, GitHandler.RM);
+    GitSimpleHandler handler = new GitSimpleHandler(myProject, root, GitCommand.RM);
     handler.setNoSSH(true);
     handler.addParameters("--cached");
     handler.addParameters("-f");
index 688e5b0617c45394ec752b95d59c9611042e66c8..c3f54a932f4f4658a74427d88aa819de66c36f8e 100644 (file)
@@ -19,7 +19,7 @@ import com.intellij.openapi.project.Project;
 import com.intellij.openapi.ui.DialogWrapper;
 import com.intellij.openapi.vfs.VirtualFile;
 import com.intellij.ui.DocumentAdapter;
-import git4idea.commands.GitHandler;
+import git4idea.commands.GitCommand;
 import git4idea.commands.GitLineHandler;
 import git4idea.i18n.GitBundle;
 
@@ -192,7 +192,7 @@ public class GitFetchDialog extends DialogWrapper {
    * @return the handler for the fetch operation
    */
   public GitLineHandler fetchHandler() {
-    GitLineHandler h = new GitLineHandler(myProject, getGitRoot(), GitHandler.FETCH);
+    GitLineHandler h = new GitLineHandler(myProject, getGitRoot(), GitCommand.FETCH);
     h.addParameters("-v");
     if (myForceReferencesUpdateCheckBox.isSelected()) {
       h.addParameters("--force");
index f961e818ca9a62df34121e47290487ddd30c5207..1569f400098fbd71003f9cc3a1574a8c63400dfd 100644 (file)
@@ -28,7 +28,7 @@ import com.intellij.util.Icons;
 import com.intellij.util.ui.tree.TreeUtil;
 import git4idea.GitBranch;
 import git4idea.GitTag;
-import git4idea.commands.GitHandler;
+import git4idea.commands.GitCommand;
 import git4idea.commands.GitHandlerUtil;
 import git4idea.commands.GitSimpleHandler;
 import git4idea.commands.StringScanner;
@@ -140,7 +140,7 @@ public class GitRefspecAddRefsDialog extends DialogWrapper {
     // perform update
     myGetRefsButton.addActionListener(new ActionListener() {
       public void actionPerformed(final ActionEvent e) {
-        GitSimpleHandler handler = new GitSimpleHandler(myProject, myRoot, GitHandler.LS_REMOTE);
+        GitSimpleHandler handler = new GitSimpleHandler(myProject, myRoot, GitCommand.LS_REMOTE);
         if (myIncludeBranchesCheckBox.isSelected()) {
           handler.addParameters("--heads");
           myBranches.clear();
index 69abaad5fb198b8d474e19f5fe0b14cbf988aab8..e85d1f477293240e5d2860550d0c3fb3bb37ec9b 100644 (file)
@@ -18,7 +18,7 @@ package git4idea.ui;
 import com.intellij.openapi.project.Project;
 import com.intellij.openapi.ui.DialogWrapper;
 import com.intellij.openapi.vfs.VirtualFile;
-import git4idea.commands.GitHandler;
+import git4idea.commands.GitCommand;
 import git4idea.commands.GitLineHandler;
 import git4idea.i18n.GitBundle;
 
@@ -116,7 +116,7 @@ public class GitResetDialog extends DialogWrapper {
    * @return the handler for reset operation
    */
   public GitLineHandler handler() {
-    GitLineHandler handler = new GitLineHandler(myProject, getGitRoot(), GitHandler.RESET);
+    GitLineHandler handler = new GitLineHandler(myProject, getGitRoot(), GitCommand.RESET);
     handler.setNoSSH(true);
     String type = (String)myResetTypeComboBox.getSelectedItem();
     if (SOFT.equals(type)) {
index 1f8a04acbb4e9f557cbda05cf340f34f375d26b0..a315bc4ae2a2efb4da5bb5d20d039a90e05ba312 100644 (file)
@@ -18,7 +18,7 @@ package git4idea.ui;
 import com.intellij.openapi.project.Project;
 import com.intellij.openapi.ui.DialogWrapper;
 import com.intellij.openapi.vfs.VirtualFile;
-import git4idea.commands.GitHandler;
+import git4idea.commands.GitCommand;
 import git4idea.commands.GitLineHandler;
 import git4idea.i18n.GitBundle;
 
@@ -74,7 +74,7 @@ public class GitStashDialog extends DialogWrapper {
    * @return the handler
    */
   public GitLineHandler handler() {
-    GitLineHandler handler = new GitLineHandler(myProject, getGitRoot(), GitHandler.STASH);
+    GitLineHandler handler = new GitLineHandler(myProject, getGitRoot(), GitCommand.STASH);
     handler.addParameters("save");
     if (myKeepIndexCheckBox.isSelected()) {
       handler.addParameters("--keep-index");
index c62ea3810068463212c721cbfbc3468b6d148073..7ac00a8af56ede17e5400a6b18c142be7368f83a 100644 (file)
@@ -21,7 +21,7 @@ import com.intellij.openapi.ui.Messages;
 import com.intellij.openapi.vcs.VcsException;
 import com.intellij.openapi.vfs.VirtualFile;
 import com.intellij.ui.DocumentAdapter;
-import git4idea.commands.GitHandler;
+import git4idea.commands.GitCommand;
 import git4idea.commands.GitHandlerUtil;
 import git4idea.commands.GitSimpleHandler;
 import git4idea.commands.StringScanner;
@@ -170,7 +170,7 @@ public class GitTagDialog extends DialogWrapper {
       messageFile = null;
     }
     try {
-      GitSimpleHandler h = new GitSimpleHandler(myProject, getGitRoot(), GitHandler.TAG);
+      GitSimpleHandler h = new GitSimpleHandler(myProject, getGitRoot(), GitCommand.TAG);
       h.setNoSSH(true);
       if (hasMessage) {
         h.addParameters("-a");
@@ -237,7 +237,7 @@ public class GitTagDialog extends DialogWrapper {
    */
   private void fetchTags() {
     myExistingTags.clear();
-    GitSimpleHandler h = new GitSimpleHandler(myProject, getGitRoot(), GitHandler.TAG);
+    GitSimpleHandler h = new GitSimpleHandler(myProject, getGitRoot(), GitCommand.TAG);
     h.setNoSSH(true);
     h.setSilent(true);
     String output = GitHandlerUtil.doSynchronously(h, GitBundle.getString("tag.getting.existing.tags"), h.printableCommandLine());
index c3b8d5161f8ef3d33391d2ba118f6e6325908bbf..c799d626a36f2bd5dedb84109a1443af2d834c10 100644 (file)
@@ -134,7 +134,7 @@ public class GitUnstashDialog extends DialogWrapper {
     });
     myClearButton.addActionListener(new ActionListener() {
       public void actionPerformed(final ActionEvent e) {
-        GitLineHandler h = new GitLineHandler(myProject, getGitRoot(), GitHandler.STASH);
+        GitLineHandler h = new GitLineHandler(myProject, getGitRoot(), GitCommand.STASH);
         h.setNoSSH(true);
         h.addParameters("clear");
         GitHandlerUtil.doSynchronously(h, GitBundle.getString("unstash.clearing.stashes"), h.printableCommandLine());
@@ -173,7 +173,7 @@ public class GitUnstashDialog extends DialogWrapper {
       }
 
       private GitSimpleHandler dropHandler(String stash) {
-        GitSimpleHandler h = new GitSimpleHandler(myProject, getGitRoot(), GitHandler.STASH);
+        GitSimpleHandler h = new GitSimpleHandler(myProject, getGitRoot(), GitCommand.STASH);
         h.setNoSSH(true);
         h.addParameters("drop", stash);
         return h;
@@ -286,7 +286,7 @@ public class GitUnstashDialog extends DialogWrapper {
   private void refreshStashList() {
     final DefaultListModel listModel = (DefaultListModel)myStashList.getModel();
     listModel.clear();
-    GitSimpleHandler h = new GitSimpleHandler(myProject, getGitRoot(), GitHandler.STASH);
+    GitSimpleHandler h = new GitSimpleHandler(myProject, getGitRoot(), GitCommand.STASH);
     h.setSilent(true);
     h.setNoSSH(true);
     h.addParameters("list");
@@ -323,7 +323,7 @@ public class GitUnstashDialog extends DialogWrapper {
    * @return unstash handler
    */
   private GitLineHandler handler(boolean escaped) {
-    GitLineHandler h = new GitLineHandler(myProject, getGitRoot(), GitHandler.STASH);
+    GitLineHandler h = new GitLineHandler(myProject, getGitRoot(), GitCommand.STASH);
     h.setNoSSH(true);
     String branch = myBranchTextField.getText();
     if (branch.length() == 0) {
index 1fcdb278dcd1c719f22491d8d556313f489a97fe..daeeefa004512bc89cfccc997882899d643e5b3c 100644 (file)
@@ -33,7 +33,7 @@ import git4idea.GitBranch;
 import git4idea.GitUtil;
 import git4idea.GitVcs;
 import git4idea.changes.GitChangeUtils;
-import git4idea.commands.GitHandler;
+import git4idea.commands.GitCommand;
 import git4idea.commands.GitHandlerUtil;
 import git4idea.commands.GitLineHandler;
 import git4idea.commands.GitLineHandlerAdapter;
@@ -390,26 +390,28 @@ public abstract class GitBaseRebaseProcess {
                         VirtualFile root,
                         RebaseConflictDetector rebaseConflictDetector,
                         final String action) {
-    GitLineHandler rh = new GitLineHandler(myProject, root, GitHandler.REBASE);
+    GitLineHandler rh = new GitLineHandler(myProject, root, GitCommand.REBASE);
     // ignore failure for abort
     rh.ignoreErrorCode(1);
     rh.addParameters(action);
     rebaseConflictDetector.reset();
     rh.addLineListener(rebaseConflictDetector);
-    if(!"--abort".equals(action)) {
+    if (!"--abort".equals(action)) {
       configureRebaseEditor(root, rh);
     }
     try {
-    GitHandlerUtil.doSynchronouslyWithExceptions(rh, progressIndicator);
-    } finally {
+      GitHandlerUtil.doSynchronouslyWithExceptions(rh, progressIndicator);
+    }
+    finally {
       cleanupHandler(root, rh);
     }
   }
 
   /**
    * Configure rebase editor
+   *
    * @param root the vcs root
-   * @param h the handler to configure
+   * @param h    the handler to configure
    */
   @SuppressWarnings({"UnusedDeclaration"})
   protected void configureRebaseEditor(VirtualFile root, GitLineHandler h) {
index b404d884c2fbdf68c8b6fcaa5a261a9bb52a686f..102ee683a08b83b79f32365e494d96a89356cbe3 100644 (file)
@@ -19,7 +19,7 @@ import com.intellij.openapi.project.Project;
 import com.intellij.openapi.vcs.VcsException;
 import com.intellij.openapi.vfs.VirtualFile;
 import git4idea.GitVcs;
-import git4idea.commands.GitHandler;
+import git4idea.commands.GitCommand;
 import git4idea.commands.GitSimpleHandler;
 import git4idea.config.GitVersion;
 import org.jetbrains.annotations.NotNull;
@@ -45,7 +45,7 @@ public class GitStashUtils {
    * @return true if the stash was created, false otherwise
    */
   public static boolean saveStash(@NotNull Project project, @NotNull VirtualFile root, final String message) throws VcsException {
-    GitSimpleHandler handler = new GitSimpleHandler(project, root, GitHandler.STASH);
+    GitSimpleHandler handler = new GitSimpleHandler(project, root, GitCommand.STASH);
     handler.setNoSSH(true);
     handler.addParameters("save", message);
     String output = handler.run();
@@ -59,10 +59,10 @@ public class GitStashUtils {
    * @param root    the root
    */
   public static void popLastStash(@NotNull Project project, @NotNull VirtualFile root) throws VcsException {
-    GitSimpleHandler handler = new GitSimpleHandler(project, root, GitHandler.STASH);
+    GitSimpleHandler handler = new GitSimpleHandler(project, root, GitCommand.STASH);
     handler.setNoSSH(true);
     handler.addParameters("pop");
-    if(QUIET_STASH_SUPPORTED.isLessOrEqual(GitVcs.getInstance(project).version())) {
+    if (QUIET_STASH_SUPPORTED.isLessOrEqual(GitVcs.getInstance(project).version())) {
       handler.addParameters("--quiet");
     }
     handler.run();
index 2d27f4e735d99d1a8aacbc23708a975c542b51f1..c750d8a06995f86296f9213d8f5b10d984f84a00 100644 (file)
@@ -23,7 +23,7 @@ import com.intellij.openapi.vfs.VirtualFile;
 import com.intellij.util.ui.UIUtil;
 import com.intellij.vcsUtil.VcsUtil;
 import git4idea.GitUtil;
-import git4idea.commands.GitHandler;
+import git4idea.commands.GitCommand;
 import git4idea.commands.GitSimpleHandler;
 import git4idea.commands.StringScanner;
 import git4idea.i18n.GitBundle;
@@ -65,8 +65,9 @@ public class GitUpdateLocallyModifiedDialog extends DialogWrapper {
 
   /**
    * The constructor
-   * @param project the current project
-   * @param root the vcs root
+   *
+   * @param project              the current project
+   * @param root                 the vcs root
    * @param locallyModifiedFiles the collection of locally modified files to use
    */
   protected GitUpdateLocallyModifiedDialog(final Project project, final VirtualFile root, List<String> locallyModifiedFiles) {
@@ -88,7 +89,8 @@ public class GitUpdateLocallyModifiedDialog extends DialogWrapper {
         }
       }
     });
-    myDescriptionLabel.setText(GitBundle.message("update.locally.modified.message", ApplicationNamesInfo.getInstance().getFullProductName()));
+    myDescriptionLabel
+      .setText(GitBundle.message("update.locally.modified.message", ApplicationNamesInfo.getInstance().getFullProductName()));
     init();
   }
 
@@ -98,7 +100,7 @@ public class GitUpdateLocallyModifiedDialog extends DialogWrapper {
   private void syncListModel() {
     DefaultListModel listModel = (DefaultListModel)myFilesList.getModel();
     listModel.removeAllElements();
-    for(String p : myLocallyModifiedFiles) {
+    for (String p : myLocallyModifiedFiles) {
       listModel.addElement(p);
     }
   }
@@ -123,27 +125,28 @@ public class GitUpdateLocallyModifiedDialog extends DialogWrapper {
    * Scan working tree and detect locally modified files
    *
    * @param project the project to scan
-   * @param root the root to scan
-   * @param files the collection with files
+   * @param root    the root to scan
+   * @param files   the collection with files
    * @throws VcsException if there problem with running git or working tree is dirty in unsupported way
    */
   private static void scanFiles(Project project, VirtualFile root, List<String> files) throws VcsException {
     String rootPath = root.getPath();
-    GitSimpleHandler h = new GitSimpleHandler(project, root, GitHandler.DIFF);
+    GitSimpleHandler h = new GitSimpleHandler(project, root, GitCommand.DIFF);
     h.addParameters("--name-status");
     h.setNoSSH(true);
     h.setStdoutSuppressed(true);
     StringScanner s = new StringScanner(h.run());
-    while(s.hasMoreData()) {
-      if(s.isEol()) {
+    while (s.hasMoreData()) {
+      if (s.isEol()) {
         s.line();
         continue;
       }
-      if(s.tryConsume("M\t")) {
+      if (s.tryConsume("M\t")) {
         String path = rootPath + "/" + GitUtil.unescapePath(s.line());
         files.add(path);
-      } else {
-        throw new VcsException("Working tree is dirty in unsupported way: "+s.line());
+      }
+      else {
+        throw new VcsException("Working tree is dirty in unsupported way: " + s.line());
       }
     }
   }
@@ -153,7 +156,7 @@ public class GitUpdateLocallyModifiedDialog extends DialogWrapper {
    * Show the dialog if needed
    *
    * @param project the project
-   * @param root the vcs root
+   * @param root    the vcs root
    * @return true if showing is not needed or operation completed successfully
    */
   public static boolean showIfNeeded(final Project project, final VirtualFile root) {
@@ -161,7 +164,7 @@ public class GitUpdateLocallyModifiedDialog extends DialogWrapper {
     try {
       scanFiles(project, root, files);
       final AtomicBoolean rc = new AtomicBoolean(true);
-      if(!files.isEmpty()) {
+      if (!files.isEmpty()) {
         UIUtil.invokeAndWaitIfNeeded(new Runnable() {
           public void run() {
             GitUpdateLocallyModifiedDialog d = new GitUpdateLocallyModifiedDialog(project, root, files);
@@ -169,8 +172,8 @@ public class GitUpdateLocallyModifiedDialog extends DialogWrapper {
             rc.set(d.isOK());
           }
         });
-        if(rc.get()) {
-          if(!files.isEmpty()) {
+        if (rc.get()) {
+          if (!files.isEmpty()) {
             revertFiles(project, root, files);
           }
         }
@@ -191,14 +194,14 @@ public class GitUpdateLocallyModifiedDialog extends DialogWrapper {
    * Revert files from the list
    *
    * @param project the project
-   * @param root the vcs root
-   * @param files the files to revert
+   * @param root    the vcs root
+   * @param files   the files to revert
    */
   private static void revertFiles(Project project, VirtualFile root, ArrayList<String> files) throws VcsException {
-    GitSimpleHandler h = new GitSimpleHandler(project, root, GitHandler.CHECKOUT);
+    GitSimpleHandler h = new GitSimpleHandler(project, root, GitCommand.CHECKOUT);
     h.endOptions();
     h.setNoSSH(true);
-    for(String p : files) {
+    for (String p : files) {
       h.addRelativePaths(VcsUtil.getFilePath(p));
     }
     h.run();
index 887244313b5c24bba932828363ebfb6c9773433a..b4d0c0770ef5978665167a0d83e6adfedc4b9e26 100644 (file)
@@ -21,7 +21,7 @@ import com.intellij.openapi.vcs.update.UpdatedFiles;
 import com.intellij.openapi.vfs.VirtualFile;
 import git4idea.GitRevisionNumber;
 import git4idea.GitVcs;
-import git4idea.commands.GitHandler;
+import git4idea.commands.GitCommand;
 import git4idea.commands.GitLineHandler;
 import git4idea.config.GitVcsSettings;
 import git4idea.merge.MergeChangeCollector;
@@ -74,7 +74,7 @@ public class GitUpdateProcess extends GitBaseRebaseProcess {
   @Override
   protected GitLineHandler makeStartHandler(VirtualFile root) {
     // do pull
-    GitLineHandler h = new GitLineHandler(myProject, root, GitHandler.PULL);
+    GitLineHandler h = new GitLineHandler(myProject, root, GitCommand.PULL);
     // ignore merge failure for the pull
     h.ignoreErrorCode(1);
     switch (mySettings.UPDATE_TYPE) {