libgit2 / libgit2sharp

Git + .NET = ❤
http://libgit2.github.com
MIT License
3.15k stars 887 forks source link

`Proxy.git_remote_connect()` hides exceptions #1912

Closed YuKitsune closed 2 years ago

YuKitsune commented 2 years ago

I've noticed when calling Repository.ListRemoteReferences with a URL that doesn't point to a valid git repo, I get a fairly unhelpful error:

LibGit2Sharp.LibGit2SharpException: this remote has never connected
   at LibGit2Sharp.Core.Ensure.HandleError(Int32 result)
   at LibGit2Sharp.Core.Proxy.git_remote_ls(Repository repository, RemoteHandle remote)
   at LibGit2Sharp.Repository.ListRemoteReferences(String url, CredentialsHandler credentialsProvider)
   at LibGit2Sharp.Repository.ListRemoteReferences(String url)
   at LibGit2SharpScratchpad.Program.Main(String[] args)

I did some digging and noticed in Repository.ListRemoteReferences(string, CredentialsHandler), there is a call to git_remote_connect, then git_remote_ls. In git_remote_connect, if an exception is thrown (E.g: from the call to Ensure.ZeroResult(res)), it's caught and then ignored: https://github.com/libgit2/libgit2sharp/blob/6329bea6d315f563d7107982bccbea4325947808/LibGit2Sharp/Core/Proxy.cs#L2163-L2176

It looks like this was introduced in this commit: https://github.com/libgit2/libgit2sharp/commit/6bc517f4d8103578e309ec7d8e206b6d9c6b2b3e

Because this doesn't re-throw the exception, git_remote_ls gets given a null transport, and thus throws the this remote has never connected error.

I would've expected this to re-throw the exception after disposing of the custom headers.

Seems like an easy fix and I'm happy to send through a PR, just wondering if this was intentional or a legitimate bug.

ethomson commented 2 years ago

Yes, this looks like an error!

YuKitsune commented 2 years ago

Thanks for checking @ethomson I've raised a PR: https://github.com/libgit2/libgit2sharp/pull/1913