Merge branch 'pw/rebase-i-after-failure' into maint-2.42
Various fixes to the behaviour of "rebase -i" when the command got interrupted by conflicting changes. cf. <6b927687-cf6e-d73e-78fb-bd4f46736928@gmx.de> * pw/rebase-i-after-failure: rebase -i: fix adding failed command to the todo list rebase --continue: refuse to commit after failed command rebase: fix rewritten list for failed pick sequencer: factor out part of pick_commits() sequencer: use rebase_path_message() rebase -i: remove patch file after conflict resolution rebase -i: move unlink() calls
This commit is contained in:
@ -604,7 +604,8 @@ test_expect_success 'clean error after failed "exec"' '
|
||||
echo "edited again" > file7 &&
|
||||
git add file7 &&
|
||||
test_must_fail git rebase --continue 2>error &&
|
||||
test_i18ngrep "you have staged changes in your working tree" error
|
||||
test_i18ngrep "you have staged changes in your working tree" error &&
|
||||
test_i18ngrep ! "could not open.*for reading" error
|
||||
'
|
||||
|
||||
test_expect_success 'rebase a detached HEAD' '
|
||||
@ -1276,20 +1277,34 @@ test_expect_success 'todo count' '
|
||||
'
|
||||
|
||||
test_expect_success 'rebase -i commits that overwrite untracked files (pick)' '
|
||||
git checkout --force branch2 &&
|
||||
git checkout --force A &&
|
||||
git clean -f &&
|
||||
cat >todo <<-EOF &&
|
||||
exec >file2
|
||||
pick $(git rev-parse B) B
|
||||
pick $(git rev-parse C) C
|
||||
pick $(git rev-parse D) D
|
||||
exec cat .git/rebase-merge/done >actual
|
||||
EOF
|
||||
(
|
||||
set_fake_editor &&
|
||||
FAKE_LINES="edit 1 2" git rebase -i A
|
||||
set_replace_editor todo &&
|
||||
test_must_fail git rebase -i A
|
||||
) &&
|
||||
test_cmp_rev HEAD F &&
|
||||
test_path_is_missing file6 &&
|
||||
>file6 &&
|
||||
test_must_fail git rebase --continue &&
|
||||
test_cmp_rev HEAD F &&
|
||||
rm file6 &&
|
||||
test_cmp_rev HEAD B &&
|
||||
test_cmp_rev REBASE_HEAD C &&
|
||||
head -n3 todo >expect &&
|
||||
test_cmp expect .git/rebase-merge/done &&
|
||||
rm file2 &&
|
||||
test_path_is_missing .git/rebase-merge/patch &&
|
||||
echo changed >file1 &&
|
||||
git add file1 &&
|
||||
test_must_fail git rebase --continue 2>err &&
|
||||
grep "error: you have staged changes in your working tree" err &&
|
||||
git reset --hard HEAD &&
|
||||
git rebase --continue &&
|
||||
test_cmp_rev HEAD I
|
||||
test_cmp_rev HEAD D &&
|
||||
tail -n3 todo >>expect &&
|
||||
test_cmp expect actual
|
||||
'
|
||||
|
||||
test_expect_success 'rebase -i commits that overwrite untracked files (squash)' '
|
||||
@ -1305,7 +1320,14 @@ test_expect_success 'rebase -i commits that overwrite untracked files (squash)'
|
||||
>file6 &&
|
||||
test_must_fail git rebase --continue &&
|
||||
test_cmp_rev HEAD F &&
|
||||
test_cmp_rev REBASE_HEAD I &&
|
||||
rm file6 &&
|
||||
test_path_is_missing .git/rebase-merge/patch &&
|
||||
echo changed >file1 &&
|
||||
git add file1 &&
|
||||
test_must_fail git rebase --continue 2>err &&
|
||||
grep "error: you have staged changes in your working tree" err &&
|
||||
git reset --hard HEAD &&
|
||||
git rebase --continue &&
|
||||
test $(git cat-file commit HEAD | sed -ne \$p) = I &&
|
||||
git reset --hard original-branch2
|
||||
@ -1323,7 +1345,14 @@ test_expect_success 'rebase -i commits that overwrite untracked files (no ff)' '
|
||||
>file6 &&
|
||||
test_must_fail git rebase --continue &&
|
||||
test $(git cat-file commit HEAD | sed -ne \$p) = F &&
|
||||
test_cmp_rev REBASE_HEAD I &&
|
||||
rm file6 &&
|
||||
test_path_is_missing .git/rebase-merge/patch &&
|
||||
echo changed >file1 &&
|
||||
git add file1 &&
|
||||
test_must_fail git rebase --continue 2>err &&
|
||||
grep "error: you have staged changes in your working tree" err &&
|
||||
git reset --hard HEAD &&
|
||||
git rebase --continue &&
|
||||
test $(git cat-file commit HEAD | sed -ne \$p) = I
|
||||
'
|
||||
|
@ -268,6 +268,24 @@ test_expect_success 'the todo command "break" works' '
|
||||
test_path_is_file execed
|
||||
'
|
||||
|
||||
test_expect_success 'patch file is removed before break command' '
|
||||
test_when_finished "git rebase --abort" &&
|
||||
cat >todo <<-\EOF &&
|
||||
pick commit-new-file-F2-on-topic-branch
|
||||
break
|
||||
EOF
|
||||
|
||||
(
|
||||
set_replace_editor todo &&
|
||||
test_must_fail git rebase -i --onto commit-new-file-F2 HEAD
|
||||
) &&
|
||||
test_path_is_file .git/rebase-merge/patch &&
|
||||
echo 22>F2 &&
|
||||
git add F2 &&
|
||||
git rebase --continue &&
|
||||
test_path_is_missing .git/rebase-merge/patch
|
||||
'
|
||||
|
||||
test_expect_success '--reschedule-failed-exec' '
|
||||
test_when_finished "git rebase --abort" &&
|
||||
test_must_fail git rebase -x false --reschedule-failed-exec HEAD^ &&
|
||||
|
@ -128,14 +128,24 @@ test_expect_success 'generate correct todo list' '
|
||||
'
|
||||
|
||||
test_expect_success '`reset` refuses to overwrite untracked files' '
|
||||
git checkout -b refuse-to-reset &&
|
||||
git checkout B &&
|
||||
test_commit dont-overwrite-untracked &&
|
||||
git checkout @{-1} &&
|
||||
: >dont-overwrite-untracked.t &&
|
||||
echo "reset refs/tags/dont-overwrite-untracked" >script-from-scratch &&
|
||||
cat >script-from-scratch <<-EOF &&
|
||||
exec >dont-overwrite-untracked.t
|
||||
pick $(git rev-parse B) B
|
||||
reset refs/tags/dont-overwrite-untracked
|
||||
pick $(git rev-parse C) C
|
||||
exec cat .git/rebase-merge/done >actual
|
||||
EOF
|
||||
test_config sequence.editor \""$PWD"/replace-editor.sh\" &&
|
||||
test_must_fail git rebase -ir HEAD &&
|
||||
git rebase --abort
|
||||
test_must_fail git rebase -ir A &&
|
||||
test_cmp_rev HEAD B &&
|
||||
head -n3 script-from-scratch >expect &&
|
||||
test_cmp expect .git/rebase-merge/done &&
|
||||
rm dont-overwrite-untracked.t &&
|
||||
git rebase --continue &&
|
||||
tail -n3 script-from-scratch >>expect &&
|
||||
test_cmp expect actual
|
||||
'
|
||||
|
||||
test_expect_success '`reset` rejects trees' '
|
||||
@ -165,12 +175,16 @@ test_expect_success 'failed `merge -C` writes patch (may be rescheduled, too)' '
|
||||
test_config sequence.editor \""$PWD"/replace-editor.sh\" &&
|
||||
test_tick &&
|
||||
test_must_fail git rebase -ir HEAD &&
|
||||
test_cmp_rev REBASE_HEAD H^0 &&
|
||||
grep "^merge -C .* G$" .git/rebase-merge/done &&
|
||||
grep "^merge -C .* G$" .git/rebase-merge/git-rebase-todo &&
|
||||
test_path_is_file .git/rebase-merge/patch &&
|
||||
test_path_is_missing .git/rebase-merge/patch &&
|
||||
echo changed >file1 &&
|
||||
git add file1 &&
|
||||
test_must_fail git rebase --continue 2>err &&
|
||||
grep "error: you have staged changes in your working tree" err &&
|
||||
|
||||
: fail because of merge conflict &&
|
||||
rm G.t .git/rebase-merge/patch &&
|
||||
git reset --hard conflicting-G &&
|
||||
test_must_fail git rebase --continue &&
|
||||
! grep "^merge -C .* G$" .git/rebase-merge/git-rebase-todo &&
|
||||
|
@ -17,6 +17,12 @@ test_expect_success 'setup' '
|
||||
git checkout A^0 &&
|
||||
test_commit E bar E &&
|
||||
test_commit F foo F &&
|
||||
git checkout B &&
|
||||
git merge E &&
|
||||
git tag merge-E &&
|
||||
test_commit G G &&
|
||||
test_commit H H &&
|
||||
test_commit I I &&
|
||||
git checkout main &&
|
||||
|
||||
test_hook --setup post-rewrite <<-EOF
|
||||
@ -173,6 +179,48 @@ test_fail_interactive_rebase () {
|
||||
)
|
||||
}
|
||||
|
||||
test_expect_success 'git rebase with failed pick' '
|
||||
clear_hook_input &&
|
||||
cat >todo <<-\EOF &&
|
||||
exec >bar
|
||||
merge -C merge-E E
|
||||
exec >G
|
||||
pick G
|
||||
exec >H 2>I
|
||||
pick H
|
||||
fixup I
|
||||
EOF
|
||||
|
||||
(
|
||||
set_replace_editor todo &&
|
||||
test_must_fail git rebase -i D D 2>err
|
||||
) &&
|
||||
grep "would be overwritten" err &&
|
||||
rm bar &&
|
||||
|
||||
test_must_fail git rebase --continue 2>err &&
|
||||
grep "would be overwritten" err &&
|
||||
rm G &&
|
||||
|
||||
test_must_fail git rebase --continue 2>err &&
|
||||
grep "would be overwritten" err &&
|
||||
rm H &&
|
||||
|
||||
test_must_fail git rebase --continue 2>err &&
|
||||
grep "would be overwritten" err &&
|
||||
rm I &&
|
||||
|
||||
git rebase --continue &&
|
||||
echo rebase >expected.args &&
|
||||
cat >expected.data <<-EOF &&
|
||||
$(git rev-parse merge-E) $(git rev-parse HEAD~2)
|
||||
$(git rev-parse G) $(git rev-parse HEAD~1)
|
||||
$(git rev-parse H) $(git rev-parse HEAD)
|
||||
$(git rev-parse I) $(git rev-parse HEAD)
|
||||
EOF
|
||||
verify_hook_input
|
||||
'
|
||||
|
||||
test_expect_success 'git rebase -i (unchanged)' '
|
||||
git reset --hard D &&
|
||||
clear_hook_input &&
|
||||
|
Reference in New Issue
Block a user