Use Git's internal diff_tree_sha1() function for the /rawdiff/ command instead of trying to recreate this functionality.
Signed-off-by: Lukas Fleischer <[email protected]> --- 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 _______________________________________________ CGit mailing list [email protected] http://lists.zx2c4.com/mailman/listinfo/cgit
