Hi Phillip, On Tue, 16 Nov 2021, Phillip Wood via GitGitGadget wrote: > From: Phillip Wood <phillip.wood@xxxxxxxxxxxxx> > > 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. What an excellent commit message! Thank you, Dscho > > Signed-off-by: Phillip Wood <phillip.wood@xxxxxxxxxxxxx> > --- > 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 1e1b5127d15..53f0df75329 100644 > --- a/diff.c > +++ b/diff.c > @@ -1176,6 +1176,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++) { > @@ -1183,7 +1184,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: > @@ -1251,7 +1251,7 @@ static void mark_color_as_moved(struct diff_options *o, > &pmb, &pmb_alloc, > &pmb_nr); > > - if (contiguous && pmb_nr && last_symbol != l->s) > + if (contiguous && 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 308dc136596..4e0fd76c6c5 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" && > -- > gitgitgadget > >