summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--cgit.css66
-rw-r--r--ui-diff.c27
-rw-r--r--ui-ssdiff.c30
-rw-r--r--ui-ssdiff.h3
4 files changed, 96 insertions, 30 deletions
diff --git a/cgit.css b/cgit.css
index bf58b8a..3f37165 100644
--- a/cgit.css
+++ b/cgit.css
@@ -602,37 +602,91 @@ table.hgraph div.bar {
 	height: 1em;
 }
 
+table.ssdiff {
+	width: 100%;
+}
+
+table.ssdiff td {
+	font-size: 75%;
+	font-family: monospace;
+	white-space: pre;
+	padding: 1px 4px 1px 4px;
+	border-left: solid 1px #aaa;
+	border-right: solid 1px #aaa;
+}
+
 table.ssdiff td.add {
 	color: black;
-	background: #afa;
+	background: #cfc;
+	min-width: 50%;
 }
 
 table.ssdiff td.add_dark {
 	color: black;
-	background: #9c9;
+	background: #aca;
+	min-width: 50%;
 }
 
 table.ssdiff td.del {
 	color: black;
-	background: #faa;
+	background: #fcc;
+	min-width: 50%;
 }
 
 table.ssdiff td.del_dark {
 	color: black;
-	background: #c99;
+	background: #caa;
+	min-width: 50%;
 }
 
 table.ssdiff td.changed {
 	color: black;
-	background: #ffa;
+	background: #ffc;
+	min-width: 50%;
 }
 
 table.ssdiff td.changed_dark {
 	color: black;
-	background: #cc9;
+	background: #cca;
+	min-width: 50%;
+}
+
+table.ssdiff td.lineno {
+	color: black;
+	background: #eee;
+	text-align: right;
+	width: 3em;
+	min-width: 3em;
 }
 
 table.ssdiff td.hunk {
 	color: #black;
 	background: #ccf;
+	border-top: solid 1px #aaa;
+	border-bottom: solid 1px #aaa;
 }
+
+table.ssdiff td.head {
+	border-top: solid 1px #aaa;
+	border-bottom: solid 1px #aaa;
+}
+
+table.ssdiff td.head div.head {
+	font-weight: bold;
+	color: black;
+}
+
+table.ssdiff td.foot {
+	border-top: solid 1px #aaa;
+        border-left: none;
+        border-right: none;
+        border-bottom: none;
+}
+
+table.ssdiff td.space {
+	border: none;
+}
+
+table.ssdiff td.space div {
+	min-height: 3em;
+}
\ No newline at end of file
diff --git a/ui-diff.c b/ui-diff.c
index 42e81ac..b21c2c1 100644
--- a/ui-diff.c
+++ b/ui-diff.c
@@ -246,8 +246,6 @@ static void header(unsigned char *sha1, char *path1, int mode1,
 			html_txt(path2);
 	}
 	html("</div>");
-	if (use_ssdiff)
-		cgit_ssdiff_header();
 }
 
 static void print_ssdiff_link()
@@ -270,24 +268,26 @@ static void filepair_cb(struct diff_filepair *pair)
 	int binary = 0;
 	linediff_fn print_line_fn = print_line;
 
-	header(pair->one->sha1, pair->one->path, pair->one->mode,
-	       pair->two->sha1, pair->two->path, pair->two->mode);
 	if (use_ssdiff) {
-		cgit_ssdiff_header();
+		cgit_ssdiff_header_begin();
 		print_line_fn = cgit_ssdiff_line_cb;
 	}
+	header(pair->one->sha1, pair->one->path, pair->one->mode,
+	       pair->two->sha1, pair->two->path, pair->two->mode);
+	if (use_ssdiff)
+		cgit_ssdiff_header_end();
 	if (S_ISGITLINK(pair->one->mode) || S_ISGITLINK(pair->two->mode)) {
 		if (S_ISGITLINK(pair->one->mode))
-			print_line(fmt("-Subproject %s", sha1_to_hex(pair->one->sha1)), 52);
+			print_line_fn(fmt("-Subproject %s", sha1_to_hex(pair->one->sha1)), 52);
 		if (S_ISGITLINK(pair->two->mode))
-			print_line(fmt("+Subproject %s", sha1_to_hex(pair->two->sha1)), 52);
+			print_line_fn(fmt("+Subproject %s", sha1_to_hex(pair->two->sha1)), 52);
 		return;
 	}
 	if (cgit_diff_files(pair->one->sha1, pair->two->sha1, &old_size,
 			    &new_size, &binary, print_line_fn))
 		cgit_print_error("Error running diff");
 	if (binary)
-		html("Binary files differ");
+		print_line_fn(" Binary files differ", 20);
 	if (use_ssdiff)
 		cgit_ssdiff_footer();
 }
@@ -334,9 +334,14 @@ void cgit_print_diff(const char *new_rev, const char *old_rev, const char *prefi
 	print_ssdiff_link();
 	cgit_print_diffstat(old_rev_sha1, new_rev_sha1);
 
-	html("<table summary='diff' class='diff'>");
-	html("<tr><td>");
+	if (use_ssdiff) {
+		html("<table summary='ssdiff' class='ssdiff'>");
+	} else {
+		html("<table summary='diff' class='diff'>");
+		html("<tr><td>");
+	}
 	cgit_diff_tree(old_rev_sha1, new_rev_sha1, filepair_cb, prefix);
-	html("</td></tr>");
+	if (!use_ssdiff)
+		html("</td></tr>");
 	html("</table>");
 }
diff --git a/ui-ssdiff.c b/ui-ssdiff.c
index 3591ab4..8215051 100644
--- a/ui-ssdiff.c
+++ b/ui-ssdiff.c
@@ -40,9 +40,9 @@ static char *replace_tabs(char *line)
 {
 	char *prev_buf = line;
 	char *cur_buf;
-        int linelen = strlen(line);
+	int linelen = strlen(line);
 	int n_tabs = 0;
-        int i;
+	int i;
 	char *result;
 	char *spaces = "        ";
 
@@ -52,10 +52,10 @@ static char *replace_tabs(char *line)
 		return result;
 	}
 
-        for (i = 0; i < linelen; i++)
+	for (i = 0; i < linelen; i++)
 		if (line[i] == '\t')
 			n_tabs += 1;
-        result = xmalloc(linelen + n_tabs * 8 + 1);
+	result = xmalloc(linelen + n_tabs * 8 + 1);
 	result[0] = '\0';
 
 	while (1) {
@@ -106,10 +106,10 @@ static void print_ssdiff_line(char *class, int old_line_no, char *old_line,
 {
 	html("<tr>");
 	if (old_line_no > 0)
-		htmlf("<td class='%s'>%d </td><td class='%s'>", class,
+		htmlf("<td class='lineno'>%d</td><td class='%s'>",
 		      old_line_no, class);
 	else
-		htmlf("<td class='%s_dark'>  </td><td class='%s_dark'>", class, class);
+		htmlf("<td class='lineno'></td><td class='%s_dark'>", class);
 
 	if (old_line) {
 		old_line = replace_tabs(old_line + 1);
@@ -117,13 +117,13 @@ static void print_ssdiff_line(char *class, int old_line_no, char *old_line,
 		free(old_line);
 	}
 
-	html("  </td>");
+	html("</td>");
 
 	if (new_line_no > 0)
-		htmlf("<td class='%s'>  %d </td><td class='%s'>", class,
+		htmlf("<td class='lineno'>%d</td><td class='%s'>",
 		      new_line_no, class);
 	else
-		htmlf("<td class='%s_dark'>  </td><td class='%s_dark'>", class, class);
+		htmlf("<td class='lineno'></td><td class='%s_dark'>", class);
 
 	if (new_line) {
 		new_line = replace_tabs(new_line + 1);
@@ -249,16 +249,22 @@ void cgit_ssdiff_line_cb(char *line, int len)
 	line[len - 1] = c;
 }
 
-void cgit_ssdiff_header()
+void cgit_ssdiff_header_begin()
 {
 	current_old_line = 0;
 	current_new_line = 0;
-	html("<table class='ssdiff'>");
+	html("<tr><td class='space' colspan='4'><div></div></td></tr>");
+	html("<tr><td class='head' colspan='4'>");
+}
+
+void cgit_ssdiff_header_end()
+{
+	html("</td><tr>");
 }
 
 void cgit_ssdiff_footer()
 {
 	if (deferred_old || deferred_new)
 		cgit_ssdiff_print_deferred_lines();
-	html("</table>");
+	html("<tr><td class='foot' colspan='4'></td></tr>");
 }
diff --git a/ui-ssdiff.h b/ui-ssdiff.h
index a0b1efe..64b4b12 100644
--- a/ui-ssdiff.h
+++ b/ui-ssdiff.h
@@ -5,7 +5,8 @@ extern void cgit_ssdiff_print_deferred_lines();
 
 extern void cgit_ssdiff_line_cb(char *line, int len);
 
-extern void cgit_ssdiff_header();
+extern void cgit_ssdiff_header_begin();
+extern void cgit_ssdiff_header_end();
 
 extern void cgit_ssdiff_footer();