| /* |
| * Copyright (C) 2021, Google LLC. |
| * Based on diffcore-order.c, which is Copyright (C) 2005, Junio C Hamano |
| */ |
| #include "cache.h" |
| #include "diff.h" |
| #include "diffcore.h" |
| |
| void diffcore_rotate(struct diff_options *opt) |
| { |
| struct diff_queue_struct *q = &diff_queued_diff; |
| struct diff_queue_struct outq; |
| int rotate_to, i; |
| |
| if (!q->nr) |
| return; |
| |
| for (i = 0; i < q->nr; i++) { |
| int cmp = strcmp(opt->rotate_to, q->queue[i]->two->path); |
| if (!cmp) |
| break; /* exact match */ |
| if (!opt->rotate_to_strict && cmp < 0) |
| break; /* q->queue[i] is now past the target pathname */ |
| } |
| |
| if (q->nr <= i) { |
| /* we did not find the specified path */ |
| if (opt->rotate_to_strict) |
| die(_("No such path '%s' in the diff"), opt->rotate_to); |
| return; |
| } |
| |
| DIFF_QUEUE_CLEAR(&outq); |
| rotate_to = i; |
| |
| for (i = rotate_to; i < q->nr; i++) |
| diff_q(&outq, q->queue[i]); |
| for (i = 0; i < rotate_to; i++) { |
| if (opt->skip_instead_of_rotate) |
| diff_free_filepair(q->queue[i]); |
| else |
| diff_q(&outq, q->queue[i]); |
| } |
| free(q->queue); |
| *q = outq; |
| } |