1#!/bin/sh
   2test_description='diff whitespace error detection'
   4. ./test-lib.sh
   6test_expect_success setup '
   8        git config diff.color.whitespace "blue reverse" &&
  10        >F &&
  11        git add F &&
  12        echo "         Eight SP indent" >>F &&
  13        echo "  HT and SP indent" >>F &&
  14        echo "With trailing SP " >>F &&
  15        echo "Carriage ReturnQ" | tr Q "\015" >>F &&
  16        echo "No problem" >>F &&
  17        echo >>F
  18'
  20blue_grep='7;34m' ;# ESC [ 7 ; 3 4 m
  22printf "\033[%s" "$blue_grep" >check-grep
  24if (grep "$blue_grep" <check-grep | grep "$blue_grep") >/dev/null 2>&1
  25then
  26        grep_a=grep
  27elif (grep -a "$blue_grep" <check-grep | grep -a "$blue_grep") >/dev/null 2>&1
  28then
  29        grep_a='grep -a'
  30else
  31        grep_a=grep ;# expected to fail...
  32fi
  33rm -f check-grep
  34prepare_output () {
  36        git diff --color >output
  37        $grep_a "$blue_grep" output >error
  38        $grep_a -v "$blue_grep" output >normal
  39        return 0
  40}
  41test_expect_success default '
  43        prepare_output &&
  45        grep Eight normal >/dev/null &&
  47        grep HT error >/dev/null &&
  48        grep With error >/dev/null &&
  49        grep Return error >/dev/null &&
  50        grep No normal >/dev/null
  51'
  53test_expect_success 'default (attribute)' '
  55        test_might_fail git config --unset core.whitespace &&
  57        echo "F whitespace" >.gitattributes &&
  58        prepare_output &&
  59        grep Eight error >/dev/null &&
  61        grep HT error >/dev/null &&
  62        grep With error >/dev/null &&
  63        grep Return error >/dev/null &&
  64        grep No normal >/dev/null
  65'
  67test_expect_success 'default, tabwidth=10 (attribute)' '
  69        git config core.whitespace "tabwidth=10" &&
  71        echo "F whitespace" >.gitattributes &&
  72        prepare_output &&
  73        grep Eight normal >/dev/null &&
  75        grep HT error >/dev/null &&
  76        grep With error >/dev/null &&
  77        grep Return error >/dev/null &&
  78        grep No normal >/dev/null
  79'
  81test_expect_success 'no check (attribute)' '
  83        test_might_fail git config --unset core.whitespace &&
  85        echo "F -whitespace" >.gitattributes &&
  86        prepare_output &&
  87        grep Eight normal >/dev/null &&
  89        grep HT normal >/dev/null &&
  90        grep With normal >/dev/null &&
  91        grep Return normal >/dev/null &&
  92        grep No normal >/dev/null
  93'
  95test_expect_success 'no check, tabwidth=10 (attribute), must be irrelevant' '
  97        git config core.whitespace "tabwidth=10" &&
  99        echo "F -whitespace" >.gitattributes &&
 100        prepare_output &&
 101        grep Eight normal >/dev/null &&
 103        grep HT normal >/dev/null &&
 104        grep With normal >/dev/null &&
 105        grep Return normal >/dev/null &&
 106        grep No normal >/dev/null
 107'
 109test_expect_success 'without -trail' '
 111        rm -f .gitattributes &&
 113        git config core.whitespace -trail &&
 114        prepare_output &&
 115        grep Eight normal >/dev/null &&
 117        grep HT error >/dev/null &&
 118        grep With normal >/dev/null &&
 119        grep Return normal >/dev/null &&
 120        grep No normal >/dev/null
 121'
 123test_expect_success 'without -trail (attribute)' '
 125        test_might_fail git config --unset core.whitespace &&
 127        echo "F whitespace=-trail" >.gitattributes &&
 128        prepare_output &&
 129        grep Eight normal >/dev/null &&
 131        grep HT error >/dev/null &&
 132        grep With normal >/dev/null &&
 133        grep Return normal >/dev/null &&
 134        grep No normal >/dev/null
 135'
 137test_expect_success 'without -space' '
 139        rm -f .gitattributes &&
 141        git config core.whitespace -space &&
 142        prepare_output &&
 143        grep Eight normal >/dev/null &&
 145        grep HT normal >/dev/null &&
 146        grep With error >/dev/null &&
 147        grep Return error >/dev/null &&
 148        grep No normal >/dev/null
 149'
 151test_expect_success 'without -space (attribute)' '
 153        test_might_fail git config --unset core.whitespace &&
 155        echo "F whitespace=-space" >.gitattributes &&
 156        prepare_output &&
 157        grep Eight normal >/dev/null &&
 159        grep HT normal >/dev/null &&
 160        grep With error >/dev/null &&
 161        grep Return error >/dev/null &&
 162        grep No normal >/dev/null
 163'
 165test_expect_success 'with indent-non-tab only' '
 167        rm -f .gitattributes &&
 169        git config core.whitespace indent,-trailing,-space &&
 170        prepare_output &&
 171        grep Eight error >/dev/null &&
 173        grep HT normal >/dev/null &&
 174        grep With normal >/dev/null &&
 175        grep Return normal >/dev/null &&
 176        grep No normal >/dev/null
 177'
 179test_expect_success 'with indent-non-tab only (attribute)' '
 181        test_might_fail git config --unset core.whitespace &&
 183        echo "F whitespace=indent,-trailing,-space" >.gitattributes &&
 184        prepare_output &&
 185        grep Eight error >/dev/null &&
 187        grep HT normal >/dev/null &&
 188        grep With normal >/dev/null &&
 189        grep Return normal >/dev/null &&
 190        grep No normal >/dev/null
 191'
 193test_expect_success 'with indent-non-tab only, tabwidth=10' '
 195        rm -f .gitattributes &&
 197        git config core.whitespace indent,tabwidth=10,-trailing,-space &&
 198        prepare_output &&
 199        grep Eight normal >/dev/null &&
 201        grep HT normal >/dev/null &&
 202        grep With normal >/dev/null &&
 203        grep Return normal >/dev/null &&
 204        grep No normal >/dev/null
 205'
 207test_expect_success 'with indent-non-tab only, tabwidth=10 (attribute)' '
 209        test_might_fail git config --unset core.whitespace &&
 211        echo "F whitespace=indent,-trailing,-space,tabwidth=10" >.gitattributes &&
 212        prepare_output &&
 213        grep Eight normal >/dev/null &&
 215        grep HT normal >/dev/null &&
 216        grep With normal >/dev/null &&
 217        grep Return normal >/dev/null &&
 218        grep No normal >/dev/null
 219'
 221test_expect_success 'with cr-at-eol' '
 223        rm -f .gitattributes &&
 225        git config core.whitespace cr-at-eol &&
 226        prepare_output &&
 227        grep Eight normal >/dev/null &&
 229        grep HT error >/dev/null &&
 230        grep With error >/dev/null &&
 231        grep Return normal >/dev/null &&
 232        grep No normal >/dev/null
 233'
 235test_expect_success 'with cr-at-eol (attribute)' '
 237        test_might_fail git config --unset core.whitespace &&
 239        echo "F whitespace=trailing,cr-at-eol" >.gitattributes &&
 240        prepare_output &&
 241        grep Eight normal >/dev/null &&
 243        grep HT error >/dev/null &&
 244        grep With error >/dev/null &&
 245        grep Return normal >/dev/null &&
 246        grep No normal >/dev/null
 247'
 249test_expect_success 'trailing empty lines (1)' '
 251        rm -f .gitattributes &&
 253        test_must_fail git diff --check >output &&
 254        grep "new blank line at" output &&
 255        grep "trailing whitespace" output
 256'
 258test_expect_success 'trailing empty lines (2)' '
 260        echo "F -whitespace" >.gitattributes &&
 262        git diff --check >output &&
 263        ! test -s output
 264'
 266test_expect_success 'checkdiff shows correct line number for trailing blank lines' '
 268        printf "a\nb\n" > G &&
 270        git add G &&
 271        printf "x\nx\nx\na\nb\nc\n\n" > G &&
 272        [ "$(git diff --check -- G)" = "G:7: new blank line at EOF." ]
 273'
 275test_expect_success 'do not color trailing cr in context' '
 277        test_might_fail git config --unset core.whitespace &&
 278        rm -f .gitattributes &&
 279        echo AAAQ | tr Q "\015" >G &&
 280        git add G &&
 281        echo BBBQ | tr Q "\015" >>G &&
 282        git diff --color G | tr "\015" Q >output &&
 283        grep "BBB.*${blue_grep}Q" output &&
 284        grep "AAA.*\[mQ" output
 285'
 287test_expect_success 'color new trailing blank lines' '
 289        { echo a; echo b; echo; echo; } >x &&
 290        git add x &&
 291        { echo a; echo; echo; echo; echo c; echo; echo; echo; echo; } >x &&
 292        git diff --color x >output &&
 293        cnt=$($grep_a "${blue_grep}" output | wc -l) &&
 294        test $cnt = 2
 295'
 296test_done