git pull: stash is needed if there is anything in the staging area.
authorKirill Likhodedov <kirill.likhodedov@jetbrains.com>
Wed, 23 Mar 2011 09:34:45 +0000 (12:34 +0300)
committerKirill Likhodedov <kirill.likhodedov@jetbrains.com>
Wed, 23 Mar 2011 09:34:45 +0000 (12:34 +0300)
plugins/git4idea/src/git4idea/update/GitMergeUpdater.java
plugins/git4idea/src/git4idea/update/GitUpdater.java

index b0d0b51c38bee9820f8e02dee151fa356c4f8e3f..7839c6d0e7bd653a2fa56081089804982f7e0471 100644 (file)
@@ -140,6 +140,16 @@ public class GitMergeUpdater extends GitUpdater {
 
   @Override
   public boolean isSaveNeeded() {
+    try {
+      if (hasStagedChanges()) {
+        return true;
+      }
+    }
+    catch (VcsException e) {
+      LOG.info("isSaveNeeded failed to check staging area", e);
+      return true;
+    }
+
     // git log --name-status master..origin/master
     GitBranchPair gitBranchPair = myUpdateProcess.getTrackedBranches().get(myRoot);
     String currentBranch = gitBranchPair.getBranch().getName();
@@ -159,6 +169,20 @@ public class GitMergeUpdater extends GitUpdater {
     }
   }
 
+  /**
+   * git diff --name-only --cached
+   * @return true if there is anything in the staging area, false if the staging area is empty.
+   */
+  private boolean hasStagedChanges() throws VcsException {
+    final GitSimpleHandler diff = new GitSimpleHandler(myProject, myRoot, GitCommand.DIFF);
+    diff.addParameters("--name-only", "--cached");
+    diff.setNoSSH(true);
+    diff.setStdoutSuppressed(true);
+    diff.setStderrSuppressed(true);
+    final String output = diff.run();
+    return !output.trim().isEmpty();
+  }
+
   private void cancel() {
     try {
       GitSimpleHandler h = new GitSimpleHandler(myProject, myRoot, GitCommand.RESET);
index cb1b3287826054405a7ed9b3294f3691d911956a..27b36f82dfc67ae7982bc5d06f92805cf1853afe 100644 (file)
@@ -130,7 +130,8 @@ public abstract class GitUpdater {
 
   /**
    * Checks the repository if local changes need to be saved before update.
-   * For rebase local changes need to be saved always, for merge - only in the case if merge affects the same files.
+   * For rebase local changes need to be saved always, 
+   * for merge - only in the case if merge affects the same files or there is something in the index.
    * @return true if local changes from this root need to be saved, false if not.
    */
   public abstract boolean isSaveNeeded();