summaryrefslogtreecommitdiffstats
path: root/t/t4210-log-i18n.sh
blob: d2dfcf164e25b8771dd852d2aefc4aee4bd3f5ea (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
#!/bin/sh

test_description='test log with i18n features'
. ./lib-gettext.sh

# two forms of é
utf8_e=$(printf '\303\251')
latin1_e=$(printf '\351')

# invalid UTF-8
invalid_e=$(printf '\303\50)') # ")" at end to close opening "("

have_reg_illseq=
if test_have_prereq GETTEXT_LOCALE &&
	! LC_ALL=$is_IS_locale test-tool regex --silent $latin1_e
then
	have_reg_illseq=1
fi

test_expect_success 'create commits in different encodings' '
	test_tick &&
	cat >msg <<-EOF &&
	utf8

	t${utf8_e}st
	EOF
	git add msg &&
	git -c i18n.commitencoding=utf8 commit -F msg &&
	cat >msg <<-EOF &&
	latin1

	t${latin1_e}st
	EOF
	git add msg &&
	git -c i18n.commitencoding=ISO-8859-1 commit -F msg
'

test_expect_success 'log --grep searches in log output encoding (utf8)' '
	cat >expect <<-\EOF &&
	latin1
	utf8
	EOF
	git log --encoding=utf8 --format=%s --grep=$utf8_e >actual &&
	test_cmp expect actual
'

test_expect_success !MINGW 'log --grep searches in log output encoding (latin1)' '
	cat >expect <<-\EOF &&
	latin1
	utf8
	EOF
	git log --encoding=ISO-8859-1 --format=%s --grep=$latin1_e >actual &&
	test_cmp expect actual
'

test_expect_success !MINGW 'log --grep does not find non-reencoded values (utf8)' '
	git log --encoding=utf8 --format=%s --grep=$latin1_e >actual &&
	test_must_be_empty actual
'

test_expect_success 'log --grep does not find non-reencoded values (latin1)' '
	git log --encoding=ISO-8859-1 --format=%s --grep=$utf8_e >actual &&
	test_must_be_empty actual
'

triggers_undefined_behaviour () {
	local engine=$1

	case $engine in
	fixed)
		if test -n "$have_reg_illseq" &&
			! test_have_prereq LIBPCRE2
		then
			return 0
		fi
		;;
	basic|extended)
		if test -n "$have_reg_illseq"
		then
			return 0
		fi
		;;
	esac
	return 1
}

mismatched_git_log () {
	local pattern=$1

	LC_ALL=$is_IS_locale git log --encoding=ISO-8859-1 --format=%s \
		--grep=$pattern
}

for engine in fixed basic extended perl
do
	prereq=
	if test $engine = "perl"
	then
		prereq=PCRE
	fi
	force_regex=
	if test $engine != "fixed"
	then
		force_regex='.*'
	fi

	test_expect_success $prereq "config grep.patternType=$engine" "
		git config grep.patternType $engine
	"

	test_expect_success GETTEXT_LOCALE,$prereq "log --grep does not find non-reencoded values (latin1 + locale)" "
		mismatched_git_log '$force_regex$utf8_e' >actual &&
		test_must_be_empty actual
	"

	if ! triggers_undefined_behaviour $engine
	then
		test_expect_success !MINGW,GETTEXT_LOCALE,$prereq "log --grep searches in log output encoding (latin1 + locale)" "
			cat >expect <<-\EOF &&
			latin1
			utf8
			EOF
			mismatched_git_log '$force_regex$latin1_e' >actual &&
			test_cmp expect actual
		"

		test_expect_success GETTEXT_LOCALE,$prereq "log --grep does not die on invalid UTF-8 value (latin1 + locale + invalid needle)" "
			mismatched_git_log '$force_regex$invalid_e' >actual &&
			test_must_be_empty actual
		"
	fi
done

test_done