Iffy output given git diff --unified=2147483647
Show 77 quoted lines
> $ git --versiongit version 2.47.0.windows.2
>
> $ git diff --unified=2147483647 1.txt 2.txt
> diff --git a/1.txt b/2.txt
> index e53eaa1..1130481 100644
> --- a/1.txt
> +++ b/2.txt
> @@ -1,10 +1,10 @@
> 1
> -2
> +a
> 3
> 4
> 5
> 6
> 7
> 8
> a
> 0
> @@ -1,10 +1,10 @@
> 1
> a
> 3
> 4
> 5
> 6
> 7
> 8
> -9
> +a
> 0
>
> $ git diff --unified=3 1.txt 2.txt
> diff --git a/1.txt b/2.txt
> index e53eaa1..1130481 100644
> --- a/1.txt
> +++ b/2.txt
> @@ -1,10 +1,10 @@
> 1
> -2
> +a
> 3
> 4
> 5
> 6
> 7
> 8
> -9
> +a
> 0
>
> $ diff --version
> diff (GNU diffutils) 3.10
> Copyright (C) 2023 Free Software Foundation, Inc.
> License GPLv3+: GNU GPL version 3 or later <https://gnu.org/licenses/gpl.html>.
> This is free software: you are free to change and redistribute it.
> There is NO WARRANTY, to the extent permitted by law.
>
> Written by Paul Eggert, Mike Haertel, David Hayes,
> Richard Stallman, and Len Tower.
>
> $ diff --unified=2147483647 1.txt 2.txt
> --- 1.txt 2025-03-12 16:04:06.947099900 +0100
> +++ 2.txt 2025-03-12 16:04:27.131732400 +0100
> @@ -1,10 +1,10 @@
> 1
> -2
> +a
> 3
> 4
> 5
> 6
> 7
> 8
> -9
> +a
> 0
Please see the above command line output. I run this on Windows with git for windows, but the problem should apply for other platforms. The version of my git is 2.47.
I prepare two files, I run GNU diff --unified=2147483647 1.txt 2.txt, the output is correct. Then I run git diff with --unified=2147483647, the context of the second hunk is repeated, which is unexpected.
I investigated it and found the repetition is due to an overflow issue in xdiff/xemit.c.
Show 5 quoted lines
> xdchange_t *xdl_get_hunk(xdchange_t **xscr, xdemitconf_t const *xecfg){
> xdchange_t *xch, *xchp, *lxch;
> long max_common = 2 * xecfg->ctxlen + xecfg->interhunkctxlen; <- ----
> ...
> }The documentation https://git-scm.com/docs/git-diff doesn't say the range of --unified. Even if its max value is INT_MAX, 2147483647 is in the range.
Can you guys clarify the correct range of --unified? If my value 2147483647 is in range, git diff should output a diff without the strange repetition. Please fix it.