|
diff --git a/shared.c b/shared.c index 077934f..cd9d68d 100644 --- a/ shared.c+++ b/ shared.c |
|
@@ -344,64 +344,65 @@ int filediff_cb(void *priv, mmbuffer_t *mb, int nbuf) |
344 | } |
344 | } |
345 | diffbuf = xrealloc(diffbuf, buflen + mb[i].size); |
345 | diffbuf = xrealloc(diffbuf, buflen + mb[i].size); |
346 | memcpy(diffbuf + buflen, mb[i].ptr, mb[i].size); |
346 | memcpy(diffbuf + buflen, mb[i].ptr, mb[i].size); |
347 | ((linediff_fn)priv)(diffbuf, buflen + mb[i].size); |
347 | ((linediff_fn)priv)(diffbuf, buflen + mb[i].size); |
348 | free(diffbuf); |
348 | free(diffbuf); |
349 | diffbuf = NULL; |
349 | diffbuf = NULL; |
350 | buflen = 0; |
350 | buflen = 0; |
351 | } |
351 | } |
352 | if (diffbuf) { |
352 | if (diffbuf) { |
353 | ((linediff_fn)priv)(diffbuf, buflen); |
353 | ((linediff_fn)priv)(diffbuf, buflen); |
354 | free(diffbuf); |
354 | free(diffbuf); |
355 | diffbuf = NULL; |
355 | diffbuf = NULL; |
356 | buflen = 0; |
356 | buflen = 0; |
357 | } |
357 | } |
358 | return 0; |
358 | return 0; |
359 | } |
359 | } |
360 | |
360 | |
361 | int cgit_diff_files(const unsigned char *old_sha1, |
361 | int cgit_diff_files(const unsigned char *old_sha1, |
362 | const unsigned char *new_sha1, |
362 | const unsigned char *new_sha1, |
363 | linediff_fn fn) |
363 | linediff_fn fn) |
364 | { |
364 | { |
365 | mmfile_t file1, file2; |
365 | mmfile_t file1, file2; |
366 | xpparam_t diff_params; |
366 | xpparam_t diff_params; |
367 | xdemitconf_t emit_params; |
367 | xdemitconf_t emit_params; |
368 | xdemitcb_t emit_cb; |
368 | xdemitcb_t emit_cb; |
369 | |
369 | |
370 | if (!load_mmfile(&file1, old_sha1) || !load_mmfile(&file2, new_sha1)) |
370 | if (!load_mmfile(&file1, old_sha1) || !load_mmfile(&file2, new_sha1)) |
371 | return 1; |
371 | return 1; |
372 | |
372 | |
373 | diff_params.flags = XDF_NEED_MINIMAL; |
373 | diff_params.flags = XDF_NEED_MINIMAL; |
374 | emit_params.ctxlen = 3; |
374 | emit_params.ctxlen = 3; |
375 | emit_params.flags = XDL_EMIT_FUNCNAMES; |
375 | emit_params.flags = XDL_EMIT_FUNCNAMES; |
| |
376 | emit_params.find_func = NULL; |
376 | emit_cb.outf = filediff_cb; |
377 | emit_cb.outf = filediff_cb; |
377 | emit_cb.priv = fn; |
378 | emit_cb.priv = fn; |
378 | xdl_diff(&file1, &file2, &diff_params, &emit_params, &emit_cb); |
379 | xdl_diff(&file1, &file2, &diff_params, &emit_params, &emit_cb); |
379 | return 0; |
380 | return 0; |
380 | } |
381 | } |
381 | |
382 | |
382 | void cgit_diff_tree(const unsigned char *old_sha1, |
383 | void cgit_diff_tree(const unsigned char *old_sha1, |
383 | const unsigned char *new_sha1, |
384 | const unsigned char *new_sha1, |
384 | filepair_fn fn) |
385 | filepair_fn fn) |
385 | { |
386 | { |
386 | struct diff_options opt; |
387 | struct diff_options opt; |
387 | int ret; |
388 | int ret; |
388 | |
389 | |
389 | diff_setup(&opt); |
390 | diff_setup(&opt); |
390 | opt.output_format = DIFF_FORMAT_CALLBACK; |
391 | opt.output_format = DIFF_FORMAT_CALLBACK; |
391 | opt.detect_rename = 1; |
392 | opt.detect_rename = 1; |
392 | opt.recursive = 1; |
393 | opt.recursive = 1; |
393 | opt.format_callback = cgit_diff_tree_cb; |
394 | opt.format_callback = cgit_diff_tree_cb; |
394 | opt.format_callback_data = fn; |
395 | opt.format_callback_data = fn; |
395 | diff_setup_done(&opt); |
396 | diff_setup_done(&opt); |
396 | |
397 | |
397 | if (old_sha1 && !is_null_sha1(old_sha1)) |
398 | if (old_sha1 && !is_null_sha1(old_sha1)) |
398 | ret = diff_tree_sha1(old_sha1, new_sha1, "", &opt); |
399 | ret = diff_tree_sha1(old_sha1, new_sha1, "", &opt); |
399 | else |
400 | else |
400 | ret = diff_root_tree_sha1(new_sha1, "", &opt); |
401 | ret = diff_root_tree_sha1(new_sha1, "", &opt); |
401 | diffcore_std(&opt); |
402 | diffcore_std(&opt); |
402 | diff_flush(&opt); |
403 | diff_flush(&opt); |
403 | } |
404 | } |
404 | |
405 | |
405 | void cgit_diff_commit(struct commit *commit, filepair_fn fn) |
406 | void cgit_diff_commit(struct commit *commit, filepair_fn fn) |
406 | { |
407 | { |
407 | unsigned char *old_sha1 = NULL; |
408 | unsigned char *old_sha1 = NULL; |
|