author | Lars Hjemli <hjemli@gmail.com> | 2007-10-01 09:42:19 (UTC) |
---|---|---|
committer | Lars Hjemli <hjemli@gmail.com> | 2007-10-01 09:42:19 (UTC) |
commit | f527a57c8a55f5fd315e1bc1cb338f5f4a9b20ae (patch) (unidiff) | |
tree | 086e1afad5762c5b6bb09672b58f2c491ffbbc20 /shared.c | |
parent | 98fcf7227c8dda520c864ea8a51012934115258f (diff) | |
download | cgit-f527a57c8a55f5fd315e1bc1cb338f5f4a9b20ae.zip cgit-f527a57c8a55f5fd315e1bc1cb338f5f4a9b20ae.tar.gz cgit-f527a57c8a55f5fd315e1bc1cb338f5f4a9b20ae.tar.bz2 |
Add prefix parameter to cgit_diff_tree()
This paramter can be used to restrict a diff to the specified path prefix.
Signed-off-by: Lars Hjemli <hjemli@gmail.com>
-rw-r--r-- | shared.c | 11 |
1 files changed, 9 insertions, 2 deletions
@@ -341,78 +341,85 @@ int filediff_cb(void *priv, mmbuffer_t *mb, int nbuf) | |||
341 | continue; | 341 | continue; |
342 | } | 342 | } |
343 | 343 | ||
344 | /* we have a complete line */ | 344 | /* we have a complete line */ |
345 | if (!diffbuf) { | 345 | if (!diffbuf) { |
346 | ((linediff_fn)priv)(mb[i].ptr, mb[i].size); | 346 | ((linediff_fn)priv)(mb[i].ptr, mb[i].size); |
347 | continue; | 347 | continue; |
348 | } | 348 | } |
349 | diffbuf = xrealloc(diffbuf, buflen + mb[i].size); | 349 | diffbuf = xrealloc(diffbuf, buflen + mb[i].size); |
350 | memcpy(diffbuf + buflen, mb[i].ptr, mb[i].size); | 350 | memcpy(diffbuf + buflen, mb[i].ptr, mb[i].size); |
351 | ((linediff_fn)priv)(diffbuf, buflen + mb[i].size); | 351 | ((linediff_fn)priv)(diffbuf, buflen + mb[i].size); |
352 | free(diffbuf); | 352 | free(diffbuf); |
353 | diffbuf = NULL; | 353 | diffbuf = NULL; |
354 | buflen = 0; | 354 | buflen = 0; |
355 | } | 355 | } |
356 | if (diffbuf) { | 356 | if (diffbuf) { |
357 | ((linediff_fn)priv)(diffbuf, buflen); | 357 | ((linediff_fn)priv)(diffbuf, buflen); |
358 | free(diffbuf); | 358 | free(diffbuf); |
359 | diffbuf = NULL; | 359 | diffbuf = NULL; |
360 | buflen = 0; | 360 | buflen = 0; |
361 | } | 361 | } |
362 | return 0; | 362 | return 0; |
363 | } | 363 | } |
364 | 364 | ||
365 | int cgit_diff_files(const unsigned char *old_sha1, | 365 | int cgit_diff_files(const unsigned char *old_sha1, |
366 | const unsigned char *new_sha1, | 366 | const unsigned char *new_sha1, |
367 | linediff_fn fn) | 367 | linediff_fn fn) |
368 | { | 368 | { |
369 | mmfile_t file1, file2; | 369 | mmfile_t file1, file2; |
370 | xpparam_t diff_params; | 370 | xpparam_t diff_params; |
371 | xdemitconf_t emit_params; | 371 | xdemitconf_t emit_params; |
372 | xdemitcb_t emit_cb; | 372 | xdemitcb_t emit_cb; |
373 | 373 | ||
374 | if (!load_mmfile(&file1, old_sha1) || !load_mmfile(&file2, new_sha1)) | 374 | if (!load_mmfile(&file1, old_sha1) || !load_mmfile(&file2, new_sha1)) |
375 | return 1; | 375 | return 1; |
376 | 376 | ||
377 | diff_params.flags = XDF_NEED_MINIMAL; | 377 | diff_params.flags = XDF_NEED_MINIMAL; |
378 | emit_params.ctxlen = 3; | 378 | emit_params.ctxlen = 3; |
379 | emit_params.flags = XDL_EMIT_FUNCNAMES; | 379 | emit_params.flags = XDL_EMIT_FUNCNAMES; |
380 | emit_params.find_func = NULL; | 380 | emit_params.find_func = NULL; |
381 | emit_cb.outf = filediff_cb; | 381 | emit_cb.outf = filediff_cb; |
382 | emit_cb.priv = fn; | 382 | emit_cb.priv = fn; |
383 | xdl_diff(&file1, &file2, &diff_params, &emit_params, &emit_cb); | 383 | xdl_diff(&file1, &file2, &diff_params, &emit_params, &emit_cb); |
384 | return 0; | 384 | return 0; |
385 | } | 385 | } |
386 | 386 | ||
387 | void cgit_diff_tree(const unsigned char *old_sha1, | 387 | void cgit_diff_tree(const unsigned char *old_sha1, |
388 | const unsigned char *new_sha1, | 388 | const unsigned char *new_sha1, |
389 | filepair_fn fn) | 389 | filepair_fn fn, const char *prefix) |
390 | { | 390 | { |
391 | struct diff_options opt; | 391 | struct diff_options opt; |
392 | int ret; | 392 | int ret; |
393 | int prefixlen; | ||
393 | 394 | ||
394 | diff_setup(&opt); | 395 | diff_setup(&opt); |
395 | opt.output_format = DIFF_FORMAT_CALLBACK; | 396 | opt.output_format = DIFF_FORMAT_CALLBACK; |
396 | opt.detect_rename = 1; | 397 | opt.detect_rename = 1; |
397 | opt.rename_limit = cgit_renamelimit; | 398 | opt.rename_limit = cgit_renamelimit; |
398 | opt.recursive = 1; | 399 | opt.recursive = 1; |
399 | opt.format_callback = cgit_diff_tree_cb; | 400 | opt.format_callback = cgit_diff_tree_cb; |
400 | opt.format_callback_data = fn; | 401 | opt.format_callback_data = fn; |
402 | if (prefix) { | ||
403 | opt.nr_paths = 1; | ||
404 | opt.paths = &prefix; | ||
405 | prefixlen = strlen(prefix); | ||
406 | opt.pathlens = &prefixlen; | ||
407 | } | ||
401 | diff_setup_done(&opt); | 408 | diff_setup_done(&opt); |
402 | 409 | ||
403 | if (old_sha1 && !is_null_sha1(old_sha1)) | 410 | if (old_sha1 && !is_null_sha1(old_sha1)) |
404 | ret = diff_tree_sha1(old_sha1, new_sha1, "", &opt); | 411 | ret = diff_tree_sha1(old_sha1, new_sha1, "", &opt); |
405 | else | 412 | else |
406 | ret = diff_root_tree_sha1(new_sha1, "", &opt); | 413 | ret = diff_root_tree_sha1(new_sha1, "", &opt); |
407 | diffcore_std(&opt); | 414 | diffcore_std(&opt); |
408 | diff_flush(&opt); | 415 | diff_flush(&opt); |
409 | } | 416 | } |
410 | 417 | ||
411 | void cgit_diff_commit(struct commit *commit, filepair_fn fn) | 418 | void cgit_diff_commit(struct commit *commit, filepair_fn fn) |
412 | { | 419 | { |
413 | unsigned char *old_sha1 = NULL; | 420 | unsigned char *old_sha1 = NULL; |
414 | 421 | ||
415 | if (commit->parents) | 422 | if (commit->parents) |
416 | old_sha1 = commit->parents->item->object.sha1; | 423 | old_sha1 = commit->parents->item->object.sha1; |
417 | cgit_diff_tree(old_sha1, commit->object.sha1, fn); | 424 | cgit_diff_tree(old_sha1, commit->object.sha1, fn, NULL); |
418 | } | 425 | } |