750
DIFF_QUEUE_CLEAR(src);
751
}
752
753
-static void queue_diffs(struct diff_options *opt,
753
+static void filter_diffs_for_paths(struct line_log_data *range, int keep_deletions)
754
+{
755
+ int i;
756
+ struct diff_queue_struct outq;
757
+ DIFF_QUEUE_CLEAR(&outq);
758
+
759
+ for (i = 0; i < diff_queued_diff.nr; i++) {
760
+ struct diff_filepair *p = diff_queued_diff.queue[i];
761
+ struct line_log_data *rg = NULL;
762
+
763
+ if (!DIFF_FILE_VALID(p->two)) {
764
+ if (keep_deletions)
765
+ diff_q(&outq, p);
766
+ else
767
+ diff_free_filepair(p);
768
+ continue;
769
+ }
770
+ for (rg = range; rg; rg = rg->next) {
771
+ if (!strcmp(rg->spec->path, p->two->path))
772
+ break;
773
+ }
774
+ if (rg)
775
+ diff_q(&outq, p);
776
+ else
777
+ diff_free_filepair(p);
778
+ }
779
+ free(diff_queued_diff.queue);
780
+ diff_queued_diff = outq;
781
+}
782
+
783
+static inline int diff_might_be_rename(void)
784
+{
785
+ int i;
786
+ for (i = 0; i < diff_queued_diff.nr; i++)
787
+ if (!DIFF_FILE_VALID(diff_queued_diff.queue[i]->one)) {
788
+ /* fprintf(stderr, "diff_might_be_rename found creation of: %s\n", */
789
+ /* diff_queued_diff.queue[i]->two->path); */
790
+ return 1;
791
+ }
792
+ return 0;
793
+}
794
+
795
+static void queue_diffs(struct line_log_data *range,
796
+ struct diff_options *opt,
797
struct diff_queue_struct *queue,
798
struct commit *commit, struct commit *parent)
799
{
809
810
DIFF_QUEUE_CLEAR(&diff_queued_diff);
811
diff_tree(&desc1, &desc2, "", opt);
769
- diffcore_std(opt);
812
+ if (opt->detect_rename) {
813
+ filter_diffs_for_paths(range, 1);
814
+ if (diff_might_be_rename())
815
+ diffcore_std(opt);
816
+ filter_diffs_for_paths(range, 0);
817
+ }
818
move_diff_queue(queue, &diff_queued_diff);
819
820
if (tree1)
1098
if (commit->parents)
1099
parent = commit->parents->item;
1100
1053
- queue_diffs(&rev->diffopt, &queue, commit, parent);
1101
+ queue_diffs(range, &rev->diffopt, &queue, commit, parent);
1102
changed = process_all_files(&parent_range, rev, &queue, range);
1103
if (parent)
1104
add_line_range(rev, parent, parent_range);
1123
for (i = 0; i < nparents; i++) {
1124
parents[i] = p->item;
1125
p = p->next;
1078
- queue_diffs(&rev->diffopt, &diffqueues[i], commit, parents[i]);
1126
+ queue_diffs(range, &rev->diffopt, &diffqueues[i], commit, parents[i]);
1127
}
1128
1129
for (i = 0; i < nparents; i++) {