/* * 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; }