diff options
Diffstat (limited to 'ui-diff.c')
-rw-r--r-- | ui-diff.c | 35 |
1 files changed, 35 insertions, 0 deletions
@@ -36,6 +36,7 @@ static struct fileinfo { | |||
36 | 36 | ||
37 | static int use_ssdiff = 0; | 37 | static int use_ssdiff = 0; |
38 | static struct diff_filepair *current_filepair; | 38 | static struct diff_filepair *current_filepair; |
39 | static const char *current_prefix; | ||
39 | 40 | ||
40 | struct diff_filespec *cgit_get_current_old_file(void) | 41 | struct diff_filespec *cgit_get_current_old_file(void) |
41 | { | 42 | { |
@@ -132,11 +133,30 @@ static void count_diff_lines(char *line, int len) | |||
132 | } | 133 | } |
133 | } | 134 | } |
134 | 135 | ||
136 | static int show_filepair(struct diff_filepair *pair) | ||
137 | { | ||
138 | /* Always show if we have no limiting prefix. */ | ||
139 | if (!current_prefix) | ||
140 | return 1; | ||
141 | |||
142 | /* Show if either path in the pair begins with the prefix. */ | ||
143 | if (starts_with(pair->one->path, current_prefix) || | ||
144 | starts_with(pair->two->path, current_prefix)) | ||
145 | return 1; | ||
146 | |||
147 | /* Otherwise we don't want to show this filepair. */ | ||
148 | return 0; | ||
149 | } | ||
150 | |||
135 | static void inspect_filepair(struct diff_filepair *pair) | 151 | static void inspect_filepair(struct diff_filepair *pair) |
136 | { | 152 | { |
137 | int binary = 0; | 153 | int binary = 0; |
138 | unsigned long old_size = 0; | 154 | unsigned long old_size = 0; |
139 | unsigned long new_size = 0; | 155 | unsigned long new_size = 0; |
156 | |||
157 | if (!show_filepair(pair)) | ||
158 | return; | ||
159 | |||
140 | files++; | 160 | files++; |
141 | lines_added = 0; | 161 | lines_added = 0; |
142 | lines_removed = 0; | 162 | lines_removed = 0; |
@@ -279,6 +299,9 @@ static void filepair_cb(struct diff_filepair *pair) | |||
279 | int binary = 0; | 299 | int binary = 0; |
280 | linediff_fn print_line_fn = print_line; | 300 | linediff_fn print_line_fn = print_line; |
281 | 301 | ||
302 | if (!show_filepair(pair)) | ||
303 | return; | ||
304 | |||
282 | current_filepair = pair; | 305 | current_filepair = pair; |
283 | if (use_ssdiff) { | 306 | if (use_ssdiff) { |
284 | cgit_ssdiff_header_begin(); | 307 | cgit_ssdiff_header_begin(); |
@@ -365,6 +388,18 @@ void cgit_print_diff(const char *new_rev, const char *old_rev, | |||
365 | const unsigned char *old_tree_sha1, *new_tree_sha1; | 388 | const unsigned char *old_tree_sha1, *new_tree_sha1; |
366 | diff_type difftype; | 389 | diff_type difftype; |
367 | 390 | ||
391 | /* | ||
392 | * If "follow" is set then the diff machinery needs to examine the | ||
393 | * entire commit to detect renames so we must limit the paths in our | ||
394 | * own callbacks and not pass the prefix to the diff machinery. | ||
395 | */ | ||
396 | if (ctx.qry.follow && ctx.cfg.enable_follow_links) { | ||
397 | current_prefix = prefix; | ||
398 | prefix = ""; | ||
399 | } else { | ||
400 | current_prefix = NULL; | ||
401 | } | ||
402 | |||
368 | if (!new_rev) | 403 | if (!new_rev) |
369 | new_rev = ctx.qry.head; | 404 | new_rev = ctx.qry.head; |
370 | if (get_sha1(new_rev, new_rev_sha1)) { | 405 | if (get_sha1(new_rev, new_rev_sha1)) { |