summaryrefslogtreecommitdiffabout
path: root/ui-diff.c
Side-by-side diff
Diffstat (limited to 'ui-diff.c') (more/less context) (ignore whitespace changes)
-rw-r--r--ui-diff.c22
1 files changed, 20 insertions, 2 deletions
diff --git a/ui-diff.c b/ui-diff.c
index 0c6f8d7..42e81ac 100644
--- a/ui-diff.c
+++ b/ui-diff.c
@@ -76,25 +76,25 @@ static void print_fileinfo(struct fileinfo *info)
cgit_print_filemode(info->new_mode);
}
if (info->old_mode != info->new_mode &&
!is_null_sha1(info->old_sha1) &&
!is_null_sha1(info->new_sha1)) {
html("<span class='modechange'>[");
cgit_print_filemode(info->old_mode);
html("]</span>");
}
htmlf("</td><td class='%s'>", class);
cgit_diff_link(info->new_path, NULL, NULL, ctx.qry.head, ctx.qry.sha1,
- ctx.qry.sha2, info->new_path);
+ ctx.qry.sha2, info->new_path, 0);
if (info->status == DIFF_STATUS_COPIED || info->status == DIFF_STATUS_RENAMED)
htmlf(" (%s from %s)",
info->status == DIFF_STATUS_COPIED ? "copied" : "renamed",
info->old_path);
html("</td><td class='right'>");
if (info->binary) {
htmlf("bin</td><td class='graph'>%d -> %d bytes",
info->old_size, info->new_size);
return;
}
htmlf("%d", info->added + info->removed);
html("</td><td class='graph'>");
@@ -151,25 +151,25 @@ static void inspect_filepair(struct diff_filepair *pair)
max_changes = lines_added + lines_removed;
total_adds += lines_added;
total_rems += lines_removed;
}
void cgit_print_diffstat(const unsigned char *old_sha1,
const unsigned char *new_sha1)
{
int i;
html("<div class='diffstat-header'>");
cgit_diff_link("Diffstat", NULL, NULL, ctx.qry.head, ctx.qry.sha1,
- ctx.qry.sha2, NULL);
+ ctx.qry.sha2, NULL, 0);
html("</div>");
html("<table summary='diffstat' class='diffstat'>");
max_changes = 0;
cgit_diff_tree(old_sha1, new_sha1, inspect_filepair, NULL);
for(i = 0; i<files; i++)
print_fileinfo(&items[i]);
html("</table>");
html("<div class='diffstat-summary'>");
htmlf("%d files changed, %d insertions, %d deletions",
files, total_adds, total_rems);
html("</div>");
}
@@ -241,24 +241,37 @@ static void header(unsigned char *sha1, char *path1, int mode1,
html("<br/>+++ b/");
if (mode2 != 0)
cgit_tree_link(path2, NULL, NULL, ctx.qry.head,
sha1_to_hex(new_rev_sha1), path2);
else
html_txt(path2);
}
html("</div>");
if (use_ssdiff)
cgit_ssdiff_header();
}
+static void print_ssdiff_link()
+{
+ if (!strcmp(ctx.qry.page, "diff")) {
+ if (use_ssdiff)
+ cgit_diff_link("Unidiff", NULL, NULL, ctx.qry.head,
+ ctx.qry.sha1, ctx.qry.sha2, NULL, 1);
+ else
+ cgit_diff_link("Side-by-side diff", NULL, NULL,
+ ctx.qry.head, ctx.qry.sha1,
+ ctx.qry.sha2, NULL, 1);
+ }
+}
+
static void filepair_cb(struct diff_filepair *pair)
{
unsigned long old_size = 0;
unsigned long new_size = 0;
int binary = 0;
linediff_fn print_line_fn = print_line;
header(pair->one->sha1, pair->one->path, pair->one->mode,
pair->two->sha1, pair->two->path, pair->two->mode);
if (use_ssdiff) {
cgit_ssdiff_header();
print_line_fn = cgit_ssdiff_line_cb;
@@ -305,20 +318,25 @@ void cgit_print_diff(const char *new_rev, const char *old_rev, const char *prefi
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(fmt("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(fmt("Bad commit: %s", sha1_to_hex(old_rev_sha1)));
}
+
+ if ((ctx.qry.ssdiff && !ctx.cfg.ssdiff) || (!ctx.qry.ssdiff && ctx.cfg.ssdiff))
+ use_ssdiff = 1;
+
+ print_ssdiff_link();
cgit_print_diffstat(old_rev_sha1, new_rev_sha1);
html("<table summary='diff' class='diff'>");
html("<tr><td>");
cgit_diff_tree(old_rev_sha1, new_rev_sha1, filepair_cb, prefix);
html("</td></tr>");
html("</table>");
}