parallel-checkout: add tests related to .gitattributes

Add tests to confirm that the `struct conv_attrs` data is correctly passed from the main process to the workers, and that they can properly convert the blobs before writing them to the working tree. Also check that parallel-ineligible entries, such as regular files that require external filters, are correctly smudge and written when parallel-checkout is enabled. Co-authored-by: Jeff Hostetler <jeffhost@microsoft.com> Signed-off-by: Matheus Tavares <matheus.bernardino@usp.br> Signed-off-by: Junio C Hamano <gitster@pobox.com>

Matheus Tavares committed May 4, 2021 at 13:27 UTC d5904220bccc7f9e49a507d969bcc83428e582df
1 file changed +194
t/t2082-parallel-checkout-attributes.sh new
+194
@@ -0,0 +1,194 @@
1 +#!/bin/sh
2 +
3 +test_description='parallel-checkout: attributes
4 +
5 +Verify that parallel-checkout correctly creates files that require
6 +conversions, as specified in .gitattributes. The main point here is
7 +to check that the conv_attr data is correctly sent to the workers
8 +and that it contains sufficient information to smudge files
9 +properly (without access to the index or attribute stack).
10 +'
11 +
12 +TEST_NO_CREATE_REPO=1
13 +. ./test-lib.sh
14 +. "$TEST_DIRECTORY/lib-parallel-checkout.sh"
15 +. "$TEST_DIRECTORY/lib-encoding.sh"
16 +
17 +test_expect_success 'parallel-checkout with ident' '
18 + set_checkout_config 2 0 &&
19 + git init ident &&
20 + (
21 + cd ident &&
22 + echo "A ident" >.gitattributes &&
23 + echo "\$Id\$" >A &&
24 + echo "\$Id\$" >B &&
25 + git add -A &&
26 + git commit -m id &&
27 +
28 + rm A B &&
29 + test_checkout_workers 2 git reset --hard &&
30 + hexsz=$(test_oid hexsz) &&
31 + grep -E "\\\$Id: [0-9a-f]{$hexsz} \\\$" A &&
32 + grep "\\\$Id\\\$" B
33 + )
34 +'
35 +
36 +test_expect_success 'parallel-checkout with re-encoding' '
37 + set_checkout_config 2 0 &&
38 + git init encoding &&
39 + (
40 + cd encoding &&
41 + echo text >utf8-text &&
42 + write_utf16 <utf8-text >utf16-text &&
43 +
44 + echo "A working-tree-encoding=UTF-16" >.gitattributes &&
45 + cp utf16-text A &&
46 + cp utf8-text B &&
47 + git add A B .gitattributes &&
48 + git commit -m encoding &&
49 +
50 + # Check that A is stored in UTF-8
51 + git cat-file -p :A >A.internal &&
52 + test_cmp_bin utf8-text A.internal &&
53 +
54 + rm A B &&
55 + test_checkout_workers 2 git checkout A B &&
56 +
57 + # Check that A (and only A) is re-encoded during checkout
58 + test_cmp_bin utf16-text A &&
59 + test_cmp_bin utf8-text B
60 + )
61 +'
62 +
63 +test_expect_success 'parallel-checkout with eol conversions' '
64 + set_checkout_config 2 0 &&
65 + git init eol &&
66 + (
67 + cd eol &&
68 + printf "multi\r\nline\r\ntext" >crlf-text &&
69 + printf "multi\nline\ntext" >lf-text &&
70 +
71 + git config core.autocrlf false &&
72 + echo "A eol=crlf" >.gitattributes &&
73 + cp crlf-text A &&
74 + cp lf-text B &&
75 + git add A B .gitattributes &&
76 + git commit -m eol &&
77 +
78 + # Check that A is stored with LF format
79 + git cat-file -p :A >A.internal &&
80 + test_cmp_bin lf-text A.internal &&
81 +
82 + rm A B &&
83 + test_checkout_workers 2 git checkout A B &&
84 +
85 + # Check that A (and only A) is converted to CRLF during checkout
86 + test_cmp_bin crlf-text A &&
87 + test_cmp_bin lf-text B
88 + )
89 +'
90 +
91 +# Entries that require an external filter are not eligible for parallel
92 +# checkout. Check that both the parallel-eligible and non-eligible entries are
93 +# properly writen in a single checkout operation.
94 +#
95 +test_expect_success 'parallel-checkout and external filter' '
96 + set_checkout_config 2 0 &&
97 + git init filter &&
98 + (
99 + cd filter &&
100 + write_script <<-\EOF rot13.sh &&
101 + tr \
102 + "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" \
103 + "nopqrstuvwxyzabcdefghijklmNOPQRSTUVWXYZABCDEFGHIJKLM"
104 + EOF
105 +
106 + git config filter.rot13.clean "\"$(pwd)/rot13.sh\"" &&
107 + git config filter.rot13.smudge "\"$(pwd)/rot13.sh\"" &&
108 + git config filter.rot13.required true &&
109 +
110 + echo abcd >original &&
111 + echo nopq >rot13 &&
112 +
113 + echo "A filter=rot13" >.gitattributes &&
114 + cp original A &&
115 + cp original B &&
116 + cp original C &&
117 + git add A B C .gitattributes &&
118 + git commit -m filter &&
119 +
120 + # Check that A (and only A) was cleaned
121 + git cat-file -p :A >A.internal &&
122 + test_cmp rot13 A.internal &&
123 + git cat-file -p :B >B.internal &&
124 + test_cmp original B.internal &&
125 + git cat-file -p :C >C.internal &&
126 + test_cmp original C.internal &&
127 +
128 + rm A B C *.internal &&
129 + test_checkout_workers 2 git checkout A B C &&
130 +
131 + # Check that A (and only A) was smudged during checkout
132 + test_cmp original A &&
133 + test_cmp original B &&
134 + test_cmp original C
135 + )
136 +'
137 +
138 +# The delayed queue is independent from the parallel queue, and they should be
139 +# able to work together in the same checkout process.
140 +#
141 +test_expect_success PERL 'parallel-checkout and delayed checkout' '
142 + write_script rot13-filter.pl "$PERL_PATH" \
143 + <"$TEST_DIRECTORY"/t0021/rot13-filter.pl &&
144 +
145 + test_config_global filter.delay.process \
146 + "\"$(pwd)/rot13-filter.pl\" --always-delay \"$(pwd)/delayed.log\" clean smudge delay" &&
147 + test_config_global filter.delay.required true &&
148 +
149 + echo "abcd" >original &&
150 + echo "nopq" >rot13 &&
151 +
152 + git init delayed &&
153 + (
154 + cd delayed &&
155 + echo "*.d filter=delay" >.gitattributes &&
156 + cp ../original W.d &&
157 + cp ../original X.d &&
158 + cp ../original Y &&
159 + cp ../original Z &&
160 + git add -A &&
161 + git commit -m delayed &&
162 +
163 + # Check that *.d files were cleaned
164 + git cat-file -p :W.d >W.d.internal &&
165 + test_cmp W.d.internal ../rot13 &&
166 + git cat-file -p :X.d >X.d.internal &&
167 + test_cmp X.d.internal ../rot13 &&
168 + git cat-file -p :Y >Y.internal &&
169 + test_cmp Y.internal ../original &&
170 + git cat-file -p :Z >Z.internal &&
171 + test_cmp Z.internal ../original &&
172 +
173 + rm *
174 + ) &&
175 +
176 + set_checkout_config 2 0 &&
177 + test_checkout_workers 2 git -C delayed checkout -f &&
178 + verify_checkout delayed &&
179 +
180 + # Check that the *.d files got to the delay queue and were filtered
181 + grep "smudge W.d .* \[DELAYED\]" delayed.log &&
182 + grep "smudge X.d .* \[DELAYED\]" delayed.log &&
183 + test_cmp delayed/W.d original &&
184 + test_cmp delayed/X.d original &&
185 +
186 + # Check that the parallel-eligible entries went to the right queue and
187 + # were not filtered
188 + ! grep "smudge Y .* \[DELAYED\]" delayed.log &&
189 + ! grep "smudge Z .* \[DELAYED\]" delayed.log &&
190 + test_cmp delayed/Y original &&
191 + test_cmp delayed/Z original
192 +'
193 +
194 +test_done