Merge branch 'dl/subtree-avoid-tricky-echo'
[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 'none of this moved HEAD' '
81         verify_saved_head
82 '
83
84 test_expect_failure 'stash -p with split hunk' '
85         git reset --hard &&
86         cat >test <<-\EOF &&
87         aaa
88         bbb
89         ccc
90         EOF
91         git add test &&
92         git commit -m "initial" &&
93         cat >test <<-\EOF &&
94         aaa
95         added line 1
96         bbb
97         added line 2
98         ccc
99         EOF
100         printf "%s\n" s n y q |
101         test_might_fail git stash -p 2>error &&
102         ! test_must_be_empty error &&
103         grep "added line 1" test &&
104         ! grep "added line 2" test
105 '
106
107 test_done