Merge branch 'jk/xdiff-clamp-funcname-context-index' into maint
authorJunio C Hamano <gitster@pobox.com>
Fri, 9 Aug 2019 22:18:18 +0000 (15:18 -0700)
committerJunio C Hamano <gitster@pobox.com>
Fri, 9 Aug 2019 22:18:18 +0000 (15:18 -0700)
The internal diff machinery can be made to read out of bounds while
looking for --funcion-context line in a corner case, which has been
corrected.

* jk/xdiff-clamp-funcname-context-index:
xdiff: clamp function context indices in post-image

1  2 
t/t4015-diff-whitespace.sh
index ab4670d23653eca46292b13ef1559584aae5c3a6,04d1bbecbe8adcc67e26f4c9ad6741604b22965c..6b087df3dcbd01df9c7e533f9e039518beaa773a
@@@ -1919,93 -1897,26 +1919,115 @@@ test_expect_success 'compare whitespac
        test_i18ngrep allow-indentation-change err
  '
  
 +EMPTY=''
 +test_expect_success 'compare mixed whitespace delta across moved blocks' '
 +
 +      git reset --hard &&
 +      tr Q_ "\t " <<-EOF >text.txt &&
 +      ${EMPTY}
 +      ____too short without
 +      ${EMPTY}
 +      ___being grouped across blank line
 +      ${EMPTY}
 +      context
 +      lines
 +      to
 +      anchor
 +      ____Indented text to
 +      _Q____be further indented by four spaces across
 +      ____Qseveral lines
 +      QQ____These two lines have had their
 +      ____indentation reduced by four spaces
 +      Qdifferent indentation change
 +      ____too short
 +      EOF
 +
 +      git add text.txt &&
 +      git commit -m "add text.txt" &&
 +
 +      tr Q_ "\t " <<-EOF >text.txt &&
 +      context
 +      lines
 +      to
 +      anchor
 +      QIndented text to
 +      QQbe further indented by four spaces across
 +      Q____several lines
 +      ${EMPTY}
 +      QQtoo short without
 +      ${EMPTY}
 +      Q_______being grouped across blank line
 +      ${EMPTY}
 +      Q_QThese two lines have had their
 +      indentation reduced by four spaces
 +      QQdifferent indentation change
 +      __Qtoo short
 +      EOF
 +
 +      git -c color.diff.whitespace="normal red" \
 +              -c core.whitespace=space-before-tab \
 +              diff --color --color-moved --ws-error-highlight=all \
 +              --color-moved-ws=allow-indentation-change >actual.raw &&
 +      grep -v "index" actual.raw | test_decode_color >actual &&
 +
 +      cat <<-\EOF >expected &&
 +      <BOLD>diff --git a/text.txt b/text.txt<RESET>
 +      <BOLD>--- a/text.txt<RESET>
 +      <BOLD>+++ b/text.txt<RESET>
 +      <CYAN>@@ -1,16 +1,16 @@<RESET>
 +      <BOLD;MAGENTA>-<RESET>
 +      <BOLD;MAGENTA>-<RESET><BOLD;MAGENTA>    too short without<RESET>
 +      <BOLD;MAGENTA>-<RESET>
 +      <BOLD;MAGENTA>-<RESET><BOLD;MAGENTA>   being grouped across blank line<RESET>
 +      <BOLD;MAGENTA>-<RESET>
 +       <RESET>context<RESET>
 +       <RESET>lines<RESET>
 +       <RESET>to<RESET>
 +       <RESET>anchor<RESET>
 +      <BOLD;MAGENTA>-<RESET><BOLD;MAGENTA>    Indented text to<RESET>
 +      <BOLD;MAGENTA>-<RESET><BRED> <RESET>    <BOLD;MAGENTA>    be further indented by four spaces across<RESET>
 +      <BOLD;MAGENTA>-<RESET><BRED>    <RESET> <BOLD;MAGENTA>several lines<RESET>
 +      <BOLD;BLUE>-<RESET>             <BOLD;BLUE>    These two lines have had their<RESET>
 +      <BOLD;BLUE>-<RESET><BOLD;BLUE>    indentation reduced by four spaces<RESET>
 +      <BOLD;MAGENTA>-<RESET>  <BOLD;MAGENTA>different indentation change<RESET>
 +      <RED>-<RESET><RED>    too short<RESET>
 +      <BOLD;CYAN>+<RESET>     <BOLD;CYAN>Indented text to<RESET>
 +      <BOLD;CYAN>+<RESET>             <BOLD;CYAN>be further indented by four spaces across<RESET>
 +      <BOLD;CYAN>+<RESET>     <BOLD;CYAN>    several lines<RESET>
 +      <BOLD;YELLOW>+<RESET>
 +      <BOLD;YELLOW>+<RESET>           <BOLD;YELLOW>too short without<RESET>
 +      <BOLD;YELLOW>+<RESET>
 +      <BOLD;YELLOW>+<RESET>   <BOLD;YELLOW>       being grouped across blank line<RESET>
 +      <BOLD;YELLOW>+<RESET>
 +      <BOLD;CYAN>+<RESET>     <BRED> <RESET>  <BOLD;CYAN>These two lines have had their<RESET>
 +      <BOLD;CYAN>+<RESET><BOLD;CYAN>indentation reduced by four spaces<RESET>
 +      <BOLD;YELLOW>+<RESET>           <BOLD;YELLOW>different indentation change<RESET>
 +      <GREEN>+<RESET><BRED>  <RESET>  <GREEN>too short<RESET>
 +      EOF
 +
 +      test_cmp expected actual
 +'
 +
+ # Note that the "6" in the expected hunk header below is funny, since we only
+ # show 5 lines (the missing one was blank and thus ignored). This is how
+ # --ignore-blank-lines behaves even without --function-context, and this test
+ # is just checking the interaction of the two features. Don't take it as an
+ # endorsement of that output.
+ test_expect_success 'combine --ignore-blank-lines with --function-context' '
+       test_write_lines 1 "" 2 3 4 5 >a &&
+       test_write_lines 1    2 3 4   >b &&
+       test_must_fail git diff --no-index \
+               --ignore-blank-lines --function-context a b >actual.raw &&
+       sed -n "/@@/,\$p" <actual.raw >actual &&
+       cat <<-\EOF >expect &&
+       @@ -1,6 +1,4 @@
+        1
+        2
+        3
+        4
+       -5
+       EOF
+       test_cmp expect actual
+ '
  test_done