Re: [PATCH 01/10] diff --color-moved=zerba: fix alternate coloring
- From
- Phillip Wood <phillip.wood123@gmail.com>
- Date
- Jun 15, 2021, 11:22 UTC
- Message-ID
- <e74e3750-b43d-1010-17df-6c821bb7b090@gmail.com>
- In-Reply-To
- <xmqq4kdzyfm0.fsf@gitster.g>
On 15/06/2021 04:24, Junio C Hamano wrote:
Show 5 quoted lines
> "Phillip Wood via GitGitGadget" <gitgitgadget@gmail.com> writes: > >> Subject: Re: [PATCH 01/10] diff --color-moved=zerba: fix alternate coloring > > Zerba?
They're quite rare in the wild :-/ Thanks for pointing that out I'll fix it when I re-roll
Best Wishes
Phillip
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" &&