X-Git-Url: https://gitweb.ps.run/ps-cgit/blobdiff_plain/01db08372965b082239e7946255ac43f42d3e37d..d6c40507711ff6cc19c8fd3f28412845a33faf50:/ui-diff.c diff --git a/ui-diff.c b/ui-diff.c index 1209c47..5b6df1f 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) @@ -97,7 +97,7 @@ static void print_fileinfo(struct fileinfo *info) } htmlf("", class); cgit_diff_link(info->new_path, NULL, NULL, ctx.qry.head, ctx.qry.sha1, - ctx.qry.sha2, info->new_path, 0); + ctx.qry.sha2, info->new_path); if (info->status == DIFF_STATUS_COPIED || info->status == DIFF_STATUS_RENAMED) { htmlf(" (%s from ", info->status == DIFF_STATUS_COPIED ? "copied" : "renamed"); @@ -175,7 +175,7 @@ static void cgit_print_diffstat(const unsigned char *old_sha1, html("
"); cgit_diff_link("Diffstat", NULL, NULL, ctx.qry.head, ctx.qry.sha1, - ctx.qry.sha2, NULL, 0); + ctx.qry.sha2, NULL); if (prefix) { html(" (limited to '"); html_txt(prefix); @@ -345,10 +345,11 @@ void cgit_print_diff_ctrls() html(""); html("mode:"); html(""); - html(""); + curr = ctx.qry.has_difftype ? ctx.qry.difftype : ctx.cfg.difftype; html_intoption(0, "unified", curr); html_intoption(1, "ssdiff", curr); + html_intoption(2, "stat only", curr); html(""); html(""); html(""); @@ -361,6 +362,8 @@ void cgit_print_diff(const char *new_rev, const char *old_rev, const char *prefix, int show_ctrls, int raw) { struct commit *commit, *commit2; + const unsigned char *old_tree_sha1, *new_tree_sha1; + diff_type difftype; if (!new_rev) new_rev = ctx.qry.head; @@ -373,6 +376,7 @@ 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) { if (get_sha1(old_rev, old_rev_sha1)) { @@ -391,23 +395,54 @@ void cgit_print_diff(const char *new_rev, const char *old_rev, 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(&ctx); - cgit_diff_tree(old_rev_sha1, new_rev_sha1, filepair_cb_raw, - prefix, 0); + 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; + difftype = ctx.qry.has_difftype ? ctx.qry.difftype : ctx.cfg.difftype; + use_ssdiff = difftype == DIFF_SSDIFF; if (show_ctrls) cgit_print_diff_ctrls(); + /* + * Clicking on a link to a file in the diff stat should show a diff + * of the file, showing the diff stat limited to a single file is + * pretty useless. All links from this point on will be to + * individual files, so we simply reset the difftype in the query + * here to avoid propagating DIFF_STATONLY to the individual files. + */ + if (difftype == DIFF_STATONLY) + ctx.qry.difftype = ctx.cfg.difftype; + cgit_print_diffstat(old_rev_sha1, new_rev_sha1, prefix); + if (difftype == DIFF_STATONLY) + return; + if (use_ssdiff) { html(""); } else {