mirror of
https://github.com/git/git
synced 2024-08-28 12:09:19 +00:00
![Ævar Arnfjörð Bjarmason](/assets/img/avatar_default.png)
Since [1] first released with Git v2.37.0 the built-in version of "add -i" has been the default. That built-in implementation was added in [2], first released with Git v2.25.0. At this point enough time has passed to allow for finding any remaining bugs in this new implementation, so let's remove the fallback code. As with similar migrations for "stash"[3] and "rebase"[4] we're keeping a mention of "add.interactive.useBuiltin" in the documentation, but adding a warning() to notify any outstanding users that the built-in is now the default. As with [5] and [6] we should follow-up in the future and eventually remove that warning. 1.0527ccb1b5
(add -i: default to the built-in implementation, 2021-11-30) 2.f83dff60a7
(Start to implement a built-in version of `git add --interactive`, 2019-11-13) 3.8a2cd3f512
(stash: remove the stash.useBuiltin setting, 2020-03-03) 4.d03ebd411c
(rebase: remove the rebase.useBuiltin setting, 2019-03-18) 5.deeaf5ee07
(stash: remove documentation for `stash.useBuiltin`, 2022-01-27) 6.9bcde4d531
(rebase: remove transitory rebase.useBuiltin setting & env, 2021-03-23) Signed-off-by: Ævar Arnfjörð Bjarmason <avarab@gmail.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
128 lines
3.6 KiB
Bash
Executable file
128 lines
3.6 KiB
Bash
Executable file
#!/bin/sh
|
|
|
|
test_description='git checkout --patch'
|
|
|
|
. ./lib-patch-mode.sh
|
|
|
|
test_expect_success 'setup' '
|
|
mkdir dir &&
|
|
echo parent > dir/foo &&
|
|
echo dummy > bar &&
|
|
git add bar dir/foo &&
|
|
git commit -m initial &&
|
|
test_tick &&
|
|
test_commit second dir/foo head &&
|
|
set_and_save_state bar bar_work bar_index &&
|
|
save_head
|
|
'
|
|
|
|
# note: bar sorts before dir/foo, so the first 'n' is always to skip 'bar'
|
|
|
|
test_expect_success 'saying "n" does nothing' '
|
|
set_and_save_state dir/foo work head &&
|
|
test_write_lines n n | git checkout -p &&
|
|
verify_saved_state bar &&
|
|
verify_saved_state dir/foo
|
|
'
|
|
|
|
test_expect_success 'git checkout -p' '
|
|
test_write_lines n y | git checkout -p &&
|
|
verify_saved_state bar &&
|
|
verify_state dir/foo head head
|
|
'
|
|
|
|
test_expect_success 'git checkout -p with staged changes' '
|
|
set_state dir/foo work index &&
|
|
test_write_lines n y | git checkout -p &&
|
|
verify_saved_state bar &&
|
|
verify_state dir/foo index index
|
|
'
|
|
|
|
test_expect_success 'git checkout -p HEAD with NO staged changes: abort' '
|
|
set_and_save_state dir/foo work head &&
|
|
test_write_lines n y n | git checkout -p HEAD &&
|
|
verify_saved_state bar &&
|
|
verify_saved_state dir/foo
|
|
'
|
|
|
|
test_expect_success 'git checkout -p HEAD with NO staged changes: apply' '
|
|
test_write_lines n y y | git checkout -p HEAD &&
|
|
verify_saved_state bar &&
|
|
verify_state dir/foo head head
|
|
'
|
|
|
|
test_expect_success 'git checkout -p HEAD with change already staged' '
|
|
set_state dir/foo index index &&
|
|
# the third n is to get out in case it mistakenly does not apply
|
|
test_write_lines n y n | git checkout -p HEAD &&
|
|
verify_saved_state bar &&
|
|
verify_state dir/foo head head
|
|
'
|
|
|
|
test_expect_success 'git checkout -p HEAD^...' '
|
|
# the third n is to get out in case it mistakenly does not apply
|
|
test_write_lines n y n | git checkout -p HEAD^... &&
|
|
verify_saved_state bar &&
|
|
verify_state dir/foo parent parent
|
|
'
|
|
|
|
test_expect_success 'git checkout -p HEAD^' '
|
|
# the third n is to get out in case it mistakenly does not apply
|
|
test_write_lines n y n | git checkout -p HEAD^ &&
|
|
verify_saved_state bar &&
|
|
verify_state dir/foo parent parent
|
|
'
|
|
|
|
test_expect_success 'git checkout -p handles deletion' '
|
|
set_state dir/foo work index &&
|
|
rm dir/foo &&
|
|
test_write_lines n y | git checkout -p &&
|
|
verify_saved_state bar &&
|
|
verify_state dir/foo index index
|
|
'
|
|
|
|
# The idea in the rest is that bar sorts first, so we always say 'y'
|
|
# first and if the path limiter fails it'll apply to bar instead of
|
|
# dir/foo. There's always an extra 'n' to reject edits to dir/foo in
|
|
# the failure case (and thus get out of the loop).
|
|
|
|
test_expect_success 'path limiting works: dir' '
|
|
set_state dir/foo work head &&
|
|
test_write_lines y n | git checkout -p dir &&
|
|
verify_saved_state bar &&
|
|
verify_state dir/foo head head
|
|
'
|
|
|
|
test_expect_success 'path limiting works: -- dir' '
|
|
set_state dir/foo work head &&
|
|
test_write_lines y n | git checkout -p -- dir &&
|
|
verify_saved_state bar &&
|
|
verify_state dir/foo head head
|
|
'
|
|
|
|
test_expect_success 'path limiting works: HEAD^ -- dir' '
|
|
# the third n is to get out in case it mistakenly does not apply
|
|
test_write_lines y n n | git checkout -p HEAD^ -- dir &&
|
|
verify_saved_state bar &&
|
|
verify_state dir/foo parent parent
|
|
'
|
|
|
|
test_expect_success 'path limiting works: foo inside dir' '
|
|
set_state dir/foo work head &&
|
|
# the third n is to get out in case it mistakenly does not apply
|
|
test_write_lines y n n | (cd dir && git checkout -p foo) &&
|
|
verify_saved_state bar &&
|
|
verify_state dir/foo head head
|
|
'
|
|
|
|
test_expect_success 'none of this moved HEAD' '
|
|
verify_saved_head
|
|
'
|
|
|
|
test_expect_success 'empty tree can be handled' '
|
|
test_when_finished "git reset --hard" &&
|
|
git checkout -p $(test_oid empty_tree) --
|
|
'
|
|
|
|
test_done
|