|
diff --git a/cgit.css b/cgit.css index 97ae4d1..53c93f2 100644 --- a/ cgit.css+++ b/ cgit.css |
|
@@ -249,83 +249,82 @@ table.diffstat tr:hover { |
249 | } |
249 | } |
250 | |
250 | |
251 | table.diffstat th { |
251 | table.diffstat th { |
252 | font-weight: normal; |
252 | font-weight: normal; |
253 | text-align: left; |
253 | text-align: left; |
254 | text-decoration: underline; |
254 | text-decoration: underline; |
255 | padding: 0.1em 1em 0.1em 0.1em; |
255 | padding: 0.1em 1em 0.1em 0.1em; |
256 | font-size: 100%; |
256 | font-size: 100%; |
257 | } |
257 | } |
258 | |
258 | |
259 | table.diffstat td { |
259 | table.diffstat td { |
260 | padding: 0.2em 0.2em 0.1em 0.1em; |
260 | padding: 0.2em 0.2em 0.1em 0.1em; |
261 | font-size: 100%; |
261 | font-size: 100%; |
262 | border: none; |
262 | border: none; |
263 | } |
263 | } |
264 | |
264 | |
265 | table.diffstat td span.modechange { |
265 | table.diffstat td span.modechange { |
266 | padding-left: 1em; |
266 | padding-left: 1em; |
267 | color: red; |
267 | color: red; |
268 | } |
268 | } |
269 | |
269 | |
270 | table.diffstat td.add a { |
270 | table.diffstat td.add a { |
271 | color: green; |
271 | color: green; |
272 | } |
272 | } |
273 | |
273 | |
274 | table.diffstat td.del a { |
274 | table.diffstat td.del a { |
275 | color: red; |
275 | color: red; |
276 | } |
276 | } |
277 | |
277 | |
278 | table.diffstat td.upd a { |
278 | table.diffstat td.upd a { |
279 | color: blue; |
279 | color: blue; |
280 | } |
280 | } |
281 | |
281 | |
282 | table.diffstat td.graph { |
282 | table.diffstat td.graph { |
283 | width: 75%; |
283 | width: 75%; |
284 | vertical-align: center; |
284 | vertical-align: center; |
285 | } |
285 | } |
286 | |
286 | |
287 | table.diffstat td.graph img { |
287 | table.diffstat td.graph img { |
288 | border: none; |
288 | border: none; |
289 | height: 8pt; |
289 | height: 8pt; |
290 | } |
290 | } |
291 | |
291 | |
292 | div.diffstat-summary { |
292 | div.diffstat-summary { |
293 | color: #888; |
293 | color: #888; |
294 | padding-top: 0.5em; |
294 | padding-top: 0.5em; |
295 | } |
295 | } |
296 | |
296 | |
297 | table.diff th { |
| |
298 | padding: 1em 0em 0.1em 0.1em; |
| |
299 | text-align: left; |
| |
300 | } |
| |
301 | |
| |
302 | table.diff td { |
297 | table.diff td { |
303 | border: solid 1px black; |
| |
304 | font-family: monospace; |
298 | font-family: monospace; |
305 | white-space: pre; |
299 | white-space: pre; |
306 | } |
300 | } |
307 | |
301 | |
| |
302 | table.diff td div.head { |
| |
303 | font-weight: bold; |
| |
304 | padding-top: 1em; |
| |
305 | } |
| |
306 | |
308 | table.diff td div.hunk { |
307 | table.diff td div.hunk { |
309 | background: #ccc; |
308 | color: #009; |
310 | } |
309 | } |
311 | |
310 | |
312 | table.diff td div.add { |
311 | table.diff td div.add { |
313 | color: green; |
312 | color: green; |
314 | } |
313 | } |
315 | |
314 | |
316 | table.diff td div.del { |
315 | table.diff td div.del { |
317 | color: red; |
316 | color: red; |
318 | } |
317 | } |
319 | |
318 | |
320 | .sha1 { |
319 | .sha1 { |
321 | font-family: courier; |
320 | font-family: courier; |
322 | font-size: 90%; |
321 | font-size: 90%; |
323 | } |
322 | } |
324 | |
323 | |
325 | .left { |
324 | .left { |
326 | text-align: left; |
325 | text-align: left; |
327 | } |
326 | } |
328 | |
327 | |
329 | .right { |
328 | .right { |
330 | text-align: right; |
329 | text-align: right; |
331 | } |
330 | } |
|
|
diff --git a/ui-diff.c b/ui-diff.c index 10330d3..7ec5701 100644 --- a/ ui-diff.c+++ b/ ui-diff.c |
|
@@ -1,82 +1,102 @@ |
1 | /* ui-diff.c: show diff between two blobs |
1 | /* ui-diff.c: show diff between two blobs |
2 | * |
2 | * |
3 | * Copyright (C) 2006 Lars Hjemli |
3 | * Copyright (C) 2006 Lars Hjemli |
4 | * |
4 | * |
5 | * Licensed under GNU General Public License v2 |
5 | * Licensed under GNU General Public License v2 |
6 | * (see COPYING for full license text) |
6 | * (see COPYING for full license text) |
7 | */ |
7 | */ |
8 | |
8 | |
9 | #include "cgit.h" |
9 | #include "cgit.h" |
10 | |
10 | |
11 | |
11 | |
12 | /* |
12 | /* |
13 | * print a single line returned from xdiff |
13 | * print a single line returned from xdiff |
14 | */ |
14 | */ |
15 | static void print_line(char *line, int len) |
15 | static void print_line(char *line, int len) |
16 | { |
16 | { |
17 | char *class = "ctx"; |
17 | char *class = "ctx"; |
18 | char c = line[len-1]; |
18 | char c = line[len-1]; |
19 | |
19 | |
20 | if (line[0] == '+') |
20 | if (line[0] == '+') |
21 | class = "add"; |
21 | class = "add"; |
22 | else if (line[0] == '-') |
22 | else if (line[0] == '-') |
23 | class = "del"; |
23 | class = "del"; |
24 | else if (line[0] == '@') |
24 | else if (line[0] == '@') |
25 | class = "hunk"; |
25 | class = "hunk"; |
26 | |
26 | |
27 | htmlf("<div class='%s'>", class); |
27 | htmlf("<div class='%s'>", class); |
28 | line[len-1] = '\0'; |
28 | line[len-1] = '\0'; |
29 | html_txt(line); |
29 | html_txt(line); |
30 | html("</div>"); |
30 | html("</div>"); |
31 | line[len-1] = c; |
31 | line[len-1] = c; |
32 | } |
32 | } |
33 | |
33 | |
34 | static void filepair_cb(struct diff_filepair *pair) |
34 | static void header(unsigned char *sha1, char *path1, |
| |
35 | unsigned char *sha2, char *path2) |
35 | { |
36 | { |
36 | html("<tr><th>"); |
37 | char *abbrev1, *abbrev2; |
37 | html_txt(pair->two->path); |
38 | |
38 | html("</th></tr>"); |
| |
39 | html("<tr><td>"); |
39 | html("<tr><td>"); |
| |
40 | html("<div class='head'>"); |
| |
41 | html("diff --git a/"); |
| |
42 | html_txt(path1); |
| |
43 | html(" b/"); |
| |
44 | html_txt(path2); |
| |
45 | abbrev1 = xstrdup(find_unique_abbrev(sha1, DEFAULT_ABBREV)); |
| |
46 | abbrev2 = xstrdup(find_unique_abbrev(sha2, DEFAULT_ABBREV)); |
| |
47 | htmlf("\nindex %s..%s", abbrev1, abbrev2); |
| |
48 | free(abbrev1); |
| |
49 | free(abbrev2); |
| |
50 | html("\n--- a/"); |
| |
51 | html_txt(path1); |
| |
52 | html("\n+++ b/"); |
| |
53 | html_txt(path2); |
| |
54 | html("</div>"); |
| |
55 | } |
| |
56 | |
| |
57 | static void filepair_cb(struct diff_filepair *pair) |
| |
58 | { |
| |
59 | header(pair->one->sha1, pair->one->path, |
| |
60 | pair->two->sha1, pair->two->path); |
40 | if (cgit_diff_files(pair->one->sha1, pair->two->sha1, print_line)) |
61 | if (cgit_diff_files(pair->one->sha1, pair->two->sha1, print_line)) |
41 | cgit_print_error("Error running diff"); |
62 | cgit_print_error("Error running diff"); |
42 | html("</tr></td>"); |
63 | html("</tr></td>"); |
43 | } |
64 | } |
44 | |
65 | |
45 | void cgit_print_diff(const char *old_hex, const char *new_hex, char *path) |
66 | void cgit_print_diff(const char *old_hex, const char *new_hex, char *path) |
46 | { |
67 | { |
47 | unsigned char sha1[20], sha2[20]; |
68 | unsigned char sha1[20], sha2[20]; |
48 | enum object_type type; |
69 | enum object_type type; |
49 | unsigned long size; |
70 | unsigned long size; |
50 | |
71 | |
51 | get_sha1(old_hex, sha1); |
72 | get_sha1(old_hex, sha1); |
52 | get_sha1(new_hex, sha2); |
73 | get_sha1(new_hex, sha2); |
53 | |
74 | |
54 | type = sha1_object_info(sha1, &size); |
75 | type = sha1_object_info(sha1, &size); |
55 | if (type == OBJ_BAD) { |
76 | if (type == OBJ_BAD) { |
56 | type = sha1_object_info(sha2, &size); |
77 | type = sha1_object_info(sha2, &size); |
57 | if (type == OBJ_BAD) { |
78 | if (type == OBJ_BAD) { |
58 | cgit_print_error(fmt("Bad object names: %s, %s", old_hex, new_hex)); |
79 | cgit_print_error(fmt("Bad object names: %s, %s", old_hex, new_hex)); |
59 | return; |
80 | return; |
60 | } |
81 | } |
61 | } |
82 | } |
62 | |
83 | |
63 | html("<table class='diff'>"); |
84 | html("<table class='diff'>"); |
64 | switch(type) { |
85 | switch(type) { |
65 | case OBJ_BLOB: |
86 | case OBJ_BLOB: |
66 | if (path) |
| |
67 | htmlf("<tr><th>%s</th></tr>", path); |
| |
68 | html("<tr><td>"); |
87 | html("<tr><td>"); |
| |
88 | header(sha1, path, sha2, path); |
69 | if (cgit_diff_files(sha1, sha2, print_line)) |
89 | if (cgit_diff_files(sha1, sha2, print_line)) |
70 | cgit_print_error("Error running diff"); |
90 | cgit_print_error("Error running diff"); |
71 | html("</tr></td>"); |
91 | html("</tr></td>"); |
72 | break; |
92 | break; |
73 | case OBJ_TREE: |
93 | case OBJ_TREE: |
74 | cgit_diff_tree(sha1, sha2, filepair_cb); |
94 | cgit_diff_tree(sha1, sha2, filepair_cb); |
75 | break; |
95 | break; |
76 | default: |
96 | default: |
77 | cgit_print_error(fmt("Unhandled object type: %s", |
97 | cgit_print_error(fmt("Unhandled object type: %s", |
78 | typename(type))); |
98 | typename(type))); |
79 | break; |
99 | break; |
80 | } |
100 | } |
81 | html("</td></tr></table>"); |
101 | html("</td></tr></table>"); |
82 | } |
102 | } |
|