var assert = require("assert"); var path = require("path"); var Promise = require("nodegit-promise"); var local = path.join.bind(path, __dirname); describe("Remote", function() { var NodeGit = require("../../"); var Repository = NodeGit.Repository; var Remote = NodeGit.Remote; var reposPath = local("../repos/workdir"); var url = "https://github.com/nodegit/test"; var url2 = "https://github.com/nodegit/test2"; function removeOrigins(repository) { Remote.delete(repository, "origin1"); Remote.delete(repository, "origin2"); Remote.delete(repository, "origin3"); Remote.delete(repository, "test2"); } beforeEach(function() { var test = this; return Repository.open(reposPath) .then(function(repository) { test.repository = repository; return Remote.lookup(repository, "origin"); }) .then(function(remote) { test.remote = remote; return removeOrigins(test.repository); }); }); after(function() { return removeOrigins(this.repository); }); it("can load a remote", function() { assert.ok(this.remote instanceof Remote); }); it("can read the remote url", function() { assert.equal( this.remote.url().replace(".git", ""), url); }); it("has an empty pushurl by default", function() { assert.equal(this.remote.pushurl(), undefined); }); it("can set a remote", function() { var repository = this.repository; var remote = Remote.create(repository, "origin1", url); remote.setPushurl("https://google.com/"); assert(remote.pushurl(), "https://google.com/"); }); it("can read the remote name", function() { assert.equal(this.remote.name(), "origin"); }); it("can create and load a new remote", function() { var repository = this.repository; var remote = Remote.create(repository, "origin2", url); return Remote.lookup(repository, "origin2").then(function() { assert(remote.url(), url); }); }); it("can delete a remote", function() { var repository = this.repository; Remote.create(repository, "origin3", url); Remote.delete(repository, "origin3"); return Remote.lookup(repository, "origin3") .then(Promise.reject, Promise.resolve); }); it("can download from a remote", function() { var repo = this.repository; return repo.getRemote("origin") .then(function(remote) { remote.setCallbacks({ certificateCheck: function() { return 1; } }); return remote.connect(NodeGit.Enums.DIRECTION.FETCH) .then(function() { return remote.download(null); }).then(function() { return remote.disconnect(); }); }); }); it("can monitor transfer progress while downloading", function() { // Set a reasonable timeout here now that our repository has grown. this.timeout(600000); var repo = this.repository; var wasCalled = false; Remote.create(repo, "test2", url2); return repo.getRemote("test2") .then(function(remote) { remote.setCallbacks({ credentials: function(url, userName) { return NodeGit.Cred.sshKeyFromAgent(userName); }, certificateCheck: function() { return 1; }, transferProgress: function() { wasCalled = true; } }); return remote.fetch(null, repo.defaultSignature(), null); }) .then(function() { assert.ok(wasCalled); Remote.delete(repo, "test2"); }); }); it("can fetch from a remote", function() { return this.repository.fetch("origin", { credentials: function(url, userName) { return NodeGit.Cred.sshKeyFromAgent(userName); }, certificateCheck: function() { return 1; } }); }); it("can fetch from all remotes", function() { // Set a reasonable timeout here for the fetchAll test this.timeout(15000); return this.repository.fetchAll({ credentials: function(url, userName) { return NodeGit.Cred.sshKeyFromAgent(userName); }, certificateCheck: function() { return 1; } }); }); it("cannot push to a repository", function() { this.timeout(5000); var repo = this.repository; var branch = "should-not-exist"; return Remote.lookup(repo, "origin") .then(function(remote) { remote.setCallbacks({ credentials: function(url, userName) { if (url.indexOf("https") === -1) { return NodeGit.Cred.sshKeyFromAgent(userName); } else { return NodeGit.Cred.userpassPlaintextNew(userName, ""); } }, certificateCheck: function() { return 1; } }); return remote; }) .then(function(remote) { var ref = "refs/heads/" + branch; var refs = [ref + ":" + ref]; var signature = repo.defaultSignature(); return remote.push(refs, null, signature, "Pushed '" + branch + "' for test"); }) .then(function() { return Promise.reject( new Error("should not be able to push to the repository")); }, function(err) { if (err.message.indexOf(401) === -1) { throw err; } else { return Promise.resolve(); } }); }); });