The added test would hang up Git due to an infinite loop. The function `next_byte()` doesn't make any forward progress in the buffer with `--ignore-space-change`. Fix this by only returning early when there was actual white space to be covered, fall back to the default case at the end of the function when there is no white space. Reported-by: Orgad Shaneh <orgads@xxxxxxxxx> Debugged-by: Jeff King <peff@xxxxxxxx> Signed-off-by: Stefan Beller <sbeller@xxxxxxxxxx> --- Peff, feel free to take ownership here. I merely made it to a patch. Thanks, Stefan diff.c | 12 ++++++++---- t/t4015-diff-whitespace.sh | 8 ++++++++ 2 files changed, 16 insertions(+), 4 deletions(-) diff --git a/diff.c b/diff.c index 69f03570ad..6fe84e6994 100644 --- a/diff.c +++ b/diff.c @@ -713,13 +713,17 @@ static int next_byte(const char **cp, const char **endp, return -1; if (DIFF_XDL_TST(diffopt, IGNORE_WHITESPACE_CHANGE)) { - while (*cp < *endp && isspace(**cp)) + int saw_whitespace = 0; + while (*cp < *endp && isspace(**cp)) { (*cp)++; + saw_whitespace = 1; + } /* - * After skipping a couple of whitespaces, we still have to - * account for one space. + * After skipping a couple of whitespaces, + * we still have to account for one space. */ - return (int)' '; + if (saw_whitespace) + return (int)' '; } if (DIFF_XDL_TST(diffopt, IGNORE_WHITESPACE)) { diff --git a/t/t4015-diff-whitespace.sh b/t/t4015-diff-whitespace.sh index bd0f75d9f7..c088ae86af 100755 --- a/t/t4015-diff-whitespace.sh +++ b/t/t4015-diff-whitespace.sh @@ -1530,4 +1530,12 @@ test_expect_success 'move detection with submodules' ' test_cmp expect decoded_actual ' +test_expect_success 'move detection with whitespace changes' ' + test_seq 10 > test && + git add test && + sed -i "s/3/42/" test && + git -c diff.colormoved diff --ignore-space-change -- test && + git reset --hard +' + test_done -- 2.14.0.rc0.3.g6c2e499285