diff options
| author | Junio C Hamano <gitster@pobox.com> | 2021-02-25 16:43:30 -0800 |
|---|---|---|
| committer | Junio C Hamano <gitster@pobox.com> | 2021-02-25 16:43:30 -0800 |
| commit | 845d6030f81da3bb43bd24a78ef8c441a441c5d5 (patch) | |
| tree | 8f53740bbf5e31f6a002bc6166c897417e58696e /diffcore-rotate.c | |
| parent | Merge branch 'mt/checkout-index-corner-cases' (diff) | |
| parent | diff: --{rotate,skip}-to=<path> (diff) | |
| download | git-845d6030f81da3bb43bd24a78ef8c441a441c5d5.tar.gz git-845d6030f81da3bb43bd24a78ef8c441a441c5d5.zip | |
Merge branch 'jc/diffcore-rotate'
"git {diff,log} --{skip,rotate}-to=<path>" allows the user to
discard diff output for early paths or move them to the end of the
output.
* jc/diffcore-rotate:
diff: --{rotate,skip}-to=<path>
Diffstat (limited to 'diffcore-rotate.c')
| -rw-r--r-- | diffcore-rotate.c | 46 |
1 files changed, 46 insertions, 0 deletions
diff --git a/diffcore-rotate.c b/diffcore-rotate.c new file mode 100644 index 0000000000..445f060ab0 --- /dev/null +++ b/diffcore-rotate.c @@ -0,0 +1,46 @@ +/* + * 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; +} |
