1#!/bin/sh
2
3test_description='git log'
4
5. ./test-lib.sh
6
7test_expect_success setup '
8
9 echo one >one &&
10 git add one &&
11 test_tick &&
12 git commit -m initial &&
13
14 echo ichi >one &&
15 git add one &&
16 test_tick &&
17 git commit -m second &&
18
19 git mv one ichi &&
20 test_tick &&
21 git commit -m third &&
22
23 cp ichi ein &&
24 git add ein &&
25 test_tick &&
26 git commit -m fourth &&
27
28 mkdir a &&
29 echo ni >a/two &&
30 git add a/two &&
31 test_tick &&
32 git commit -m fifth &&
33
34 git rm a/two &&
35 test_tick &&
36 git commit -m sixth
37
38'
39
40printf "sixth\nfifth\nfourth\nthird\nsecond\ninitial" > expect
41test_expect_success 'pretty' '
42
43 git log --pretty="format:%s" > actual &&
44 test_cmp expect actual
45'
46
47printf "sixth\nfifth\nfourth\nthird\nsecond\ninitial\n" > expect
48test_expect_success 'pretty (tformat)' '
49
50 git log --pretty="tformat:%s" > actual &&
51 test_cmp expect actual
52'
53
54test_expect_success 'pretty (shortcut)' '
55
56 git log --pretty="%s" > actual &&
57 test_cmp expect actual
58'
59
60test_expect_success 'format' '
61
62 git log --format="%s" > actual &&
63 test_cmp expect actual
64'
65
66cat > expect << EOF
67 This is
68 the sixth
69 commit.
70 This is
71 the fifth
72 commit.
73EOF
74
75test_expect_success 'format %w(12,1,2)' '
76
77 git log -2 --format="%w(12,1,2)This is the %s commit." > actual &&
78 test_cmp expect actual
79'
80
81test_expect_success 'format %w(,1,2)' '
82
83 git log -2 --format="%w(,1,2)This is%nthe %s%ncommit." > actual &&
84 test_cmp expect actual
85'
86
87cat > expect << EOF
88804a787 sixth
89394ef78 fifth
905d31159 fourth
912fbe8c0 third
92f7dab8e second
933a2fdcb initial
94EOF
95test_expect_success 'oneline' '
96
97 git log --oneline > actual &&
98 test_cmp expect actual
99'
100
101test_expect_success 'diff-filter=A' '
102
103 actual=$(git log --pretty="format:%s" --diff-filter=A HEAD) &&
104 expect=$(echo fifth ; echo fourth ; echo third ; echo initial) &&
105 test "$actual" = "$expect" || {
106 echo Oops
107 echo "Actual: $actual"
108 false
109 }
110
111'
112
113test_expect_success 'diff-filter=M' '
114
115 actual=$(git log --pretty="format:%s" --diff-filter=M HEAD) &&
116 expect=$(echo second) &&
117 test "$actual" = "$expect" || {
118 echo Oops
119 echo "Actual: $actual"
120 false
121 }
122
123'
124
125test_expect_success 'diff-filter=D' '
126
127 actual=$(git log --pretty="format:%s" --diff-filter=D HEAD) &&
128 expect=$(echo sixth ; echo third) &&
129 test "$actual" = "$expect" || {
130 echo Oops
131 echo "Actual: $actual"
132 false
133 }
134
135'
136
137test_expect_success 'diff-filter=R' '
138
139 actual=$(git log -M --pretty="format:%s" --diff-filter=R HEAD) &&
140 expect=$(echo third) &&
141 test "$actual" = "$expect" || {
142 echo Oops
143 echo "Actual: $actual"
144 false
145 }
146
147'
148
149test_expect_success 'diff-filter=C' '
150
151 actual=$(git log -C -C --pretty="format:%s" --diff-filter=C HEAD) &&
152 expect=$(echo fourth) &&
153 test "$actual" = "$expect" || {
154 echo Oops
155 echo "Actual: $actual"
156 false
157 }
158
159'
160
161test_expect_success 'git log --follow' '
162
163 actual=$(git log --follow --pretty="format:%s" ichi) &&
164 expect=$(echo third ; echo second ; echo initial) &&
165 test "$actual" = "$expect" || {
166 echo Oops
167 echo "Actual: $actual"
168 false
169 }
170
171'
172
173cat > expect << EOF
174804a787 sixth
175394ef78 fifth
1765d31159 fourth
177EOF
178test_expect_success 'git log --no-walk <commits> sorts by commit time' '
179 git log --no-walk --oneline 5d31159 804a787 394ef78 > actual &&
180 test_cmp expect actual
181'
182
183cat > expect << EOF
1845d31159 fourth
185804a787 sixth
186394ef78 fifth
187EOF
188test_expect_success 'git show <commits> leaves list of commits as given' '
189 git show --oneline -s 5d31159 804a787 394ef78 > actual &&
190 test_cmp expect actual
191'
192
193test_expect_success 'setup case sensitivity tests' '
194 echo case >one &&
195 test_tick &&
196 git add one
197 git commit -a -m Second
198'
199
200test_expect_success 'log --grep' '
201 echo second >expect &&
202 git log -1 --pretty="tformat:%s" --grep=sec >actual &&
203 test_cmp expect actual
204'
205
206test_expect_success 'log -i --grep' '
207 echo Second >expect &&
208 git log -1 --pretty="tformat:%s" -i --grep=sec >actual &&
209 test_cmp expect actual
210'
211
212test_expect_success 'log --grep -i' '
213 echo Second >expect &&
214 git log -1 --pretty="tformat:%s" --grep=sec -i >actual &&
215 test_cmp expect actual
216'
217
218cat > expect <<EOF
219* Second
220* sixth
221* fifth
222* fourth
223* third
224* second
225* initial
226EOF
227
228test_expect_success 'simple log --graph' '
229 git log --graph --pretty=tformat:%s >actual &&
230 test_cmp expect actual
231'
232
233test_expect_success 'set up merge history' '
234 git checkout -b side HEAD~4 &&
235 test_commit side-1 1 1 &&
236 test_commit side-2 2 2 &&
237 git checkout master &&
238 git merge side
239'
240
241cat > expect <<\EOF
242* Merge branch 'side'
243|\
244| * side-2
245| * side-1
246* | Second
247* | sixth
248* | fifth
249* | fourth
250|/
251* third
252* second
253* initial
254EOF
255
256test_expect_success 'log --graph with merge' '
257 git log --graph --date-order --pretty=tformat:%s |
258 sed "s/ *$//" >actual &&
259 test_cmp expect actual
260'
261
262cat > expect <<\EOF
263* commit master
264|\ Merge: A B
265| | Author: A U Thor <author@example.com>
266| |
267| | Merge branch 'side'
268| |
269| * commit side
270| | Author: A U Thor <author@example.com>
271| |
272| | side-2
273| |
274| * commit tags/side-1
275| | Author: A U Thor <author@example.com>
276| |
277| | side-1
278| |
279* | commit master~1
280| | Author: A U Thor <author@example.com>
281| |
282| | Second
283| |
284* | commit master~2
285| | Author: A U Thor <author@example.com>
286| |
287| | sixth
288| |
289* | commit master~3
290| | Author: A U Thor <author@example.com>
291| |
292| | fifth
293| |
294* | commit master~4
295|/ Author: A U Thor <author@example.com>
296|
297| fourth
298|
299* commit tags/side-1~1
300| Author: A U Thor <author@example.com>
301|
302| third
303|
304* commit tags/side-1~2
305| Author: A U Thor <author@example.com>
306|
307| second
308|
309* commit tags/side-1~3
310 Author: A U Thor <author@example.com>
311
312 initial
313EOF
314
315test_expect_success 'log --graph with full output' '
316 git log --graph --date-order --pretty=short |
317 git name-rev --name-only --stdin |
318 sed "s/Merge:.*/Merge: A B/;s/ *$//" >actual &&
319 test_cmp expect actual
320'
321
322test_expect_success 'set up more tangled history' '
323 git checkout -b tangle HEAD~6 &&
324 test_commit tangle-a tangle-a a &&
325 git merge master~3 &&
326 git merge side~1 &&
327 git checkout master &&
328 git merge tangle &&
329 git checkout -b reach &&
330 test_commit reach &&
331 git checkout master &&
332 git checkout -b octopus-a &&
333 test_commit octopus-a &&
334 git checkout master &&
335 git checkout -b octopus-b &&
336 test_commit octopus-b &&
337 git checkout master &&
338 test_commit seventh &&
339 git merge octopus-a octopus-b
340 git merge reach
341'
342
343cat > expect <<\EOF
344* Merge commit 'reach'
345|\
346| \
347| \
348*-. \ Merge commit 'octopus-a'; commit 'octopus-b'
349|\ \ \
350* | | | seventh
351| | * | octopus-b
352| |/ /
353|/| |
354| * | octopus-a
355|/ /
356| * reach
357|/
358* Merge branch 'tangle'
359|\
360| * Merge branch 'side' (early part) into tangle
361| |\
362| * \ Merge branch 'master' (early part) into tangle
363| |\ \
364| * | | tangle-a
365* | | | Merge branch 'side'
366|\ \ \ \
367| * | | | side-2
368| | |_|/
369| |/| |
370| * | | side-1
371* | | | Second
372* | | | sixth
373| |_|/
374|/| |
375* | | fifth
376* | | fourth
377|/ /
378* | third
379|/
380* second
381* initial
382EOF
383
384test_expect_success 'log --graph with merge' '
385 git log --graph --date-order --pretty=tformat:%s |
386 sed "s/ *$//" >actual &&
387 test_cmp expect actual
388'
389
390test_done
391