var assert = require("assert");
var path = require("path");
var local = path.join.bind(path, __dirname);
describe("Revwalk", function() {
var NodeGit = require("../../");
var Repository = NodeGit.Repository;
var Revwalk = NodeGit.Revwalk;
var Oid = NodeGit.Oid;
var reposPath = local("../repos/workdir");
// Set a reasonable timeout here now that our repository has grown.
this.timeout(120000);
beforeEach(function() {
var test = this;
return Repository.open(reposPath)
.then(function(repository) {
test.repository = repository;
return test.repository.getBranchCommit("rev-walk");
})
.then(function(commit) {
test.commit = commit;
});
});
beforeEach(function() {
this.walker = this.repository.createRevWalk();
this.walker.push(this.commit.id());
});
it("can create a walker", function() {
assert.ok(this.walker instanceof Revwalk);
});
it("can push an object", function() {
var sha = this.commit.sha();
return this.walker.next()
.then(function(commit) {
assert.equal(sha, commit);
});
});
it("can hide an object", function() {
var test = this;
return next(test.walker, 4)
.then(function(commit) {
assert.equal(commit.toString(),
"b8a94aefb22d0534cc0e5acf533989c13d8725dc");
test.walker = test.repository.createRevWalk();
test.walker.push(test.commit.id());
test.walker.hide(
Oid.fromString("b8a94aefb22d0534cc0e5acf533989c13d8725dc"));
return next(test.walker, 3);
})
.then(function(commit) {
assert.equal(commit.toString(),
"95f695136203a372751c19b6353aeb5ae32ea40e");
return next(test.walker, 1);
})
.then(function(commit) {
assert.equal(commit, undefined);
});
});
it("can simplify to first parent", function() {
var test = this;
test.walker.simplifyFirstParent();
return next(test.walker, 3)
.then(function(commit) {
assert.equal(commit.toString(),
"b8a94aefb22d0534cc0e5acf533989c13d8725dc");
});
});
it("can get a specified number of commits", function() {
var test = this;
var storedCommits;
return test.walker.getCommits()
.then(function(commits) {
assert.equal(commits.length, 10);
storedCommits = commits;
test.walker = test.repository.createRevWalk();
test.walker.push(test.commit.id());
return test.walker.getCommits(8);
})
.then(function(commits) {
assert.equal(commits.length, 8);
for (var i = 0; i < 8; i++) {
assert.equal(commits[i].toString(), storedCommits[i].toString());
}
});
});
it("can get commits until you tell it not to", function() {
var test = this;
var magicSha = "b8a94aefb22d0534cc0e5acf533989c13d8725dc";
function checkCommit(commit) {
return commit.toString() != magicSha;
}
return test.walker.getCommitsUntil(checkCommit)
.then(function(commits) {
assert.equal(commits.length, 4);
assert.equal(commits[commits.length-1].toString(), magicSha);
});
});
// This test requires forcing garbage collection, so mocha needs to be run
// via node rather than npm, with a la `node --expose-gc [pathtohmoca]
// [testglob]`
var testGC = global.gc ? it : it.skip;
testGC("doesnt segfault when accessing .author() twice", function(done) {
Repository.open(reposPath).then(function(repository) {
var walker = repository.createRevWalk();
repository.getMasterCommit().then(function(firstCommitOnMaster) {
walker.walk(firstCommitOnMaster, function(err, commit) {
if (!err && !commit) {
return done();
}
for (var i = 0; i < 500; i++) {
commit.author().name();
commit.author().email();
if ( i % 250 === 0) {
global.gc();
}
}
});
});
});
});
function next(walker, count) {
var promise = null;
for (var i = 0; i < count; i++) {
if (!promise) {
promise = walker.next();
}
else {
promise = promise.then(getNext);
}
}
return promise;
function getNext() {
return walker.next();
}
}
});