From: Jonathan Tan Date: Fri, 11 Aug 2017 22:49:16 GMT Subject: [RFC PATCH 3/3] diff: check MIN_BLOCK_LENGTH at start of new block Message-ID: <16707a12715ea60e05b00f4eb887ee99cd4d7b71.1502491372.git.jonathantanmy@google.com> In-Reply-To: When noticing that the current line is not the continuation of the current block, but the start of a new one, mark_color_as_moved() does not check the length of the current block. Perform that check. Signed-off-by: Jonathan Tan --- diff.c | 6 +++++- t/t4015-diff-whitespace.sh | 45 ++++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 49 insertions(+), 2 deletions(-) diff --git a/diff.c b/diff.c index 95620b130..04fc0d65d 100644 --- a/diff.c +++ b/diff.c @@ -920,7 +920,6 @@ static void mark_color_as_moved(struct diff_options *o, } l->flags |= DIFF_SYMBOL_MOVED_LINE; - block_length++; if (o->color_moved == COLOR_MOVED_PLAIN) continue; @@ -950,8 +949,13 @@ static void mark_color_as_moved(struct diff_options *o, } flipped_block = (flipped_block + 1) % 2; + + adjust_last_block(o, n, block_length); + block_length = 0; } + block_length++; + if (flipped_block) l->flags |= DIFF_SYMBOL_MOVED_LINE_ALT; } diff --git a/t/t4015-diff-whitespace.sh b/t/t4015-diff-whitespace.sh index 6f7758e5c..401dc8f08 100755 --- a/t/t4015-diff-whitespace.sh +++ b/t/t4015-diff-whitespace.sh @@ -1015,7 +1015,7 @@ test_expect_success 'detect moved code, complete file' ' test_cmp expected actual ' -test_expect_success 'detect malicious moved code, inside file' ' +test_expect_failure 'detect malicious moved code, inside file' ' test_config color.diff.oldMoved "normal red" && test_config color.diff.newMoved "normal green" && test_config color.diff.oldMovedAlternative "blue" && @@ -1417,6 +1417,49 @@ test_expect_success '--color-moved block at end of diff output respects MIN_BLOC test_cmp expected actual ' +test_expect_success '--color-moved treats adjacent blocks as separate for MIN_BLOCK_LENGTH' ' + git reset --hard && + cat <<-\EOF >foo && + line1 + irrelevant_line + line2 + line3 + EOF + >bar && + git add foo bar && + git commit -m x && + + cat <<-\EOF >foo && + irrelevant_line + EOF + cat <<-\EOF >bar && + line2 + line3 + line1 + EOF + + git diff HEAD --color-moved=zebra --no-renames | grep -v "index" | test_decode_color >actual && + cat >expected <<-\EOF && + diff --git a/bar b/bar + --- a/bar + +++ b/bar + @@ -0,0 +1,3 @@ + +line2 + +line3 + +line1 + diff --git a/foo b/foo + --- a/foo + +++ b/foo + @@ -1,4 +1 @@ + -line1 + irrelevant_line + -line2 + -line3 + EOF + + test_cmp expected actual +' + test_expect_success 'move detection with submodules' ' test_create_repo bananas && echo ripe >bananas/recipe && -- 2.14.0.434.g98096fd7a8-goog