From 5482dfe450cc1fc465c6eb90409afbb26cb0376c Mon Sep 17 00:00:00 2001 From: Pieter de Bie Date: Tue, 20 Jan 2009 17:53:05 +0100 Subject: [PATCH] Rudimentary support for renames/deletions of files diffHighlighter.js, history.js: Distinguish created, renamed, changed and deleted files and display them accordingly --- html/lib/diffHighlighter.js | 73 +++++++++++++++++++++++++---------- html/views/history/history.js | 15 +++++-- 2 files changed, 64 insertions(+), 24 deletions(-) diff --git a/html/lib/diffHighlighter.js b/html/lib/diffHighlighter.js index 79f31de..b604e11 100644 --- a/html/lib/diffHighlighter.js +++ b/html/lib/diffHighlighter.js @@ -18,7 +18,8 @@ var highlightDiff = function(diff, element, callbacks) { var file_index = 0; - var filename = ""; + var startname = ""; + var endname = ""; var line1 = ""; var line2 = ""; var diffContent = ""; @@ -33,8 +34,26 @@ var highlightDiff = function(diff, element, callbacks) { var finishContent = function() { - finalContent += '
' + - '
' + filename + '
'; + if (!file_index) + { + file_index++; + return; + } + + if (callbacks["newfile"]) + callbacks["newfile"](startname, endname, "file_index_" + (file_index - 1)); + + var title = startname; + if (endname == "/dev/null") + title = startname; + else if (startname == "/dev/null") + title = endname; + else if (startname != endname) + title = startname + " renamed to " + endname; + + finalContent += '
' + + '
' + title + '
'; + if (!binary) { finalContent += '
' + '
' + line1 + "
" + @@ -50,37 +69,52 @@ var highlightDiff = function(diff, element, callbacks) { } finalContent += '
'; + line1 = ""; line2 = ""; diffContent = ""; + file_index++; + startname = ""; + endname = ""; } for (var lineno = 0; lineno < lines.length; lineno++) { var l = lines[lineno]; var firstChar = l.charAt(0); - // Matches "diff --git ...." + if (firstChar == "d" && l.charAt(1) == "i") { // "diff", i.e. new file, we have to reset everything + header = true; // diff always starts with a header - if (firstChar == "d") { // New file, we have to reset everything - header = true; - - if (file_index++) // Finish last file - finishContent(); - - binary = false; - - if(match = l.match(/diff --git a\/(\S*)/)) { - filename = match[1]; - if (callbacks["newfile"]) - callbacks["newfile"](filename, "file_index_" + (file_index - 1)); - } + finishContent(); // Finish last file + binary = false; continue; } if (header) { - if (firstChar == "+" || firstChar == "-") + if (firstChar == "-") { + if (match = l.match(/^--- (a\/)?(.*)$/)) + startname = match[2]; continue; + } + if (firstChar == "+") { + if (match = l.match(/^\+\+\+ (b\/)?(.*)$/)) + endname = match[2]; + continue; + } + // If it is a complete rename, we don't know the name yet + // We can figure this out from the 'rename from.. rename to.. thing + if (firstChar == 'r') + { + if (match = l.match(/^rename (from|to) (.*)$/)) + { + if (match[1] == "from") + startname = match[2]; + else + endname = match[2]; + } + continue; + } if (firstChar == "B") // "Binary files" { binary = true; @@ -126,7 +160,6 @@ var highlightDiff = function(diff, element, callbacks) { } } - file_index++; finishContent(); // This takes about 7ms @@ -135,4 +168,4 @@ var highlightDiff = function(diff, element, callbacks) { // TODO: Replace this with a performance pref call if (false) Controller.log_("Total time:" + (new Date().getTime() - start)); -} \ No newline at end of file +} diff --git a/html/views/history/history.js b/html/views/history/history.js index 36d40f7..a748485 100644 --- a/html/views/history/history.js +++ b/html/views/history/history.js @@ -173,8 +173,15 @@ var loadCommit = function(commitObject, currentRef) { } var showDiff = function() { - var newfile = function(name, id) { - $("files").innerHTML += "" + name + "
"; + var newfile = function(name1, name2, id) { + if (name1 == name2) + $("files").innerHTML += "" + name1 + " changed
"; + else if (name1 == "/dev/null") + $("files").innerHTML += "" + name2 + " created
"; + else if (name2 == "/dev/null") + $("files").innerHTML += "" + name1 + " deleted
"; + else + $("files").innerHTML += "" + name1 + " moved to " + name2 + "
"; } var binaryDiff = function(filename) { @@ -184,7 +191,7 @@ var showDiff = function() { return "Binary file differs"; } - highlightDiff(commit.diff, $("diff"), { "newfile" : newfile, "binaryFile" : binaryDiff }); + highlightDiff(commit.diff, $("diff"), { "newfile" : newfile, "binaryFile" : binaryDiff}); } var showImage = function(element, filename) @@ -225,4 +232,4 @@ var loadExtendedCommit = function(commit) hideNotification(); enableFeatures(); -} \ No newline at end of file +}