From 09153277f8948d3ed8cb6712f135a9caeaa006f6 Mon Sep 17 00:00:00 2001 From: Jonathan Tan Date: Tue, 15 Aug 2017 18:27:38 -0700 Subject: diff: respect MIN_BLOCK_LENGTH for last block Currently, MIN_BLOCK_LENGTH is only checked when diff encounters a line that does not belong to the current block. In particular, this means that MIN_BLOCK_LENGTH is not checked after all lines are encountered. Perform that check. Signed-off-by: Jonathan Tan Signed-off-by: Junio C Hamano diff --git a/diff.c b/diff.c index 23311f9..f598d8a 100644 --- a/diff.c +++ b/diff.c @@ -861,6 +861,26 @@ static int shrink_potential_moved_blocks(struct moved_entry **pmb, return rp + 1; } +/* + * If o->color_moved is COLOR_MOVED_PLAIN, this function does nothing. + * + * Otherwise, if the last block has fewer lines than + * COLOR_MOVED_MIN_BLOCK_LENGTH, unset DIFF_SYMBOL_MOVED_LINE on all lines in + * that block. + * + * The last block consists of the (n - block_length)'th line up to but not + * including the nth line. + */ +static void adjust_last_block(struct diff_options *o, int n, int block_length) +{ + int i; + if (block_length >= COLOR_MOVED_MIN_BLOCK_LENGTH || + o->color_moved == COLOR_MOVED_PLAIN) + return; + for (i = 1; i < block_length + 1; i++) + o->emitted_symbols->buf[n - i].flags &= ~DIFF_SYMBOL_MOVED_LINE; +} + /* Find blocks of moved code, delegate actual coloring decision to helper */ static void mark_color_as_moved(struct diff_options *o, struct hashmap *add_lines, @@ -896,13 +916,7 @@ static void mark_color_as_moved(struct diff_options *o, } if (!match) { - if (block_length < COLOR_MOVED_MIN_BLOCK_LENGTH && - o->color_moved != COLOR_MOVED_PLAIN) { - for (i = 1; i < block_length + 1; i++) { - l = &o->emitted_symbols->buf[n - i]; - l->flags &= ~DIFF_SYMBOL_MOVED_LINE; - } - } + adjust_last_block(o, n, block_length); pmb_nr = 0; block_length = 0; continue; @@ -944,6 +958,7 @@ static void mark_color_as_moved(struct diff_options *o, if (flipped_block) l->flags |= DIFF_SYMBOL_MOVED_LINE_ALT; } + adjust_last_block(o, n, block_length); free(pmb); } diff --git a/t/t4015-diff-whitespace.sh b/t/t4015-diff-whitespace.sh index c3b6974..6ae62a6 100755 --- a/t/t4015-diff-whitespace.sh +++ b/t/t4015-diff-whitespace.sh @@ -1382,6 +1382,43 @@ EOF test_cmp expected actual ' +test_expect_success '--color-moved block at end of diff output respects MIN_BLOCK_LENGTH' ' + git reset --hard && + >bar && + cat <<-\EOF >foo && + irrelevant_line + line1 + EOF + git add foo bar && + git commit -m x && + + cat <<-\EOF >bar && + line1 + EOF + cat <<-\EOF >foo && + irrelevant_line + 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 @@ + +line1 + diff --git a/foo b/foo + --- a/foo + +++ b/foo + @@ -1,2 +1 @@ + irrelevant_line + -line1 + EOF + + test_cmp expected actual +' + test_expect_success 'move detection with submodules' ' test_create_repo bananas && echo ripe >bananas/recipe && -- cgit v0.10.2-6-g49f6