Skip to content

Commit 38fdee6

Browse files
committed
Delegate tracking reference retrieval to libgit2
1 parent ed35167 commit 38fdee6

File tree

3 files changed

+33
-22
lines changed

3 files changed

+33
-22
lines changed

LibGit2Sharp/Branch.cs

Lines changed: 10 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
using System;
22
using System.Globalization;
33
using System.Linq;
4+
using LibGit2Sharp.Core;
45
using LibGit2Sharp.Core.Compat;
6+
using LibGit2Sharp.Core.Handles;
57

68
namespace LibGit2Sharp
79
{
@@ -138,31 +140,17 @@ public virtual ICommitLog Commits
138140

139141
private Branch ResolveTrackedBranch()
140142
{
141-
var trackedRemote = repo.Config.Get<string>("branch", Name, "remote", null);
142-
if (trackedRemote == null)
143+
using (ReferenceSafeHandle branchPtr = repo.Refs.RetrieveReferencePtr(CanonicalName))
144+
using (ReferenceSafeHandle referencePtr = Proxy.git_branch_tracking(branchPtr))
143145
{
144-
return null;
145-
}
146-
147-
var trackedRefName = repo.Config.Get<string>("branch", Name, "merge", null);
148-
if (trackedRefName == null)
149-
{
150-
return null;
151-
}
152-
153-
var remoteRefName = ResolveTrackedReference(trackedRemote, trackedRefName);
154-
return repo.Branches[remoteRefName];
155-
}
146+
if (referencePtr == null)
147+
{
148+
return null;
149+
}
156150

157-
private static string ResolveTrackedReference(string trackedRemote, string trackedRefName)
158-
{
159-
if (trackedRemote == ".")
160-
{
161-
return trackedRefName;
151+
var reference = Reference.BuildFromPtr<Reference>(referencePtr, repo);
152+
return repo.Branches[reference.CanonicalName];
162153
}
163-
164-
//TODO: To be replaced by native libgit2 git_branch_tracked_reference() when available.
165-
return trackedRefName.Replace("refs/heads/", string.Concat("refs/remotes/", trackedRemote, "/"));
166154
}
167155

168156
private static bool IsRemoteBranch(string canonicalName)

LibGit2Sharp/Core/NativeMethods.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -129,6 +129,11 @@ internal static extern int git_branch_move(
129129
[MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(Utf8Marshaler))] string new_branch_name,
130130
[MarshalAs(UnmanagedType.Bool)] bool force);
131131

132+
[DllImport(libgit2)]
133+
internal static extern int git_branch_tracking(
134+
out ReferenceSafeHandle reference,
135+
ReferenceSafeHandle branch);
136+
132137
[DllImport(libgit2)]
133138
internal static extern IntPtr git_commit_author(GitObjectSafeHandle commit);
134139

LibGit2Sharp/Core/Proxy.cs

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -125,6 +125,24 @@ public static void git_branch_move(ReferenceSafeHandle reference, string new_bra
125125
}
126126
}
127127

128+
public static ReferenceSafeHandle git_branch_tracking(ReferenceSafeHandle branch)
129+
{
130+
using (ThreadAffinity())
131+
{
132+
ReferenceSafeHandle reference;
133+
int res = NativeMethods.git_branch_tracking(out reference, branch);
134+
135+
if (res == (int)GitErrorCode.NotFound)
136+
{
137+
return null;
138+
}
139+
140+
Ensure.Success(res);
141+
142+
return reference;
143+
}
144+
}
145+
128146
#endregion
129147

130148
#region git_commit_

0 commit comments

Comments
 (0)