Message ID | 374dbebcbf29b686508e51205b2f7a4e72104950.1623675888.git.gitgitgadget@gmail.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | diff --color-moved[-ws] speedups | expand |
"Phillip Wood via GitGitGadget" <gitgitgadget@gmail.com> writes: > Subject: Re: [PATCH 01/10] diff --color-moved=zerba: fix alternate coloring Zerba? > 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" &&
On 15/06/2021 04:24, Junio C Hamano wrote: > "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 >> 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" &&
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" &&