From 6a8749d3bd1570faa3dc07e80efc8fcef5953aa0 Mon Sep 17 00:00:00 2001 From: Lars Hjemli Date: Sun, 13 May 2007 23:13:12 +0200 Subject: Add commitdiff between commit and each of it's parent A link is added next to each parent of a commit, leading to the new diff-functionality in ui-diff.c. Also added support for a path-parameter to filelevel diffs accessed via the diffstat. Signed-off-by: Lars Hjemli --- ui-diff.c | 45 +++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 41 insertions(+), 4 deletions(-) (limited to 'ui-diff.c') diff --git a/ui-diff.c b/ui-diff.c index 96106af..10330d3 100644 --- a/ui-diff.c +++ b/ui-diff.c @@ -31,15 +31,52 @@ static void print_line(char *line, int len) line[len-1] = c; } -void cgit_print_diff(const char *old_hex, const char *new_hex) +static void filepair_cb(struct diff_filepair *pair) +{ + html(""); + html_txt(pair->two->path); + html(""); + html(""); + if (cgit_diff_files(pair->one->sha1, pair->two->sha1, print_line)) + cgit_print_error("Error running diff"); + html(""); +} + +void cgit_print_diff(const char *old_hex, const char *new_hex, char *path) { unsigned char sha1[20], sha2[20]; + enum object_type type; + unsigned long size; get_sha1(old_hex, sha1); get_sha1(new_hex, sha2); - html("
"); - if (cgit_diff_files(sha1, sha2, print_line)) - cgit_print_error("Error running diff"); + type = sha1_object_info(sha1, &size); + if (type == OBJ_BAD) { + type = sha1_object_info(sha2, &size); + if (type == OBJ_BAD) { + cgit_print_error(fmt("Bad object names: %s, %s", old_hex, new_hex)); + return; + } + } + + html(""); + switch(type) { + case OBJ_BLOB: + if (path) + htmlf("", path); + html(""); + break; + case OBJ_TREE: + cgit_diff_tree(sha1, sha2, filepair_cb); + break; + default: + cgit_print_error(fmt("Unhandled object type: %s", + typename(type))); + break; + } html("
%s
"); + if (cgit_diff_files(sha1, sha2, print_line)) + cgit_print_error("Error running diff"); + html("
"); } -- cgit v1.2.3