t / t4019-diff-wserror.shon commit doc: promote "git restore" (80f537f)
   1#!/bin/sh
   2
   3test_description='diff whitespace error detection'
   4
   5. ./test-lib.sh
   6
   7test_expect_success setup '
   8
   9        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
  19'
  20
  21blue_grep='7;34m' ;# ESC [ 7 ; 3 4 m
  22
  23printf "\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
  34
  35prepare_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}
  41
  42test_expect_success default '
  43
  44        prepare_output &&
  45
  46        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
  52'
  53
  54test_expect_success 'default (attribute)' '
  55
  56        test_might_fail git config --unset core.whitespace &&
  57        echo "F whitespace" >.gitattributes &&
  58        prepare_output &&
  59
  60        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
  66'
  67
  68test_expect_success 'default, tabwidth=10 (attribute)' '
  69
  70        git config core.whitespace "tabwidth=10" &&
  71        echo "F whitespace" >.gitattributes &&
  72        prepare_output &&
  73
  74        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
  80'
  81
  82test_expect_success 'no check (attribute)' '
  83
  84        test_might_fail git config --unset core.whitespace &&
  85        echo "F -whitespace" >.gitattributes &&
  86        prepare_output &&
  87
  88        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
  94'
  95
  96test_expect_success 'no check, tabwidth=10 (attribute), must be irrelevant' '
  97
  98        git config core.whitespace "tabwidth=10" &&
  99        echo "F -whitespace" >.gitattributes &&
 100        prepare_output &&
 101
 102        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
 108'
 109
 110test_expect_success 'without -trail' '
 111
 112        rm -f .gitattributes &&
 113        git config core.whitespace -trail &&
 114        prepare_output &&
 115
 116        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
 122'
 123
 124test_expect_success 'without -trail (attribute)' '
 125
 126        test_might_fail git config --unset core.whitespace &&
 127        echo "F whitespace=-trail" >.gitattributes &&
 128        prepare_output &&
 129
 130        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
 136'
 137
 138test_expect_success 'without -space' '
 139
 140        rm -f .gitattributes &&
 141        git config core.whitespace -space &&
 142        prepare_output &&
 143
 144        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
 150'
 151
 152test_expect_success 'without -space (attribute)' '
 153
 154        test_might_fail git config --unset core.whitespace &&
 155        echo "F whitespace=-space" >.gitattributes &&
 156        prepare_output &&
 157
 158        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
 164'
 165
 166test_expect_success 'with indent-non-tab only' '
 167
 168        rm -f .gitattributes &&
 169        git config core.whitespace indent,-trailing,-space &&
 170        prepare_output &&
 171
 172        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
 178'
 179
 180test_expect_success 'with indent-non-tab only (attribute)' '
 181
 182        test_might_fail git config --unset core.whitespace &&
 183        echo "F whitespace=indent,-trailing,-space" >.gitattributes &&
 184        prepare_output &&
 185
 186        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
 192'
 193
 194test_expect_success 'with indent-non-tab only, tabwidth=10' '
 195
 196        rm -f .gitattributes &&
 197        git config core.whitespace indent,tabwidth=10,-trailing,-space &&
 198        prepare_output &&
 199
 200        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
 206'
 207
 208test_expect_success 'with indent-non-tab only, tabwidth=10 (attribute)' '
 209
 210        test_might_fail git config --unset core.whitespace &&
 211        echo "F whitespace=indent,-trailing,-space,tabwidth=10" >.gitattributes &&
 212        prepare_output &&
 213
 214        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
 220'
 221
 222test_expect_success 'with cr-at-eol' '
 223
 224        rm -f .gitattributes &&
 225        git config core.whitespace cr-at-eol &&
 226        prepare_output &&
 227
 228        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
 234'
 235
 236test_expect_success 'with cr-at-eol (attribute)' '
 237
 238        test_might_fail git config --unset core.whitespace &&
 239        echo "F whitespace=trailing,cr-at-eol" >.gitattributes &&
 240        prepare_output &&
 241
 242        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
 248'
 249
 250test_expect_success 'trailing empty lines (1)' '
 251
 252        rm -f .gitattributes &&
 253        test_must_fail git diff --check >output &&
 254        grep "new blank line at" output &&
 255        grep "trailing whitespace" output
 256
 257'
 258
 259test_expect_success 'trailing empty lines (2)' '
 260
 261        echo "F -whitespace" >.gitattributes &&
 262        git diff --check >output &&
 263        test_must_be_empty output
 264
 265'
 266
 267test_expect_success 'checkdiff shows correct line number for trailing blank lines' '
 268
 269        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
 274'
 275
 276test_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
 286'
 287
 288test_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'
 296
 297test_done