var assert = require("assert"); var NodeGit = require("../../"); var path = require("path"); var promisify = require("promisify-node"); var fse = promisify(require("fs-extra")); var RepositorySetup = { addFileToIndex: function addFileToIndex(repository, fileName) { return repository.refreshIndex() .then(function(index) { return index.addByPath(fileName) .then(function() { return index.write(); }) .then(function() { return index.writeTree(); }); }); }, commitFileToRepo: function commitFileToRepo(repository, fileName, fileContent, parentCommit) { var repoWorkDir = repository.workdir(); var signature = NodeGit.Signature.create("Foo bar", "foo@bar.com", 123456789, 60); var filePath = path.join(repoWorkDir, fileName); var parents = []; if (parentCommit) { parents.push(parentCommit); } // fse.ensure allows us to write files inside new folders return fse.ensureFile(filePath) .then(function() { return fse.writeFile(filePath, fileContent); }) .then(function() { return RepositorySetup.addFileToIndex(repository, fileName); }) .then(function(oid) { return repository.createCommit("HEAD", signature, signature, "initial commit", oid, parents); }) .then(function(commitOid) { return repository.getCommit(commitOid); }); }, createRepository: function createRepository(repoPath){ // 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); }); }, // Expects empty repo setupBranches: function setupBranches(repository, checkoutOurs) { var repoWorkDir = repository.workdir(); var ourBranchName = "ours"; var theirBranchName = "theirs"; var baseFileName = "baseNewFile.txt"; var ourFileName = "ourNewFile.txt"; var theirFileName = "theirNewFile.txt"; var baseFileContent = "How do you feel about Toll Roads?"; var ourFileContent = "I like Toll Roads. I have an EZ-Pass!"; var theirFileContent = "I'm skeptical about Toll Roads"; var ourSignature = NodeGit.Signature.create ("Ron Paul", "RonPaul@TollRoadsRBest.info", 123456789, 60); var theirSignature = NodeGit.Signature.create ("Greg Abbott", "Gregggg@IllTollYourFace.us", 123456789, 60); var initialCommit; var ourBranch; var theirBranch; var ret = { ourBranchName: ourBranchName, theirBranchName: theirBranchName, ourSignature: ourSignature, theirSignature: theirSignature, ourFileName: ourFileName, theirFileName: theirFileName, ourFileContent: ourFileContent, theirFileContent: theirFileContent }; return Promise.all([ fse.writeFile(path.join(repoWorkDir, baseFileName), baseFileContent), fse.writeFile(path.join(repoWorkDir, ourFileName), ourFileContent), fse.writeFile(path.join(repoWorkDir, theirFileName), theirFileContent) ]) .then(function() { return RepositorySetup.addFileToIndex(repository, baseFileName); }) .then(function(oid) { assert.equal(oid.toString(), "b5cdc109d437c4541a13fb7509116b5f03d5039a"); return repository.createCommit( "HEAD", ourSignature, ourSignature, "initial commit", oid, []); }) .then(function(commitOid) { assert.equal(commitOid.toString(), "be03abdf0353d05924c53bebeb0e5bb129cda44a"); return repository.getCommit(commitOid); }) .then(function(commit) { ret.initialCommit = initialCommit = commit; return Promise.all([ repository.createBranch(ourBranchName, initialCommit), repository.createBranch(theirBranchName, initialCommit) ]); }) .then(function(branches) { assert(branches[0]); assert(branches[1]); ret.ourBranch = ourBranch = branches[0]; ret.theirBranch = theirBranch = branches[1]; return RepositorySetup.addFileToIndex(repository, ourFileName); }) .then(function(oid) { assert.equal(oid.toString(), "77867fc0bfeb3f80ab18a78c8d53aa3a06207047"); return repository.createCommit(ourBranch.name(), ourSignature, ourSignature, "we made a commit", oid, [initialCommit]); }) .then(function(commitOid) { return repository.getCommit(commitOid); }) .then(function(commit) { ret.ourCommit = commit; return NodeGit.Reset.default( repository, initialCommit, ourFileName); }) .then(function() { return RepositorySetup.addFileToIndex( repository, theirFileName); }) .then(function(oid) { assert.equal(oid.toString(), "be5f0fd38a39a67135ad68921c93cd5c17fefb3d"); return repository.createCommit( theirBranch.name(), theirSignature, theirSignature, "they made a commit", oid, [initialCommit]); }) .then(function(commitOid) { return repository.getCommit(commitOid); }) .then(function(commit) { ret.theirCommit = commit; return NodeGit.Reset.default( repository, initialCommit, theirFileName); }) .then(function() { return Promise.all([ fse.remove(path.join(repoWorkDir, ourFileName)), fse.remove(path.join(repoWorkDir, theirFileName)) ]); }) .then(function() { if (checkoutOurs) { var opts = { checkoutStrategy: NodeGit.Checkout.STRATEGY.FORCE }; return repository.checkoutBranch(ourBranchName, opts); } }) .then(function() { return ret; }); } }; module.exports = RepositorySetup;