Merge branch 'kw/commit-keep-index-when-pre-commit-is-not-run' into next
[git] / t / t3904-stash-patch.sh
1 #!/bin/sh
2
3 test_description='stash -p'
4 . ./lib-patch-mode.sh
5
6 if ! test_have_prereq PERL
7 then
8         skip_all='skipping stash -p tests, perl not available'
9         test_done
10 fi
11
12 test_expect_success 'setup' '
13         mkdir dir &&
14         echo parent > dir/foo &&
15         echo dummy > bar &&
16         echo committed > HEAD &&
17         git add bar dir/foo HEAD &&
18         git commit -m initial &&
19         test_tick &&
20         test_commit second dir/foo head &&
21         echo index > dir/foo &&
22         git add dir/foo &&
23         set_and_save_state bar bar_work bar_index &&
24         save_head
25 '
26
27 # note: order of files with unstaged changes: HEAD bar dir/foo
28
29 test_expect_success 'saying "n" does nothing' '
30         set_state HEAD HEADfile_work HEADfile_index &&
31         set_state dir/foo work index &&
32         (echo n; echo n; echo n) | test_must_fail git stash save -p &&
33         verify_state HEAD HEADfile_work HEADfile_index &&
34         verify_saved_state bar &&
35         verify_state dir/foo work index
36 '
37
38 test_expect_success 'git stash -p' '
39         (echo y; echo n; echo y) | git stash save -p &&
40         verify_state HEAD committed HEADfile_index &&
41         verify_saved_state bar &&
42         verify_state dir/foo head index &&
43         git reset --hard &&
44         git stash apply &&
45         verify_state HEAD HEADfile_work committed &&
46         verify_state bar dummy dummy &&
47         verify_state dir/foo work head
48 '
49
50 test_expect_success 'git stash -p --no-keep-index' '
51         set_state HEAD HEADfile_work HEADfile_index &&
52         set_state bar bar_work bar_index &&
53         set_state dir/foo work index &&
54         (echo y; echo n; echo y) | git stash save -p --no-keep-index &&
55         verify_state HEAD committed committed &&
56         verify_state bar bar_work dummy &&
57         verify_state dir/foo head head &&
58         git reset --hard &&
59         git stash apply --index &&
60         verify_state HEAD HEADfile_work HEADfile_index &&
61         verify_state bar dummy bar_index &&
62         verify_state dir/foo work index
63 '
64
65 test_expect_success 'git stash --no-keep-index -p' '
66         set_state HEAD HEADfile_work HEADfile_index &&
67         set_state bar bar_work bar_index &&
68         set_state dir/foo work index &&
69         (echo y; echo n; echo y) | git stash save --no-keep-index -p &&
70         verify_state HEAD committed committed &&
71         verify_state dir/foo head head &&
72         verify_state bar bar_work dummy &&
73         git reset --hard &&
74         git stash apply --index &&
75         verify_state HEAD HEADfile_work HEADfile_index &&
76         verify_state bar dummy bar_index &&
77         verify_state dir/foo work index
78 '
79
80 test_expect_success 'stash -p --no-keep-index -- <pathspec> does not unstage other files' '
81         set_state HEAD HEADfile_work HEADfile_index &&
82         set_state dir/foo work index &&
83         echo y | git stash push -p --no-keep-index -- HEAD &&
84         verify_state HEAD committed committed &&
85         verify_state dir/foo work index
86 '
87
88 test_expect_success 'none of this moved HEAD' '
89         verify_saved_head
90 '
91
92 test_expect_failure 'stash -p with split hunk' '
93         git reset --hard &&
94         cat >test <<-\EOF &&
95         aaa
96         bbb
97         ccc
98         EOF
99         git add test &&
100         git commit -m "initial" &&
101         cat >test <<-\EOF &&
102         aaa
103         added line 1
104         bbb
105         added line 2
106         ccc
107         EOF
108         printf "%s\n" s n y q |
109         test_might_fail git stash -p 2>error &&
110         ! test_must_be_empty error &&
111         grep "added line 1" test &&
112         ! grep "added line 2" test
113 '
114
115 test_done