* Unlike most other functions, this destructively operates on * 'range'. */
| 889 | * 'range'. |
| 890 | */ |
| 891 | static int process_diff_filepair(struct rev_info *rev, |
| 892 | struct diff_filepair *pair, |
| 893 | struct line_log_data *range, |
| 894 | struct diff_ranges **diff_out) |
| 895 | { |
| 896 | struct line_log_data *rg = range; |
| 897 | struct range_set tmp; |
| 898 | struct diff_ranges diff; |
| 899 | mmfile_t file_parent, file_target; |
| 900 | char *parent_data_to_free = NULL; |
| 901 | |
| 902 | assert(pair->two->path); |
| 903 | while (rg) { |
| 904 | assert(rg->path); |
| 905 | if (!strcmp(rg->path, pair->two->path)) |
| 906 | break; |
| 907 | rg = rg->next; |
| 908 | } |
| 909 | |
| 910 | if (!rg) |
| 911 | return 0; |
| 912 | if (rg->ranges.nr == 0) |
| 913 | return 0; |
| 914 | |
| 915 | assert(pair->two->oid_valid); |
| 916 | diff_populate_filespec(rev->diffopt.repo, pair->two, NULL); |
| 917 | file_target.ptr = pair->two->data; |
| 918 | file_target.size = pair->two->size; |
| 919 | |
| 920 | if (pair->one->oid_valid) { |
| 921 | diff_populate_filespec(rev->diffopt.repo, pair->one, NULL); |
| 922 | file_parent.ptr = pair->one->data; |
| 923 | file_parent.size = pair->one->size; |
| 924 | } else { |
| 925 | file_parent.ptr = parent_data_to_free = xstrdup(""); |
| 926 | file_parent.size = 0; |
| 927 | } |
| 928 | |
| 929 | diff_ranges_init(&diff); |
| 930 | if (collect_diff(&file_parent, &file_target, &diff)) |
| 931 | die("unable to generate diff for %s", pair->one->path); |
| 932 | |
| 933 | /* NEEDSWORK should apply some heuristics to prevent mismatches */ |
| 934 | free(rg->path); |
| 935 | rg->path = xstrdup(pair->one->path); |
| 936 | |
| 937 | range_set_init(&tmp, 0); |
| 938 | range_set_map_across_diff(&tmp, &rg->ranges, &diff, diff_out); |
| 939 | range_set_release(&rg->ranges); |
| 940 | range_set_move(&rg->ranges, &tmp); |
| 941 | |
| 942 | diff_ranges_release(&diff); |
| 943 | |
| 944 | free(parent_data_to_free); |
| 945 | return ((*diff_out)->parent.nr > 0); |
| 946 | } |
| 947 | |
| 948 | static struct diff_filepair *diff_filepair_dup(struct diff_filepair *pair) |
no test coverage detected