-rw-r--r-- | ui-diff.c | 14 | ||||
-rw-r--r-- | ui-ssdiff.c | 8 |
2 files changed, 16 insertions, 6 deletions
@@ -224,99 +224,105 @@ static void header(unsigned char *sha1, char *path1, int mode1, | |||
224 | if (!subproject) { | 224 | if (!subproject) { |
225 | abbrev1 = xstrdup(find_unique_abbrev(sha1, DEFAULT_ABBREV)); | 225 | abbrev1 = xstrdup(find_unique_abbrev(sha1, DEFAULT_ABBREV)); |
226 | abbrev2 = xstrdup(find_unique_abbrev(sha2, DEFAULT_ABBREV)); | 226 | abbrev2 = xstrdup(find_unique_abbrev(sha2, DEFAULT_ABBREV)); |
227 | htmlf("<br/>index %s..%s", abbrev1, abbrev2); | 227 | htmlf("<br/>index %s..%s", abbrev1, abbrev2); |
228 | free(abbrev1); | 228 | free(abbrev1); |
229 | free(abbrev2); | 229 | free(abbrev2); |
230 | if (mode1 != 0 && mode2 != 0) { | 230 | if (mode1 != 0 && mode2 != 0) { |
231 | htmlf(" %.6o", mode1); | 231 | htmlf(" %.6o", mode1); |
232 | if (mode2 != mode1) | 232 | if (mode2 != mode1) |
233 | htmlf("..%.6o", mode2); | 233 | htmlf("..%.6o", mode2); |
234 | } | 234 | } |
235 | html("<br/>--- a/"); | 235 | html("<br/>--- a/"); |
236 | if (mode1 != 0) | 236 | if (mode1 != 0) |
237 | cgit_tree_link(path1, NULL, NULL, ctx.qry.head, | 237 | cgit_tree_link(path1, NULL, NULL, ctx.qry.head, |
238 | sha1_to_hex(old_rev_sha1), path1); | 238 | sha1_to_hex(old_rev_sha1), path1); |
239 | else | 239 | else |
240 | html_txt(path1); | 240 | html_txt(path1); |
241 | html("<br/>+++ b/"); | 241 | html("<br/>+++ b/"); |
242 | if (mode2 != 0) | 242 | if (mode2 != 0) |
243 | cgit_tree_link(path2, NULL, NULL, ctx.qry.head, | 243 | cgit_tree_link(path2, NULL, NULL, ctx.qry.head, |
244 | sha1_to_hex(new_rev_sha1), path2); | 244 | sha1_to_hex(new_rev_sha1), path2); |
245 | else | 245 | else |
246 | html_txt(path2); | 246 | html_txt(path2); |
247 | } | 247 | } |
248 | html("</div>"); | 248 | html("</div>"); |
249 | } | 249 | } |
250 | 250 | ||
251 | static void print_ssdiff_link() | 251 | static void print_ssdiff_link() |
252 | { | 252 | { |
253 | if (!strcmp(ctx.qry.page, "diff")) { | 253 | if (!strcmp(ctx.qry.page, "diff")) { |
254 | if (use_ssdiff) | 254 | if (use_ssdiff) |
255 | cgit_diff_link("Unidiff", NULL, NULL, ctx.qry.head, | 255 | cgit_diff_link("Unidiff", NULL, NULL, ctx.qry.head, |
256 | ctx.qry.sha1, ctx.qry.sha2, NULL, 1); | 256 | ctx.qry.sha1, ctx.qry.sha2, ctx.qry.path, 1); |
257 | else | 257 | else |
258 | cgit_diff_link("Side-by-side diff", NULL, NULL, | 258 | cgit_diff_link("Side-by-side diff", NULL, NULL, |
259 | ctx.qry.head, ctx.qry.sha1, | 259 | ctx.qry.head, ctx.qry.sha1, |
260 | ctx.qry.sha2, NULL, 1); | 260 | ctx.qry.sha2, ctx.qry.path, 1); |
261 | } | 261 | } |
262 | } | 262 | } |
263 | 263 | ||
264 | static void filepair_cb(struct diff_filepair *pair) | 264 | static void filepair_cb(struct diff_filepair *pair) |
265 | { | 265 | { |
266 | unsigned long old_size = 0; | 266 | unsigned long old_size = 0; |
267 | unsigned long new_size = 0; | 267 | unsigned long new_size = 0; |
268 | int binary = 0; | 268 | int binary = 0; |
269 | linediff_fn print_line_fn = print_line; | 269 | linediff_fn print_line_fn = print_line; |
270 | 270 | ||
271 | if (use_ssdiff) { | 271 | if (use_ssdiff) { |
272 | cgit_ssdiff_header_begin(); | 272 | cgit_ssdiff_header_begin(); |
273 | print_line_fn = cgit_ssdiff_line_cb; | 273 | print_line_fn = cgit_ssdiff_line_cb; |
274 | } | 274 | } |
275 | header(pair->one->sha1, pair->one->path, pair->one->mode, | 275 | header(pair->one->sha1, pair->one->path, pair->one->mode, |
276 | pair->two->sha1, pair->two->path, pair->two->mode); | 276 | pair->two->sha1, pair->two->path, pair->two->mode); |
277 | if (use_ssdiff) | 277 | if (use_ssdiff) |
278 | cgit_ssdiff_header_end(); | 278 | cgit_ssdiff_header_end(); |
279 | if (S_ISGITLINK(pair->one->mode) || S_ISGITLINK(pair->two->mode)) { | 279 | if (S_ISGITLINK(pair->one->mode) || S_ISGITLINK(pair->two->mode)) { |
280 | if (S_ISGITLINK(pair->one->mode)) | 280 | if (S_ISGITLINK(pair->one->mode)) |
281 | print_line_fn(fmt("-Subproject %s", sha1_to_hex(pair->one->sha1)), 52); | 281 | print_line_fn(fmt("-Subproject %s", sha1_to_hex(pair->one->sha1)), 52); |
282 | if (S_ISGITLINK(pair->two->mode)) | 282 | if (S_ISGITLINK(pair->two->mode)) |
283 | print_line_fn(fmt("+Subproject %s", sha1_to_hex(pair->two->sha1)), 52); | 283 | print_line_fn(fmt("+Subproject %s", sha1_to_hex(pair->two->sha1)), 52); |
284 | if (use_ssdiff) | ||
285 | cgit_ssdiff_footer(); | ||
284 | return; | 286 | return; |
285 | } | 287 | } |
286 | if (cgit_diff_files(pair->one->sha1, pair->two->sha1, &old_size, | 288 | if (cgit_diff_files(pair->one->sha1, pair->two->sha1, &old_size, |
287 | &new_size, &binary, print_line_fn)) | 289 | &new_size, &binary, print_line_fn)) |
288 | cgit_print_error("Error running diff"); | 290 | cgit_print_error("Error running diff"); |
289 | if (binary) | 291 | if (binary) { |
290 | print_line_fn(" Binary files differ", 20); | 292 | if (use_ssdiff) |
293 | html("<tr><td colspan='4'>Binary files differ</td></tr>"); | ||
294 | else | ||
295 | html("Binary files differ"); | ||
296 | } | ||
291 | if (use_ssdiff) | 297 | if (use_ssdiff) |
292 | cgit_ssdiff_footer(); | 298 | cgit_ssdiff_footer(); |
293 | } | 299 | } |
294 | 300 | ||
295 | void cgit_print_diff(const char *new_rev, const char *old_rev, const char *prefix) | 301 | void cgit_print_diff(const char *new_rev, const char *old_rev, const char *prefix) |
296 | { | 302 | { |
297 | enum object_type type; | 303 | enum object_type type; |
298 | unsigned long size; | 304 | unsigned long size; |
299 | struct commit *commit, *commit2; | 305 | struct commit *commit, *commit2; |
300 | 306 | ||
301 | if (!new_rev) | 307 | if (!new_rev) |
302 | new_rev = ctx.qry.head; | 308 | new_rev = ctx.qry.head; |
303 | get_sha1(new_rev, new_rev_sha1); | 309 | get_sha1(new_rev, new_rev_sha1); |
304 | type = sha1_object_info(new_rev_sha1, &size); | 310 | type = sha1_object_info(new_rev_sha1, &size); |
305 | if (type == OBJ_BAD) { | 311 | if (type == OBJ_BAD) { |
306 | cgit_print_error(fmt("Bad object name: %s", new_rev)); | 312 | cgit_print_error(fmt("Bad object name: %s", new_rev)); |
307 | return; | 313 | return; |
308 | } | 314 | } |
309 | commit = lookup_commit_reference(new_rev_sha1); | 315 | commit = lookup_commit_reference(new_rev_sha1); |
310 | if (!commit || parse_commit(commit)) | 316 | if (!commit || parse_commit(commit)) |
311 | cgit_print_error(fmt("Bad commit: %s", sha1_to_hex(new_rev_sha1))); | 317 | cgit_print_error(fmt("Bad commit: %s", sha1_to_hex(new_rev_sha1))); |
312 | 318 | ||
313 | if (old_rev) | 319 | if (old_rev) |
314 | get_sha1(old_rev, old_rev_sha1); | 320 | get_sha1(old_rev, old_rev_sha1); |
315 | else if (commit->parents && commit->parents->item) | 321 | else if (commit->parents && commit->parents->item) |
316 | hashcpy(old_rev_sha1, commit->parents->item->object.sha1); | 322 | hashcpy(old_rev_sha1, commit->parents->item->object.sha1); |
317 | else | 323 | else |
318 | hashclr(old_rev_sha1); | 324 | hashclr(old_rev_sha1); |
319 | 325 | ||
320 | if (!is_null_sha1(old_rev_sha1)) { | 326 | if (!is_null_sha1(old_rev_sha1)) { |
321 | type = sha1_object_info(old_rev_sha1, &size); | 327 | type = sha1_object_info(old_rev_sha1, &size); |
322 | if (type == OBJ_BAD) { | 328 | if (type == OBJ_BAD) { |
diff --git a/ui-ssdiff.c b/ui-ssdiff.c index 8215051..5673642 100644 --- a/ui-ssdiff.c +++ b/ui-ssdiff.c | |||
@@ -79,78 +79,82 @@ static void deferred_old_add(char *line, int line_no) | |||
79 | item->line = xstrdup(line); | 79 | item->line = xstrdup(line); |
80 | item->line_no = line_no; | 80 | item->line_no = line_no; |
81 | item->next = NULL; | 81 | item->next = NULL; |
82 | if (deferred_old) { | 82 | if (deferred_old) { |
83 | deferred_old_last->next = item; | 83 | deferred_old_last->next = item; |
84 | deferred_old_last = item; | 84 | deferred_old_last = item; |
85 | } else { | 85 | } else { |
86 | deferred_old = deferred_old_last = item; | 86 | deferred_old = deferred_old_last = item; |
87 | } | 87 | } |
88 | } | 88 | } |
89 | 89 | ||
90 | static void deferred_new_add(char *line, int line_no) | 90 | static void deferred_new_add(char *line, int line_no) |
91 | { | 91 | { |
92 | struct deferred_lines *item = xmalloc(sizeof(struct deferred_lines)); | 92 | struct deferred_lines *item = xmalloc(sizeof(struct deferred_lines)); |
93 | item->line = xstrdup(line); | 93 | item->line = xstrdup(line); |
94 | item->line_no = line_no; | 94 | item->line_no = line_no; |
95 | item->next = NULL; | 95 | item->next = NULL; |
96 | if (deferred_new) { | 96 | if (deferred_new) { |
97 | deferred_new_last->next = item; | 97 | deferred_new_last->next = item; |
98 | deferred_new_last = item; | 98 | deferred_new_last = item; |
99 | } else { | 99 | } else { |
100 | deferred_new = deferred_new_last = item; | 100 | deferred_new = deferred_new_last = item; |
101 | } | 101 | } |
102 | } | 102 | } |
103 | 103 | ||
104 | static void print_ssdiff_line(char *class, int old_line_no, char *old_line, | 104 | static void print_ssdiff_line(char *class, int old_line_no, char *old_line, |
105 | int new_line_no, char *new_line) | 105 | int new_line_no, char *new_line) |
106 | { | 106 | { |
107 | html("<tr>"); | 107 | html("<tr>"); |
108 | if (old_line_no > 0) | 108 | if (old_line_no > 0) |
109 | htmlf("<td class='lineno'>%d</td><td class='%s'>", | 109 | htmlf("<td class='lineno'>%d</td><td class='%s'>", |
110 | old_line_no, class); | 110 | old_line_no, class); |
111 | else if (old_line) | ||
112 | htmlf("<td class='lineno'></td><td class='%s'>", class); | ||
111 | else | 113 | else |
112 | htmlf("<td class='lineno'></td><td class='%s_dark'>", class); | 114 | htmlf("<td class='lineno'></td><td class='%s_dark'>", class); |
113 | 115 | ||
114 | if (old_line) { | 116 | if (old_line) { |
115 | old_line = replace_tabs(old_line + 1); | 117 | old_line = replace_tabs(old_line + 1); |
116 | html_txt(old_line); | 118 | html_txt(old_line); |
117 | free(old_line); | 119 | free(old_line); |
118 | } | 120 | } |
119 | 121 | ||
120 | html("</td>"); | 122 | html("</td>"); |
121 | 123 | ||
122 | if (new_line_no > 0) | 124 | if (new_line_no > 0) |
123 | htmlf("<td class='lineno'>%d</td><td class='%s'>", | 125 | htmlf("<td class='lineno'>%d</td><td class='%s'>", |
124 | new_line_no, class); | 126 | new_line_no, class); |
127 | else if (new_line) | ||
128 | htmlf("<td class='lineno'></td><td class='%s'>", class); | ||
125 | else | 129 | else |
126 | htmlf("<td class='lineno'></td><td class='%s_dark'>", class); | 130 | htmlf("<td class='lineno'></td><td class='%s_dark'>", class); |
127 | 131 | ||
128 | if (new_line) { | 132 | if (new_line) { |
129 | new_line = replace_tabs(new_line + 1); | 133 | new_line = replace_tabs(new_line + 1); |
130 | html_txt(new_line); | 134 | html_txt(new_line); |
131 | free(new_line); | 135 | free(new_line); |
132 | } | 136 | } |
133 | 137 | ||
134 | html("</td></tr>"); | 138 | html("</td></tr>"); |
135 | } | 139 | } |
136 | 140 | ||
137 | static void print_deferred_old_lines() | 141 | static void print_deferred_old_lines() |
138 | { | 142 | { |
139 | struct deferred_lines *iter_old, *tmp; | 143 | struct deferred_lines *iter_old, *tmp; |
140 | 144 | ||
141 | iter_old = deferred_old; | 145 | iter_old = deferred_old; |
142 | while (iter_old) { | 146 | while (iter_old) { |
143 | print_ssdiff_line("del", iter_old->line_no, | 147 | print_ssdiff_line("del", iter_old->line_no, |
144 | iter_old->line, -1, NULL); | 148 | iter_old->line, -1, NULL); |
145 | tmp = iter_old->next; | 149 | tmp = iter_old->next; |
146 | free(iter_old); | 150 | free(iter_old); |
147 | iter_old = tmp; | 151 | iter_old = tmp; |
148 | } | 152 | } |
149 | } | 153 | } |
150 | 154 | ||
151 | static void print_deferred_new_lines() | 155 | static void print_deferred_new_lines() |
152 | { | 156 | { |
153 | struct deferred_lines *iter_new, *tmp; | 157 | struct deferred_lines *iter_new, *tmp; |
154 | 158 | ||
155 | iter_new = deferred_new; | 159 | iter_new = deferred_new; |
156 | while (iter_new) { | 160 | while (iter_new) { |
@@ -222,49 +226,49 @@ void cgit_ssdiff_line_cb(char *line, int len) | |||
222 | if (line[0] == '@') { | 226 | if (line[0] == '@') { |
223 | current_old_line = line_from_hunk(line, '-'); | 227 | current_old_line = line_from_hunk(line, '-'); |
224 | current_new_line = line_from_hunk(line, '+'); | 228 | current_new_line = line_from_hunk(line, '+'); |
225 | } | 229 | } |
226 | 230 | ||
227 | if (line[0] == ' ') { | 231 | if (line[0] == ' ') { |
228 | if (deferred_old || deferred_new) | 232 | if (deferred_old || deferred_new) |
229 | cgit_ssdiff_print_deferred_lines(); | 233 | cgit_ssdiff_print_deferred_lines(); |
230 | print_ssdiff_line("ctx", current_old_line, line, | 234 | print_ssdiff_line("ctx", current_old_line, line, |
231 | current_new_line, line); | 235 | current_new_line, line); |
232 | current_old_line += 1; | 236 | current_old_line += 1; |
233 | current_new_line += 1; | 237 | current_new_line += 1; |
234 | } else if (line[0] == '+') { | 238 | } else if (line[0] == '+') { |
235 | deferred_new_add(line, current_new_line); | 239 | deferred_new_add(line, current_new_line); |
236 | current_new_line += 1; | 240 | current_new_line += 1; |
237 | } else if (line[0] == '-') { | 241 | } else if (line[0] == '-') { |
238 | deferred_old_add(line, current_old_line); | 242 | deferred_old_add(line, current_old_line); |
239 | current_old_line += 1; | 243 | current_old_line += 1; |
240 | } else if (line[0] == '@') { | 244 | } else if (line[0] == '@') { |
241 | html("<tr><td colspan='4' class='hunk'>"); | 245 | html("<tr><td colspan='4' class='hunk'>"); |
242 | html_txt(line); | 246 | html_txt(line); |
243 | html("</td></tr>"); | 247 | html("</td></tr>"); |
244 | } else { | 248 | } else { |
245 | html("<tr><td colspan='4' class='ctx'>"); | 249 | html("<tr><td colspan='4' class='ctx'>"); |
246 | html_txt(line); | 250 | html_txt(line); |
247 | html("</td></tr>"); | 251 | html("</td></tr>"); |
248 | } | 252 | } |
249 | line[len - 1] = c; | 253 | line[len - 1] = c; |
250 | } | 254 | } |
251 | 255 | ||
252 | void cgit_ssdiff_header_begin() | 256 | void cgit_ssdiff_header_begin() |
253 | { | 257 | { |
254 | current_old_line = 0; | 258 | current_old_line = -1; |
255 | current_new_line = 0; | 259 | current_new_line = -1; |
256 | html("<tr><td class='space' colspan='4'><div></div></td></tr>"); | 260 | html("<tr><td class='space' colspan='4'><div></div></td></tr>"); |
257 | html("<tr><td class='head' colspan='4'>"); | 261 | html("<tr><td class='head' colspan='4'>"); |
258 | } | 262 | } |
259 | 263 | ||
260 | void cgit_ssdiff_header_end() | 264 | void cgit_ssdiff_header_end() |
261 | { | 265 | { |
262 | html("</td><tr>"); | 266 | html("</td><tr>"); |
263 | } | 267 | } |
264 | 268 | ||
265 | void cgit_ssdiff_footer() | 269 | void cgit_ssdiff_footer() |
266 | { | 270 | { |
267 | if (deferred_old || deferred_new) | 271 | if (deferred_old || deferred_new) |
268 | cgit_ssdiff_print_deferred_lines(); | 272 | cgit_ssdiff_print_deferred_lines(); |
269 | html("<tr><td class='foot' colspan='4'></td></tr>"); | 273 | html("<tr><td class='foot' colspan='4'></td></tr>"); |
270 | } | 274 | } |