Iffy output given git diff --unified=2147483647
From: Jason Cho <hidden>
Date: 2025-03-12 15:51:10
quoted hunk
$ git --versiongit version 2.47.0.windows.2 $ git diff --unified=2147483647 1.txt 2.txtdiff --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.txtdiff --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.
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.