diff options
author | Junio C Hamano <gitster@pobox.com> | 2020-05-14 14:39:43 -0700 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2020-05-14 14:39:43 -0700 |
commit | a2a0942a16a6459d4a52e7ee4ec85f7f90ad5334 (patch) | |
tree | 83dcf90fd0897ccf3974021dddd6e48042c89637 | |
parent | Merge branch 'jc/codingstyle-compare-with-null' (diff) | |
parent | rebase --autosquash: fix a potential segfault (diff) | |
download | tgif-a2a0942a16a6459d4a52e7ee4ec85f7f90ad5334.tar.xz |
Merge branch 'js/rebase-autosquash-double-fixup-fix'
"rebase -i" segfaulted when rearranging a sequence that has a
fix-up that applies another fix-up (which may or may not be a
fix-up of yet another step).
* js/rebase-autosquash-double-fixup-fix:
rebase --autosquash: fix a potential segfault
-rw-r--r-- | sequencer.c | 7 | ||||
-rwxr-xr-x | t/t3415-rebase-autosquash.sh | 16 |
2 files changed, 21 insertions, 2 deletions
diff --git a/sequencer.c b/sequencer.c index 9d1b3e7d4f..fd7701c88a 100644 --- a/sequencer.c +++ b/sequencer.c @@ -5385,10 +5385,13 @@ int todo_list_rearrange_squash(struct todo_list *todo_list) todo_list->items[i].command = starts_with(subject, "fixup!") ? TODO_FIXUP : TODO_SQUASH; - if (next[i2] < 0) + if (tail[i2] < 0) { + next[i] = next[i2]; next[i2] = i; - else + } else { + next[i] = next[tail[i2]]; next[tail[i2]] = i; + } tail[i2] = i; } else if (!hashmap_get_from_hash(&subject2item, strhash(subject), subject)) { diff --git a/t/t3415-rebase-autosquash.sh b/t/t3415-rebase-autosquash.sh index 093de9005b..7bab6000dc 100755 --- a/t/t3415-rebase-autosquash.sh +++ b/t/t3415-rebase-autosquash.sh @@ -424,4 +424,20 @@ test_expect_success 'abort last squash' ' ! grep first actual ' +test_expect_success 'fixup a fixup' ' + echo 0to-fixup >file0 && + test_tick && + git commit -m "to-fixup" file0 && + test_tick && + git commit --squash HEAD -m X --allow-empty && + test_tick && + git commit --squash HEAD^ -m Y --allow-empty && + test_tick && + git commit -m "squash! $(git rev-parse HEAD^)" -m Z --allow-empty && + test_tick && + git commit -m "squash! $(git rev-parse HEAD^^)" -m W --allow-empty && + git rebase -ki --autosquash HEAD~5 && + test XZWY = $(git show | tr -cd W-Z) +' + test_done |