diff --git a/generate/input/callbacks.json b/generate/input/callbacks.json index 215dc5ed9..a94faa030 100644 --- a/generate/input/callbacks.json +++ b/generate/input/callbacks.json @@ -798,6 +798,33 @@ "throttle": 100 } }, + "git_push_transfer_progress": { + "args": [ + { + "name": "current", + "type": "unsigned int" + }, + { + "name": "total", + "type": "unsigned int" + }, + { + "name": "bytes", + "type": "size_t" + }, + { + "name": "payload", + "type": "void *" + } + ], + "return": { + "type": "int", + "noResults": 0, + "success": 0, + "error": -1, + "throttle": 100 + } + }, "git_transport_cb": { "args": [ { diff --git a/generate/input/descriptor.json b/generate/input/descriptor.json index d309a5fd9..a61195040 100644 --- a/generate/input/descriptor.json +++ b/generate/input/descriptor.json @@ -2311,9 +2311,6 @@ "push_negotiation": { "ignore": true }, - "push_transfer_progress": { - "ignore": true - }, "sideband_progress": { "ignore": true }, diff --git a/generate/input/libgit2-supplement.json b/generate/input/libgit2-supplement.json index b90b20697..e1fb11d3b 100644 --- a/generate/input/libgit2-supplement.json +++ b/generate/input/libgit2-supplement.json @@ -698,6 +698,11 @@ "type": "git_transfer_progress_cb", "name": "transfer_progress" }, + { + "type": "git_push_transfer_progress", + "name": "push_transfer_progress", + "isCallback": true + }, { "type": "git_transport_cb", "name": "transport", diff --git a/generate/scripts/helpers.js b/generate/scripts/helpers.js index 1effd02c7..b9a67dc06 100644 --- a/generate/scripts/helpers.js +++ b/generate/scripts/helpers.js @@ -84,8 +84,8 @@ var Helpers = { }); }, - isCallbackFunction: function(cType) { - return callbackTypePattern.test(cType); + isCallbackFunction: function(cType, isCallback) { + return isCallback === true || callbackTypePattern.test(cType); }, isPayloadFor: function(cbField, payloadName) { @@ -228,7 +228,7 @@ var Helpers = { field.jsClassName = utils.titleCase(Helpers.cTypeToJsName(field.type)); field.ownedByThis = true; - if (Helpers.isCallbackFunction(field.cType)) { + if (Helpers.isCallbackFunction(field.cType, field.isCallback)) { Helpers.processCallback(field); var argOverrides = fieldOverrides.args || {}; diff --git a/test/tests/remote.js b/test/tests/remote.js index 57d77517d..ff6004c66 100644 --- a/test/tests/remote.js +++ b/test/tests/remote.js @@ -5,6 +5,7 @@ var _ = require("lodash"); var fp = require("lodash/fp"); var garbageCollect = require("../utils/garbage_collect.js"); +var RepoUtils = require("../utils/repository_setup"); describe("Remote", function() { var NodeGit = require("../../"); @@ -12,6 +13,7 @@ describe("Remote", function() { var Remote = NodeGit.Remote; var reposPath = local("../repos/workdir"); + var bareReposPath = local("../repos/bare"); var url = "https://github.com/nodegit/test"; var url2 = "https://github.com/nodegit/test2"; var privateUrl = "git@github.com:nodegit/private"; @@ -44,6 +46,9 @@ describe("Remote", function() { test.remote = remote; return removeNonOrigins(test.repository); + }) + .then(function() { + return RepoUtils.createRepository(bareReposPath, 1); }); }); @@ -129,6 +134,59 @@ describe("Remote", function() { }); }); + it("can monitor transfer progress while pushing", function() { + var repo = this.repository; + var wasCalled = false; + + return Remote.create(repo, "bare", bareReposPath) + .then(function(remote) { + var fetchOpts = { + callbacks: { + pushTransferProgress: function() { + wasCalled = true; + } + } + }; + + var ref = "refs/heads/master"; + var refs = [ref + ":" + ref]; + + return remote.push(refs, fetchOpts) + .then(function(res) { + assert.ok(wasCalled); + }); + }); + }); + + it("can monitor transfer progress while pushing with throttling", + function() { + var repo = this.repository; + var wasCalled = false; + + return Remote.create(repo, "bare", bareReposPath) + .then(function(remote) { + var fetchOpts = { + callbacks: { + pushTransferProgress: { + throttle: 200, + callback: function() { + wasCalled = true; + }, + } + } + }; + + var ref = "refs/heads/master"; + var refs = [ref + ":" + ref]; + + return remote.push(refs, fetchOpts) + .then(function(res) { + assert.ok(wasCalled); + }); + }); + } + ); + it("can monitor transfer progress while downloading", function() { // Set a reasonable timeout here now that our repository has grown. this.timeout(600000); diff --git a/test/utils/repository_setup.js b/test/utils/repository_setup.js index c5d6ab3e2..5dc22eb6a 100644 --- a/test/utils/repository_setup.js +++ b/test/utils/repository_setup.js @@ -49,14 +49,15 @@ var RepositorySetup = { }, createRepository: - function createRepository(repoPath){ + function createRepository(repoPath, isBare){ // Create a new repository in a clean directory return fse.remove(repoPath) .then(function() { return fse.ensureDir(repoPath); }) .then(function() { - return NodeGit.Repository.init(repoPath, 0); + var bare = typeof isBare !== "undefined" ? isBare : 0; + return NodeGit.Repository.init(repoPath, bare); }); },