Merge pull request #73 from rtfpessoa/support-unified-diffs
Add support for parsing unified diffs
This commit is contained in:
commit
2b05eaf0fa
4 changed files with 345 additions and 266 deletions
|
|
@ -228,7 +228,13 @@
|
||||||
" </test>\n" +
|
" </test>\n" +
|
||||||
" -->\n" +
|
" -->\n" +
|
||||||
"+\n" +
|
"+\n" +
|
||||||
"+\n";
|
"+\n" +
|
||||||
|
"--- a/sample.js\n" +
|
||||||
|
"+++ b/sample.js\n" +
|
||||||
|
"@@ -1 +1,2 @@\n" +
|
||||||
|
"-test\n" +
|
||||||
|
"+test1r\n" +
|
||||||
|
"+test2r\n";
|
||||||
|
|
||||||
$(document).ready(function() {
|
$(document).ready(function() {
|
||||||
var diff2htmlUi = new Diff2HtmlUI({diff: lineDiffExample});
|
var diff2htmlUi = new Diff2HtmlUI({diff: lineDiffExample});
|
||||||
|
|
|
||||||
|
|
@ -33,32 +33,30 @@
|
||||||
var oldLine2 = null; // Used for combined diff
|
var oldLine2 = null; // Used for combined diff
|
||||||
var newLine = null;
|
var newLine = null;
|
||||||
|
|
||||||
var saveBlock = function() {
|
|
||||||
|
|
||||||
/* Add previous block(if exists) before start a new file */
|
/* Add previous block(if exists) before start a new file */
|
||||||
|
var saveBlock = function() {
|
||||||
if (currentBlock) {
|
if (currentBlock) {
|
||||||
currentFile.blocks.push(currentBlock);
|
currentFile.blocks.push(currentBlock);
|
||||||
currentBlock = null;
|
currentBlock = null;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
var saveFile = function() {
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Add previous file(if exists) before start a new one
|
* Add previous file(if exists) before start a new one
|
||||||
* if it has name (to avoid binary files errors)
|
* if it has name (to avoid binary files errors)
|
||||||
*/
|
*/
|
||||||
|
var saveFile = function() {
|
||||||
if (currentFile && currentFile.newName) {
|
if (currentFile && currentFile.newName) {
|
||||||
files.push(currentFile);
|
files.push(currentFile);
|
||||||
currentFile = null;
|
currentFile = null;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/* Create file structure */
|
||||||
var startFile = function() {
|
var startFile = function() {
|
||||||
saveBlock();
|
saveBlock();
|
||||||
saveFile();
|
saveFile();
|
||||||
|
|
||||||
/* Create file structure */
|
|
||||||
currentFile = {};
|
currentFile = {};
|
||||||
currentFile.blocks = [];
|
currentFile.blocks = [];
|
||||||
currentFile.deletedLines = 0;
|
currentFile.deletedLines = 0;
|
||||||
|
|
@ -179,18 +177,72 @@
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
var values = [];
|
if (
|
||||||
if (utils.startsWith(line, 'diff')) {
|
utils.startsWith(line, 'diff') || // Git diffs always start with diff
|
||||||
|
!currentFile || // If we do not have a file yet, we should crete one
|
||||||
|
(
|
||||||
|
currentFile && // If we already have some file in progress and
|
||||||
|
(
|
||||||
|
currentFile.oldName && utils.startsWith(line, '---') || // Either we reached a old file identification line
|
||||||
|
currentFile.newName && utils.startsWith(line, '+++') // Or we reached a new file identification line
|
||||||
|
)
|
||||||
|
)
|
||||||
|
) {
|
||||||
startFile();
|
startFile();
|
||||||
} else if (currentFile && !currentFile.oldName && (values = getSrcFilename(line, config))) {
|
}
|
||||||
|
|
||||||
|
var values;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* --- Date Timestamp[FractionalSeconds] TimeZone
|
||||||
|
* --- 2002-02-21 23:30:39.942229878 -0800
|
||||||
|
*/
|
||||||
|
if (currentFile && !currentFile.oldName &&
|
||||||
|
utils.startsWith(line, '---') && (values = getSrcFilename(line, config))) {
|
||||||
currentFile.oldName = values;
|
currentFile.oldName = values;
|
||||||
currentFile.language = getExtension(currentFile.oldName, currentFile.language);
|
currentFile.language = getExtension(currentFile.oldName, currentFile.language);
|
||||||
} else if (currentFile && !currentFile.newName && (values = getDstFilename(line, config))) {
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* +++ Date Timestamp[FractionalSeconds] TimeZone
|
||||||
|
* +++ 2002-02-21 23:30:39.942229878 -0800
|
||||||
|
*/
|
||||||
|
if (currentFile && !currentFile.newName &&
|
||||||
|
utils.startsWith(line, '+++') && (values = getDstFilename(line, config))) {
|
||||||
currentFile.newName = values;
|
currentFile.newName = values;
|
||||||
currentFile.language = getExtension(currentFile.newName, currentFile.language);
|
currentFile.language = getExtension(currentFile.newName, currentFile.language);
|
||||||
} else if (currentFile && utils.startsWith(line, '@@')) {
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (currentFile && utils.startsWith(line, '@')) {
|
||||||
startBlock(line);
|
startBlock(line);
|
||||||
} else if ((values = oldMode.exec(line))) {
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* There are three types of diff lines. These lines are defined by the way they start.
|
||||||
|
* 1. New line starts with: +
|
||||||
|
* 2. Old line starts with: -
|
||||||
|
* 3. Context line starts with: <SPACE>
|
||||||
|
*/
|
||||||
|
if (currentBlock && (utils.startsWith(line, '+') || utils.startsWith(line, '-') || utils.startsWith(line, ' '))) {
|
||||||
|
createLine(line);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (
|
||||||
|
(currentFile && currentFile.blocks.length) ||
|
||||||
|
(currentBlock && currentBlock.lines.length)
|
||||||
|
) {
|
||||||
|
startFile();
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Git diffs provide more information regarding files modes, renames, copies,
|
||||||
|
* commits between changes and similarity indexes
|
||||||
|
*/
|
||||||
|
if ((values = oldMode.exec(line))) {
|
||||||
currentFile.oldMode = values[1];
|
currentFile.oldMode = values[1];
|
||||||
} else if ((values = newMode.exec(line))) {
|
} else if ((values = newMode.exec(line))) {
|
||||||
currentFile.newMode = values[1];
|
currentFile.newMode = values[1];
|
||||||
|
|
@ -232,8 +284,6 @@
|
||||||
} else if ((values = combinedDeletedFile.exec(line))) {
|
} else if ((values = combinedDeletedFile.exec(line))) {
|
||||||
currentFile.deletedFileMode = values[1];
|
currentFile.deletedFileMode = values[1];
|
||||||
currentFile.isDeleted = true;
|
currentFile.isDeleted = true;
|
||||||
} else if (currentBlock) {
|
|
||||||
createLine(line);
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -54,7 +54,7 @@ describe('DiffParser', function() {
|
||||||
});
|
});
|
||||||
|
|
||||||
function checkDiffSample(diff) {
|
function checkDiffSample(diff) {
|
||||||
var result = Diff2Html.getJsonFromDiff(diff);
|
var result = DiffParser.generateDiffJson(diff);
|
||||||
var file1 = result[0];
|
var file1 = result[0];
|
||||||
assert.equal(1, result.length);
|
assert.equal(1, result.length);
|
||||||
assert.equal(1, file1.addedLines);
|
assert.equal(1, file1.addedLines);
|
||||||
|
|
@ -75,7 +75,7 @@ describe('DiffParser', function() {
|
||||||
'+cenas com ananas\n' +
|
'+cenas com ananas\n' +
|
||||||
'+bananas';
|
'+bananas';
|
||||||
|
|
||||||
var result = Diff2Html.getJsonFromDiff(diff);
|
var result = DiffParser.generateDiffJson(diff);
|
||||||
var file1 = result[0];
|
var file1 = result[0];
|
||||||
assert.equal(1, result.length);
|
assert.equal(1, result.length);
|
||||||
assert.equal(2, file1.addedLines);
|
assert.equal(2, file1.addedLines);
|
||||||
|
|
@ -96,7 +96,7 @@ describe('DiffParser', function() {
|
||||||
'+cenas com ananas\n' +
|
'+cenas com ananas\n' +
|
||||||
'+bananas';
|
'+bananas';
|
||||||
|
|
||||||
var result = Diff2Html.getJsonFromDiff(diff, {"srcPrefix": "\t", "dstPrefix": "\t"});
|
var result = DiffParser.generateDiffJson(diff, {"srcPrefix": "\t", "dstPrefix": "\t"});
|
||||||
var file1 = result[0];
|
var file1 = result[0];
|
||||||
assert.equal(1, result.length);
|
assert.equal(1, result.length);
|
||||||
assert.equal(2, file1.addedLines);
|
assert.equal(2, file1.addedLines);
|
||||||
|
|
@ -118,7 +118,7 @@ describe('DiffParser', function() {
|
||||||
'- return typeof undefined;\n' +
|
'- return typeof undefined;\n' +
|
||||||
'-});\n';
|
'-});\n';
|
||||||
|
|
||||||
var result = Diff2Html.getJsonFromDiff(diff);
|
var result = DiffParser.generateDiffJson(diff);
|
||||||
assert.equal(1, result.length);
|
assert.equal(1, result.length);
|
||||||
|
|
||||||
var file1 = result[0];
|
var file1 = result[0];
|
||||||
|
|
@ -147,7 +147,7 @@ describe('DiffParser', function() {
|
||||||
'+\n' +
|
'+\n' +
|
||||||
'+console.log(parser.parsePatchDiffResult(text, patchLineList));\n';
|
'+console.log(parser.parsePatchDiffResult(text, patchLineList));\n';
|
||||||
|
|
||||||
var result = Diff2Html.getJsonFromDiff(diff);
|
var result = DiffParser.generateDiffJson(diff);
|
||||||
assert.equal(1, result.length);
|
assert.equal(1, result.length);
|
||||||
|
|
||||||
var file1 = result[0];
|
var file1 = result[0];
|
||||||
|
|
@ -177,7 +177,7 @@ describe('DiffParser', function() {
|
||||||
'+\n' +
|
'+\n' +
|
||||||
'+console.log(parser.parsePatchDiffResult(text, patchLineList));\n';
|
'+console.log(parser.parsePatchDiffResult(text, patchLineList));\n';
|
||||||
|
|
||||||
var result = Diff2Html.getJsonFromDiff(diff);
|
var result = DiffParser.generateDiffJson(diff);
|
||||||
assert.equal(1, result.length);
|
assert.equal(1, result.length);
|
||||||
|
|
||||||
var file1 = result[0];
|
var file1 = result[0];
|
||||||
|
|
@ -220,7 +220,7 @@ describe('DiffParser', function() {
|
||||||
' // store className if set\n' +
|
' // store className if set\n' +
|
||||||
' dataPriv.set( this, "__className__", this.className );\n';
|
' dataPriv.set( this, "__className__", this.className );\n';
|
||||||
|
|
||||||
var result = Diff2Html.getJsonFromDiff(diff);
|
var result = DiffParser.generateDiffJson(diff);
|
||||||
assert.equal(1, result.length);
|
assert.equal(1, result.length);
|
||||||
|
|
||||||
var file1 = result[0];
|
var file1 = result[0];
|
||||||
|
|
@ -263,7 +263,7 @@ describe('DiffParser', function() {
|
||||||
' "./var/hasOwn",\n' +
|
' "./var/hasOwn",\n' +
|
||||||
' "./var/slice",\n';
|
' "./var/slice",\n';
|
||||||
|
|
||||||
var result = Diff2Html.getJsonFromDiff(diff);
|
var result = DiffParser.generateDiffJson(diff);
|
||||||
assert.equal(2, result.length);
|
assert.equal(2, result.length);
|
||||||
|
|
||||||
var file1 = result[0];
|
var file1 = result[0];
|
||||||
|
|
@ -319,7 +319,7 @@ describe('DiffParser', function() {
|
||||||
' initialized = 1;\n' +
|
' initialized = 1;\n' +
|
||||||
' for_each_ref(get_name);\n';
|
' for_each_ref(get_name);\n';
|
||||||
|
|
||||||
var result = Diff2Html.getJsonFromDiff(diff);
|
var result = DiffParser.generateDiffJson(diff);
|
||||||
assert.equal(1, result.length);
|
assert.equal(1, result.length);
|
||||||
|
|
||||||
var file1 = result[0];
|
var file1 = result[0];
|
||||||
|
|
@ -341,7 +341,7 @@ describe('DiffParser', function() {
|
||||||
'copy from index.js\n' +
|
'copy from index.js\n' +
|
||||||
'copy to more-index.js\n';
|
'copy to more-index.js\n';
|
||||||
|
|
||||||
var result = Diff2Html.getJsonFromDiff(diff);
|
var result = DiffParser.generateDiffJson(diff);
|
||||||
assert.equal(1, result.length);
|
assert.equal(1, result.length);
|
||||||
|
|
||||||
var file1 = result[0];
|
var file1 = result[0];
|
||||||
|
|
@ -361,7 +361,7 @@ describe('DiffParser', function() {
|
||||||
'rename from more-index.js\n' +
|
'rename from more-index.js\n' +
|
||||||
'rename to other-index.js\n';
|
'rename to other-index.js\n';
|
||||||
|
|
||||||
var result = Diff2Html.getJsonFromDiff(diff);
|
var result = DiffParser.generateDiffJson(diff);
|
||||||
assert.equal(1, result.length);
|
assert.equal(1, result.length);
|
||||||
|
|
||||||
var file1 = result[0];
|
var file1 = result[0];
|
||||||
|
|
@ -384,7 +384,7 @@ describe('DiffParser', function() {
|
||||||
'-test\n' +
|
'-test\n' +
|
||||||
'+test1r\n';
|
'+test1r\n';
|
||||||
|
|
||||||
var result = Diff2Html.getJsonFromDiff(diff);
|
var result = DiffParser.generateDiffJson(diff);
|
||||||
assert.equal(1, result.length);
|
assert.equal(1, result.length);
|
||||||
|
|
||||||
var file1 = result[0];
|
var file1 = result[0];
|
||||||
|
|
@ -400,5 +400,29 @@ describe('DiffParser', function() {
|
||||||
assert.equal(1, file1.blocks[0].lines[1].newNumber);
|
assert.equal(1, file1.blocks[0].lines[1].newNumber);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it('should parse unified non git diff', function() {
|
||||||
|
var diff =
|
||||||
|
'--- a/sample.js\n' +
|
||||||
|
'+++ b/sample.js\n' +
|
||||||
|
'@@ -1 +1,2 @@\n' +
|
||||||
|
'-test\n' +
|
||||||
|
'+test1r\n' +
|
||||||
|
'+test2r\n';
|
||||||
|
|
||||||
|
var result = DiffParser.generateDiffJson(diff);
|
||||||
|
var file1 = result[0];
|
||||||
|
assert.equal(1, result.length);
|
||||||
|
assert.equal(2, file1.addedLines);
|
||||||
|
assert.equal(1, file1.deletedLines);
|
||||||
|
assert.equal('sample.js', file1.oldName);
|
||||||
|
assert.equal('sample.js', file1.newName);
|
||||||
|
assert.equal(1, file1.blocks.length);
|
||||||
|
|
||||||
|
var linesContent = file1.blocks[0].lines.map(function(line) {
|
||||||
|
return line.content;
|
||||||
|
});
|
||||||
|
assert.deepEqual(linesContent, ['-test', '+test1r', '+test2r']);
|
||||||
|
});
|
||||||
|
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
|
||||||
|
|
@ -191,7 +191,6 @@ describe('Diff2Html', function() {
|
||||||
'+test1\n';
|
'+test1\n';
|
||||||
var result = Diff2Html.getJsonFromDiff(diff);
|
var result = Diff2Html.getJsonFromDiff(diff);
|
||||||
|
|
||||||
console.log(result);
|
|
||||||
var file1 = result[0];
|
var file1 = result[0];
|
||||||
assert.equal(1, result.length);
|
assert.equal(1, result.length);
|
||||||
assert.equal(1, file1.addedLines);
|
assert.equal(1, file1.addedLines);
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue