var assert = require("assert");
var path = require("path");
var local = path.join.bind(path, __dirname);
var Promise = require("nodegit-promise");
describe("Tag", function() {
var NodeGit = require("../../");
var Repository = NodeGit.Repository;
var Tag = NodeGit.Tag;
var Obj = NodeGit.Object;
var Oid = NodeGit.Oid;
var Reference = NodeGit.Reference;
var reposPath = local("../repos/workdir");
var tagName = "annotated-tag";
var tagFullName = "refs/tags/" + tagName;
var tagOid = "dc800017566123ff3c746b37284a24a66546667e";
var commitPointedTo = "32789a79e71fbc9e04d3eff7425e1771eb595150";
var tagMessage = "This is an annotated tag\n";
function testTag(tag, name) {
assert.equal(tag.name(), name || tagName);
assert.equal(tag.targetType(), Obj.TYPE.COMMIT);
assert.equal(tag.message(), tagMessage);
var target = tag.target();
assert.ok(target.isCommit());
assert.equal(target.id().toString(), commitPointedTo);
}
beforeEach(function() {
var test = this;
return Repository.open(reposPath)
.then(function(repo) {
test.repository = repo;
});
});
it("can get a tag from a repo via the tag name", function() {
return this.repository.getTagByName(tagName)
.then(function(tag) {
testTag(tag);
});
});
it("can get a tag from a repo via the long tag name", function() {
return this.repository.getTagByName(tagFullName)
.then(function(tag) {
testTag(tag);
});
});
it("can get a tag from a repo via the tag's OID as a string", function() {
return this.repository.getTag(tagOid)
.then(function(tag) {
testTag(tag);
});
});
it("can get a tag from a repo via the tag's OID object", function() {
var oid = Oid.fromString(tagOid);
return this.repository.getTag(oid)
.then(function(tag) {
testTag(tag);
});
});
it("can list tags in a repo", function() {
return Tag.list(this.repository)
.then(function(tagNames) {
tagNames = tagNames.filter(function(tagNameTest) {
return tagNameTest == tagName;
});
assert.equal(tagNames.length, 1);
});
});
it("can create a new annotated tag in a repo and delete it", function() {
var oid = Oid.fromString(commitPointedTo);
var name = "created-annotated-tag";
var repository = this.repository;
return repository.createTag(oid, name, tagMessage)
.then(function(tag) {
testTag(tag, name);
})
.then(function() {
return repository.createTag(oid, name, tagMessage);
})
.then(function() {
return Promise.reject(new Error("should not be able to create the '" +
name + "' tag twice"));
}, function() {
return Promise.resolve();
})
.then(function() {
return repository.deleteTagByName(name);
})
.then(function() {
return Reference.lookup(repository, "refs/tags/" + name);
})
.then(function() {
return Promise.reject(new Error("the tag '" + name +
"' should not exist"));
}, function() {
return Promise.resolve();
});
});
it("can create a new lightweight tag in a repo and delete it", function() {
var oid = Oid.fromString(commitPointedTo);
var name = "created-lightweight-tag";
var repository = this.repository;
return repository.createLightweightTag(oid, name)
.then(function(reference) {
return reference.target();
})
.then(function(refOid) {
assert.equal(refOid.toString(), oid.toString());
})
.then(function() {
return repository.createLightweightTag(oid, name);
})
.then(function() {
return Promise.reject(new Error("should not be able to create the '" +
name + "' tag twice"));
}, function() {
return Promise.resolve();
})
.then(function() {
return repository.deleteTagByName(name);
})
.then(function() {
return Reference.lookup(repository, "refs/tags/" + name);
})
.then(function() {
return Promise.reject(new Error("the tag '" + name +
"' should not exist"));
}, function() {
return Promise.resolve();
});
});
});