X-Git-Url: https://gitweb.ps.run/ps-cgit/blobdiff_plain/ed5bd30ebe6921dd22948a3f33a314283f043606..eeaffc33432d3cf91902cac3eab50c0598bdaa19:/ui-diff.c diff --git a/ui-diff.c b/ui-diff.c index 8b38209..71273aa 100644 --- a/ui-diff.c +++ b/ui-diff.c @@ -1,6 +1,6 @@ /* ui-diff.c: show diff between two blobs * - * Copyright (C) 2006 Lars Hjemli + * Copyright (C) 2006-2014 cgit Development Team * * Licensed under GNU General Public License v2 * (see COPYING for full license text) @@ -358,17 +358,14 @@ void cgit_print_diff_ctrls() } void cgit_print_diff(const char *new_rev, const char *old_rev, - const char *prefix, int show_ctrls) + const char *prefix, int show_ctrls, int raw) { - enum object_type type; - unsigned long size; struct commit *commit, *commit2; + const unsigned char *old_tree_sha1, *new_tree_sha1; if (!new_rev) new_rev = ctx.qry.head; - get_sha1(new_rev, new_rev_sha1); - type = sha1_object_info(new_rev_sha1, &size); - if (type == OBJ_BAD) { + if (get_sha1(new_rev, new_rev_sha1)) { cgit_print_error("Bad object name: %s", new_rev); return; } @@ -377,25 +374,50 @@ void cgit_print_diff(const char *new_rev, const char *old_rev, cgit_print_error("Bad commit: %s", sha1_to_hex(new_rev_sha1)); return; } + new_tree_sha1 = commit->tree->object.sha1; - if (old_rev) - get_sha1(old_rev, old_rev_sha1); - else if (commit->parents && commit->parents->item) + if (old_rev) { + if (get_sha1(old_rev, old_rev_sha1)) { + cgit_print_error("Bad object name: %s", old_rev); + return; + } + } else if (commit->parents && commit->parents->item) { hashcpy(old_rev_sha1, commit->parents->item->object.sha1); - else + } else { hashclr(old_rev_sha1); + } if (!is_null_sha1(old_rev_sha1)) { - type = sha1_object_info(old_rev_sha1, &size); - if (type == OBJ_BAD) { - cgit_print_error("Bad object name: %s", sha1_to_hex(old_rev_sha1)); - return; - } commit2 = lookup_commit_reference(old_rev_sha1); if (!commit2 || parse_commit(commit2)) { cgit_print_error("Bad commit: %s", sha1_to_hex(old_rev_sha1)); return; } + old_tree_sha1 = commit2->tree->object.sha1; + } else { + old_tree_sha1 = NULL; + } + + if (raw) { + struct diff_options diffopt; + + diff_setup(&diffopt); + diffopt.output_format = DIFF_FORMAT_PATCH; + DIFF_OPT_SET(&diffopt, RECURSIVE); + diff_setup_done(&diffopt); + + ctx.page.mimetype = "text/plain"; + cgit_print_http_headers(); + if (old_tree_sha1) { + diff_tree_sha1(old_tree_sha1, new_tree_sha1, "", + &diffopt); + } else { + diff_root_tree_sha1(new_tree_sha1, "", &diffopt); + } + diffcore_std(&diffopt); + diff_flush(&diffopt); + + return; } use_ssdiff = ctx.qry.has_ssdiff ? ctx.qry.ssdiff : ctx.cfg.ssdiff;