]>
Commit | Line | Data |
---|---|---|
1eb4136a JH |
1 | /* |
2 | * Copyright (C) 2021, Google LLC. | |
3 | * Based on diffcore-order.c, which is Copyright (C) 2005, Junio C Hamano | |
4 | */ | |
fc7bd51b EN |
5 | #include "git-compat-util.h" |
6 | #include "gettext.h" | |
1eb4136a JH |
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 | } |