From mboxrd@z Thu Jan 1 00:00:00 1970 From: cgit at cryptocrack.de (Lukas Fleischer) Date: Tue, 27 Aug 2013 03:27:06 +0200 Subject: [PATCH/RFC 1/2] ui-diff: Use diff_tree_sha1() for raw diff formatting Message-ID: <1377566827-2136-1-git-send-email-cgit@cryptocrack.de> Use Git's internal diff_tree_sha1() function for the /rawdiff/ command instead of trying to recreate this functionality. Signed-off-by: Lukas Fleischer --- The test suite still passes. If anybody has any idea how to do this better: Comments welcome. ui-diff.c | 28 +++++++++++++++++++++++++--- 1 file changed, 25 insertions(+), 3 deletions(-) diff --git a/ui-diff.c b/ui-diff.c index 1209c47..c602494 100644 --- a/ui-diff.c +++ b/ui-diff.c @@ -360,7 +360,7 @@ void cgit_print_diff_ctrls() void cgit_print_diff(const char *new_rev, const char *old_rev, const char *prefix, int show_ctrls, int raw) { - struct commit *commit, *commit2; + struct commit *commit, *commit2 = NULL; if (!new_rev) new_rev = ctx.qry.head; @@ -394,10 +394,32 @@ void cgit_print_diff(const char *new_rev, const char *old_rev, } if (raw) { + unsigned char old_tree_sha1[20], new_tree_sha1[20]; + struct diff_options diffopt; + + memcpy(new_tree_sha1, commit->tree->object.sha1, 20); + if (commit2) { + memcpy(old_tree_sha1, commit2->tree->object.sha1, 20); + } else { + /* + * SHA-1 of an empty tree. We might be better off not + * hardcoding this. + */ + get_sha1("4b825dc642cb6eb9a060e54bf8d69288fbee4904", + old_tree_sha1); + } + + 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); + diff_tree_sha1(old_tree_sha1, new_tree_sha1, "", &diffopt); + diffcore_std(&diffopt); + diff_flush(&diffopt); + return; } -- 1.8.4.rc3.500.gc3113b0