git4idea: added getMergeBase() method and integrated it into outgoing changes provider
authorConstantine Plotnikov <Constantine.Plotnikov@jetbrains.com>
Wed, 23 Sep 2009 14:11:07 +0000 (18:11 +0400)
committerConstantine Plotnikov <Constantine.Plotnikov@jetbrains.com>
Wed, 23 Sep 2009 14:11:07 +0000 (18:11 +0400)
plugins/git4idea/src/git4idea/GitBranch.java
plugins/git4idea/src/git4idea/changes/GitOutgoingChangesProvider.java
plugins/git4idea/src/git4idea/commands/GitHandler.java

index 673067891a1f5fc6c3c9c957611aeed2e02ec7dc..671ed1eaff1ccb0eaaf9a20da6f75b541727ad72 100644 (file)
@@ -287,4 +287,27 @@ public class GitBranch extends GitReference {
     }
     return new GitBranch(branch, false, remoteFlag);
   }
+
+  /**
+   * Get a merge base between the current branch and specified branch.
+   *
+   * @param project the current project
+   * @param root    the vcs root
+   * @param branch  the branch
+   * @return the common commit or null if the there is no common commit
+   * @throws VcsException the exception
+   */
+  @Nullable
+  public GitRevisionNumber getMergeBase(@NotNull Project project, @NotNull VirtualFile root, @NotNull GitBranch branch)
+    throws VcsException {
+    GitSimpleHandler h = new GitSimpleHandler(project, root, GitHandler.MERGE_BASE);
+    h.addParameters(this.getFullName(), branch.getFullName());
+    String output = h.run().trim();
+    if (output.length() == 0) {
+      return null;
+    }
+    else {
+      return GitRevisionNumber.resolve(project, root, output);
+    }
+  }
 }
index 99a95e2e404647b5109513015163abd93d286644..373b120192578899763c93d9b4fc8d7aa90b3fef 100644 (file)
@@ -10,6 +10,7 @@ import com.intellij.openapi.vcs.versionBrowser.CommittedChangeList;
 import com.intellij.openapi.vfs.VirtualFile;
 import com.intellij.util.Consumer;
 import git4idea.GitBranchesSearcher;
+import git4idea.GitRevisionNumber;
 import git4idea.GitUtil;
 import git4idea.commands.GitSimpleHandler;
 
@@ -24,18 +25,22 @@ public class GitOutgoingChangesProvider implements VcsOutgoingChangesProvider<Co
     myProject = project;
   }
 
-  public Pair<VcsRevisionNumber, List<CommittedChangeList>> getOutgoingChanges(final VirtualFile vcsRoot, final boolean findRemote) throws VcsException {
+  public Pair<VcsRevisionNumber, List<CommittedChangeList>> getOutgoingChanges(final VirtualFile vcsRoot, final boolean findRemote)
+    throws VcsException {
     LOG.debug("getOutgoingChanges root: " + vcsRoot.getPath());
     final GitBranchesSearcher searcher = new GitBranchesSearcher(myProject, vcsRoot, findRemote);
     if (searcher.getLocal() == null || searcher.getRemote() == null) {
       return new Pair<VcsRevisionNumber, List<CommittedChangeList>>(null, Collections.<CommittedChangeList>emptyList());
     }
-
+    final GitRevisionNumber base = searcher.getLocal().getMergeBase(myProject, vcsRoot, searcher.getRemote());
+    if (base == null) {
+      return new Pair<VcsRevisionNumber, List<CommittedChangeList>>(null, Collections.<CommittedChangeList>emptyList());
+    }
     final List<CommittedChangeList> lists = GitUtil.getLocalCommittedChanges(myProject, vcsRoot, new Consumer<GitSimpleHandler>() {
       public void consume(final GitSimpleHandler handler) {
-        handler.addParameters(searcher.getRemote().getFullName() + "..HEAD");
+        handler.addParameters(base.asString() + "..HEAD");
       }
     });
-    return new Pair<VcsRevisionNumber, List<CommittedChangeList>>(null, lists);
+    return new Pair<VcsRevisionNumber, List<CommittedChangeList>>(base, lists);
   }
 }
index aea355d7170a84754e98a58c5e011e981a43a68f..a1a87e2f7e048f7c1aa316bb9d19bbb3895c70ee 100644 (file)
@@ -166,6 +166,10 @@ public abstract class GitHandler {
    * 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}
    */