mirror of
https://github.com/git/git
synced 2024-08-28 12:09:19 +00:00
![Junio C Hamano](/assets/img/avatar_default.png)
"git apply --whitespace=fix" used to be able to assume that fixing errors will always reduce the size by e.g. stripping whitespaces at the end of lines or collapsing runs of spaces into tabs at the beginning of lines. An update to accomodate fixes that lengthens the result by e.g. expanding leading tabs into spaces were made long time ago but the logic miscounted the necessary space after such whitespace fixes, leading to either under-allocation or over-usage of already allocated space. Illustrate this with a runtime sanity-check to protect us from future breakage. The test was stolen from Kyle McKay who helped to identify the problem. Helped-by: "Kyle J. McKay" <mackyle@gmail.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
122 lines
2.6 KiB
Bash
Executable file
122 lines
2.6 KiB
Bash
Executable file
#!/bin/sh
|
|
#
|
|
# Copyright (C) 2015 Kyle J. McKay
|
|
#
|
|
|
|
test_description='git apply test patches with whitespace expansion.'
|
|
|
|
. ./test-lib.sh
|
|
|
|
test_expect_success setup '
|
|
#
|
|
## create test-N, patchN.patch, expect-N files
|
|
#
|
|
|
|
# test 1
|
|
printf "\t%s\n" 1 2 3 4 5 6 >before &&
|
|
printf "\t%s\n" 1 2 3 >after &&
|
|
printf "%64s\n" a b c >>after &&
|
|
printf "\t%s\n" 4 5 6 >>after &&
|
|
git diff --no-index before after |
|
|
sed -e "s/before/test-1/" -e "s/after/test-1/" >patch1.patch &&
|
|
printf "%64s\n" 1 2 3 4 5 6 >test-1 &&
|
|
printf "%64s\n" 1 2 3 a b c 4 5 6 >expect-1 &&
|
|
|
|
# test 2
|
|
printf "\t%s\n" a b c d e f >before &&
|
|
printf "\t%s\n" a b c >after &&
|
|
n=10 &&
|
|
x=1 &&
|
|
while test $x -lt $n
|
|
do
|
|
printf "%63s%d\n" "" $x >>after
|
|
x=$(( $x + 1 ))
|
|
done &&
|
|
printf "\t%s\n" d e f >>after &&
|
|
git diff --no-index before after |
|
|
sed -e "s/before/test-2/" -e "s/after/test-2/" >patch2.patch &&
|
|
printf "%64s\n" a b c d e f >test-2 &&
|
|
printf "%64s\n" a b c >expect-2 &&
|
|
x=1 &&
|
|
while test $x -lt $n
|
|
do
|
|
printf "%63s%d\n" "" $x >>expect-2
|
|
x=$(( $x + 1 ))
|
|
done &&
|
|
printf "%64s\n" d e f >>expect-2 &&
|
|
|
|
# test 3
|
|
printf "\t%s\n" a b c d e f >before &&
|
|
printf "\t%s\n" a b c >after &&
|
|
n=100 &&
|
|
x=0 &&
|
|
while test $x -lt $n
|
|
do
|
|
printf "%63s%02d\n" "" $x >>after
|
|
x=$(( $x + 1 ))
|
|
done &&
|
|
printf "\t%s\n" d e f >>after &&
|
|
git diff --no-index before after |
|
|
sed -e "s/before/test-3/" -e "s/after/test-3/" >patch3.patch &&
|
|
printf "%64s\n" a b c d e f >test-3 &&
|
|
printf "%64s\n" a b c >expect-3 &&
|
|
x=0 &&
|
|
while test $x -lt $n
|
|
do
|
|
printf "%63s%02d\n" "" $x >>expect-3
|
|
x=$(( $x + 1 ))
|
|
done &&
|
|
printf "%64s\n" d e f >>expect-3 &&
|
|
|
|
# test 4
|
|
>before &&
|
|
x=0 &&
|
|
while test $x -lt 50
|
|
do
|
|
printf "\t%02d\n" $x >>before
|
|
x=$(( $x + 1 ))
|
|
done &&
|
|
cat before >after &&
|
|
printf "%64s\n" a b c >>after &&
|
|
while test $x -lt 100
|
|
do
|
|
printf "\t%02d\n" $x >>before
|
|
printf "\t%02d\n" $x >>after
|
|
x=$(( $x + 1 ))
|
|
done &&
|
|
git diff --no-index before after |
|
|
sed -e "s/before/test-4/" -e "s/after/test-4/" >patch4.patch &&
|
|
>test-4 &&
|
|
x=0 &&
|
|
while test $x -lt 50
|
|
do
|
|
printf "%63s%02d\n" "" $x >>test-4
|
|
x=$(( $x + 1 ))
|
|
done &&
|
|
cat test-4 >expect-4 &&
|
|
printf "%64s\n" a b c >>expect-4 &&
|
|
while test $x -lt 100
|
|
do
|
|
printf "%63s%02d\n" "" $x >>test-4
|
|
printf "%63s%02d\n" "" $x >>expect-4
|
|
x=$(( $x + 1 ))
|
|
done &&
|
|
|
|
git config core.whitespace tab-in-indent,tabwidth=63 &&
|
|
git config apply.whitespace fix
|
|
|
|
'
|
|
|
|
# Note that `patch` can successfully apply all patches when run
|
|
# with the --ignore-whitespace option.
|
|
|
|
for t in 1 2 3 4
|
|
do
|
|
test_expect_success 'apply with ws expansion (t=$t)' '
|
|
git apply patch$t.patch &&
|
|
test_cmp test-$t expect-$t
|
|
'
|
|
done
|
|
|
|
test_done
|