1#!/bin/sh
2#
3# Copyright (c) 2012 Torsten Bögershausen
4#
5
6test_description='utf-8 decomposed (nfd) converted to precomposed (nfc)'
7
8. ./test-lib.sh
9
10if ! test_have_prereq UTF8_NFD_TO_NFC
11then
12 skip_all="filesystem does not corrupt utf-8"
13 test_done
14fi
15
16# create utf-8 variables
17Adiarnfc=$(printf '\303\204')
18Adiarnfd=$(printf 'A\314\210')
19
20Odiarnfc=$(printf '\303\226')
21Odiarnfd=$(printf 'O\314\210')
22AEligatu=$(printf '\303\206')
23Invalidu=$(printf '\303\377')
24
25
26#Create a string with 255 bytes (decomposed)
27Alongd=$Adiarnfd$Adiarnfd$Adiarnfd$Adiarnfd$Adiarnfd$Adiarnfd$Adiarnfd #21 Byte
28Alongd=$Alongd$Alongd$Alongd #63 Byte
29Alongd=$Alongd$Alongd$Alongd$Alongd$Adiarnfd #255 Byte
30
31#Create a string with 254 bytes (precomposed)
32Alongc=$AEligatu$AEligatu$AEligatu$AEligatu$AEligatu #10 Byte
33Alongc=$Alongc$Alongc$Alongc$Alongc$Alongc #50 Byte
34Alongc=$Alongc$Alongc$Alongc$Alongc$Alongc #250 Byte
35Alongc=$Alongc$AEligatu$AEligatu #254 Byte
36
37test_expect_success "detect if nfd needed" '
38 precomposeunicode=$(git config core.precomposeunicode) &&
39 test "$precomposeunicode" = true &&
40 git config core.precomposeunicode true
41'
42test_expect_success "setup" '
43 >x &&
44 git add x &&
45 git commit -m "1st commit" &&
46 git rm x &&
47 git commit -m "rm x"
48'
49test_expect_success "setup case mac" '
50 git checkout -b mac_os
51'
52# This will test nfd2nfc in git diff
53test_expect_success "git diff f.Adiar" '
54 touch f.$Adiarnfc &&
55 git add f.$Adiarnfc &&
56 echo f.Adiarnfc >f.$Adiarnfc &&
57 git diff f.$Adiarnfd >expect &&
58 git diff f.$Adiarnfc >actual &&
59 test_cmp expect actual &&
60 git reset HEAD f.Adiarnfc &&
61 rm f.$Adiarnfc expect actual
62'
63# This will test nfd2nfc in git diff-files
64test_expect_success "git diff-files f.Adiar" '
65 touch f.$Adiarnfc &&
66 git add f.$Adiarnfc &&
67 echo f.Adiarnfc >f.$Adiarnfc &&
68 git diff-files f.$Adiarnfd >expect &&
69 git diff-files f.$Adiarnfc >actual &&
70 test_cmp expect actual &&
71 git reset HEAD f.Adiarnfc &&
72 rm f.$Adiarnfc expect actual
73'
74# This will test nfd2nfc in git diff-index
75test_expect_success "git diff-index f.Adiar" '
76 touch f.$Adiarnfc &&
77 git add f.$Adiarnfc &&
78 echo f.Adiarnfc >f.$Adiarnfc &&
79 git diff-index HEAD f.$Adiarnfd >expect &&
80 git diff-index HEAD f.$Adiarnfc >actual &&
81 test_cmp expect actual &&
82 git reset HEAD f.Adiarnfc &&
83 rm f.$Adiarnfc expect actual
84'
85# This will test nfd2nfc in readdir()
86test_expect_success "add file Adiarnfc" '
87 echo f.Adiarnfc >f.$Adiarnfc &&
88 git add f.$Adiarnfc &&
89 git commit -m "add f.$Adiarnfc"
90'
91# This will test nfd2nfc in git diff-tree
92test_expect_success "git diff-tree f.Adiar" '
93 echo f.Adiarnfc >>f.$Adiarnfc &&
94 git diff-tree HEAD f.$Adiarnfd >expect &&
95 git diff-tree HEAD f.$Adiarnfc >actual &&
96 test_cmp expect actual &&
97 git checkout f.$Adiarnfc &&
98 rm expect actual
99'
100# This will test nfd2nfc in git stage()
101test_expect_success "stage file d.Adiarnfd/f.Adiarnfd" '
102 mkdir d.$Adiarnfd &&
103 echo d.$Adiarnfd/f.$Adiarnfd >d.$Adiarnfd/f.$Adiarnfd &&
104 git stage d.$Adiarnfd/f.$Adiarnfd &&
105 git commit -m "add d.$Adiarnfd/f.$Adiarnfd"
106'
107test_expect_success "add link Adiarnfc" '
108 ln -s d.$Adiarnfd/f.$Adiarnfd l.$Adiarnfc &&
109 git add l.$Adiarnfc &&
110 git commit -m "add l.Adiarnfc"
111'
112# This will test git log
113test_expect_success "git log f.Adiar" '
114 git log f.$Adiarnfc > f.Adiarnfc.log &&
115 git log f.$Adiarnfd > f.Adiarnfd.log &&
116 test -s f.Adiarnfc.log &&
117 test -s f.Adiarnfd.log &&
118 test_cmp f.Adiarnfc.log f.Adiarnfd.log &&
119 rm f.Adiarnfc.log f.Adiarnfd.log
120'
121# This will test git ls-files
122test_expect_success "git lsfiles f.Adiar" '
123 git ls-files f.$Adiarnfc > f.Adiarnfc.log &&
124 git ls-files f.$Adiarnfd > f.Adiarnfd.log &&
125 test -s f.Adiarnfc.log &&
126 test -s f.Adiarnfd.log &&
127 test_cmp f.Adiarnfc.log f.Adiarnfd.log &&
128 rm f.Adiarnfc.log f.Adiarnfd.log
129'
130# This will test git mv
131test_expect_success "git mv" '
132 git mv f.$Adiarnfd f.$Odiarnfc &&
133 git mv d.$Adiarnfd d.$Odiarnfc &&
134 git mv l.$Adiarnfd l.$Odiarnfc &&
135 git commit -m "mv Adiarnfd Odiarnfc"
136'
137# Files can be checked out as nfc
138# And the link has been corrected from nfd to nfc
139test_expect_success "git checkout nfc" '
140 rm f.$Odiarnfc &&
141 git checkout f.$Odiarnfc
142'
143# Make it possible to checkout files with their NFD names
144test_expect_success "git checkout file nfd" '
145 rm -f f.* &&
146 git checkout f.$Odiarnfd
147'
148# Make it possible to checkout links with their NFD names
149test_expect_success "git checkout link nfd" '
150 rm l.* &&
151 git checkout l.$Odiarnfd
152'
153test_expect_success "setup case mac2" '
154 git checkout master &&
155 git reset --hard &&
156 git checkout -b mac_os_2
157'
158# This will test nfd2nfc in git commit
159test_expect_success "commit file d2.Adiarnfd/f.Adiarnfd" '
160 mkdir d2.$Adiarnfd &&
161 echo d2.$Adiarnfd/f.$Adiarnfd >d2.$Adiarnfd/f.$Adiarnfd &&
162 git add d2.$Adiarnfd/f.$Adiarnfd &&
163 git commit -m "add d2.$Adiarnfd/f.$Adiarnfd" -- d2.$Adiarnfd/f.$Adiarnfd
164'
165test_expect_success "setup for long decomposed filename" '
166 git checkout master &&
167 git reset --hard &&
168 git checkout -b mac_os_long_nfd_fn
169'
170test_expect_success "Add long decomposed filename" '
171 echo longd >$Alongd &&
172 git add * &&
173 git commit -m "Long filename"
174'
175test_expect_success "setup for long precomposed filename" '
176 git checkout master &&
177 git reset --hard &&
178 git checkout -b mac_os_long_nfc_fn
179'
180test_expect_success "Add long precomposed filename" '
181 echo longc >$Alongc &&
182 git add * &&
183 git commit -m "Long filename"
184'
185
186test_expect_failure 'handle existing decomposed filenames' '
187 echo content >"verbatim.$Adiarnfd" &&
188 git -c core.precomposeunicode=false add "verbatim.$Adiarnfd" &&
189 git commit -m "existing decomposed file" &&
190 git ls-files --exclude-standard -o "verbatim*" >untracked &&
191 test_must_be_empty untracked
192'
193
194# Test if the global core.precomposeunicode stops autosensing
195# Must be the last test case
196test_expect_success "respect git config --global core.precomposeunicode" '
197 git config --global core.precomposeunicode true &&
198 rm -rf .git &&
199 git init &&
200 precomposeunicode=$(git config core.precomposeunicode) &&
201 test "$precomposeunicode" = "true"
202'
203
204test_done