author | Lars Hjemli <hjemli@gmail.com> | 2007-06-17 16:12:03 (UTC) |
---|---|---|
committer | Lars Hjemli <hjemli@gmail.com> | 2007-06-17 16:12:03 (UTC) |
commit | 4a0be586662843382ecfa53af34a13b291312bc0 (patch) (unidiff) | |
tree | 01e0cd725fe249df3449bb089aad9f8d58081f89 /shared.c | |
parent | faaca447b071592c9a1e1f14b4d0d2a39b4c795a (diff) | |
download | cgit-4a0be586662843382ecfa53af34a13b291312bc0.zip cgit-4a0be586662843382ecfa53af34a13b291312bc0.tar.gz cgit-4a0be586662843382ecfa53af34a13b291312bc0.tar.bz2 |
Add cgit_diff_link()
This adds a new function used to generate links to the diff page and uses
it everywhere such links appear (expect for single files in the diffstat
displayed on the commit page: this is now a link to the tree page).
The updated diff-page now expects zero, one or two revision specifiers, in
parameters head, id and id2. Id defaults to head unless otherwise specified,
while head (as usual) defaults to repo.defbranch. If id2 isn't specified, it
defaults to the first parent of id1.
The most important change is of course that now all repo pages (summary, log,
tree, commit and diff) has support for passing on the current branch and
revision, i.e. the road is now open for a 'static' menu with links to all
of these pages.
Signed-off-by: Lars Hjemli <hjemli@gmail.com>
-rw-r--r-- | shared.c | 2 |
1 files changed, 1 insertions, 1 deletions
@@ -315,64 +315,64 @@ int filediff_cb(void *priv, mmbuffer_t *mb, int nbuf) | |||
315 | diffbuf = NULL; | 315 | diffbuf = NULL; |
316 | buflen = 0; | 316 | buflen = 0; |
317 | } | 317 | } |
318 | if (diffbuf) { | 318 | if (diffbuf) { |
319 | ((linediff_fn)priv)(diffbuf, buflen); | 319 | ((linediff_fn)priv)(diffbuf, buflen); |
320 | free(diffbuf); | 320 | free(diffbuf); |
321 | diffbuf = NULL; | 321 | diffbuf = NULL; |
322 | buflen = 0; | 322 | buflen = 0; |
323 | } | 323 | } |
324 | return 0; | 324 | return 0; |
325 | } | 325 | } |
326 | 326 | ||
327 | int cgit_diff_files(const unsigned char *old_sha1, | 327 | int cgit_diff_files(const unsigned char *old_sha1, |
328 | const unsigned char *new_sha1, | 328 | const unsigned char *new_sha1, |
329 | linediff_fn fn) | 329 | linediff_fn fn) |
330 | { | 330 | { |
331 | mmfile_t file1, file2; | 331 | mmfile_t file1, file2; |
332 | xpparam_t diff_params; | 332 | xpparam_t diff_params; |
333 | xdemitconf_t emit_params; | 333 | xdemitconf_t emit_params; |
334 | xdemitcb_t emit_cb; | 334 | xdemitcb_t emit_cb; |
335 | 335 | ||
336 | if (!load_mmfile(&file1, old_sha1) || !load_mmfile(&file2, new_sha1)) | 336 | if (!load_mmfile(&file1, old_sha1) || !load_mmfile(&file2, new_sha1)) |
337 | return 1; | 337 | return 1; |
338 | 338 | ||
339 | diff_params.flags = XDF_NEED_MINIMAL; | 339 | diff_params.flags = XDF_NEED_MINIMAL; |
340 | emit_params.ctxlen = 3; | 340 | emit_params.ctxlen = 3; |
341 | emit_params.flags = XDL_EMIT_FUNCNAMES; | 341 | emit_params.flags = XDL_EMIT_FUNCNAMES; |
342 | emit_cb.outf = filediff_cb; | 342 | emit_cb.outf = filediff_cb; |
343 | emit_cb.priv = fn; | 343 | emit_cb.priv = fn; |
344 | xdl_diff(&file1, &file2, &diff_params, &emit_params, &emit_cb); | 344 | xdl_diff(&file1, &file2, &diff_params, &emit_params, &emit_cb); |
345 | return 0; | 345 | return 0; |
346 | } | 346 | } |
347 | 347 | ||
348 | void cgit_diff_tree(const unsigned char *old_sha1, | 348 | void cgit_diff_tree(const unsigned char *old_sha1, |
349 | const unsigned char *new_sha1, | 349 | const unsigned char *new_sha1, |
350 | filepair_fn fn) | 350 | filepair_fn fn) |
351 | { | 351 | { |
352 | struct diff_options opt; | 352 | struct diff_options opt; |
353 | int ret; | 353 | int ret; |
354 | 354 | ||
355 | diff_setup(&opt); | 355 | diff_setup(&opt); |
356 | opt.output_format = DIFF_FORMAT_CALLBACK; | 356 | opt.output_format = DIFF_FORMAT_CALLBACK; |
357 | opt.detect_rename = 1; | 357 | opt.detect_rename = 1; |
358 | opt.recursive = 1; | 358 | opt.recursive = 1; |
359 | opt.format_callback = cgit_diff_tree_cb; | 359 | opt.format_callback = cgit_diff_tree_cb; |
360 | opt.format_callback_data = fn; | 360 | opt.format_callback_data = fn; |
361 | diff_setup_done(&opt); | 361 | diff_setup_done(&opt); |
362 | 362 | ||
363 | if (old_sha1) | 363 | if (old_sha1 && !is_null_sha1(old_sha1)) |
364 | ret = diff_tree_sha1(old_sha1, new_sha1, "", &opt); | 364 | ret = diff_tree_sha1(old_sha1, new_sha1, "", &opt); |
365 | else | 365 | else |
366 | ret = diff_root_tree_sha1(new_sha1, "", &opt); | 366 | ret = diff_root_tree_sha1(new_sha1, "", &opt); |
367 | diffcore_std(&opt); | 367 | diffcore_std(&opt); |
368 | diff_flush(&opt); | 368 | diff_flush(&opt); |
369 | } | 369 | } |
370 | 370 | ||
371 | void cgit_diff_commit(struct commit *commit, filepair_fn fn) | 371 | void cgit_diff_commit(struct commit *commit, filepair_fn fn) |
372 | { | 372 | { |
373 | unsigned char *old_sha1 = NULL; | 373 | unsigned char *old_sha1 = NULL; |
374 | 374 | ||
375 | if (commit->parents) | 375 | if (commit->parents) |
376 | old_sha1 = commit->parents->item->object.sha1; | 376 | old_sha1 = commit->parents->item->object.sha1; |
377 | cgit_diff_tree(old_sha1, commit->object.sha1, fn); | 377 | cgit_diff_tree(old_sha1, commit->object.sha1, fn); |
378 | } | 378 | } |