Show 141 quoted lines
> From: Phillip Wood <phillip.wood@dunelm.org.uk>
>
> b0a2ba4776 ("diff --color-moved=zebra: be stricter with color
> alternation", 2018-11-23) sought to avoid using the alternate colors
> unless there are two adjacent moved blocks of the same
> sign. Unfortunately it contains two bugs that prevented it from fixing
> the problem properly. Firstly `last_symbol` is reset at the start of
> each iteration of the loop losing the symbol of the last line and
> secondly when deciding whether to use the alternate color it should be
> checking if the current line is the same sign of the last line, not a
> different sign. The combination of the two errors means that we still
> use the alternate color when we should do but we also use it when we
> shouldn't. This is most noticable when using
> --color-moved-ws=allow-indentation-change with hunks like
>
> -this line gets indented
> + this line gets indented
>
> where the post image is colored with newMovedAlternate rather than
> newMoved. While this does not matter much, the next commit will change
> the coloring to be correct in this case, so lets fix the bug here to
> make it clear why the output is changing and add a regression test.
>
> Signed-off-by: Phillip Wood <phillip.wood@dunelm.org.uk>
> ---
> diff.c | 4 +--
> t/t4015-diff-whitespace.sh | 72 ++++++++++++++++++++++++++++++++++++++
> 2 files changed, 74 insertions(+), 2 deletions(-)
>
> diff --git a/diff.c b/diff.c
> index 52c791574b71..cb068f8258c0 100644
> --- a/diff.c
> +++ b/diff.c
> @@ -1142,6 +1142,7 @@ static void mark_color_as_moved(struct diff_options *o,
> struct moved_block *pmb = NULL; /* potentially moved blocks */
> int pmb_nr = 0, pmb_alloc = 0;
> int n, flipped_block = 0, block_length = 0;
> + enum diff_symbol last_symbol = 0;
>
>
> for (n = 0; n < o->emitted_symbols->nr; n++) {
> @@ -1149,7 +1150,6 @@ static void mark_color_as_moved(struct diff_options *o,
> struct moved_entry *key;
> struct moved_entry *match = NULL;
> struct emitted_diff_symbol *l = &o->emitted_symbols->buf[n];
> - enum diff_symbol last_symbol = 0;
>
> switch (l->s) {
> case DIFF_SYMBOL_PLUS:
> @@ -1214,7 +1214,7 @@ static void mark_color_as_moved(struct diff_options *o,
> }
>
> if (adjust_last_block(o, n, block_length) &&
> - pmb_nr && last_symbol != l->s)
> + pmb_nr && last_symbol == l->s)
> flipped_block = (flipped_block + 1) % 2;
> else
> flipped_block = 0;
> diff --git a/t/t4015-diff-whitespace.sh b/t/t4015-diff-whitespace.sh
> index 2c13b62d3c65..920114cd795c 100755
> --- a/t/t4015-diff-whitespace.sh
> +++ b/t/t4015-diff-whitespace.sh
> @@ -1442,6 +1442,78 @@ test_expect_success 'detect permutations inside moved code -- dimmed-zebra' '
> test_cmp expected actual
> '
>
> +test_expect_success 'zebra alternate color is only used when necessary' '
> + cat >old.txt <<-\EOF &&
> + line 1A should be marked as oldMoved newMovedAlternate
> + line 1B should be marked as oldMoved newMovedAlternate
> + unchanged
> + line 2A should be marked as oldMoved newMovedAlternate
> + line 2B should be marked as oldMoved newMovedAlternate
> + line 3A should be marked as oldMovedAlternate newMoved
> + line 3B should be marked as oldMovedAlternate newMoved
> + unchanged
> + line 4A should be marked as oldMoved newMovedAlternate
> + line 4B should be marked as oldMoved newMovedAlternate
> + line 5A should be marked as oldMovedAlternate newMoved
> + line 5B should be marked as oldMovedAlternate newMoved
> + line 6A should be marked as oldMoved newMoved
> + line 6B should be marked as oldMoved newMoved
> + EOF
> + cat >new.txt <<-\EOF &&
> + line 1A should be marked as oldMoved newMovedAlternate
> + line 1B should be marked as oldMoved newMovedAlternate
> + unchanged
> + line 3A should be marked as oldMovedAlternate newMoved
> + line 3B should be marked as oldMovedAlternate newMoved
> + line 2A should be marked as oldMoved newMovedAlternate
> + line 2B should be marked as oldMoved newMovedAlternate
> + unchanged
> + line 6A should be marked as oldMoved newMoved
> + line 6B should be marked as oldMoved newMoved
> + line 4A should be marked as oldMoved newMovedAlternate
> + line 4B should be marked as oldMoved newMovedAlternate
> + line 5A should be marked as oldMovedAlternate newMoved
> + line 5B should be marked as oldMovedAlternate newMoved
> + EOF
> + test_expect_code 1 git diff --no-index --color --color-moved=zebra \
> + --color-moved-ws=allow-indentation-change \
> + old.txt new.txt >output &&
> + grep -v index output | test_decode_color >actual &&
> + cat >expected <<-\EOF &&
> + <BOLD>diff --git a/old.txt b/new.txt<RESET>
> + <BOLD>--- a/old.txt<RESET>
> + <BOLD>+++ b/new.txt<RESET>
> + <CYAN>@@ -1,14 +1,14 @@<RESET>
> + <BOLD;MAGENTA>-line 1A should be marked as oldMoved newMovedAlternate<RESET>
> + <BOLD;MAGENTA>-line 1B should be marked as oldMoved newMovedAlternate<RESET>
> + <BOLD;CYAN>+<RESET><BOLD;CYAN> line 1A should be marked as oldMoved newMovedAlternate<RESET>
> + <BOLD;CYAN>+<RESET><BOLD;CYAN> line 1B should be marked as oldMoved newMovedAlternate<RESET>
> + unchanged<RESET>
> + <BOLD;MAGENTA>-line 2A should be marked as oldMoved newMovedAlternate<RESET>
> + <BOLD;MAGENTA>-line 2B should be marked as oldMoved newMovedAlternate<RESET>
> + <BOLD;BLUE>-line 3A should be marked as oldMovedAlternate newMoved<RESET>
> + <BOLD;BLUE>-line 3B should be marked as oldMovedAlternate newMoved<RESET>
> + <BOLD;CYAN>+<RESET><BOLD;CYAN> line 3A should be marked as oldMovedAlternate newMoved<RESET>
> + <BOLD;CYAN>+<RESET><BOLD;CYAN> line 3B should be marked as oldMovedAlternate newMoved<RESET>
> + <BOLD;YELLOW>+<RESET><BOLD;YELLOW> line 2A should be marked as oldMoved newMovedAlternate<RESET>
> + <BOLD;YELLOW>+<RESET><BOLD;YELLOW> line 2B should be marked as oldMoved newMovedAlternate<RESET>
> + unchanged<RESET>
> + <BOLD;MAGENTA>-line 4A should be marked as oldMoved newMovedAlternate<RESET>
> + <BOLD;MAGENTA>-line 4B should be marked as oldMoved newMovedAlternate<RESET>
> + <BOLD;BLUE>-line 5A should be marked as oldMovedAlternate newMoved<RESET>
> + <BOLD;BLUE>-line 5B should be marked as oldMovedAlternate newMoved<RESET>
> + <BOLD;MAGENTA>-line 6A should be marked as oldMoved newMoved<RESET>
> + <BOLD;MAGENTA>-line 6B should be marked as oldMoved newMoved<RESET>
> + <BOLD;CYAN>+<RESET><BOLD;CYAN> line 6A should be marked as oldMoved newMoved<RESET>
> + <BOLD;CYAN>+<RESET><BOLD;CYAN> line 6B should be marked as oldMoved newMoved<RESET>
> + <BOLD;YELLOW>+<RESET><BOLD;YELLOW> line 4A should be marked as oldMoved newMovedAlternate<RESET>
> + <BOLD;YELLOW>+<RESET><BOLD;YELLOW> line 4B should be marked as oldMoved newMovedAlternate<RESET>
> + <BOLD;CYAN>+<RESET><BOLD;CYAN> line 5A should be marked as oldMovedAlternate newMoved<RESET>
> + <BOLD;CYAN>+<RESET><BOLD;CYAN> line 5B should be marked as oldMovedAlternate newMoved<RESET>
> + EOF
> + test_cmp expected actual
> +'
> +
> test_expect_success 'cmd option assumes configured colored-moved' '
> test_config color.diff.oldMoved "magenta" &&
> test_config color.diff.newMoved "cyan" &&