summaryrefslogtreecommitdiffabout
path: root/ui-diff.c
Unidiff
Diffstat (limited to 'ui-diff.c') (more/less context) (ignore whitespace changes)
-rw-r--r--ui-diff.c14
1 files changed, 10 insertions, 4 deletions
diff --git a/ui-diff.c b/ui-diff.c
index b21c2c1..a92a768 100644
--- a/ui-diff.c
+++ b/ui-diff.c
@@ -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
251static void print_ssdiff_link() 251static 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
264static void filepair_cb(struct diff_filepair *pair) 264static 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
295void cgit_print_diff(const char *new_rev, const char *old_rev, const char *prefix) 301void 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) {