{"action":"created","comment":{"url":"https://api.github.com/repos/libgit2/libgit2sharp/pulls/comments/25014813","id":25014813,"diff_hunk":"@@ -242,5 +244,239 @@ public void CloningWithoutUrlThrows()\n \n             Assert.Throws<ArgumentNullException>(() => Repository.Clone(null, scd.DirectoryPath));\n         }\n+\n+        /// <summary>\n+        /// Private helper to record the callbacks that were called as part of a clone.\n+        /// </summary>\n+        private class CloneCallbackInfo\n+        {\n+            /// <summary>\n+            /// Was checkout progress called.\n+            /// </summary>\n+            public bool CheckoutProgressCalled { get; set; }\n+\n+            /// <summary>\n+            /// The reported remote URL.\n+            /// </summary>\n+            public string RemoteUrl { get; set; }\n+\n+            /// <summary>\n+            /// Was remote ref update called.\n+            /// </summary>\n+            public bool RemoteRefUpdateCalled { get; set; }\n+\n+            /// <summary>\n+            /// Was the transition callback called when starting\n+            /// work on this repository.\n+            /// </summary>\n+            public bool StartingWorkInRepositoryCalled { get; set; }\n+\n+            /// <summary>\n+            /// Was the transition callback called when finishing\n+            /// work on this repository.\n+            /// </summary>\n+            public bool FinishedWorkInRepositoryCalled { get; set; }\n+\n+            /// <summary>\n+            /// The reported recursion depth.\n+            /// </summary>\n+            public int RecursionDepth { get; set; }\n+        }\n+\n+        [Fact]\n+        public void CanRecursivelyCloneSubmodules()\n+        {\n+            var uri = new Uri(Path.GetFullPath(SandboxSubmoduleSmallTestRepo()));\n+            var scd = BuildSelfCleaningDirectory();\n+            string relativeSubmodulePath = \"submodule_target_wd\";\n+\n+            // Construct the expected URL the submodule will clone from.\n+            string expectedSubmoduleUrl = Path.Combine(Path.GetDirectoryName(uri.AbsolutePath), relativeSubmodulePath);\n+            expectedSubmoduleUrl = expectedSubmoduleUrl.Replace('\\\\', '/');\n+\n+            Dictionary<string, CloneCallbackInfo> callbacks = new Dictionary<string, CloneCallbackInfo>();\n+\n+            CloneCallbackInfo currentEntry = null;\n+            bool unexpectedOrderOfCallbacks = false;\n+\n+            CheckoutProgressHandler checkoutProgressHandler = (x, y, z) =>\n+                {\n+                    if (currentEntry != null)\n+                    {\n+                        currentEntry.CheckoutProgressCalled = true;\n+                    }\n+                    else\n+                    {\n+                        // Should not be called if there is not a current\n+                        // callbackInfo entry.\n+                        unexpectedOrderOfCallbacks = true;\n+                    }\n+                };\n+\n+            UpdateTipsHandler remoteRefUpdated = (x, y, z) =>\n+            {\n+                if (currentEntry != null)\n+                {\n+                    currentEntry.RemoteRefUpdateCalled = true;\n+                }\n+                else\n+                {\n+                    // Should not be called if there is not a current\n+                    // callbackInfo entry.\n+                    unexpectedOrderOfCallbacks = true;\n+                }\n+\n+                return true;\n+            };\n+\n+            RepositoryOperationStarting repositoryOperationStarting = (x) =>\n+                {\n+                    if (currentEntry != null)\n+                    {\n+                        // Should not be called if there is a current\n+                        // callbackInfo entry.\n+                        unexpectedOrderOfCallbacks = true;\n+                    }\n+\n+                    currentEntry = new CloneCallbackInfo();\n+                    currentEntry.StartingWorkInRepositoryCalled = true;\n+                    currentEntry.RecursionDepth = x.RecursionDepth;\n+                    currentEntry.RemoteUrl = x.RemoteUrl;\n+                    callbacks.Add(x.RepositoryPath, currentEntry);\n+\n+                    return true;\n+                };\n+\n+            RepositoryOperationCompleted repositoryOperationCompleted = (x, ex) =>\n+                {\n+                    if (currentEntry != null)\n+                    {\n+                        currentEntry.FinishedWorkInRepositoryCalled = true;\n+                        currentEntry = null;\n+                    }\n+                    else\n+                    {\n+                        // Should not be called if there is not a current\n+                        // callbackInfo entry.\n+                        unexpectedOrderOfCallbacks = true;\n+                    }\n+                };\n+\n+            CloneOptions options = new CloneOptions()\n+            {\n+                RecurseSubmodules = true,\n+                OnCheckoutProgress = checkoutProgressHandler,\n+                OnUpdateTips = remoteRefUpdated,\n+                RepositoryOperationStarting = repositoryOperationStarting,\n+                RepositoryOperationCompleted = repositoryOperationCompleted,\n+            };\n+\n+            string clonedRepoPath = Repository.Clone(uri.AbsolutePath, scd.DirectoryPath, options);\n+            string workDirPath;\n+\n+            using(Repository repo = new Repository(clonedRepoPath))\n+            {\n+                workDirPath = repo.Info.WorkingDirectory.TrimEnd(new char[] { Path.DirectorySeparatorChar, Path.AltDirectorySeparatorChar });\n+            }\n+\n+            // Verification:\n+            // Verify that no callbacks were called in an unexpected order.\n+            Assert.False(unexpectedOrderOfCallbacks);\n+\n+            Dictionary<string, CloneCallbackInfo> expectedCallbackInfo = new Dictionary<string, CloneCallbackInfo>();\n+            expectedCallbackInfo.Add(workDirPath, new CloneCallbackInfo()\n+                {\n+                    RecursionDepth = 0,\n+                    RemoteUrl = uri.AbsolutePath,\n+                    StartingWorkInRepositoryCalled = true,\n+                    FinishedWorkInRepositoryCalled = true,\n+                    CheckoutProgressCalled = true,\n+                    RemoteRefUpdateCalled = true,\n+                });\n+\n+            expectedCallbackInfo.Add(Path.Combine(workDirPath, relativeSubmodulePath), new CloneCallbackInfo()\n+            {\n+                RecursionDepth = 1,\n+                RemoteUrl = expectedSubmoduleUrl,\n+                StartingWorkInRepositoryCalled = true,\n+                FinishedWorkInRepositoryCalled = true,\n+                CheckoutProgressCalled = true,\n+                RemoteRefUpdateCalled = true,\n+            });\n+\n+            // Callbacks for each expected repository that is cloned\n+            foreach (KeyValuePair<string, CloneCallbackInfo> kvp in expectedCallbackInfo)\n+            {\n+                CloneCallbackInfo entry = null;\n+                Assert.True(callbacks.TryGetValue(kvp.Key, out entry), string.Format(\"{0} was not found in callbacks.\", kvp.Key));\n+\n+                Assert.Equal(kvp.Value.RemoteUrl, entry.RemoteUrl);\n+                Assert.Equal(kvp.Value.RecursionDepth, entry.RecursionDepth);\n+                Assert.Equal(kvp.Value.StartingWorkInRepositoryCalled, entry.StartingWorkInRepositoryCalled);\n+                Assert.Equal(kvp.Value.FinishedWorkInRepositoryCalled, entry.FinishedWorkInRepositoryCalled);\n+                Assert.Equal(kvp.Value.CheckoutProgressCalled, entry.CheckoutProgressCalled);\n+                Assert.Equal(kvp.Value.RemoteRefUpdateCalled, entry.RemoteRefUpdateCalled);\n+            }\n+\n+            // submodule is initialized\n+            // To Verify: submodule head commit","path":"LibGit2Sharp.Tests/CloneFixture.cs","position":188,"original_position":188,"commit_id":"e41ccb1dcfd2db950e2bec98b97d39a9d66e55d5","original_commit_id":"e41ccb1dcfd2db950e2bec98b97d39a9d66e55d5","user":{"login":"nulltoken","id":92363,"avatar_url":"https://avatars.githubusercontent.com/u/92363?v=3","gravatar_id":"","url":"https://api.github.com/users/nulltoken","html_url":"https://github.com/nulltoken","followers_url":"https://api.github.com/users/nulltoken/followers","following_url":"https://api.github.com/users/nulltoken/following{/other_user}","gists_url":"https://api.github.com/users/nulltoken/gists{/gist_id}","starred_url":"https://api.github.com/users/nulltoken/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/nulltoken/subscriptions","organizations_url":"https://api.github.com/users/nulltoken/orgs","repos_url":"https://api.github.com/users/nulltoken/repos","events_url":"https://api.github.com/users/nulltoken/events{/privacy}","received_events_url":"https://api.github.com/users/nulltoken/received_events","type":"User","site_admin":false},"body":"Is that a reminder?","created_at":"2015-02-19T19:06:11Z","updated_at":"2015-02-19T19:06:11Z","html_url":"https://github.com/libgit2/libgit2sharp/pull/949#discussion_r25014813","pull_request_url":"https://api.github.com/repos/libgit2/libgit2sharp/pulls/949","_links":{"self":{"href":"https://api.github.com/repos/libgit2/libgit2sharp/pulls/comments/25014813"},"html":{"href":"https://github.com/libgit2/libgit2sharp/pull/949#discussion_r25014813"},"pull_request":{"href":"https://api.github.com/repos/libgit2/libgit2sharp/pulls/949"}}},"pull_request":{"url":"https://api.github.com/repos/libgit2/libgit2sharp/pulls/949","id":29036237,"html_url":"https://github.com/libgit2/libgit2sharp/pull/949","diff_url":"https://github.com/libgit2/libgit2sharp/pull/949.diff","patch_url":"https://github.com/libgit2/libgit2sharp/pull/949.patch","issue_url":"https://api.github.com/repos/libgit2/libgit2sharp/issues/949","number":949,"state":"open","locked":false,"title":"Teach clone to recurse into submodules","user":{"login":"jamill","id":2045976,"avatar_url":"https://avatars.githubusercontent.com/u/2045976?v=3","gravatar_id":"","url":"https://api.github.com/users/jamill","html_url":"https://github.com/jamill","followers_url":"https://api.github.com/users/jamill/followers","following_url":"https://api.github.com/users/jamill/following{/other_user}","gists_url":"https://api.github.com/users/jamill/gists{/gist_id}","starred_url":"https://api.github.com/users/jamill/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/jamill/subscriptions","organizations_url":"https://api.github.com/users/jamill/orgs","repos_url":"https://api.github.com/users/jamill/repos","events_url":"https://api.github.com/users/jamill/events{/privacy}","received_events_url":"https://api.github.com/users/jamill/received_events","type":"User","site_admin":false},"body":"This is the basic outline to enable cloning with the option to recursively clone submodules. I wanted to put this up to get feedback on how the progress is reported through callbacks.\r\n\r\n**Notes:**\r\nThis adds callbacks that are called before and after cloning a repository. The user has an opportunity to cancel the clone before starting a clone operation in a repository.\r\n\r\nIf an exception occurs when cloning a submodule, this exception is not thrown through the calling function. Instead, it is reported through the `RepositoryOperationCompleted` callback. Alternatively, we could have had `Clone` return a `CloneResult` object, which could include the \"warning\" exceptions.\r\n","created_at":"2015-02-10T19:23:58Z","updated_at":"2015-02-19T19:06:11Z","closed_at":null,"merged_at":null,"merge_commit_sha":"774be6f9ae702e839748c5f978f1d9f20a61a843","assignee":null,"milestone":null,"commits_url":"https://api.github.com/repos/libgit2/libgit2sharp/pulls/949/commits","review_comments_url":"https://api.github.com/repos/libgit2/libgit2sharp/pulls/949/comments","review_comment_url":"https://api.github.com/repos/libgit2/libgit2sharp/pulls/comments/{number}","comments_url":"https://api.github.com/repos/libgit2/libgit2sharp/issues/949/comments","statuses_url":"https://api.github.com/repos/libgit2/libgit2sharp/statuses/e41ccb1dcfd2db950e2bec98b97d39a9d66e55d5","head":{"label":"jamill/clone_recurse_submodule","ref":"jamill/clone_recurse_submodule","sha":"e41ccb1dcfd2db950e2bec98b97d39a9d66e55d5","user":{"login":"libgit2","id":394745,"avatar_url":"https://avatars.githubusercontent.com/u/394745?v=3","gravatar_id":"","url":"https://api.github.com/users/libgit2","html_url":"https://github.com/libgit2","followers_url":"https://api.github.com/users/libgit2/followers","following_url":"https://api.github.com/users/libgit2/following{/other_user}","gists_url":"https://api.github.com/users/libgit2/gists{/gist_id}","starred_url":"https://api.github.com/users/libgit2/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/libgit2/subscriptions","organizations_url":"https://api.github.com/users/libgit2/orgs","repos_url":"https://api.github.com/users/libgit2/repos","events_url":"https://api.github.com/users/libgit2/events{/privacy}","received_events_url":"https://api.github.com/users/libgit2/received_events","type":"Organization","site_admin":false},"repo":{"id":1415168,"name":"libgit2sharp","full_name":"libgit2/libgit2sharp","owner":{"login":"libgit2","id":394745,"avatar_url":"https://avatars.githubusercontent.com/u/394745?v=3","gravatar_id":"","url":"https://api.github.com/users/libgit2","html_url":"https://github.com/libgit2","followers_url":"https://api.github.com/users/libgit2/followers","following_url":"https://api.github.com/users/libgit2/following{/other_user}","gists_url":"https://api.github.com/users/libgit2/gists{/gist_id}","starred_url":"https://api.github.com/users/libgit2/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/libgit2/subscriptions","organizations_url":"https://api.github.com/users/libgit2/orgs","repos_url":"https://api.github.com/users/libgit2/repos","events_url":"https://api.github.com/users/libgit2/events{/privacy}","received_events_url":"https://api.github.com/users/libgit2/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/libgit2/libgit2sharp","description":"Git + .Net/Mono = ❤","fork":false,"url":"https://api.github.com/repos/libgit2/libgit2sharp","forks_url":"https://api.github.com/repos/libgit2/libgit2sharp/forks","keys_url":"https://api.github.com/repos/libgit2/libgit2sharp/keys{/key_id}","collaborators_url":"https://api.github.com/repos/libgit2/libgit2sharp/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/libgit2/libgit2sharp/teams","hooks_url":"https://api.github.com/repos/libgit2/libgit2sharp/hooks","issue_events_url":"https://api.github.com/repos/libgit2/libgit2sharp/issues/events{/number}","events_url":"https://api.github.com/repos/libgit2/libgit2sharp/events","assignees_url":"https://api.github.com/repos/libgit2/libgit2sharp/assignees{/user}","branches_url":"https://api.github.com/repos/libgit2/libgit2sharp/branches{/branch}","tags_url":"https://api.github.com/repos/libgit2/libgit2sharp/tags","blobs_url":"https://api.github.com/repos/libgit2/libgit2sharp/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/libgit2/libgit2sharp/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/libgit2/libgit2sharp/git/refs{/sha}","trees_url":"https://api.github.com/repos/libgit2/libgit2sharp/git/trees{/sha}","statuses_url":"https://api.github.com/repos/libgit2/libgit2sharp/statuses/{sha}","languages_url":"https://api.github.com/repos/libgit2/libgit2sharp/languages","stargazers_url":"https://api.github.com/repos/libgit2/libgit2sharp/stargazers","contributors_url":"https://api.github.com/repos/libgit2/libgit2sharp/contributors","subscribers_url":"https://api.github.com/repos/libgit2/libgit2sharp/subscribers","subscription_url":"https://api.github.com/repos/libgit2/libgit2sharp/subscription","commits_url":"https://api.github.com/repos/libgit2/libgit2sharp/commits{/sha}","git_commits_url":"https://api.github.com/repos/libgit2/libgit2sharp/git/commits{/sha}","comments_url":"https://api.github.com/repos/libgit2/libgit2sharp/comments{/number}","issue_comment_url":"https://api.github.com/repos/libgit2/libgit2sharp/issues/comments/{number}","contents_url":"https://api.github.com/repos/libgit2/libgit2sharp/contents/{+path}","compare_url":"https://api.github.com/repos/libgit2/libgit2sharp/compare/{base}...{head}","merges_url":"https://api.github.com/repos/libgit2/libgit2sharp/merges","archive_url":"https://api.github.com/repos/libgit2/libgit2sharp/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/libgit2/libgit2sharp/downloads","issues_url":"https://api.github.com/repos/libgit2/libgit2sharp/issues{/number}","pulls_url":"https://api.github.com/repos/libgit2/libgit2sharp/pulls{/number}","milestones_url":"https://api.github.com/repos/libgit2/libgit2sharp/milestones{/number}","notifications_url":"https://api.github.com/repos/libgit2/libgit2sharp/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/libgit2/libgit2sharp/labels{/name}","releases_url":"https://api.github.com/repos/libgit2/libgit2sharp/releases{/id}","created_at":"2011-02-26T16:44:49Z","updated_at":"2015-02-19T07:51:07Z","pushed_at":"2015-02-19T18:30:58Z","git_url":"git://github.com/libgit2/libgit2sharp.git","ssh_url":"git@github.com:libgit2/libgit2sharp.git","clone_url":"https://github.com/libgit2/libgit2sharp.git","svn_url":"https://github.com/libgit2/libgit2sharp","homepage":"http://libgit2.github.com","size":204267,"stargazers_count":710,"watchers_count":710,"language":"C#","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":286,"mirror_url":null,"open_issues_count":124,"forks":286,"open_issues":124,"watchers":710,"default_branch":"vNext"}},"base":{"label":"vNext","ref":"vNext","sha":"9e05f8d2d02aa033683c81e27d098e94c1072a65","user":{"login":"libgit2","id":394745,"avatar_url":"https://avatars.githubusercontent.com/u/394745?v=3","gravatar_id":"","url":"https://api.github.com/users/libgit2","html_url":"https://github.com/libgit2","followers_url":"https://api.github.com/users/libgit2/followers","following_url":"https://api.github.com/users/libgit2/following{/other_user}","gists_url":"https://api.github.com/users/libgit2/gists{/gist_id}","starred_url":"https://api.github.com/users/libgit2/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/libgit2/subscriptions","organizations_url":"https://api.github.com/users/libgit2/orgs","repos_url":"https://api.github.com/users/libgit2/repos","events_url":"https://api.github.com/users/libgit2/events{/privacy}","received_events_url":"https://api.github.com/users/libgit2/received_events","type":"Organization","site_admin":false},"repo":{"id":1415168,"name":"libgit2sharp","full_name":"libgit2/libgit2sharp","owner":{"login":"libgit2","id":394745,"avatar_url":"https://avatars.githubusercontent.com/u/394745?v=3","gravatar_id":"","url":"https://api.github.com/users/libgit2","html_url":"https://github.com/libgit2","followers_url":"https://api.github.com/users/libgit2/followers","following_url":"https://api.github.com/users/libgit2/following{/other_user}","gists_url":"https://api.github.com/users/libgit2/gists{/gist_id}","starred_url":"https://api.github.com/users/libgit2/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/libgit2/subscriptions","organizations_url":"https://api.github.com/users/libgit2/orgs","repos_url":"https://api.github.com/users/libgit2/repos","events_url":"https://api.github.com/users/libgit2/events{/privacy}","received_events_url":"https://api.github.com/users/libgit2/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/libgit2/libgit2sharp","description":"Git + .Net/Mono = ❤","fork":false,"url":"https://api.github.com/repos/libgit2/libgit2sharp","forks_url":"https://api.github.com/repos/libgit2/libgit2sharp/forks","keys_url":"https://api.github.com/repos/libgit2/libgit2sharp/keys{/key_id}","collaborators_url":"https://api.github.com/repos/libgit2/libgit2sharp/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/libgit2/libgit2sharp/teams","hooks_url":"https://api.github.com/repos/libgit2/libgit2sharp/hooks","issue_events_url":"https://api.github.com/repos/libgit2/libgit2sharp/issues/events{/number}","events_url":"https://api.github.com/repos/libgit2/libgit2sharp/events","assignees_url":"https://api.github.com/repos/libgit2/libgit2sharp/assignees{/user}","branches_url":"https://api.github.com/repos/libgit2/libgit2sharp/branches{/branch}","tags_url":"https://api.github.com/repos/libgit2/libgit2sharp/tags","blobs_url":"https://api.github.com/repos/libgit2/libgit2sharp/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/libgit2/libgit2sharp/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/libgit2/libgit2sharp/git/refs{/sha}","trees_url":"https://api.github.com/repos/libgit2/libgit2sharp/git/trees{/sha}","statuses_url":"https://api.github.com/repos/libgit2/libgit2sharp/statuses/{sha}","languages_url":"https://api.github.com/repos/libgit2/libgit2sharp/languages","stargazers_url":"https://api.github.com/repos/libgit2/libgit2sharp/stargazers","contributors_url":"https://api.github.com/repos/libgit2/libgit2sharp/contributors","subscribers_url":"https://api.github.com/repos/libgit2/libgit2sharp/subscribers","subscription_url":"https://api.github.com/repos/libgit2/libgit2sharp/subscription","commits_url":"https://api.github.com/repos/libgit2/libgit2sharp/commits{/sha}","git_commits_url":"https://api.github.com/repos/libgit2/libgit2sharp/git/commits{/sha}","comments_url":"https://api.github.com/repos/libgit2/libgit2sharp/comments{/number}","issue_comment_url":"https://api.github.com/repos/libgit2/libgit2sharp/issues/comments/{number}","contents_url":"https://api.github.com/repos/libgit2/libgit2sharp/contents/{+path}","compare_url":"https://api.github.com/repos/libgit2/libgit2sharp/compare/{base}...{head}","merges_url":"https://api.github.com/repos/libgit2/libgit2sharp/merges","archive_url":"https://api.github.com/repos/libgit2/libgit2sharp/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/libgit2/libgit2sharp/downloads","issues_url":"https://api.github.com/repos/libgit2/libgit2sharp/issues{/number}","pulls_url":"https://api.github.com/repos/libgit2/libgit2sharp/pulls{/number}","milestones_url":"https://api.github.com/repos/libgit2/libgit2sharp/milestones{/number}","notifications_url":"https://api.github.com/repos/libgit2/libgit2sharp/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/libgit2/libgit2sharp/labels{/name}","releases_url":"https://api.github.com/repos/libgit2/libgit2sharp/releases{/id}","created_at":"2011-02-26T16:44:49Z","updated_at":"2015-02-19T07:51:07Z","pushed_at":"2015-02-19T18:30:58Z","git_url":"git://github.com/libgit2/libgit2sharp.git","ssh_url":"git@github.com:libgit2/libgit2sharp.git","clone_url":"https://github.com/libgit2/libgit2sharp.git","svn_url":"https://github.com/libgit2/libgit2sharp","homepage":"http://libgit2.github.com","size":204267,"stargazers_count":710,"watchers_count":710,"language":"C#","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":286,"mirror_url":null,"open_issues_count":124,"forks":286,"open_issues":124,"watchers":710,"default_branch":"vNext"}},"_links":{"self":{"href":"https://api.github.com/repos/libgit2/libgit2sharp/pulls/949"},"html":{"href":"https://github.com/libgit2/libgit2sharp/pull/949"},"issue":{"href":"https://api.github.com/repos/libgit2/libgit2sharp/issues/949"},"comments":{"href":"https://api.github.com/repos/libgit2/libgit2sharp/issues/949/comments"},"review_comments":{"href":"https://api.github.com/repos/libgit2/libgit2sharp/pulls/949/comments"},"review_comment":{"href":"https://api.github.com/repos/libgit2/libgit2sharp/pulls/comments/{number}"},"commits":{"href":"https://api.github.com/repos/libgit2/libgit2sharp/pulls/949/commits"},"statuses":{"href":"https://api.github.com/repos/libgit2/libgit2sharp/statuses/e41ccb1dcfd2db950e2bec98b97d39a9d66e55d5"}}}}