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>tags/v2.1.0.201209190230-r
@@ -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 { |
@@ -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); |
@@ -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; |