]> source.dussan.org Git - jgit.git/commitdiff
Teach BranchTrackingStatus to handle tracking of local branches 91/7191/4
authorMatthias Sohn <matthias.sohn@sap.com>
Fri, 17 Aug 2012 22:29:45 +0000 (00:29 +0200)
committerMatthias Sohn <matthias.sohn@sap.com>
Fri, 17 Aug 2012 22:29:45 +0000 (00:29 +0200)
EGit wasn't able to decorate local branches tracking another local
branch with number of commits the checked out local branch differs from
the other local branch it's tracking.

Bug: 376970
Change-Id: I74e932d5eacd74dbf6b0dffcfc65ba3222a8250e
Signed-off-by: Matthias Sohn <matthias.sohn@sap.com>
org.eclipse.jgit.test/tst/org/eclipse/jgit/lib/BranchConfigTest.java
org.eclipse.jgit/src/org/eclipse/jgit/lib/BranchConfig.java
org.eclipse.jgit/src/org/eclipse/jgit/lib/BranchTrackingStatus.java

index 1401526623fa5ea52f64ad98355dfbe2ebcc6d82..4895d3cf1a605456bf0747cc514febca6008eba6 100644 (file)
@@ -1,5 +1,6 @@
 /*
  * Copyright (C) 2011, Robin Stocker <robin@nibor.org>
+ * Copyright (C) 2012, Matthias Sohn <matthias.sohn@sap.com>
  * and other copyright owners as documented in the project's IP log.
  *
  * This program and the accompanying materials are made available
@@ -104,6 +105,45 @@ public class BranchConfigTest {
                assertNull(branchConfig.getRemoteTrackingBranch());
        }
 
+       @Test
+       public void getTrackingBranchShouldReturnMergeBranchForLocalBranch() {
+               Config c = parse("" //
+                               + "[remote \"origin\"]\n"
+                               + "  fetch = +refs/heads/*:refs/remotes/origin/*\n"
+                               + "[branch \"master\"]\n"
+                               + "  remote = .\n"
+                               + "  merge = refs/heads/master\n");
+
+               BranchConfig branchConfig = new BranchConfig(c, "master");
+               assertEquals("refs/heads/master",
+                               branchConfig.getTrackingBranch());
+       }
+
+       @Test
+       public void getTrackingBranchShouldReturnNullWithoutMergeBranchForLocalBranch() {
+               Config c = parse("" //
+                               + "[remote \"origin\"]\n"
+                               + "  fetch = +refs/heads/onlyone:refs/remotes/origin/onlyone\n"
+                               + "[branch \"master\"]\n" //
+                               + "  remote = .\n");
+               BranchConfig branchConfig = new BranchConfig(c, "master");
+               assertNull(branchConfig.getTrackingBranch());
+       }
+
+       @Test
+       public void getTrackingBranchShouldHandleNormalCaseForRemoteTrackingBranch() {
+               Config c = parse("" //
+                               + "[remote \"origin\"]\n"
+                               + "  fetch = +refs/heads/*:refs/remotes/origin/*\n"
+                               + "[branch \"master\"]\n"
+                               + "  remote = origin\n"
+                               + "  merge = refs/heads/master\n");
+
+               BranchConfig branchConfig = new BranchConfig(c, "master");
+               assertEquals("refs/remotes/origin/master",
+                               branchConfig.getTrackingBranch());
+       }
+
        private Config parse(final String content) {
                final Config c = new Config(null);
                try {
index ae05fd95e065bf38a8a01f7e215afa6ae5f0d474..b0883e3f434199468139cab22329915913e6b114 100644 (file)
@@ -1,5 +1,6 @@
 /*
  * Copyright (C) 2011, Robin Stocker <robin@nibor.org>
+ * Copyright (C) 2012, Matthias Sohn <matthias.sohn@sap.com>
  * and other copyright owners as documented in the project's IP log.
  *
  * This program and the accompanying materials are made available
@@ -71,8 +72,25 @@ public class BranchConfig {
        }
 
        /**
-        * @return the full remote-tracking branch name or <code>null</code> if it
-        *         could not be determined
+        * @return the full tracking branch name or <code>null</code> if it could
+        *         not be determined
+        */
+       public String getTrackingBranch() {
+               String remote = getRemote();
+               String mergeRef = getMergeBranch();
+               if (remote == null || mergeRef == null)
+                       return null;
+
+               if (remote.equals("."))
+                       return mergeRef;
+
+               return findRemoteTrackingBranch(remote, mergeRef);
+       }
+
+       /**
+        * @return the full remote-tracking branch name or {@code null} if it could
+        *         not be determined. If you also want local tracked branches use
+        *         {@link #getTrackingBranch()} instead.
         */
        public String getRemoteTrackingBranch() {
                String remote = getRemote();
@@ -80,6 +98,20 @@ public class BranchConfig {
                if (remote == null || mergeRef == null)
                        return null;
 
+               return findRemoteTrackingBranch(remote, mergeRef);
+       }
+
+       /**
+        * Finds the tracked remote tracking branch
+        *
+        * @param remote
+        *            Remote name
+        * @param mergeRef
+        *            merge Ref of the local branch tracking the remote tracking
+        *            branch
+        * @return full remote tracking branch name or null
+        */
+       private String findRemoteTrackingBranch(String remote, String mergeRef) {
                RemoteConfig remoteConfig;
                try {
                        remoteConfig = new RemoteConfig(config, remote);
index 4d69e602ee0f22305542a5ceeb87a887af9eebea..7844fd819faf0afd7c87009454625b3aa10cc055 100644 (file)
@@ -1,5 +1,6 @@
 /*
  * Copyright (C) 2011, Robin Stocker <robin@nibor.org>
+ * Copyright (C) 2012, Matthias Sohn <matthias.sohn@sap.com>
  * and other copyright owners as documented in the project's IP log.
  *
  * This program and the accompanying materials are made available
@@ -72,11 +73,11 @@ public class BranchTrackingStatus {
                BranchConfig branchConfig = new BranchConfig(repository.getConfig(),
                                branchName);
 
-               String remoteTrackingBranch = branchConfig.getRemoteTrackingBranch();
-               if (remoteTrackingBranch == null)
+               String trackingBranch = branchConfig.getTrackingBranch();
+               if (trackingBranch == null)
                        return null;
 
-               Ref tracking = repository.getRef(remoteTrackingBranch);
+               Ref tracking = repository.getRef(trackingBranch);
                if (tracking == null)
                        return null;
 
@@ -99,7 +100,7 @@ public class BranchTrackingStatus {
                int aheadCount = RevWalkUtils.count(walk, localCommit, mergeBase);
                int behindCount = RevWalkUtils.count(walk, trackingCommit, mergeBase);
 
-               return new BranchTrackingStatus(remoteTrackingBranch, aheadCount, behindCount);
+               return new BranchTrackingStatus(trackingBranch, aheadCount, behindCount);
        }
 
        private final String remoteTrackingBranch;