Skip to content

Commit 89b9b39

Browse files
committed
copy, rename and friends
1 parent 56a122c commit 89b9b39

File tree

5 files changed

+181
-48
lines changed

5 files changed

+181
-48
lines changed

src/diff-parser.js

Lines changed: 73 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -64,12 +64,12 @@
6464
var values;
6565

6666
if (values = /^@@ -(\d+),\d+ \+(\d+),\d+ @@.*/.exec(line)) {
67-
currentFile.isTripleDiff = false;
67+
currentFile.isCombined = false;
6868
} else if (values = /^@@@ -(\d+),\d+ -\d+,\d+ \+(\d+),\d+ @@@.*/.exec(line)) {
69-
currentFile.isTripleDiff = true;
69+
currentFile.isCombined = true;
7070
} else {
7171
values = [0, 0];
72-
currentFile.isTripleDiff = false;
72+
currentFile.isCombined = false;
7373
}
7474

7575
oldLine = values[1];
@@ -120,23 +120,82 @@
120120
// Unmerged paths, and possibly other non-diffable files
121121
// https://github.com/scottgonzalez/pretty-diff/issues/11
122122
// Also, remove some useless lines
123-
if (!line || utils.startsWith(line, "*") ||
124-
utils.startsWith(line, "new") || utils.startsWith(line, "index")) {
123+
if (!line || utils.startsWith(line, "*")) {
124+
//|| utils.startsWith(line, "new") || utils.startsWith(line, "index")
125125
return;
126126
}
127127

128+
/* Diff */
129+
var oldMode = /old mode (\d{6})/;
130+
var newMode = /new mode (\d{6})/;
131+
var deletedFileMode = /deleted file mode (\d{6})/;
132+
var newFileMode = /new file mode (\d{6})/;
133+
134+
var copyFrom = /copy from (.+)/;
135+
var copyTo = /copy to (.+)/;
136+
137+
var renameFrom = /rename from (.+)/;
138+
var renameTo = /rename to (.+)/;
139+
140+
var similarityIndex = /similarity index (\d+)%/;
141+
var dissimilarityIndex = /dissimilarity index (\d+)%/;
142+
var index = /index ([0-9a-z]+)..([0-9a-z]+) (\d{6})?/;
143+
144+
/* Combined Diff */
145+
var combinedIndex = /index ([0-9a-z]+),([0-9a-z]+)..([0-9a-z]+)/;
146+
var combinedMode = /mode (\d{6}),(\d{6})..(\d{6})/;
147+
var combinedNewFile = /new file mode (\d{6})/;
148+
var combinedDeletedFile = /deleted file mode (\d{6}),(\d{6})/;
149+
128150
var values = [];
129151
if (utils.startsWith(line, "diff")) {
130152
startFile();
131153
} else if (currentFile && !currentFile.oldName && (values = /^--- a\/(\S+).*$/.exec(line))) {
132154
currentFile.oldName = values[1];
155+
currentFile.language = getExtension(currentFile.oldName, currentFile.language);
133156
} else if (currentFile && !currentFile.newName && (values = /^\+\+\+ [b]?\/(\S+).*$/.exec(line))) {
134157
currentFile.newName = values[1];
135-
136-
var fileSplit = currentFile.newName.split(".");
137-
currentFile.language = fileSplit[fileSplit.length - 1];
158+
currentFile.language = getExtension(currentFile.newName, currentFile.language);
138159
} else if (currentFile && utils.startsWith(line, "@@")) {
139160
startBlock(line);
161+
} else if ((values = oldMode.exec(line))) {
162+
currentFile.oldMode = values[1];
163+
} else if ((values = newMode.exec(line))) {
164+
currentFile.newMode = values[1];
165+
} else if ((values = deletedFileMode.exec(line))) {
166+
currentFile.deletedFileMode = values[1];
167+
} else if ((values = newFileMode.exec(line))) {
168+
currentFile.newFileMode = values[1];
169+
} else if ((values = copyFrom.exec(line))) {
170+
currentFile.oldName = values[1];
171+
currentFile.isCopy = true;
172+
} else if ((values = copyTo.exec(line))) {
173+
currentFile.newName = values[1];
174+
currentFile.isCopy = true;
175+
} else if ((values = renameFrom.exec(line))) {
176+
currentFile.oldName = values[1];
177+
currentFile.isRename = true;
178+
} else if ((values = renameTo.exec(line))) {
179+
currentFile.newName = values[1];
180+
currentFile.isRename = true;
181+
} else if ((values = similarityIndex.exec(line))) {
182+
currentFile.unchangedPercentage = values[1];
183+
} else if ((values = dissimilarityIndex.exec(line))) {
184+
currentFile.changedPercentage = values[1];
185+
} else if ((values = index.exec(line))) {
186+
currentFile.checksumBefore = values[1];
187+
currentFile.checksumAfter = values[2];
188+
values[2] && (currentFile.mode = values[3]);
189+
} else if ((values = combinedIndex.exec(line))) {
190+
currentFile.checksumBefore = [values[2], values[3]];
191+
currentFile.checksumAfter = values[1];
192+
} else if ((values = combinedMode.exec(line))) {
193+
currentFile.oldMode = [values[2], values[3]];
194+
currentFile.newMode = values[1];
195+
} else if ((values = combinedNewFile.exec(line))) {
196+
currentFile.newFileMode = values[1];
197+
} else if ((values = combinedDeletedFile.exec(line))) {
198+
currentFile.deletedFileMode = values[1];
140199
} else if (currentBlock) {
141200
createLine(line);
142201
}
@@ -148,6 +207,12 @@
148207
return files;
149208
};
150209

210+
function getExtension(filename, language) {
211+
var nameSplit = filename.split(".");
212+
if (nameSplit.length > 1) return nameSplit[nameSplit.length - 1];
213+
else return language;
214+
}
215+
151216
if (typeof module !== 'undefined' && module.exports) {
152217
module.exports.DiffParser = new DiffParser();
153218
} else if (typeof global.DiffParser === 'undefined') {

src/diff2html.js

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,6 @@
3030
*/
3131
Diff2Html.prototype.getPrettyHtmlFromDiff = function (diffInput, config) {
3232
var diffJson = diffParser.generateDiffJson(diffInput);
33-
3433
var configOrEmpty = config || {};
3534
return htmlPrinter.generateLineByLineJsonHtml(diffJson, configOrEmpty);
3635
};

src/line-by-line-printer.js

Lines changed: 39 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -17,19 +17,24 @@
1717
LineByLinePrinter.prototype.generateLineByLineJsonHtml = function (diffFiles, config) {
1818
return "<div class=\"d2h-wrapper\">\n" +
1919
diffFiles.map(function (file) {
20+
21+
var diffs;
22+
if (file.blocks.length) diffs = generateFileHtml(file, config);
23+
else diffs = generateEmptyDiff();
24+
2025
return "<div class=\"d2h-file-wrapper\" data-lang=\"" + file.language + "\">\n" +
2126
" <div class=\"d2h-file-header\">\n" +
2227
" <div class=\"d2h-file-stats\">\n" +
2328
" <span class=\"d2h-lines-added\">+" + file.addedLines + "</span>\n" +
2429
" <span class=\"d2h-lines-deleted\">-" + file.deletedLines + "</span>\n" +
2530
" </div>\n" +
26-
" <div class=\"d2h-file-name\">" + printerUtils.getDiffName(file.oldName, file.newName) + "</div>\n" +
31+
" <div class=\"d2h-file-name\">" + printerUtils.getDiffName(file) + "</div>\n" +
2732
" </div>\n" +
2833
" <div class=\"d2h-file-diff\">\n" +
2934
" <div class=\"d2h-code-wrapper\">\n" +
3035
" <table class=\"d2h-diff-table\">\n" +
3136
" <tbody class=\"d2h-diff-tbody\">\n" +
32-
" " + generateFileHtml(file, config) +
37+
" " + diffs +
3338
" </tbody>\n" +
3439
" </table>\n" +
3540
" </div>\n" +
@@ -76,7 +81,7 @@
7681
oldEscapedLine = utils.escape(oldLine.content);
7782
newEscapedLine = utils.escape(newLine.content);
7883

79-
config.isTripleDiff = file.isTripleDiff;
84+
config.isCombined = file.isCombined;
8085
var diff = printerUtils.diffHighlight(oldEscapedLine, newEscapedLine, config);
8186

8287
processedOldLines += generateLineHtml(oldLine.type, oldLine.oldNumber, oldLine.newNumber, diff.o);
@@ -85,17 +90,7 @@
8590

8691
lines += processedOldLines + processedNewLines;
8792
} else {
88-
for (j = 0; j < oldLines.length; j++) {
89-
oldLine = oldLines[j];
90-
oldEscapedLine = utils.escape(oldLine.content);
91-
lines += generateLineHtml(oldLine.type, oldLine.oldNumber, oldLine.newNumber, oldEscapedLine);
92-
}
93-
94-
for (j = 0; j < newLines.length; j++) {
95-
newLine = newLines[j];
96-
newEscapedLine = utils.escape(newLine.content);
97-
lines += generateLineHtml(newLine.type, newLine.oldNumber, newLine.newNumber, newEscapedLine);
98-
}
93+
lines += processLines(oldLines, newLines);
9994
}
10095

10196
oldLines = [];
@@ -106,10 +101,30 @@
106101
}
107102
}
108103

104+
lines += processLines(oldLines, newLines);
105+
109106
return lines;
110107
}).join("\n");
111108
}
112109

110+
function processLines(oldLines, newLines) {
111+
var lines = "";
112+
113+
for (j = 0; j < oldLines.length; j++) {
114+
var oldLine = oldLines[j];
115+
var oldEscapedLine = utils.escape(oldLine.content);
116+
lines += generateLineHtml(oldLine.type, oldLine.oldNumber, oldLine.newNumber, oldEscapedLine);
117+
}
118+
119+
for (j = 0; j < newLines.length; j++) {
120+
var newLine = newLines[j];
121+
var newEscapedLine = utils.escape(newLine.content);
122+
lines += generateLineHtml(newLine.type, newLine.oldNumber, newLine.newNumber, newEscapedLine);
123+
}
124+
125+
return lines;
126+
}
127+
113128
function generateLineHtml(type, oldNumber, newNumber, content) {
114129
return "<tr>\n" +
115130
" <td class=\"d2h-code-linenumber " + type + "\">" +
@@ -122,6 +137,16 @@
122137
"</tr>\n";
123138
}
124139

140+
function generateEmptyDiff() {
141+
return "<tr>\n" +
142+
" <td class=\"" + diffParser.LINE_TYPE.INFO + "\">" +
143+
" <div class=\"d2h-code-line " + diffParser.LINE_TYPE.INFO + "\">" +
144+
"File without changes" +
145+
" </div>" +
146+
" </td>\n" +
147+
"</tr>\n";
148+
}
149+
125150
if (typeof module !== 'undefined' && module.exports) {
126151
module.exports.LineByLinePrinter = new LineByLinePrinter();
127152
} else if (typeof global.LineByLinePrinter === 'undefined') {

src/printer-utils.js

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,10 +13,15 @@
1313
function PrinterUtils() {
1414
}
1515

16-
PrinterUtils.prototype.getDiffName = function (oldFilename, newFilename) {
17-
if (oldFilename && newFilename && oldFilename !== newFilename) {
16+
PrinterUtils.prototype.getDiffName = function (file) {
17+
var oldFilename = file.oldName;
18+
var newFilename = file.newName;
19+
20+
if (oldFilename && newFilename
21+
&& oldFilename !== newFilename
22+
&& !isDeletedName(newFilename)) {
1823
return oldFilename + " -> " + newFilename;
19-
} else if (newFilename) {
24+
} else if (newFilename && !isDeletedName(newFilename)) {
2025
return newFilename;
2126
} else if (oldFilename) {
2227
return oldFilename;
@@ -30,7 +35,7 @@
3035

3136
var prefixSize = 1;
3237

33-
if (config.isTripleDiff) prefixSize = 2;
38+
if (config.isCombined) prefixSize = 2;
3439

3540
lineStart1 = diffLine1.substr(0, prefixSize);
3641
lineStart2 = diffLine2.substr(0, prefixSize);
@@ -60,6 +65,10 @@
6065
}
6166
};
6267

68+
function isDeletedName(name) {
69+
return name === "dev/null";
70+
}
71+
6372
function removeIns(line) {
6473
return line.replace(/(<ins>((.|\n)*?)<\/ins>)/g, "");
6574
}

src/side-by-side-printer.js

Lines changed: 56 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -17,15 +17,18 @@
1717
SideBySidePrinter.prototype.generateSideBySideJsonHtml = function (diffFiles, config) {
1818
return "<div class=\"d2h-wrapper\">\n" +
1919
diffFiles.map(function (file) {
20-
var diffs = generateSideBySideFileHtml(file, config);
20+
21+
var diffs;
22+
if (file.blocks.length) diffs = generateSideBySideFileHtml(file, config);
23+
else diffs = generateEmptyDiff();
2124

2225
return "<div class=\"d2h-file-wrapper\" data-lang=\"" + file.language + "\">\n" +
2326
" <div class=\"d2h-file-header\">\n" +
2427
" <div class=\"d2h-file-stats\">\n" +
2528
" <span class=\"d2h-lines-added\">+" + file.addedLines + "</span>\n" +
2629
" <span class=\"d2h-lines-deleted\">-" + file.deletedLines + "</span>\n" +
2730
" </div>\n" +
28-
" <div class=\"d2h-file-name\">" + printerUtils.getDiffName(file.oldName, file.newName) + "</div>\n" +
31+
" <div class=\"d2h-file-name\">" + printerUtils.getDiffName(file) + "</div>\n" +
2932
" </div>\n" +
3033
" <div class=\"d2h-files-diff\">\n" +
3134
" <div class=\"d2h-file-side-diff\">\n" +
@@ -74,6 +77,7 @@
7477
"</tr>\n";
7578

7679
var oldLines = [], newLines = [];
80+
var tmpHtml = "";
7781

7882
for (var i = 0; i < block.lines.length; i++) {
7983
var line = block.lines[i];
@@ -101,44 +105,60 @@
101105
oldEscapedLine = utils.escape(oldLine.content);
102106
newEscapedLine = utils.escape(newLine.content);
103107

104-
config.isTripleDiff = file.isTripleDiff;
108+
config.isCombined = file.isCombined;
105109

106110
var diff = printerUtils.diffHighlight(oldEscapedLine, newEscapedLine, config);
107111

108112
fileHtml.left += generateSingleLineHtml(oldLine.type, oldLine.oldNumber, diff.o);
109113
fileHtml.right += generateSingleLineHtml(newLine.type, newLine.newNumber, diff.n);
110114
}
111115
} else {
112-
var maxLinesNumber = Math.max(oldLines.length, newLines.length);
113-
for (j = 0; j < maxLinesNumber; j++) {
114-
oldLine = oldLines[j];
115-
newLine = newLines[j];
116-
117-
if (oldLine && newLine) {
118-
fileHtml.left += generateSingleLineHtml(oldLine.type, oldLine.oldNumber, utils.escape(oldLine.content));
119-
fileHtml.right += generateSingleLineHtml(newLine.type, newLine.newNumber, utils.escape(newLine.content));
120-
} else if (oldLine) {
121-
fileHtml.left += generateSingleLineHtml(oldLine.type, oldLine.oldNumber, utils.escape(oldLine.content));
122-
fileHtml.right += generateSingleLineHtml(diffParser.LINE_TYPE.CONTEXT, "", "", "");
123-
} else if (newLine) {
124-
fileHtml.left += generateSingleLineHtml(diffParser.LINE_TYPE.CONTEXT, "", "", "");
125-
fileHtml.right += generateSingleLineHtml(newLine.type, newLine.newNumber, utils.escape(newLine.content));
126-
} else {
127-
console.error("How did it get here?");
128-
}
129-
}
116+
tmpHtml = processLines(oldLines, newLines);
117+
fileHtml.left += tmpHtml.left;
118+
fileHtml.right += tmpHtml.right;
130119
}
131120

132121
oldLines = [];
133122
newLines = [];
134123
i--;
135124
}
136125
}
126+
127+
tmpHtml = processLines(oldLines, newLines);
128+
fileHtml.left += tmpHtml.left;
129+
fileHtml.right += tmpHtml.right;
137130
});
138131

139132
return fileHtml;
140133
}
141134

135+
function processLines(oldLines, newLines) {
136+
var fileHtml = {};
137+
fileHtml.left = "";
138+
fileHtml.right = "";
139+
140+
var maxLinesNumber = Math.max(oldLines.length, newLines.length);
141+
for (j = 0; j < maxLinesNumber; j++) {
142+
var oldLine = oldLines[j];
143+
var newLine = newLines[j];
144+
145+
if (oldLine && newLine) {
146+
fileHtml.left += generateSingleLineHtml(oldLine.type, oldLine.oldNumber, utils.escape(oldLine.content));
147+
fileHtml.right += generateSingleLineHtml(newLine.type, newLine.newNumber, utils.escape(newLine.content));
148+
} else if (oldLine) {
149+
fileHtml.left += generateSingleLineHtml(oldLine.type, oldLine.oldNumber, utils.escape(oldLine.content));
150+
fileHtml.right += generateSingleLineHtml(diffParser.LINE_TYPE.CONTEXT, "", "", "");
151+
} else if (newLine) {
152+
fileHtml.left += generateSingleLineHtml(diffParser.LINE_TYPE.CONTEXT, "", "", "");
153+
fileHtml.right += generateSingleLineHtml(newLine.type, newLine.newNumber, utils.escape(newLine.content));
154+
} else {
155+
console.error("How did it get here?");
156+
}
157+
}
158+
159+
return fileHtml;
160+
}
161+
142162
function generateSingleLineHtml(type, number, content) {
143163
return "<tr>\n" +
144164
" <td class=\"d2h-code-side-linenumber " + type + "\">" + number + "</td>\n" +
@@ -148,6 +168,21 @@
148168
" </tr>\n";
149169
}
150170

171+
function generateEmptyDiff() {
172+
var fileHtml = {};
173+
fileHtml.right = "";
174+
175+
fileHtml.left = "<tr>\n" +
176+
" <td class=\"" + diffParser.LINE_TYPE.INFO + "\">" +
177+
" <div class=\"d2h-code-side-line " + diffParser.LINE_TYPE.INFO + "\">" +
178+
"File without changes" +
179+
" </div>" +
180+
" </td>\n" +
181+
"</tr>\n";
182+
183+
return fileHtml;
184+
}
185+
151186
if (typeof module !== 'undefined' && module.exports) {
152187
module.exports.SideBySidePrinter = new SideBySidePrinter();
153188
} else if (typeof global.SideBySidePrinter === 'undefined') {

0 commit comments

Comments
 (0)