| /* | |
| * Copyright (C) 2021, Google LLC. | |
| * Based on diffcore-order.c, which is Copyright (C) 2005, Junio C Hamano | |
| */ | |
| #include "git-compat-util.h" | |
| #include "gettext.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 = DIFF_QUEUE_INIT; | |
| 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; | |
| } | |
| 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; | |
| } |