|
diff --git a/ui-diff.c b/ui-diff.c index 96106af..10330d3 100644 --- a/ ui-diff.c+++ b/ ui-diff.c |
|
@@ -1,45 +1,82 @@ |
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 | void cgit_print_diff(const char *old_hex, const char *new_hex) |
34 | static void filepair_cb(struct diff_filepair *pair) |
| |
35 | { |
| |
36 | html("<tr><th>"); |
| |
37 | html_txt(pair->two->path); |
| |
38 | html("</th></tr>"); |
| |
39 | html("<tr><td>"); |
| |
40 | if (cgit_diff_files(pair->one->sha1, pair->two->sha1, print_line)) |
| |
41 | cgit_print_error("Error running diff"); |
| |
42 | html("</tr></td>"); |
| |
43 | } |
| |
44 | |
| |
45 | void cgit_print_diff(const char *old_hex, const char *new_hex, char *path) |
35 | { |
46 | { |
36 | unsigned char sha1[20], sha2[20]; |
47 | unsigned char sha1[20], sha2[20]; |
| |
48 | enum object_type type; |
| |
49 | unsigned long size; |
37 | |
50 | |
38 | get_sha1(old_hex, sha1); |
51 | get_sha1(old_hex, sha1); |
39 | get_sha1(new_hex, sha2); |
52 | get_sha1(new_hex, sha2); |
40 | |
53 | |
41 | html("<table class='diff'><tr><td>"); |
54 | type = sha1_object_info(sha1, &size); |
42 | if (cgit_diff_files(sha1, sha2, print_line)) |
55 | if (type == OBJ_BAD) { |
43 | cgit_print_error("Error running diff"); |
56 | type = sha1_object_info(sha2, &size); |
| |
57 | if (type == OBJ_BAD) { |
| |
58 | cgit_print_error(fmt("Bad object names: %s, %s", old_hex, new_hex)); |
| |
59 | return; |
| |
60 | } |
| |
61 | } |
| |
62 | |
| |
63 | html("<table class='diff'>"); |
| |
64 | switch(type) { |
| |
65 | case OBJ_BLOB: |
| |
66 | if (path) |
| |
67 | htmlf("<tr><th>%s</th></tr>", path); |
| |
68 | html("<tr><td>"); |
| |
69 | if (cgit_diff_files(sha1, sha2, print_line)) |
| |
70 | cgit_print_error("Error running diff"); |
| |
71 | html("</tr></td>"); |
| |
72 | break; |
| |
73 | case OBJ_TREE: |
| |
74 | cgit_diff_tree(sha1, sha2, filepair_cb); |
| |
75 | break; |
| |
76 | default: |
| |
77 | cgit_print_error(fmt("Unhandled object type: %s", |
| |
78 | typename(type))); |
| |
79 | break; |
| |
80 | } |
44 | html("</td></tr></table>"); |
81 | html("</td></tr></table>"); |
45 | } |
82 | } |
|