pretty: test --expand-tabs

The test prepares a simple commit with HT on its log message lines, and makes sure that - formats that should or should not expand tabs by default do or do not expand tabs respectively, - with explicit --expand-tabs=<N> and short-hands --expand-tabs (equivalent to --expand-tabs=8) and --no-expand-tabs (equivalent to --expand-tabs=0) before or after the explicit --pretty=$fmt, the tabs are expanded (or not expanded) accordingly. The tests use the second line of the log message for formats other than --pretty=short, primarily because the first line of the email format is handled specially to add the [PATCH] prefix, etc. in a separate codepath (--pretty=short uses the first line because there is no other line to test). Signed-off-by: Junio C Hamano <gitster@pobox.com>

Junio C Hamano committed Apr 4, 2016 at 16:09 UTC 915c96df3822f968332f6bf3642e5195b52201c9
1 file changed +105
t/t4213-log-tabexpand.sh new
+105
@@ -0,0 +1,105 @@
1 +#!/bin/sh
2 +
3 +test_description='log/show --expand-tabs'
4 +
5 +. ./test-lib.sh
6 +
7 +HT=" "
8 +title='tab indent at the beginning of the title line'
9 +body='tab indent on a line in the body'
10 +
11 +# usage: count_expand $indent $numSP $numHT @format_args
12 +count_expand ()
13 +{
14 + expect=
15 + count=$(( $1 + $2 )) ;# expected spaces
16 + while test $count -gt 0
17 + do
18 + expect="$expect "
19 + count=$(( $count - 1 ))
20 + done
21 + shift 2
22 + count=$1 ;# expected tabs
23 + while test $count -gt 0
24 + do
25 + expect="$expect$HT"
26 + count=$(( $count - 1 ))
27 + done
28 + shift
29 +
30 + # The remainder of the command line is "git show -s" options
31 + case " $* " in
32 + *' --pretty=short '*)
33 + line=$title ;;
34 + *)
35 + line=$body ;;
36 + esac
37 +
38 + # Prefix the output with the command line arguments, and
39 + # replace SP with a dot both in the expecte and actual output
40 + # so that test_cmp would show the differene together with the
41 + # breakage in a way easier to consume by the debugging user.
42 + {
43 + echo "git show -s $*"
44 + echo "$expect$line"
45 + } | sed -e 's/ /./g' >expect
46 +
47 + {
48 + echo "git show -s $*"
49 + git show -s "$@" |
50 + sed -n -e "/$line\$/p"
51 + } | sed -e 's/ /./g' >actual
52 +
53 + test_cmp expect actual
54 +}
55 +
56 +test_expand ()
57 +{
58 + fmt=$1
59 + case "$fmt" in
60 + *=raw | *=short | *=email)
61 + default="0 1" ;;
62 + *)
63 + default="8 0" ;;
64 + esac
65 + case "$fmt" in
66 + *=email)
67 + in=0 ;;
68 + *)
69 + in=4 ;;
70 + esac
71 + test_expect_success "expand/no-expand${fmt:+ for $fmt}" '
72 + count_expand $in $default $fmt &&
73 + count_expand $in 8 0 $fmt --expand-tabs &&
74 + count_expand $in 8 0 --expand-tabs $fmt &&
75 + count_expand $in 8 0 $fmt --expand-tabs=8 &&
76 + count_expand $in 8 0 --expand-tabs=8 $fmt &&
77 + count_expand $in 0 1 $fmt --no-expand-tabs &&
78 + count_expand $in 0 1 --no-expand-tabs $fmt &&
79 + count_expand $in 0 1 $fmt --expand-tabs=0 &&
80 + count_expand $in 0 1 --expand-tabs=0 $fmt &&
81 + count_expand $in 4 0 $fmt --expand-tabs=4 &&
82 + count_expand $in 4 0 --expand-tabs=4 $fmt
83 + '
84 +}
85 +
86 +test_expect_success 'setup' '
87 + test_tick &&
88 + sed -e "s/Q/$HT/g" <<-EOF >msg &&
89 + Q$title
90 +
91 + Q$body
92 + EOF
93 + git commit --allow-empty -F msg
94 +'
95 +
96 +test_expand ""
97 +test_expand --pretty
98 +test_expand --pretty=short
99 +test_expand --pretty=medium
100 +test_expand --pretty=full
101 +test_expand --pretty=fuller
102 +test_expand --pretty=raw
103 +test_expand --pretty=email
104 +
105 +test_done