]> git.ipfire.org Git - thirdparty/git.git/commitdiff
parallel-checkout: add tests related to .gitattributes
authorMatheus Tavares <matheus.bernardino@usp.br>
Tue, 4 May 2021 16:27:34 +0000 (13:27 -0300)
committerJunio C Hamano <gitster@pobox.com>
Wed, 5 May 2021 03:26:36 +0000 (12:26 +0900)
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>
t/t2082-parallel-checkout-attributes.sh [new file with mode: 0755]

diff --git a/t/t2082-parallel-checkout-attributes.sh b/t/t2082-parallel-checkout-attributes.sh
new file mode 100755 (executable)
index 0000000..2525457
--- /dev/null
@@ -0,0 +1,194 @@
+#!/bin/sh
+
+test_description='parallel-checkout: attributes
+
+Verify that parallel-checkout correctly creates files that require
+conversions, as specified in .gitattributes. The main point here is
+to check that the conv_attr data is correctly sent to the workers
+and that it contains sufficient information to smudge files
+properly (without access to the index or attribute stack).
+'
+
+TEST_NO_CREATE_REPO=1
+. ./test-lib.sh
+. "$TEST_DIRECTORY/lib-parallel-checkout.sh"
+. "$TEST_DIRECTORY/lib-encoding.sh"
+
+test_expect_success 'parallel-checkout with ident' '
+       set_checkout_config 2 0 &&
+       git init ident &&
+       (
+               cd ident &&
+               echo "A ident" >.gitattributes &&
+               echo "\$Id\$" >A &&
+               echo "\$Id\$" >B &&
+               git add -A &&
+               git commit -m id &&
+
+               rm A B &&
+               test_checkout_workers 2 git reset --hard &&
+               hexsz=$(test_oid hexsz) &&
+               grep -E "\\\$Id: [0-9a-f]{$hexsz} \\\$" A &&
+               grep "\\\$Id\\\$" B
+       )
+'
+
+test_expect_success 'parallel-checkout with re-encoding' '
+       set_checkout_config 2 0 &&
+       git init encoding &&
+       (
+               cd encoding &&
+               echo text >utf8-text &&
+               write_utf16 <utf8-text >utf16-text &&
+
+               echo "A working-tree-encoding=UTF-16" >.gitattributes &&
+               cp utf16-text A &&
+               cp utf8-text B &&
+               git add A B .gitattributes &&
+               git commit -m encoding &&
+
+               # Check that A is stored in UTF-8
+               git cat-file -p :A >A.internal &&
+               test_cmp_bin utf8-text A.internal &&
+
+               rm A B &&
+               test_checkout_workers 2 git checkout A B &&
+
+               # Check that A (and only A) is re-encoded during checkout
+               test_cmp_bin utf16-text A &&
+               test_cmp_bin utf8-text B
+       )
+'
+
+test_expect_success 'parallel-checkout with eol conversions' '
+       set_checkout_config 2 0 &&
+       git init eol &&
+       (
+               cd eol &&
+               printf "multi\r\nline\r\ntext" >crlf-text &&
+               printf "multi\nline\ntext" >lf-text &&
+
+               git config core.autocrlf false &&
+               echo "A eol=crlf" >.gitattributes &&
+               cp crlf-text A &&
+               cp lf-text B &&
+               git add A B .gitattributes &&
+               git commit -m eol &&
+
+               # Check that A is stored with LF format
+               git cat-file -p :A >A.internal &&
+               test_cmp_bin lf-text A.internal &&
+
+               rm A B &&
+               test_checkout_workers 2 git checkout A B &&
+
+               # Check that A (and only A) is converted to CRLF during checkout
+               test_cmp_bin crlf-text A &&
+               test_cmp_bin lf-text B
+       )
+'
+
+# Entries that require an external filter are not eligible for parallel
+# checkout. Check that both the parallel-eligible and non-eligible entries are
+# properly writen in a single checkout operation.
+#
+test_expect_success 'parallel-checkout and external filter' '
+       set_checkout_config 2 0 &&
+       git init filter &&
+       (
+               cd filter &&
+               write_script <<-\EOF rot13.sh &&
+               tr \
+                 "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" \
+                 "nopqrstuvwxyzabcdefghijklmNOPQRSTUVWXYZABCDEFGHIJKLM"
+               EOF
+
+               git config filter.rot13.clean "\"$(pwd)/rot13.sh\"" &&
+               git config filter.rot13.smudge "\"$(pwd)/rot13.sh\"" &&
+               git config filter.rot13.required true &&
+
+               echo abcd >original &&
+               echo nopq >rot13 &&
+
+               echo "A filter=rot13" >.gitattributes &&
+               cp original A &&
+               cp original B &&
+               cp original C &&
+               git add A B C .gitattributes &&
+               git commit -m filter &&
+
+               # Check that A (and only A) was cleaned
+               git cat-file -p :A >A.internal &&
+               test_cmp rot13 A.internal &&
+               git cat-file -p :B >B.internal &&
+               test_cmp original B.internal &&
+               git cat-file -p :C >C.internal &&
+               test_cmp original C.internal &&
+
+               rm A B C *.internal &&
+               test_checkout_workers 2 git checkout A B C &&
+
+               # Check that A (and only A) was smudged during checkout
+               test_cmp original A &&
+               test_cmp original B &&
+               test_cmp original C
+       )
+'
+
+# The delayed queue is independent from the parallel queue, and they should be
+# able to work together in the same checkout process.
+#
+test_expect_success PERL 'parallel-checkout and delayed checkout' '
+       write_script rot13-filter.pl "$PERL_PATH" \
+               <"$TEST_DIRECTORY"/t0021/rot13-filter.pl &&
+
+       test_config_global filter.delay.process \
+               "\"$(pwd)/rot13-filter.pl\" --always-delay \"$(pwd)/delayed.log\" clean smudge delay" &&
+       test_config_global filter.delay.required true &&
+
+       echo "abcd" >original &&
+       echo "nopq" >rot13 &&
+
+       git init delayed &&
+       (
+               cd delayed &&
+               echo "*.d filter=delay" >.gitattributes &&
+               cp ../original W.d &&
+               cp ../original X.d &&
+               cp ../original Y &&
+               cp ../original Z &&
+               git add -A &&
+               git commit -m delayed &&
+
+               # Check that *.d files were cleaned
+               git cat-file -p :W.d >W.d.internal &&
+               test_cmp W.d.internal ../rot13 &&
+               git cat-file -p :X.d >X.d.internal &&
+               test_cmp X.d.internal ../rot13 &&
+               git cat-file -p :Y >Y.internal &&
+               test_cmp Y.internal ../original &&
+               git cat-file -p :Z >Z.internal &&
+               test_cmp Z.internal ../original &&
+
+               rm *
+       ) &&
+
+       set_checkout_config 2 0 &&
+       test_checkout_workers 2 git -C delayed checkout -f &&
+       verify_checkout delayed &&
+
+       # Check that the *.d files got to the delay queue and were filtered
+       grep "smudge W.d .* \[DELAYED\]" delayed.log &&
+       grep "smudge X.d .* \[DELAYED\]" delayed.log &&
+       test_cmp delayed/W.d original &&
+       test_cmp delayed/X.d original &&
+
+       # Check that the parallel-eligible entries went to the right queue and
+       # were not filtered
+       ! grep "smudge Y .* \[DELAYED\]" delayed.log &&
+       ! grep "smudge Z .* \[DELAYED\]" delayed.log &&
+       test_cmp delayed/Y original &&
+       test_cmp delayed/Z original
+'
+
+test_done