From fc8ff1f1c8a4a5cad88c0735157f3227fc508c6e Mon Sep 17 00:00:00 2001 From: Steve Smith Date: Mon, 2 Mar 2015 14:23:55 -0500 Subject: [PATCH] Add Diff.prototype.findSimilar Also DiffFindOptions --- generate/input/descriptor.json | 19 ++++++++++++--- lib/diff.js | 7 ++++++ test/tests/diff.js | 43 +++++++++++++++++++++++++++++----- 3 files changed, 60 insertions(+), 9 deletions(-) diff --git a/generate/input/descriptor.json b/generate/input/descriptor.json index 46c2fb99a..b1aaf8024 100644 --- a/generate/input/descriptor.json +++ b/generate/input/descriptor.json @@ -524,7 +524,20 @@ "ignore": true }, "git_diff_find_similar": { - "ignore": true + "args": { + "diff": { + "isSelf": true + }, + "options": { + "isOptional": true + } + }, + "return": { + "cppClassName": "Number", + "jsClassName": "Number", + "isErrorCode": true + }, + "isAsync": true }, "git_diff_foreach": { "ignore": true @@ -639,12 +652,12 @@ } }, "diff_find_options": { + "hasConstructor": true, "fields": { "git_diff_similarity_metric": { "ignore": true } - }, - "ignore": true + } }, "diff_format_email_options": { "ignore": true diff --git a/lib/diff.js b/lib/diff.js index b0e2eaecf..9f4686c6f 100644 --- a/lib/diff.js +++ b/lib/diff.js @@ -56,4 +56,11 @@ Diff.treeToWorkdirWithIndex = function(repo, tree, opts) { return treeToWorkdirWithIndex(repo, tree, opts); }; +// Override Diff.findSimilar to normalize opts +var findSimilar = Diff.prototype.findSimilar; +Diff.prototype.findSimilar = function(opts) { + opts = normalizeOptions(opts, NodeGit.DiffFindOptions); + return findSimilar.call(this, opts); +}; + module.exports = Diff; diff --git a/test/tests/diff.js b/test/tests/diff.js index af5c8a259..a47930f6e 100644 --- a/test/tests/diff.js +++ b/test/tests/diff.js @@ -14,6 +14,12 @@ describe("Diff", function() { var diffFilename = "wddiff.txt"; var diffFilepath = local("../repos/workdir", diffFilename); + var moveFromFile = "README.md"; + var moveToFile = "MOVED_README.md"; + + var moveFromPath = local("../repos/workdir", moveFromFile); + var moveToPath = local("../repos/workdir", moveToFile); + beforeEach(function() { var test = this; @@ -45,6 +51,9 @@ describe("Diff", function() { return fse.writeFile(diffFilepath, "1 line\n2 line\n3 line\n\n4"); }) + .then(function() { + return fse.move(moveFromPath, moveToPath); + }) .then(function() { return Diff.treeToWorkdirWithIndex( test.repository, @@ -56,7 +65,10 @@ describe("Diff", function() { test.workdirDiff = workdirDiff; }) .then(function() { - var opts = { flags: Diff.OPTION.INCLUDE_UNTRACKED }; + var opts = { + flags: Diff.OPTION.INCLUDE_UNTRACKED | + Diff.OPTION.RECURSE_UNTRACKED_DIRS + }; return Diff.indexToWorkdir(test.repository, test.index, opts); }) @@ -66,6 +78,9 @@ describe("Diff", function() { .then(function() { return fse.remove(diffFilepath); }) + .then(function() { + return fse.move(moveToPath, moveFromPath); + }) .catch(function(e) { return fse.remove(diffFilepath) .then(function() { @@ -106,14 +121,14 @@ describe("Diff", function() { it("can diff the workdir with index", function() { var patches = this.workdirDiff.patches(); - assert.equal(patches.length, 1); - assert(patches[0].isUntracked()); + assert.equal(patches.length, 3); + assert(patches[2].isUntracked()); - var oldFile = patches[0].delta.oldFile(); + var oldFile = patches[2].delta.oldFile(); assert.equal(oldFile.path(), "wddiff.txt"); assert.equal(oldFile.size(), 0); - var newFile = patches[0].delta.newFile(); + var newFile = patches[2].delta.newFile(); assert.equal(newFile.path(), "wddiff.txt"); assert.equal(newFile.size(), 23); }); @@ -151,6 +166,22 @@ describe("Diff", function() { }); it("can diff index to workdir", function() { - assert.equal(this.indexToWorkdirDiff.patches().length, 1); + assert.equal(this.indexToWorkdirDiff.patches().length, 3); + }); + + it("can find similar files in a diff", function() { + var diff = this.indexToWorkdirDiff; + var opts = { + flags: Diff.FIND.RENAMES | + Diff.FIND.RENAMES_FROM_REWRITES | + Diff.FIND.FOR_UNTRACKED + }; + + assert.equal(diff.patches().length, 3); + + diff.findSimilar(opts).then(function() { + // Renamed file now treated as one diff, so 3 patches -> 2 + assert.equal(diff.patches().length, 2); + }); }); });