On Tue, 24 Apr 2018 14:03:30 -0700 Stefan Beller <sbeller@xxxxxxxxxx> wrote: > +--color-moved-[no-]ignore-space-prefix-delta:: > + Ignores whitespace when comparing lines when performing the move > + detection for --color-moved. This ignores uniform differences > + of white space at the beginning lines in moved blocks. Setting this option means that moved lines may be indented or dedented, and if they have been indented or dedented by the same amount, they are still considered to be the same block. Maybe call this --color-moved-allow-indentation-change. > +struct ws_delta { > + char *string; /* The prefix delta, which is the same in the block */ Probably better described as "the difference between the '-' line and the '+' line". This may be the empty string if there is no difference. > + int direction; /* adding or removing the line? */ What is the value when "added" and what when "removed"? Also, it is not truly "added" or "removed", so a better way might be: 1 if the '-' line is longer than the '+' line, and 0 otherwise. (And make sure that the documentation is correct with respect to equal lines.) > + int missmatch; /* in the remainder */ s/missmatch/mismatch/ Also, what is this used for? > + if (diffopt->color_moved_ws_handling & COLOR_MOVED_DELTA_WHITESPACES) > + /* > + * As there is not specific white space config given, > + * we'd need to check for a new block, so ignore all > + * white space. The setup of the white space > + * configuration for the next block is done else where > + */ > + flags |= XDF_IGNORE_WHITESPACE; > + > return !xdiff_compare_lines(a->es->line, a->es->len, > b->es->line, b->es->len, > flags); I wrote in [1]: I think we should just prohibit combining this with any of the whitespace ignoring flags except for the space-at-eol one. They seem to contradict anyway. To elaborate, adding a specific flag that may interfere with other user-provided flags sounds like we're unnecessarily adding combinations that we must keep track of, and that it's both logical (from a user's point of view) and clearer (as for the code) to just forbid such combinations. [1] https://public-inbox.org/git/20180402174118.d204ec0d4b9d2fa7ebd77739@xxxxxxxxxx/ > struct moved_entry **pmb = NULL; /* potentially moved blocks */ > int pmb_nr = 0, pmb_alloc = 0; > - int n, flipped_block = 1, block_length = 0; > > + struct ws_delta *wsd = NULL; /* white space deltas between pmb */ > + int wsd_alloc = 0; > + > + int n, flipped_block = 1, block_length = 0; It seems like pmb and wsd are parallel arrays - could each wsd be embedded into the corresponding entry of pmb instead? > --- a/diff.h > +++ b/diff.h > @@ -214,6 +214,8 @@ struct diff_options { > } color_moved; > #define COLOR_MOVED_DEFAULT COLOR_MOVED_ZEBRA > #define COLOR_MOVED_MIN_ALNUM_COUNT 20 > + /* XDF_WHITESPACE_FLAGS regarding block detection are set at 2, 3, 4 */ > + #define COLOR_MOVED_DELTA_WHITESPACES (1 << 22) > int color_moved_ws_handling; > }; Setting of DELTA_WHITESPACES should be a separate field, not as part of ws_handling. It's fine for the ws_handling to be a bitset, since that's how it's passed to xdiff_compare_lines(), but we don't need to do the same for DELTA_WHITESPACES. > +test_expect_success 'compare whitespace delta across moved blocks' ' > + > + git reset --hard && > + q_to_tab <<-\EOF >text.txt && > + QIndented > + QText across > + Qthree lines > + QBut! <- this stands out > + Qthis one > + QQline did > + Qnot adjust > + EOF > + > + git add text.txt && > + git commit -m "add text.txt" && > + > + q_to_tab <<-\EOF >text.txt && > + QQIndented > + QQText across > + QQthree lines > + QQQBut! <- this stands out > + this one > + Qline did > + not adjust > + EOF > + > + git diff --color --color-moved-ignore-space-prefix-delta | > + grep -v "index" | > + test_decode_color >actual && > + > + q_to_tab <<-\EOF >expected && > + <BOLD>diff --git a/text.txt b/text.txt<RESET> > + <BOLD>--- a/text.txt<RESET> > + <BOLD>+++ b/text.txt<RESET> > + <CYAN>@@ -1,7 +1,7 @@<RESET> > + <RED>-QIndented<RESET> > + <RED>-QText across<RESET> > + <RED>-Qthree lines<RESET> > + <RED>-QBut! <- this stands out<RESET> > + <RED>-Qthis one<RESET> > + <RED>-QQline did<RESET> > + <RED>-Qnot adjust<RESET> > + <GREEN>+<RESET>QQ<GREEN>Indented<RESET> > + <GREEN>+<RESET>QQ<GREEN>Text across<RESET> > + <GREEN>+<RESET>QQ<GREEN>three lines<RESET> > + <GREEN>+<RESET>QQQ<GREEN>But! <- this stands out<RESET> > + <GREEN>+<RESET><GREEN>this one<RESET> > + <GREEN>+<RESET>Q<GREEN>line did<RESET> > + <GREEN>+<RESET><GREEN>not adjust<RESET> > + EOF > + > + test_cmp expected actual > +' I would have expected every line except the "this stands out" line to be colored differently than the usual RED and GREEN. Is this test output expected?