diff --git a/html/css/diff.css b/html/css/diff.css
index d7fd572..8da1211 100644
--- a/html/css/diff.css
+++ b/html/css/diff.css
@@ -3,6 +3,14 @@ body {
margin-top: 5px;
width: 100%;
}
+
+.fileHeader {
+ margin-top: 0px;
+ padding-top: 2px;
+ padding-bottom: 1px;
+ border-top:0.1em solid #999999;
+}
+
code .delline, code .oldfile {
background-color: #FEE;
color: #B00;
diff --git a/html/lib/diffHighlighter.js b/html/lib/diffHighlighter.js
index 983b9a0..66c8806 100644
--- a/html/lib/diffHighlighter.js
+++ b/html/lib/diffHighlighter.js
@@ -13,6 +13,8 @@ var highlightDiffs = function() {
var diff = diffs[diffn];
var content = diff.innerHTML.replace(/\t/g, " ");;
+
+ var file_index = 0;
var line1 = "";
var line2 = "";
@@ -33,10 +35,12 @@ var highlightDiffs = function() {
if (firstChar == "+" || firstChar == "-")
continue;
} else if (firstChar == "d") {
+ ++file_index;
header = true;
line1 += '\n';
line2 += '\n';
- diffContent += '
';
+ var match = l.match(/diff --git a\/(\S*)/);
+ diffContent += '';
continue;
}
diff --git a/html/lib/keyboardNavigation.js b/html/lib/keyboardNavigation.js
index fada9bf..02b9754 100644
--- a/html/lib/keyboardNavigation.js
+++ b/html/lib/keyboardNavigation.js
@@ -2,13 +2,21 @@ var scrollToCenter = function(element) {
window.scrollTo(0, element.offsetTop);
}
+var scrollToTop = function(element) {
+ element.scrollIntoView(true);
+}
+
var handleKeys = function(event) {
- if (event.altKey || event.ctrlKey || event.metaKey || event.shiftKey)
+ if (event.altKey || event.metaKey || event.shiftKey)
return;
if (event.keyCode == 74)
return changeHunk(true);
else if (event.keyCode == 75)
return changeHunk(false);
+ else if (event.keyCode == 40 && event.ctrlKey == true) // ctrl-down_arrow
+ return changeFile(true);
+ else if (event.keyCode == 38 && event.ctrlKey == true) // ctrl-up_arrow
+ return changeFile(false);
else if (event.keyCode == 86) {// 'v'
showDiffs();
return false;
@@ -21,6 +29,10 @@ var handleKeyFromCocoa = function(key) {
changeHunk(true);
else if (key == 'k')
changeHunk(false);
+ else if (event.keyCode == 40 && event.ctrlKey == true) // ctrl-down_arrow
+ changeFile(true);
+ else if (event.keyCode == 38 && event.ctrlKey == true) // ctrl-up_arrow
+ changeFile(false);
else if (key == 'v')
showDiffs();
else if (key == 'c')
@@ -57,6 +69,42 @@ var changeHunk = function(next) {
return false;
}
+var changeFile = function(next) {
+ var files = document.getElementsByClassName("fileHeader");
+
+ if (files.length == 0)
+ return;
+
+ var currentFile = document.getElementById("CurrentFile");
+ var newFile;
+
+ var index = -1;
+ for (; index < files.length; ++index) {
+ if (files[index] == currentFile)
+ break;
+ }
+
+ if (currentFile && index >= 0) {
+ currentFile.id = null;
+
+ if (next) {
+ if (index <= files.length-1)
+ newFile = files[index + 1];
+ }
+ else {
+ newFile = files[index - 1];
+ if (!newFile)
+ newFile = files[files.length-1];
+ }
+ }
+ if (!newFile)
+ newFile = files[0];
+
+ newFile.id = 'CurrentFile';
+ scrollToTop(newFile);
+ return false;
+}
+
document.onkeydown = function(event) {
return handleKeys(event);
};
\ No newline at end of file
diff --git a/html/views/history/history.css b/html/views/history/history.css
index 72fc3bf..29123bc 100644
--- a/html/views/history/history.css
+++ b/html/views/history/history.css
@@ -54,12 +54,39 @@ a.servicebutton{
font-weight: bold;
}
+
+#message_files {
+ margin: 5px;
+ padding-left: 1em;
+ width: auto;
+}
+
#message {
font-family: Monaco;
- margin: 5px;
- margin-left: 20px;
- width: auto;
- font-size: 12px;
+ font-size: 10px;
+}
+
+#files {
+ margin-top: 1em;
+ font-family: Monaco;
+ font-size: 10px;
+}
+
+#files a {
+ color: #666666;
+}
+
+#files a:hover {
+ color: #4444ff;
+}
+
+.clear_both {
+ clear:both;
+ display:block;
+ height:1px;
+ line-height:0;
+ margin:1em;
+ visibility:hidden;
}
#details {
diff --git a/html/views/history/history.js b/html/views/history/history.js
index ff4b1cf..f0da2d2 100644
--- a/html/views/history/history.js
+++ b/html/views/history/history.js
@@ -33,6 +33,13 @@ var Commit = function(obj) {
this.author_date = new Date(parseInt(match[3]) * 1000);
+ this.files = this.raw.match(/diff --git a\/\S*/g);
+
+ for (var i=0; i < this.files.length; i++) {
+ var match = this.files[i].match(/diff --git a\/(.*)/);
+ this.files[i] = match[1];
+ }
+
match = this.header.match(/\ncommitter (.*) <(.*@.*)> ([0-9].*)/);
this.committer_name = match[1];
this.committer_email = match[2];
@@ -153,6 +160,7 @@ var loadCommit = function(commitObject, currentRef) {
$("subjectID").innerHTML = commit.subject.escapeHTML();
$("details").innerHTML = ""
$("message").innerHTML = ""
+ $("files").innerHTML = ""
$("date").innerHTML = ""
showRefs();
@@ -181,6 +189,15 @@ var loadExtendedCommit = function(commit)
$("date").innerHTML = commit.author_date;
$("message").innerHTML = commit.message.replace(/\n/g,"
");
+ if (commit.files)
+ var commit_file_links = commit.files;
+ for (var i=0; i < commit_file_links.length; i++) {
+ index = i+1;
+ commit_file_links[i] = "" + commit.files[i] + "";
+ }
+
+ $("files").innerHTML = commit_file_links.join("
");
+
if (commit.diff.length < 200000) {
showDiffs();
} else {
diff --git a/html/views/history/index.html b/html/views/history/index.html
index 9f24af1..9bc31c1 100644
--- a/html/views/history/index.html
+++ b/html/views/history/index.html
@@ -47,6 +47,9 @@
-
+