3 test_description
='git restore --patch'
7 test_expect_success
'setup' '
9 echo parent >dir/foo &&
11 git add bar dir/foo &&
12 git commit -m initial &&
14 test_commit second dir/foo head &&
15 set_and_save_state bar bar_work bar_index &&
19 test_expect_success
'restore -p without pathspec is fine' '
24 # note: bar sorts before dir/foo, so the first 'n' is always to skip 'bar'
26 test_expect_success
'saying "n" does nothing' '
27 set_and_save_state dir/foo work head &&
28 test_write_lines n n | git restore -p &&
29 verify_saved_state bar &&
30 verify_saved_state dir/foo
33 test_expect_success
'git restore -p' '
34 set_and_save_state dir/foo work head &&
35 test_write_lines n y | git restore -p &&
36 verify_saved_state bar &&
37 verify_state dir/foo head head
40 test_expect_success
'git restore -p with staged changes' '
41 set_state dir/foo work index &&
42 test_write_lines n y | git restore -p &&
43 verify_saved_state bar &&
44 verify_state dir/foo index index
49 test_expect_success
"git restore -p --source=$opt" '
50 set_state dir/foo work index &&
51 # the third n is to get out in case it mistakenly does not apply
52 test_write_lines n y n | git restore -p --source=$opt >output &&
53 verify_saved_state bar &&
54 verify_state dir/foo head index &&
55 test_grep "Discard" output
59 test_expect_success
'git restore -p --source=HEAD^' '
60 set_state dir/foo work index &&
61 # the third n is to get out in case it mistakenly does not apply
62 test_write_lines n y n | git restore -p --source=HEAD^ &&
63 verify_saved_state bar &&
64 verify_state dir/foo parent index
67 test_expect_success
'git restore -p --source=HEAD^...' '
68 set_state dir/foo work index &&
69 # the third n is to get out in case it mistakenly does not apply
70 test_write_lines n y n | git restore -p --source=HEAD^... &&
71 verify_saved_state bar &&
72 verify_state dir/foo parent index
75 test_expect_success
'git restore -p handles deletion' '
76 set_state dir/foo work index &&
78 test_write_lines n y | git restore -p &&
79 verify_saved_state bar &&
80 verify_state dir/foo index index
83 # The idea in the rest is that bar sorts first, so we always say 'y'
84 # first and if the path limiter fails it'll apply to bar instead of
85 # dir/foo. There's always an extra 'n' to reject edits to dir/foo in
86 # the failure case (and thus get out of the loop).
88 test_expect_success
'path limiting works: dir' '
89 set_state dir/foo work head &&
90 test_write_lines y n | git restore -p dir &&
91 verify_saved_state bar &&
92 verify_state dir/foo head head
95 test_expect_success
'path limiting works: -- dir' '
96 set_state dir/foo work head &&
97 test_write_lines y n | git restore -p -- dir &&
98 verify_saved_state bar &&
99 verify_state dir/foo head head
102 test_expect_success
'path limiting works: HEAD^ -- dir' '
103 set_state dir/foo work head &&
104 # the third n is to get out in case it mistakenly does not apply
105 test_write_lines y n n | git restore -p --source=HEAD^ -- dir &&
106 verify_saved_state bar &&
107 verify_state dir/foo parent head
110 test_expect_success
'path limiting works: foo inside dir' '
111 set_state dir/foo work head &&
112 # the third n is to get out in case it mistakenly does not apply
113 test_write_lines y n n | (cd dir && git restore -p foo) &&
114 verify_saved_state bar &&
115 verify_state dir/foo head head
118 test_expect_success
'none of this moved HEAD' '