Merge branch 'jk/ref-filter-segfault-fix'
[git] / t / t3201-branch-contains.sh
1 #!/bin/sh
2
3 test_description='branch --contains <commit>, --no-contains <commit> --merged, and --no-merged'
4
5 GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main
6 export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME
7
8 . ./test-lib.sh
9
10 test_expect_success setup '
11
12         >file &&
13         git add file &&
14         test_tick &&
15         git commit -m initial &&
16         git branch -M main &&
17         git branch side &&
18
19         echo 1 >file &&
20         test_tick &&
21         git commit -a -m "second on main" &&
22
23         git checkout side &&
24         echo 1 >file &&
25         test_tick &&
26         git commit -a -m "second on side" &&
27
28         git merge main
29
30 '
31
32 test_expect_success 'branch --contains=main' '
33
34         git branch --contains=main >actual &&
35         {
36                 echo "  main" && echo "* side"
37         } >expect &&
38         test_cmp expect actual
39
40 '
41
42 test_expect_success 'branch --contains main' '
43
44         git branch --contains main >actual &&
45         {
46                 echo "  main" && echo "* side"
47         } >expect &&
48         test_cmp expect actual
49
50 '
51
52 test_expect_success 'branch --no-contains=main' '
53
54         git branch --no-contains=main >actual &&
55         test_must_be_empty actual
56
57 '
58
59 test_expect_success 'branch --no-contains main' '
60
61         git branch --no-contains main >actual &&
62         test_must_be_empty actual
63
64 '
65
66 test_expect_success 'branch --contains=side' '
67
68         git branch --contains=side >actual &&
69         {
70                 echo "* side"
71         } >expect &&
72         test_cmp expect actual
73
74 '
75
76 test_expect_success 'branch --no-contains=side' '
77
78         git branch --no-contains=side >actual &&
79         {
80                 echo "  main"
81         } >expect &&
82         test_cmp expect actual
83
84 '
85
86 test_expect_success 'branch --contains with pattern implies --list' '
87
88         git branch --contains=main main >actual &&
89         {
90                 echo "  main"
91         } >expect &&
92         test_cmp expect actual
93
94 '
95
96 test_expect_success 'branch --no-contains with pattern implies --list' '
97
98         git branch --no-contains=main main >actual &&
99         test_must_be_empty actual
100
101 '
102
103 test_expect_success 'side: branch --merged' '
104
105         git branch --merged >actual &&
106         {
107                 echo "  main" &&
108                 echo "* side"
109         } >expect &&
110         test_cmp expect actual
111
112 '
113
114 test_expect_success 'branch --merged with pattern implies --list' '
115
116         git branch --merged=side main >actual &&
117         {
118                 echo "  main"
119         } >expect &&
120         test_cmp expect actual
121
122 '
123
124 test_expect_success 'side: branch --no-merged' '
125
126         git branch --no-merged >actual &&
127         test_must_be_empty actual
128
129 '
130
131 test_expect_success 'main: branch --merged' '
132
133         git checkout main &&
134         git branch --merged >actual &&
135         {
136                 echo "* main"
137         } >expect &&
138         test_cmp expect actual
139
140 '
141
142 test_expect_success 'main: branch --no-merged' '
143
144         git branch --no-merged >actual &&
145         {
146                 echo "  side"
147         } >expect &&
148         test_cmp expect actual
149
150 '
151
152 test_expect_success 'branch --no-merged with pattern implies --list' '
153
154         git branch --no-merged=main main >actual &&
155         test_must_be_empty actual
156
157 '
158
159 test_expect_success 'implicit --list conflicts with modification options' '
160
161         test_must_fail git branch --contains=main -d &&
162         test_must_fail git branch --contains=main -m foo &&
163         test_must_fail git branch --no-contains=main -d &&
164         test_must_fail git branch --no-contains=main -m foo
165
166 '
167
168 test_expect_success 'Assert that --contains only works on commits, not trees & blobs' '
169         test_must_fail git branch --contains main^{tree} &&
170         blob=$(git hash-object -w --stdin <<-\EOF
171         Some blob
172         EOF
173         ) &&
174         test_must_fail git branch --contains $blob &&
175         test_must_fail git branch --no-contains $blob
176 '
177
178 test_expect_success 'multiple branch --contains' '
179         git checkout -b side2 main &&
180         >feature &&
181         git add feature &&
182         git commit -m "add feature" &&
183         git checkout -b next main &&
184         git merge side &&
185         git branch --contains side --contains side2 >actual &&
186         cat >expect <<-\EOF &&
187         * next
188           side
189           side2
190         EOF
191         test_cmp expect actual
192 '
193
194 test_expect_success 'multiple branch --merged' '
195         git branch --merged next --merged main >actual &&
196         cat >expect <<-\EOF &&
197           main
198         * next
199           side
200         EOF
201         test_cmp expect actual
202 '
203
204 test_expect_success 'multiple branch --no-contains' '
205         git branch --no-contains side --no-contains side2 >actual &&
206         cat >expect <<-\EOF &&
207           main
208         EOF
209         test_cmp expect actual
210 '
211
212 test_expect_success 'multiple branch --no-merged' '
213         git branch --no-merged next --no-merged main >actual &&
214         cat >expect <<-\EOF &&
215           side2
216         EOF
217         test_cmp expect actual
218 '
219
220 test_expect_success 'branch --contains combined with --no-contains' '
221         git checkout -b seen main &&
222         git merge side &&
223         git merge side2 &&
224         git branch --contains side --no-contains side2 >actual &&
225         cat >expect <<-\EOF &&
226           next
227           side
228         EOF
229         test_cmp expect actual
230 '
231
232 test_expect_success 'branch --merged combined with --no-merged' '
233         git branch --merged seen --no-merged next >actual &&
234         cat >expect <<-\EOF &&
235         * seen
236           side2
237         EOF
238         test_cmp expect actual
239 '
240
241 # We want to set up a case where the walk for the tracking info
242 # of one branch crosses the tip of another branch (and make sure
243 # that the latter walk does not mess up our flag to see if it was
244 # merged).
245 #
246 # Here "topic" tracks "main" with one extra commit, and "zzz" points to the
247 # same tip as main The name "zzz" must come alphabetically after "topic"
248 # as we process them in that order.
249 test_expect_success 'branch --merged with --verbose' '
250         git branch --track topic main &&
251         git branch zzz topic &&
252         git checkout topic &&
253         test_commit foo &&
254         git branch --merged topic >actual &&
255         cat >expect <<-\EOF &&
256           main
257         * topic
258           zzz
259         EOF
260         test_cmp expect actual &&
261         git branch --verbose --merged topic >actual &&
262         cat >expect <<-EOF &&
263           main  $(git rev-parse --short main) second on main
264         * topic $(git rev-parse --short topic ) [ahead 1] foo
265           zzz   $(git rev-parse --short zzz   ) second on main
266         EOF
267         test_cmp expect actual
268 '
269
270 test_done