From a336802a4f614d0b2b312e3ca3745cd9f1b543ca Mon Sep 17 00:00:00 2001 From: Kyle Smith Date: Tue, 19 Apr 2016 12:50:43 -0700 Subject: [PATCH] Added git_diff_merge --- generate/input/descriptor.json | 10 +++++- test/tests/diff.js | 61 +++++++++++++++++++++++++++++++++- 2 files changed, 69 insertions(+), 2 deletions(-) diff --git a/generate/input/descriptor.json b/generate/input/descriptor.json index c8e45d87f..b4577b092 100644 --- a/generate/input/descriptor.json +++ b/generate/input/descriptor.json @@ -741,7 +741,15 @@ "ignore": true }, "git_diff_merge": { - "ignore": true + "isAsync": true, + "args": { + "onto": { + "isSelf": true + } + }, + "return": { + "isErrorCode": true + } }, "git_diff_num_deltas_of_type": { "ignore": true diff --git a/test/tests/diff.js b/test/tests/diff.js index 7ce87275c..4b2cdfe33 100644 --- a/test/tests/diff.js +++ b/test/tests/diff.js @@ -1,9 +1,31 @@ var assert = require("assert"); var path = require("path"); var promisify = require("promisify-node"); +var _ = require("lodash"); var fse = promisify(require("fs-extra")); var local = path.join.bind(path, __dirname); +function getLinesFromDiff(diff) { + return diff.patches() + .then(function(patches) { + return Promise.all(_.map(patches, function(patch) { + return patch.hunks(); + })); + }) + .then(function(listsOfHunks) { + var hunks = _.flatten(listsOfHunks); + return Promise.all(_.map(hunks, function(hunk) { + return hunk.lines(); + })); + }) + .then(function(listsOfLines) { + var lines = _.flatten(listsOfLines); + return _.map(lines, function(line) { + return line.content(); + }); + }); +} + describe("Diff", function() { var NodeGit = require("../../"); var Repository = NodeGit.Repository; @@ -144,7 +166,7 @@ describe("Diff", function() { }); }); - it("can resolve individual line chages from the patch hunks", function() { + it("can resolve individual line changes from the patch hunks", function() { return this.workdirDiff.patches() .then(function(patches) { var result = []; @@ -326,6 +348,43 @@ describe("Diff", function() { }); }); + + it("can merge two diffs", function() { + var linesOfFirstDiff; + var linesOfSecondDiff; + var firstDiff = this.diff[0]; + var secondDiff; + var oid = "c88d39e70585199425b111c6a2c7fa7b4bc617ad"; + return this.repository.getCommit(oid) + .then(function(testCommit) { + return testCommit.getDiff(); + }) + .then(function(_secondDiff) { + secondDiff = _secondDiff[0]; + return Promise.all([ + getLinesFromDiff(firstDiff), + getLinesFromDiff(secondDiff) + ]); + }) + .then(function(listOfLines) { + linesOfFirstDiff = listOfLines[0]; + linesOfSecondDiff = listOfLines[1]; + return firstDiff.merge(secondDiff); + }) + .then(function() { + return getLinesFromDiff(firstDiff); + }) + .then(function(linesOfMergedDiff) { + var allDiffLines = _.flatten([ + linesOfFirstDiff, + linesOfSecondDiff + ]); + _.forEach(allDiffLines, function(diffLine) { + assert.ok(_.includes(linesOfMergedDiff, diffLine)); + }); + }); + }); + // This wasn't working before. It was only passing because the promise chain // was broken it.skip("can find similar files in a diff", function() {