Skip to content

Commit 1f5881d

Browse files
committed
Merge branch 'tr/maint-show-walk' into maint
"git show"'s auto-walking behaviour was an unreliable and unpredictable hack; it now behaves just like "git log" does when it walks. * tr/maint-show-walk: show: fix "range implies walking" Demonstrate git-show is broken with ranges
2 parents 106ef55 + c5941f1 commit 1f5881d

File tree

2 files changed

+94
-0
lines changed

2 files changed

+94
-0
lines changed

builtin/log.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -462,6 +462,9 @@ int cmd_show(int argc, const char **argv, const char *prefix)
462462
opt.tweak = show_rev_tweak_rev;
463463
cmd_log_init(argc, argv, prefix, &rev, &opt);
464464

465+
if (!rev.no_walk)
466+
return cmd_log_walk(&rev);
467+
465468
count = rev.pending.nr;
466469
objects = rev.pending.objects;
467470
for (i = 0; i < count && !ret; i++) {

t/t7007-show.sh

Lines changed: 91 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,4 +17,95 @@ test_expect_success 'showing a tag that point at a missing object' '
1717
test_must_fail git --no-pager show foo-tag
1818
'
1919

20+
test_expect_success 'set up a bit of history' '
21+
test_commit main1 &&
22+
test_commit main2 &&
23+
test_commit main3 &&
24+
git tag -m "annotated tag" annotated &&
25+
git checkout -b side HEAD^^ &&
26+
test_commit side2 &&
27+
test_commit side3
28+
'
29+
30+
test_expect_success 'showing two commits' '
31+
cat >expect <<-EOF &&
32+
commit $(git rev-parse main2)
33+
commit $(git rev-parse main3)
34+
EOF
35+
git show main2 main3 >actual &&
36+
grep ^commit actual >actual.filtered &&
37+
test_cmp expect actual.filtered
38+
'
39+
40+
test_expect_success 'showing a range walks (linear)' '
41+
cat >expect <<-EOF &&
42+
commit $(git rev-parse main3)
43+
commit $(git rev-parse main2)
44+
EOF
45+
git show main1..main3 >actual &&
46+
grep ^commit actual >actual.filtered &&
47+
test_cmp expect actual.filtered
48+
'
49+
50+
test_expect_success 'showing a range walks (Y shape, ^ first)' '
51+
cat >expect <<-EOF &&
52+
commit $(git rev-parse main3)
53+
commit $(git rev-parse main2)
54+
EOF
55+
git show ^side3 main3 >actual &&
56+
grep ^commit actual >actual.filtered &&
57+
test_cmp expect actual.filtered
58+
'
59+
60+
test_expect_success 'showing a range walks (Y shape, ^ last)' '
61+
cat >expect <<-EOF &&
62+
commit $(git rev-parse main3)
63+
commit $(git rev-parse main2)
64+
EOF
65+
git show main3 ^side3 >actual &&
66+
grep ^commit actual >actual.filtered &&
67+
test_cmp expect actual.filtered
68+
'
69+
70+
test_expect_success 'showing with -N walks' '
71+
cat >expect <<-EOF &&
72+
commit $(git rev-parse main3)
73+
commit $(git rev-parse main2)
74+
EOF
75+
git show -2 main3 >actual &&
76+
grep ^commit actual >actual.filtered &&
77+
test_cmp expect actual.filtered
78+
'
79+
80+
test_expect_success 'showing annotated tag' '
81+
cat >expect <<-EOF &&
82+
tag annotated
83+
commit $(git rev-parse annotated^{commit})
84+
EOF
85+
git show annotated >actual &&
86+
grep -E "^(commit|tag)" actual >actual.filtered &&
87+
test_cmp expect actual.filtered
88+
'
89+
90+
test_expect_success 'showing annotated tag plus commit' '
91+
cat >expect <<-EOF &&
92+
tag annotated
93+
commit $(git rev-parse annotated^{commit})
94+
commit $(git rev-parse side3)
95+
EOF
96+
git show annotated side3 >actual &&
97+
grep -E "^(commit|tag)" actual >actual.filtered &&
98+
test_cmp expect actual.filtered
99+
'
100+
101+
test_expect_success 'showing range' '
102+
cat >expect <<-EOF &&
103+
commit $(git rev-parse main3)
104+
commit $(git rev-parse main2)
105+
EOF
106+
git show ^side3 annotated >actual &&
107+
grep -E "^(commit|tag)" actual >actual.filtered &&
108+
test_cmp expect actual.filtered
109+
'
110+
20111
test_done

0 commit comments

Comments
 (0)