Merge branch 'mt/grep-submodule-textconv'
"git grep --recurse-submodules" takes trees and blobs from the submodule repository, but the textconv settings when processing a blob from the submodule is not taken from the submodule repository. A test is added to demonstrate the issue, without fixing it. * mt/grep-submodule-textconv: grep: demonstrate bug with textconv attributes and submodules
This commit is contained in:
commit
1fdfb774aa
6
grep.h
6
grep.h
@ -128,9 +128,9 @@ struct grep_opt {
|
||||
* instead.
|
||||
*
|
||||
* This is potentially the cause of at least one bug - "git grep"
|
||||
* ignoring the textconv attributes from submodules. See [1] for more
|
||||
* information.
|
||||
* [1] https://lore.kernel.org/git/CAHd-oW5iEQarYVxEXoTG-ua2zdoybTrSjCBKtO0YT292fm0NQQ@mail.gmail.com/
|
||||
* using the textconv attributes from the superproject on the
|
||||
* submodules. See the failing "git grep --textconv" tests in
|
||||
* t7814-grep-recurse-submodules.sh for more information.
|
||||
*/
|
||||
struct repository *repo;
|
||||
|
||||
|
@ -441,4 +441,107 @@ test_expect_success 'grep --recurse-submodules with --cached ignores worktree mo
|
||||
test_must_fail git grep --recurse-submodules --cached "A modified line in submodule" >actual 2>&1 &&
|
||||
test_must_be_empty actual
|
||||
'
|
||||
|
||||
test_expect_failure 'grep --textconv: superproject .gitattributes does not affect submodules' '
|
||||
reset_and_clean &&
|
||||
test_config_global diff.d2x.textconv "sed -e \"s/d/x/\"" &&
|
||||
echo "a diff=d2x" >.gitattributes &&
|
||||
|
||||
cat >expect <<-\EOF &&
|
||||
a:(1|2)x(3|4)
|
||||
EOF
|
||||
git grep --textconv --recurse-submodules x >actual &&
|
||||
test_cmp expect actual
|
||||
'
|
||||
|
||||
test_expect_failure 'grep --textconv: superproject .gitattributes (from index) does not affect submodules' '
|
||||
reset_and_clean &&
|
||||
test_config_global diff.d2x.textconv "sed -e \"s/d/x/\"" &&
|
||||
echo "a diff=d2x" >.gitattributes &&
|
||||
git add .gitattributes &&
|
||||
rm .gitattributes &&
|
||||
|
||||
cat >expect <<-\EOF &&
|
||||
a:(1|2)x(3|4)
|
||||
EOF
|
||||
git grep --textconv --recurse-submodules x >actual &&
|
||||
test_cmp expect actual
|
||||
'
|
||||
|
||||
test_expect_failure 'grep --textconv: superproject .git/info/attributes does not affect submodules' '
|
||||
reset_and_clean &&
|
||||
test_config_global diff.d2x.textconv "sed -e \"s/d/x/\"" &&
|
||||
super_attr="$(git rev-parse --git-path info/attributes)" &&
|
||||
test_when_finished "rm -f \"$super_attr\"" &&
|
||||
echo "a diff=d2x" >"$super_attr" &&
|
||||
|
||||
cat >expect <<-\EOF &&
|
||||
a:(1|2)x(3|4)
|
||||
EOF
|
||||
git grep --textconv --recurse-submodules x >actual &&
|
||||
test_cmp expect actual
|
||||
'
|
||||
|
||||
# Note: what currently prevents this test from passing is not that the
|
||||
# .gitattributes file from "./submodule" is being ignored, but that it is being
|
||||
# propagated to the nested "./submodule/sub" files.
|
||||
#
|
||||
test_expect_failure 'grep --textconv correctly reads submodule .gitattributes' '
|
||||
reset_and_clean &&
|
||||
test_config_global diff.d2x.textconv "sed -e \"s/d/x/\"" &&
|
||||
echo "a diff=d2x" >submodule/.gitattributes &&
|
||||
|
||||
cat >expect <<-\EOF &&
|
||||
submodule/a:(1|2)x(3|4)
|
||||
EOF
|
||||
git grep --textconv --recurse-submodules x >actual &&
|
||||
test_cmp expect actual
|
||||
'
|
||||
|
||||
test_expect_failure 'grep --textconv correctly reads submodule .gitattributes (from index)' '
|
||||
reset_and_clean &&
|
||||
test_config_global diff.d2x.textconv "sed -e \"s/d/x/\"" &&
|
||||
echo "a diff=d2x" >submodule/.gitattributes &&
|
||||
git -C submodule add .gitattributes &&
|
||||
rm submodule/.gitattributes &&
|
||||
|
||||
cat >expect <<-\EOF &&
|
||||
submodule/a:(1|2)x(3|4)
|
||||
EOF
|
||||
git grep --textconv --recurse-submodules x >actual &&
|
||||
test_cmp expect actual
|
||||
'
|
||||
|
||||
test_expect_failure 'grep --textconv correctly reads submodule .git/info/attributes' '
|
||||
reset_and_clean &&
|
||||
test_config_global diff.d2x.textconv "sed -e \"s/d/x/\"" &&
|
||||
|
||||
submodule_attr="$(git -C submodule rev-parse --path-format=absolute --git-path info/attributes)" &&
|
||||
test_when_finished "rm -f \"$submodule_attr\"" &&
|
||||
echo "a diff=d2x" >"$submodule_attr" &&
|
||||
|
||||
cat >expect <<-\EOF &&
|
||||
submodule/a:(1|2)x(3|4)
|
||||
EOF
|
||||
git grep --textconv --recurse-submodules x >actual &&
|
||||
test_cmp expect actual
|
||||
'
|
||||
|
||||
test_expect_failure 'grep saves textconv cache in the appropriate repository' '
|
||||
reset_and_clean &&
|
||||
test_config_global diff.d2x_cached.textconv "sed -e \"s/d/x/\"" &&
|
||||
test_config_global diff.d2x_cached.cachetextconv true &&
|
||||
echo "a diff=d2x_cached" >submodule/.gitattributes &&
|
||||
|
||||
# We only read/write to the textconv cache when grepping from an OID,
|
||||
# as the working tree file might have modifications.
|
||||
git grep --textconv --cached --recurse-submodules x &&
|
||||
|
||||
super_textconv_cache="$(git rev-parse --git-path refs/notes/textconv/d2x_cached)" &&
|
||||
sub_textconv_cache="$(git -C submodule rev-parse \
|
||||
--path-format=absolute --git-path refs/notes/textconv/d2x_cached)" &&
|
||||
test_path_is_missing "$super_textconv_cache" &&
|
||||
test_path_is_file "$sub_textconv_cache"
|
||||
'
|
||||
|
||||
test_done
|
||||
|
Loading…
Reference in New Issue
Block a user