diff options
Diffstat (limited to 'diffcore-rotate.c')
-rw-r--r-- | diffcore-rotate.c | 47 |
1 files changed, 47 insertions, 0 deletions
diff --git a/diffcore-rotate.c b/diffcore-rotate.c new file mode 100644 index 0000000000..67b591261a --- /dev/null +++ b/diffcore-rotate.c @@ -0,0 +1,47 @@ +/* + * 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; +} |