t / t4015-diff-whitespace.shon commit Merge branch 'bc/xdiffnl' (bc36540)
   1#!/bin/sh
   2#
   3# Copyright (c) 2006 Johannes E. Schindelin
   4#
   5
   6test_description='Test special whitespace in diff engine.
   7
   8'
   9. ./test-lib.sh
  10. "$TEST_DIRECTORY"/diff-lib.sh
  11
  12# Ray Lehtiniemi's example
  13
  14cat << EOF > x
  15do {
  16   nothing;
  17} while (0);
  18EOF
  19
  20git update-index --add x
  21
  22cat << EOF > x
  23do
  24{
  25   nothing;
  26}
  27while (0);
  28EOF
  29
  30cat << EOF > expect
  31diff --git a/x b/x
  32index adf3937..6edc172 100644
  33--- a/x
  34+++ b/x
  35@@ -1,3 +1,5 @@
  36-do {
  37+do
  38+{
  39    nothing;
  40-} while (0);
  41+}
  42+while (0);
  43EOF
  44
  45git diff > out
  46test_expect_success "Ray's example without options" 'test_cmp expect out'
  47
  48git diff -w > out
  49test_expect_success "Ray's example with -w" 'test_cmp expect out'
  50
  51git diff -b > out
  52test_expect_success "Ray's example with -b" 'test_cmp expect out'
  53
  54tr 'Q' '\015' << EOF > x
  55whitespace at beginning
  56whitespace change
  57whitespace in the middle
  58whitespace at end
  59unchanged line
  60CR at endQ
  61EOF
  62
  63git update-index x
  64
  65tr '_' ' ' << EOF > x
  66        whitespace at beginning
  67whitespace       change
  68white space in the middle
  69whitespace at end__
  70unchanged line
  71CR at end
  72EOF
  73
  74tr 'Q_' '\015 ' << EOF > expect
  75diff --git a/x b/x
  76index d99af23..8b32fb5 100644
  77--- a/x
  78+++ b/x
  79@@ -1,6 +1,6 @@
  80-whitespace at beginning
  81-whitespace change
  82-whitespace in the middle
  83-whitespace at end
  84+       whitespace at beginning
  85+whitespace      change
  86+white space in the middle
  87+whitespace at end__
  88 unchanged line
  89-CR at endQ
  90+CR at end
  91EOF
  92git diff > out
  93test_expect_success 'another test, without options' 'test_cmp expect out'
  94
  95cat << EOF > expect
  96diff --git a/x b/x
  97index d99af23..8b32fb5 100644
  98EOF
  99git diff -w > out
 100test_expect_success 'another test, with -w' 'test_cmp expect out'
 101
 102tr 'Q' '\015' << EOF > expect
 103diff --git a/x b/x
 104index d99af23..8b32fb5 100644
 105--- a/x
 106+++ b/x
 107@@ -1,6 +1,6 @@
 108-whitespace at beginning
 109+       whitespace at beginning
 110 whitespace change
 111-whitespace in the middle
 112+white space in the middle
 113 whitespace at end
 114 unchanged line
 115 CR at endQ
 116EOF
 117git diff -b > out
 118test_expect_success 'another test, with -b' 'test_cmp expect out'
 119
 120test_expect_success 'check mixed spaces and tabs in indent' '
 121
 122        # This is indented with SP HT SP.
 123        echo "   foo();" > x &&
 124        git diff --check | grep "space before tab in indent"
 125
 126'
 127
 128test_expect_success 'check mixed tabs and spaces in indent' '
 129
 130        # This is indented with HT SP HT.
 131        echo "          foo();" > x &&
 132        git diff --check | grep "space before tab in indent"
 133
 134'
 135
 136test_expect_success 'check with no whitespace errors' '
 137
 138        git commit -m "snapshot" &&
 139        echo "foo();" > x &&
 140        git diff --check
 141
 142'
 143
 144test_expect_success 'check with trailing whitespace' '
 145
 146        echo "foo(); " > x &&
 147        test_must_fail git diff --check
 148
 149'
 150
 151test_expect_success 'check with space before tab in indent' '
 152
 153        # indent has space followed by hard tab
 154        echo "  foo();" > x &&
 155        test_must_fail git diff --check
 156
 157'
 158
 159test_expect_success '--check and --exit-code are not exclusive' '
 160
 161        git checkout x &&
 162        git diff --check --exit-code
 163
 164'
 165
 166test_expect_success '--check and --quiet are not exclusive' '
 167
 168        git diff --check --quiet
 169
 170'
 171
 172test_expect_success 'check staged with no whitespace errors' '
 173
 174        echo "foo();" > x &&
 175        git add x &&
 176        git diff --cached --check
 177
 178'
 179
 180test_expect_success 'check staged with trailing whitespace' '
 181
 182        echo "foo(); " > x &&
 183        git add x &&
 184        test_must_fail git diff --cached --check
 185
 186'
 187
 188test_expect_success 'check staged with space before tab in indent' '
 189
 190        # indent has space followed by hard tab
 191        echo "  foo();" > x &&
 192        git add x &&
 193        test_must_fail git diff --cached --check
 194
 195'
 196
 197test_expect_success 'check with no whitespace errors (diff-index)' '
 198
 199        echo "foo();" > x &&
 200        git add x &&
 201        git diff-index --check HEAD
 202
 203'
 204
 205test_expect_success 'check with trailing whitespace (diff-index)' '
 206
 207        echo "foo(); " > x &&
 208        git add x &&
 209        test_must_fail git diff-index --check HEAD
 210
 211'
 212
 213test_expect_success 'check with space before tab in indent (diff-index)' '
 214
 215        # indent has space followed by hard tab
 216        echo "  foo();" > x &&
 217        git add x &&
 218        test_must_fail git diff-index --check HEAD
 219
 220'
 221
 222test_expect_success 'check staged with no whitespace errors (diff-index)' '
 223
 224        echo "foo();" > x &&
 225        git add x &&
 226        git diff-index --cached --check HEAD
 227
 228'
 229
 230test_expect_success 'check staged with trailing whitespace (diff-index)' '
 231
 232        echo "foo(); " > x &&
 233        git add x &&
 234        test_must_fail git diff-index --cached --check HEAD
 235
 236'
 237
 238test_expect_success 'check staged with space before tab in indent (diff-index)' '
 239
 240        # indent has space followed by hard tab
 241        echo "  foo();" > x &&
 242        git add x &&
 243        test_must_fail git diff-index --cached --check HEAD
 244
 245'
 246
 247test_expect_success 'check with no whitespace errors (diff-tree)' '
 248
 249        echo "foo();" > x &&
 250        git commit -m "new commit" x &&
 251        git diff-tree --check HEAD^ HEAD
 252
 253'
 254
 255test_expect_success 'check with trailing whitespace (diff-tree)' '
 256
 257        echo "foo(); " > x &&
 258        git commit -m "another commit" x &&
 259        test_must_fail git diff-tree --check HEAD^ HEAD
 260
 261'
 262
 263test_expect_success 'check with space before tab in indent (diff-tree)' '
 264
 265        # indent has space followed by hard tab
 266        echo "  foo();" > x &&
 267        git commit -m "yet another" x &&
 268        test_must_fail git diff-tree --check HEAD^ HEAD
 269
 270'
 271
 272test_expect_success 'check trailing whitespace (trailing-space: off)' '
 273
 274        git config core.whitespace "-trailing-space" &&
 275        echo "foo ();   " > x &&
 276        git diff --check
 277
 278'
 279
 280test_expect_success 'check trailing whitespace (trailing-space: on)' '
 281
 282        git config core.whitespace "trailing-space" &&
 283        echo "foo ();   " > x &&
 284        test_must_fail git diff --check
 285
 286'
 287
 288test_expect_success 'check space before tab in indent (space-before-tab: off)' '
 289
 290        # indent contains space followed by HT
 291        git config core.whitespace "-space-before-tab" &&
 292        echo "  foo ();" > x &&
 293        git diff --check
 294
 295'
 296
 297test_expect_success 'check space before tab in indent (space-before-tab: on)' '
 298
 299        # indent contains space followed by HT
 300        git config core.whitespace "space-before-tab" &&
 301        echo "  foo ();   " > x &&
 302        test_must_fail git diff --check
 303
 304'
 305
 306test_expect_success 'check spaces as indentation (indent-with-non-tab: off)' '
 307
 308        git config core.whitespace "-indent-with-non-tab"
 309        echo "        foo ();" > x &&
 310        git diff --check
 311
 312'
 313
 314test_expect_success 'check spaces as indentation (indent-with-non-tab: on)' '
 315
 316        git config core.whitespace "indent-with-non-tab" &&
 317        echo "        foo ();" > x &&
 318        test_must_fail git diff --check
 319
 320'
 321
 322test_expect_success 'check tabs and spaces as indentation (indent-with-non-tab: on)' '
 323
 324        git config core.whitespace "indent-with-non-tab" &&
 325        echo "                  foo ();" > x &&
 326        test_must_fail git diff --check
 327
 328'
 329
 330test_expect_success 'line numbers in --check output are correct' '
 331
 332        echo "" > x &&
 333        echo "foo(); " >> x &&
 334        git diff --check | grep "x:2:"
 335
 336'
 337
 338test_expect_success 'checkdiff detects trailing blank lines' '
 339        echo "foo();" >x &&
 340        echo "" >>x &&
 341        git diff --check | grep "ends with blank"
 342'
 343
 344test_expect_success 'checkdiff allows new blank lines' '
 345        git checkout x &&
 346        mv x y &&
 347        (
 348                echo "/* This is new */" &&
 349                echo "" &&
 350                cat y
 351        ) >x &&
 352        git diff --check
 353'
 354
 355test_expect_success 'combined diff with autocrlf conversion' '
 356
 357        git reset --hard &&
 358        echo >x hello &&
 359        git commit -m "one side" x &&
 360        git checkout HEAD^ &&
 361        echo >x goodbye &&
 362        git commit -m "the other side" x &&
 363        git config core.autocrlf true &&
 364        test_must_fail git merge master &&
 365
 366        git diff | sed -e "1,/^@@@/d" >actual &&
 367        ! grep "^-" actual
 368
 369'
 370
 371test_done