Skip to content

Commit 0ef4390

Browse files
committed
Teach Network.ListReferences to accept both a url and a CredentialsProvider
Fix libgit2#1099
1 parent 87067b5 commit 0ef4390

File tree

1 file changed

+37
-14
lines changed

1 file changed

+37
-14
lines changed

LibGit2Sharp/Network.cs

Lines changed: 37 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,9 @@ public virtual RemoteCollection Remotes
5050
/// <returns>The references in the <see cref="Remote"/> repository.</returns>
5151
public virtual IEnumerable<DirectReference> ListReferences(Remote remote)
5252
{
53-
return ListReferences(remote, null);
53+
Ensure.ArgumentNotNull(remote, "remote");
54+
55+
return ListReferencesInternal(remote.Url, null);
5456
}
5557

5658
/// <summary>
@@ -68,20 +70,27 @@ public virtual IEnumerable<DirectReference> ListReferences(Remote remote)
6870
public virtual IEnumerable<DirectReference> ListReferences(Remote remote, CredentialsHandler credentialsProvider)
6971
{
7072
Ensure.ArgumentNotNull(remote, "remote");
73+
Ensure.ArgumentNotNull(credentialsProvider, "credentialsProvider");
7174

72-
using (RemoteSafeHandle remoteHandle = Proxy.git_remote_lookup(repository.Handle, remote.Name, true))
73-
{
74-
var gitCallbacks = new GitRemoteCallbacks { version = 1 };
75+
return ListReferencesInternal(remote.Url, credentialsProvider);
76+
}
7577

76-
if (credentialsProvider != null)
77-
{
78-
var callbacks = new RemoteCallbacks(credentialsProvider);
79-
gitCallbacks = callbacks.GenerateCallbacks();
80-
}
78+
/// <summary>
79+
/// List references in a remote repository.
80+
/// <para>
81+
/// When the remote tips are ahead of the local ones, the retrieved
82+
/// <see cref="DirectReference"/>s may point to non existing
83+
/// <see cref="GitObject"/>s in the local repository. In that
84+
/// case, <see cref="DirectReference.Target"/> will return <c>null</c>.
85+
/// </para>
86+
/// </summary>
87+
/// <param name="url">The url to list from.</param>
88+
/// <returns>The references in the remote repository.</returns>
89+
public virtual IEnumerable<DirectReference> ListReferences(string url)
90+
{
91+
Ensure.ArgumentNotNull(url, "url");
8192

82-
Proxy.git_remote_connect(remoteHandle, GitDirection.Fetch, ref gitCallbacks);
83-
return Proxy.git_remote_ls(repository, remoteHandle);
84-
}
93+
return ListReferencesInternal(url, null);
8594
}
8695

8796
/// <summary>
@@ -94,14 +103,28 @@ public virtual IEnumerable<DirectReference> ListReferences(Remote remote, Creden
94103
/// </para>
95104
/// </summary>
96105
/// <param name="url">The url to list from.</param>
106+
/// <param name="credentialsProvider">The <see cref="Func{Credentials}"/> used to connect to remote repository.</param>
97107
/// <returns>The references in the remote repository.</returns>
98-
public virtual IEnumerable<DirectReference> ListReferences(string url)
108+
public virtual IEnumerable<DirectReference> ListReferences(string url, CredentialsHandler credentialsProvider)
99109
{
100110
Ensure.ArgumentNotNull(url, "url");
111+
Ensure.ArgumentNotNull(credentialsProvider, "credentialsProvider");
101112

102-
using (RemoteSafeHandle remoteHandle = Proxy.git_remote_create_anonymous(repository.Handle, url))
113+
return ListReferencesInternal(url, credentialsProvider);
114+
}
115+
116+
private IEnumerable<DirectReference> ListReferencesInternal(string url, CredentialsHandler credentialsProvider)
117+
{
118+
using (RemoteSafeHandle remoteHandle = BuildRemoteSafeHandle(repository.Handle, url))
103119
{
104120
GitRemoteCallbacks gitCallbacks = new GitRemoteCallbacks { version = 1 };
121+
122+
if (credentialsProvider != null)
123+
{
124+
var callbacks = new RemoteCallbacks(credentialsProvider);
125+
gitCallbacks = callbacks.GenerateCallbacks();
126+
}
127+
105128
Proxy.git_remote_connect(remoteHandle, GitDirection.Fetch, ref gitCallbacks);
106129
return Proxy.git_remote_ls(repository, remoteHandle);
107130
}

0 commit comments

Comments
 (0)