@@ -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