diff --git a/src/diff-parser.js b/src/diff-parser.js index cb1a8ce..0ffc395 100644 --- a/src/diff-parser.js +++ b/src/diff-parser.js @@ -28,6 +28,7 @@ var currentFile = null; var currentBlock = null; var oldLine = null; + var oldLine2 = null; // Used for combined diff var newLine = null; var saveBlock = function() { @@ -67,22 +68,41 @@ var values; - if (values = /^@@ -(\d+),\d+ \+(\d+),\d+ @@.*/.exec(line)) { + /** + * From Range: + * -[,] + * + * To Range: + * +[,] + * + * @@ from-file-range to-file-range @@ + * + * @@@ from-file-range from-file-range to-file-range @@@ + * + * number of lines is optional, if omited consider 0 + */ + + if (values = /^@@ -(\d+)(?:,\d+)? \+(\d+)(?:,\d+)? @@.*/.exec(line)) { currentFile.isCombined = false; - } else if (values = /^@@@ -(\d+),\d+ -\d+,\d+ \+(\d+),\d+ @@@.*/.exec(line)) { + oldLine = values[1]; + newLine = values[2]; + } else if (values = /^@@@ -(\d+)(?:,\d+)? -(\d+)(?:,\d+)? \+(\d+)(?:,\d+)? @@@.*/.exec(line)) { currentFile.isCombined = true; + oldLine = values[1]; + oldLine2 = values[2]; + newLine = values[3]; } else { - values = [0, 0]; + console.error("Failed to parse lines, starting in 0!"); + oldLine = 0; + newLine = 0; currentFile.isCombined = false; } - oldLine = values[1]; - newLine = values[2]; - /* Create block metadata */ currentBlock = {}; currentBlock.lines = []; currentBlock.oldStartLine = oldLine; + currentBlock.oldStartLine2 = oldLine2; currentBlock.newStartLine = newLine; currentBlock.header = line; }; diff --git a/test/diff-parser-tests.js b/test/diff-parser-tests.js index d9789e0..9aac03f 100644 --- a/test/diff-parser-tests.js +++ b/test/diff-parser-tests.js @@ -374,5 +374,31 @@ describe('DiffParser', function() { assert.equal(86, file1.unchangedPercentage); }); + it('should parse diffs correct line numbers', function() { + var diff = + 'diff --git a/sample b/sample\n' + + 'index 0000001..0ddf2ba\n' + + '--- a/sample\n' + + '+++ b/sample\n' + + '@@ -1 +1,2 @@\n' + + '-test\n' + + '+test1r\n'; + + var result = Diff2Html.getJsonFromDiff(diff); + assert.equal(1, result.length); + + var file1 = result[0]; + assert.equal(1, file1.addedLines); + assert.equal(1, file1.deletedLines); + assert.equal('sample', file1.oldName); + assert.equal('sample', file1.newName); + assert.equal(1, file1.blocks.length); + assert.equal(2, file1.blocks[0].lines.length); + assert.equal(1, file1.blocks[0].lines[0].oldNumber); + assert.equal(null, file1.blocks[0].lines[0].newNumber); + assert.equal(null, file1.blocks[0].lines[1].oldNumber); + assert.equal(1, file1.blocks[0].lines[1].newNumber); + }); + }); });