From: Phillip Wood <phillip.wood@xxxxxxxxxxxxx> If there are empty commits on the left hand side of $upstream...HEAD then the empty commits on the right hand side that we want to keep are pruned because they are marked as cherry-picks. Fix this by keeping the commits that are empty or are not marked as cherry-picks. Signed-off-by: Phillip Wood <phillip.wood@xxxxxxxxxxxxx> --- sequencer.c | 30 ++++++++++++++++-------------- t/t3421-rebase-topology-linear.sh | 4 ++-- 2 files changed, 18 insertions(+), 16 deletions(-) diff --git a/sequencer.c b/sequencer.c index d8cc63dbe4..da87c390ed 100644 --- a/sequencer.c +++ b/sequencer.c @@ -2975,14 +2975,15 @@ static int make_script_with_merges(struct pretty_print_context *pp, */ while ((commit = get_revision(revs))) { struct commit_list *to_merge; - int is_octopus; + int is_octopus, is_empty; const char *p1, *p2; struct object_id *oid; tail = &commit_list_insert(commit, tail)->next; oidset_insert(&interesting, &commit->object.oid); - if ((commit->object.flags & PATCHSAME)) + is_empty = is_original_commit_empty(commit); + if (!is_empty && (commit->object.flags & PATCHSAME)) continue; strbuf_reset(&oneline); @@ -2992,7 +2993,7 @@ static int make_script_with_merges(struct pretty_print_context *pp, if (!to_merge) { /* non-merge commit: easy case */ strbuf_reset(&buf); - if (!keep_empty && is_original_commit_empty(commit)) + if (!keep_empty && is_empty) strbuf_addf(&buf, "%c ", comment_line_char); strbuf_addf(&buf, "%s %s %s", cmd_pick, oid_to_hex(&commit->object.oid), @@ -3172,12 +3173,9 @@ int sequencer_make_script(FILE *out, int argc, const char **argv, init_revisions(&revs, NULL); revs.verbose_header = 1; - if (recreate_merges) - revs.cherry_mark = 1; - else { + if (!recreate_merges) revs.max_parents = 1; - revs.cherry_pick = 1; - } + revs.cherry_mark = 1; revs.limited = 1; revs.reverse = 1; revs.right_only = 1; @@ -3205,14 +3203,18 @@ int sequencer_make_script(FILE *out, int argc, const char **argv, return make_script_with_merges(&pp, &revs, out, flags); while ((commit = get_revision(&revs))) { + int is_empty = is_original_commit_empty(commit); + strbuf_reset(&buf); - if (!keep_empty && is_original_commit_empty(commit)) + if (!keep_empty && is_empty) strbuf_addf(&buf, "%c ", comment_line_char); - strbuf_addf(&buf, "%s %s ", insn, - oid_to_hex(&commit->object.oid)); - pretty_print_commit(&pp, commit, &buf); - strbuf_addch(&buf, '\n'); - fputs(buf.buf, out); + if (is_empty || !(commit->object.flags & PATCHSAME)) { + strbuf_addf(&buf, "%s %s ", insn, + oid_to_hex(&commit->object.oid)); + pretty_print_commit(&pp, commit, &buf); + strbuf_addch(&buf, '\n'); + fputs(buf.buf, out); + } } strbuf_release(&buf); return 0; diff --git a/t/t3421-rebase-topology-linear.sh b/t/t3421-rebase-topology-linear.sh index cb7f176f1d..7384010075 100755 --- a/t/t3421-rebase-topology-linear.sh +++ b/t/t3421-rebase-topology-linear.sh @@ -215,9 +215,9 @@ test_run_rebase () { } test_run_rebase success '' test_run_rebase failure -m -test_run_rebase failure -i +test_run_rebase success -i test_run_rebase failure -p -test_run_rebase failure --recreate-merges +test_run_rebase success --recreate-merges # m # / -- 2.16.2