Junio C Hamano | 1eb4136 | 2021-02-11 11:57:50 -0800 | [diff] [blame] | 1 | /* |
| 2 | * Copyright (C) 2021, Google LLC. |
| 3 | * Based on diffcore-order.c, which is Copyright (C) 2005, Junio C Hamano |
| 4 | */ |
Elijah Newren | fc7bd51 | 2023-02-24 00:09:34 +0000 | [diff] [blame^] | 5 | #include "git-compat-util.h" |
| 6 | #include "gettext.h" |
Junio C Hamano | 1eb4136 | 2021-02-11 11:57:50 -0800 | [diff] [blame] | 7 | #include "diff.h" |
| 8 | #include "diffcore.h" |
| 9 | |
| 10 | void diffcore_rotate(struct diff_options *opt) |
| 11 | { |
| 12 | struct diff_queue_struct *q = &diff_queued_diff; |
| 13 | struct diff_queue_struct outq; |
| 14 | int rotate_to, i; |
| 15 | |
| 16 | if (!q->nr) |
| 17 | return; |
| 18 | |
| 19 | for (i = 0; i < q->nr; i++) { |
| 20 | int cmp = strcmp(opt->rotate_to, q->queue[i]->two->path); |
| 21 | if (!cmp) |
| 22 | break; /* exact match */ |
| 23 | if (!opt->rotate_to_strict && cmp < 0) |
| 24 | break; /* q->queue[i] is now past the target pathname */ |
| 25 | } |
| 26 | |
| 27 | if (q->nr <= i) { |
| 28 | /* we did not find the specified path */ |
| 29 | if (opt->rotate_to_strict) |
| 30 | die(_("No such path '%s' in the diff"), opt->rotate_to); |
| 31 | return; |
| 32 | } |
| 33 | |
| 34 | DIFF_QUEUE_CLEAR(&outq); |
| 35 | rotate_to = i; |
| 36 | |
| 37 | for (i = rotate_to; i < q->nr; i++) |
| 38 | diff_q(&outq, q->queue[i]); |
| 39 | for (i = 0; i < rotate_to; i++) { |
| 40 | if (opt->skip_instead_of_rotate) |
| 41 | diff_free_filepair(q->queue[i]); |
| 42 | else |
| 43 | diff_q(&outq, q->queue[i]); |
| 44 | } |
| 45 | free(q->queue); |
| 46 | *q = outq; |
| 47 | } |