diff --git a/generate/input/callbacks.json b/generate/input/callbacks.json index aa0842995..17722c28e 100644 --- a/generate/input/callbacks.json +++ b/generate/input/callbacks.json @@ -948,6 +948,30 @@ "throttle": 100 } }, + "git_push_negotiation": { + "args": [ + { + "name": "updates", + "type": "const git_push_update **" + }, + { + "name": "len", + "type": "size_t" + }, + { + "name": "payload", + "type": "void *" + } + ], + "return": { + "type": "int", + "noResults": 0, + "success": 0, + "error": -1, + "cancel": -1, + "throttle": 100 + } + }, "git_transport_cb": { "args": [ { diff --git a/generate/input/descriptor.json b/generate/input/descriptor.json index bf0efcd0a..b89abe3d1 100644 --- a/generate/input/descriptor.json +++ b/generate/input/descriptor.json @@ -3605,7 +3605,24 @@ "ignore": true }, "push_negotiation": { - "ignore": true + "args": [ + { + "name": "updates", + "cType": "const git_push_update **", + "cppClassName": "Array", + "jsClassName": "Array", + "arrayElementCppClassName": "GitPushUpdate", + "arrayLengthArgumentName": "len" + }, + { + "name": "len", + "ctype": "size_t" + }, + { + "name": "payload", + "ctype": "void *" + } + ] }, "sideband_progress": { "ignore": false diff --git a/generate/input/libgit2-supplement.json b/generate/input/libgit2-supplement.json index 557410cfc..e41067a84 100644 --- a/generate/input/libgit2-supplement.json +++ b/generate/input/libgit2-supplement.json @@ -1667,6 +1667,11 @@ "type": "git_push_update_reference_cb", "name": "push_update_reference" }, + { + "type": "git_push_negotiation", + "name": "push_negotiation", + "isCallback": true + }, { "type": "void *", "name": "payload" diff --git a/test/tests/remote.js b/test/tests/remote.js index c9bf8192c..2952624a0 100644 --- a/test/tests/remote.js +++ b/test/tests/remote.js @@ -243,6 +243,57 @@ describe("Remote", function() { }); }); + it("can negotiate push", function() { + var repo = this.repository; + var wasCalled = false; + + return Remote.create(repo, "bare", bareReposPath) + .then(function(remote) { + var fetchOpts = { + callbacks: { + pushNegotiation: function(update_list, len) { + wasCalled = true; + return NodeGit.Error.CODE.OK; + } + } + }; + + var ref = "refs/heads/master"; + var refs = [ref + ":" + ref]; + + return remote.push(refs, fetchOpts) + .then(function(res) { + assert.ok(wasCalled); + }); + }); + }); + + it("can reject push during negotiation", function() { + var repo = this.repository; + + return Remote.create(repo, "bare", bareReposPath) + .then(function(remote) { + var fetchOpts = { + callbacks: { + pushNegotiation: function(update_list, len) { + return NodeGit.Error.CODE.ERROR; + } + } + }; + + var ref = "refs/heads/master"; + var refs = [ref + ":" + ref]; + + return remote.push(refs, fetchOpts); + }) + .then(function() { + assert.fail("push should not succeed"); + }) + .catch(function(err) { + assert.notEqual(err.code, "ERR_ASSERTION"); + }); + }); + it("can get the default branch of a remote", function() { var remoteCallbacks = { certificateCheck: () => 0