Files
git/t/t4055-diff-context.sh
Michael Montalbo 94a9e6934c diff: reject negative values for -U/--unified
Passing a negative value to -U is silently accepted and produces
corrupt unified diff output with malformed hunk headers:

    $ git log -1 -p -U-500 -- GIT-VERSION-GEN | grep '^@@'
    @@ -503,999- +503,999- @@

Line 503 of a 106-line file, count "999-" is not a valid integer.

The config variable diff.context already rejects negative values, but
the command line callback diff_opt_unified() uses strtol() with no
range check.

Change the type of diff_options.context and its static default from
int to unsigned int, matching the change to interhunkcontext in the
previous commit. The type change requires reworking the callback and
config parsing to validate in a local variable before assigning to
the now-unsigned field.

Unlike --inter-hunk-context which could be converted to OPT_UNSIGNED,
-U needs OPT_CALLBACK_F for PARSE_OPT_OPTARG (bare -U with no value
enables patch output). Add a range check in the callback instead.

Signed-off-by: Michael Montalbo <mmontalbo@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2026-05-13 10:13:26 +09:00

108 lines
2.2 KiB
Bash
Executable File

#!/bin/sh
#
# Copyright (c) 2012 Mozilla Foundation
#
test_description='diff.context configuration'
. ./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 &&
test_grep ! "^ d" output &&
test_grep "^ e" output &&
test_grep "^ j" output &&
test_grep ! "^ k" output
'
test_expect_success 'diff.context honored by "log"' '
git log -1 -p >output &&
test_grep ! firstline output &&
test_config diff.context 8 &&
git log -1 -p >output &&
test_grep "^ firstline" output
'
test_expect_success 'The -U option overrides diff.context' '
test_config diff.context 8 &&
git log -U4 -1 >output &&
test_grep ! "^ firstline" output
'
test_expect_success 'diff.context honored by "diff"' '
test_config diff.context 8 &&
git diff >output &&
test_grep "^ firstline" output
'
test_expect_success 'plumbing not affected' '
test_config diff.context 8 &&
git diff-files -p >output &&
test_grep ! "^ firstline" output
'
test_expect_success 'non-integer config parsing' '
test_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' '
test_config diff.context -1 &&
test_must_fail git diff 2>output &&
test_grep "bad config variable" output
'
test_expect_success '-U-1 is rejected' '
test_must_fail git diff -U-1 2>err &&
test_grep "expects a non-negative integer" err
'
test_expect_success '-U0 is valid, so is diff.context=0' '
test_config diff.context 0 &&
git diff >output &&
test_grep "^-ADDED" output &&
test_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 &&
test_grep "^-ADDED" output &&
test_grep "^+MODIFIED" output &&
test_grep "^+APPENDED" output
'
test_done