Merge branch 'jc/calloc-fix'
[git] / t / t3501-revert-cherry-pick.sh
1 #!/bin/sh
2
3 test_description='test cherry-pick and revert with renames
4
5   --
6    + rename2: renames oops to opos
7   +  rename1: renames oops to spoo
8   +  added:   adds extra line to oops
9   ++ initial: has lines in oops
10
11 '
12
13 GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main
14 export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME
15
16 . ./test-lib.sh
17
18 test_expect_success setup '
19
20         for l in a b c d e f g h i j k l m n o
21         do
22                 echo $l$l$l$l$l$l$l$l$l
23         done >oops &&
24
25         test_tick &&
26         git add oops &&
27         git commit -m initial &&
28         git tag initial &&
29
30         test_tick &&
31         echo "Add extra line at the end" >>oops &&
32         git commit -a -m added &&
33         git tag added &&
34
35         test_tick &&
36         git mv oops spoo &&
37         git commit -m rename1 &&
38         git tag rename1 &&
39
40         test_tick &&
41         git checkout -b side initial &&
42         git mv oops opos &&
43         git commit -m rename2 &&
44         git tag rename2
45 '
46
47 test_expect_success 'cherry-pick --nonsense' '
48
49         pos=$(git rev-parse HEAD) &&
50         git diff --exit-code HEAD &&
51         test_must_fail git cherry-pick --nonsense 2>msg &&
52         git diff --exit-code HEAD "$pos" &&
53         test_i18ngrep "[Uu]sage:" msg
54 '
55
56 test_expect_success 'revert --nonsense' '
57
58         pos=$(git rev-parse HEAD) &&
59         git diff --exit-code HEAD &&
60         test_must_fail git revert --nonsense 2>msg &&
61         git diff --exit-code HEAD "$pos" &&
62         test_i18ngrep "[Uu]sage:" msg
63 '
64
65 test_expect_success 'cherry-pick after renaming branch' '
66
67         git checkout rename2 &&
68         git cherry-pick added &&
69         test $(git rev-parse HEAD^) = $(git rev-parse rename2) &&
70         test -f opos &&
71         grep "Add extra line at the end" opos &&
72         git reflog -1 | grep cherry-pick
73
74 '
75
76 test_expect_success 'revert after renaming branch' '
77
78         git checkout rename1 &&
79         git revert added &&
80         test $(git rev-parse HEAD^) = $(git rev-parse rename1) &&
81         test -f spoo &&
82         ! grep "Add extra line at the end" spoo &&
83         git reflog -1 | grep revert
84
85 '
86
87 test_expect_success 'cherry-pick on stat-dirty working tree' '
88         git clone . copy &&
89         (
90                 cd copy &&
91                 git checkout initial &&
92                 test-tool chmtime +40 oops &&
93                 git cherry-pick added
94         )
95 '
96
97 test_expect_success 'revert forbidden on dirty working tree' '
98
99         echo content >extra_file &&
100         git add extra_file &&
101         test_must_fail git revert HEAD 2>errors &&
102         test_i18ngrep "your local changes would be overwritten by " errors
103
104 '
105
106 test_expect_success 'cherry-pick on unborn branch' '
107         git checkout --orphan unborn &&
108         git rm --cached -r . &&
109         rm -rf * &&
110         git cherry-pick initial &&
111         git diff --quiet initial &&
112         test_cmp_rev ! initial HEAD
113 '
114
115 test_expect_success 'cherry-pick "-" to pick from previous branch' '
116         git checkout unborn &&
117         test_commit to-pick actual content &&
118         git checkout main &&
119         git cherry-pick - &&
120         echo content >expect &&
121         test_cmp expect actual
122 '
123
124 test_expect_success 'cherry-pick "-" is meaningless without checkout' '
125         test_create_repo afresh &&
126         (
127                 cd afresh &&
128                 test_commit one &&
129                 test_commit two &&
130                 test_commit three &&
131                 test_must_fail git cherry-pick -
132         )
133 '
134
135 test_expect_success 'cherry-pick "-" works with arguments' '
136         git checkout -b side-branch &&
137         test_commit change actual change &&
138         git checkout main &&
139         git cherry-pick -s - &&
140         echo "Signed-off-by: C O Mitter <committer@example.com>" >expect &&
141         git cat-file commit HEAD | grep ^Signed-off-by: >signoff &&
142         test_cmp expect signoff &&
143         echo change >expect &&
144         test_cmp expect actual
145 '
146
147 test_expect_success 'cherry-pick works with dirty renamed file' '
148         test_commit to-rename &&
149         git checkout -b unrelated &&
150         test_commit unrelated &&
151         git checkout @{-1} &&
152         git mv to-rename.t renamed &&
153         test_tick &&
154         git commit -m renamed &&
155         echo modified >renamed &&
156         git cherry-pick refs/heads/unrelated &&
157         test $(git rev-parse :0:renamed) = $(git rev-parse HEAD~2:to-rename.t) &&
158         grep -q "^modified$" renamed
159 '
160
161 test_done