xdl_get_hunk() calculates the maximum number of common lines between two changes that would fit into the same hunk for the given context options. It involves doubling and addition and thus can overflow if the terms are huge. The type of ctxlen and interhunkctxlen in xdemitconf_t is long, while the type of the corresponding context and interhunkcontext in struct diff_options is int. On many platforms longs are bigger that ints, which prevents the overflow. On Windows they have the same range and the overflow manifests as hunks that are split erroneously and lines being repeated between them. Fix the overflow by checking and not going beyond LONG_MAX. This allows specifying a huge context line count and getting all lines of a changed files in a single hunk, as expected. Reported-by: Jason Cho <jason11choca@proton.me> Signed-off-by: René Scharfe <l.s.r@web.de> Signed-off-by: Junio C Hamano <gitster@pobox.com>
104 lines
2.0 KiB
Bash
Executable File
104 lines
2.0 KiB
Bash
Executable File
#!/bin/sh
|
|
#
|
|
# Copyright (c) 2012 Mozilla Foundation
|
|
#
|
|
|
|
test_description='diff.context configuration'
|
|
|
|
TEST_PASSES_SANITIZE_LEAK=true
|
|
. ./test-lib.sh
|
|
|
|
test_expect_success 'setup' '
|
|
cat >template <<-\EOF &&
|
|
firstline
|
|
b
|
|
c
|
|
d
|
|
e
|
|
f
|
|
preline
|
|
TARGET
|
|
postline
|
|
i
|
|
j
|
|
k
|
|
l
|
|
m
|
|
n
|
|
EOF
|
|
sed "/TARGET/d" >x <template &&
|
|
git update-index --add x &&
|
|
git commit -m initial &&
|
|
|
|
sed "s/TARGET/ADDED/" >x <template &&
|
|
git update-index --add x &&
|
|
git commit -m next &&
|
|
|
|
sed "s/TARGET/MODIFIED/" >x <template
|
|
'
|
|
|
|
test_expect_success 'the default number of context lines is 3' '
|
|
git diff >output &&
|
|
! grep "^ d" output &&
|
|
grep "^ e" output &&
|
|
grep "^ j" output &&
|
|
! grep "^ k" output
|
|
'
|
|
|
|
test_expect_success 'diff.context honored by "log"' '
|
|
git log -1 -p >output &&
|
|
! grep firstline output &&
|
|
git config diff.context 8 &&
|
|
git log -1 -p >output &&
|
|
grep "^ firstline" output
|
|
'
|
|
|
|
test_expect_success 'The -U option overrides diff.context' '
|
|
git config diff.context 8 &&
|
|
git log -U4 -1 >output &&
|
|
! grep "^ firstline" output
|
|
'
|
|
|
|
test_expect_success 'diff.context honored by "diff"' '
|
|
git config diff.context 8 &&
|
|
git diff >output &&
|
|
grep "^ firstline" output
|
|
'
|
|
|
|
test_expect_success 'plumbing not affected' '
|
|
git config diff.context 8 &&
|
|
git diff-files -p >output &&
|
|
! grep "^ firstline" output
|
|
'
|
|
|
|
test_expect_success 'non-integer config parsing' '
|
|
git config diff.context no &&
|
|
test_must_fail git diff 2>output &&
|
|
test_grep "bad numeric config value" output
|
|
'
|
|
|
|
test_expect_success 'negative integer config parsing' '
|
|
git config diff.context -1 &&
|
|
test_must_fail git diff 2>output &&
|
|
test_grep "bad config variable" output
|
|
'
|
|
|
|
test_expect_success '-U0 is valid, so is diff.context=0' '
|
|
git config diff.context 0 &&
|
|
git diff >output &&
|
|
grep "^-ADDED" output &&
|
|
grep "^+MODIFIED" output
|
|
'
|
|
|
|
test_expect_success '-U2147483647 works' '
|
|
echo APPENDED >>x &&
|
|
test_line_count = 16 x &&
|
|
git diff -U2147483647 >output &&
|
|
test_line_count = 22 output &&
|
|
grep "^-ADDED" output &&
|
|
grep "^+MODIFIED" output &&
|
|
grep "^+APPENDED" output
|
|
'
|
|
|
|
test_done
|