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 | |
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-- | cgit.h | 2 | ||||
-rw-r--r-- | shared.c | 11 | ||||
-rw-r--r-- | ui-diff.c | 3 |
3 files changed, 11 insertions, 5 deletions
@@ -165,17 +165,17 @@ extern char *trim_end(const char *str, char c); | |||
165 | extern void *cgit_free_commitinfo(struct commitinfo *info); | 165 | extern void *cgit_free_commitinfo(struct commitinfo *info); |
166 | 166 | ||
167 | extern int cgit_diff_files(const unsigned char *old_sha1, | 167 | extern int cgit_diff_files(const unsigned char *old_sha1, |
168 | const unsigned char *new_sha1, | 168 | const unsigned char *new_sha1, |
169 | linediff_fn fn); | 169 | linediff_fn fn); |
170 | 170 | ||
171 | extern void cgit_diff_tree(const unsigned char *old_sha1, | 171 | extern void cgit_diff_tree(const unsigned char *old_sha1, |
172 | const unsigned char *new_sha1, | 172 | const unsigned char *new_sha1, |
173 | filepair_fn fn); | 173 | filepair_fn fn, const char *prefix); |
174 | 174 | ||
175 | extern void cgit_diff_commit(struct commit *commit, filepair_fn fn); | 175 | extern void cgit_diff_commit(struct commit *commit, filepair_fn fn); |
176 | 176 | ||
177 | extern char *fmt(const char *format,...); | 177 | extern char *fmt(const char *format,...); |
178 | 178 | ||
179 | extern void html(const char *txt); | 179 | extern void html(const char *txt); |
180 | extern void htmlf(const char *format,...); | 180 | extern void htmlf(const char *format,...); |
181 | extern void html_txt(char *txt); | 181 | extern void html_txt(char *txt); |
@@ -381,38 +381,45 @@ int cgit_diff_files(const unsigned char *old_sha1, | |||
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 | } |
@@ -126,15 +126,14 @@ void cgit_print_diff(const char *new_rev, const char *old_rev) | |||
126 | if (type == OBJ_BAD) { | 126 | if (type == OBJ_BAD) { |
127 | cgit_print_error(fmt("Bad object name: %s", sha1_to_hex(sha2))); | 127 | cgit_print_error(fmt("Bad object name: %s", sha1_to_hex(sha2))); |
128 | return; | 128 | return; |
129 | } | 129 | } |
130 | commit2 = lookup_commit_reference(sha2); | 130 | commit2 = lookup_commit_reference(sha2); |
131 | if (!commit2 || parse_commit(commit2)) | 131 | if (!commit2 || parse_commit(commit2)) |
132 | cgit_print_error(fmt("Bad commit: %s", sha1_to_hex(sha2))); | 132 | cgit_print_error(fmt("Bad commit: %s", sha1_to_hex(sha2))); |
133 | } | 133 | } |
134 | |||
135 | html("<table class='diff'>"); | 134 | html("<table class='diff'>"); |
136 | html("<tr><td>"); | 135 | html("<tr><td>"); |
137 | cgit_diff_tree(sha2, sha1, filepair_cb); | 136 | cgit_diff_tree(sha2, sha1, filepair_cb, NULL); |
138 | html("</td></tr>"); | 137 | html("</td></tr>"); |
139 | html("</table>"); | 138 | html("</table>"); |
140 | } | 139 | } |