t / t4038-diff-combined.shon commit checkout: advice how to get out of detached HEAD mode (af9ded5)
   1#!/bin/sh
   2
   3test_description='combined diff'
   4
   5. ./test-lib.sh
   6. "$TEST_DIRECTORY"/diff-lib.sh
   7
   8setup_helper () {
   9        one=$1 branch=$2 side=$3 &&
  10
  11        git branch $side $branch &&
  12        for l in $one two three fyra
  13        do
  14                echo $l
  15        done >file &&
  16        git add file &&
  17        test_tick &&
  18        git commit -m $branch &&
  19        git checkout $side &&
  20        for l in $one two three quatro
  21        do
  22                echo $l
  23        done >file &&
  24        git add file &&
  25        test_tick &&
  26        git commit -m $side &&
  27        test_must_fail git merge $branch &&
  28        for l in $one three four
  29        do
  30                echo $l
  31        done >file &&
  32        git add file &&
  33        test_tick &&
  34        git commit -m "merge $branch into $side"
  35}
  36
  37verify_helper () {
  38        it=$1 &&
  39
  40        # Ignore lines that were removed only from the other parent
  41        sed -e '
  42                1,/^@@@/d
  43                /^ -/d
  44                s/^\(.\)./\1/
  45        ' "$it" >"$it.actual.1" &&
  46        sed -e '
  47                1,/^@@@/d
  48                /^- /d
  49                s/^.\(.\)/\1/
  50        ' "$it" >"$it.actual.2" &&
  51
  52        git diff "$it^" "$it" -- | sed -e '1,/^@@/d' >"$it.expect.1" &&
  53        test_cmp "$it.expect.1" "$it.actual.1" &&
  54
  55        git diff "$it^2" "$it" -- | sed -e '1,/^@@/d' >"$it.expect.2" &&
  56        test_cmp "$it.expect.2" "$it.actual.2"
  57}
  58
  59test_expect_success setup '
  60        >file &&
  61        git add file &&
  62        test_tick &&
  63        git commit -m initial &&
  64
  65        git branch withone &&
  66        git branch sansone &&
  67
  68        git checkout withone &&
  69        setup_helper one withone sidewithone &&
  70
  71        git checkout sansone &&
  72        setup_helper "" sansone sidesansone
  73'
  74
  75test_expect_success 'check combined output (1)' '
  76        git show sidewithone -- >sidewithone &&
  77        verify_helper sidewithone
  78'
  79
  80test_expect_success 'check combined output (2)' '
  81        git show sidesansone -- >sidesansone &&
  82        verify_helper sidesansone
  83'
  84
  85test_expect_success 'diagnose truncated file' '
  86        >file &&
  87        git add file &&
  88        git commit --amend -C HEAD &&
  89        git show >out &&
  90        grep "diff --cc file" out
  91'
  92
  93test_expect_success 'setup for --cc --raw' '
  94        blob=$(echo file | git hash-object --stdin -w) &&
  95        base_tree=$(echo "100644 blob $blob     file" | git mktree) &&
  96        trees= &&
  97        for i in $(test_seq 1 40)
  98        do
  99                blob=$(echo file$i | git hash-object --stdin -w) &&
 100                trees="$trees$(echo "100644 blob $blob  file" | git mktree)$LF"
 101        done
 102'
 103
 104test_expect_success 'check --cc --raw with four trees' '
 105        four_trees=$(echo "$trees" | sed -e 4q) &&
 106        git diff --cc --raw $four_trees $base_tree >out &&
 107        # Check for four leading colons in the output:
 108        grep "^::::[^:]" out
 109'
 110
 111test_expect_success 'check --cc --raw with forty trees' '
 112        git diff --cc --raw $trees $base_tree >out &&
 113        # Check for forty leading colons in the output:
 114        grep "^::::::::::::::::::::::::::::::::::::::::[^:]" out
 115'
 116
 117test_expect_success 'setup combined ignore spaces' '
 118        git checkout master &&
 119        >test &&
 120        git add test &&
 121        git commit -m initial &&
 122
 123        tr -d Q <<-\EOF >test &&
 124        always coalesce
 125        eol space coalesce Q
 126        space  change coalesce
 127        all spa ces coalesce
 128        eol spaces Q
 129        space  change
 130        all spa ces
 131        EOF
 132        git commit -m "test space change" -a &&
 133
 134        git checkout -b side HEAD^ &&
 135        tr -d Q <<-\EOF >test &&
 136        always coalesce
 137        eol space coalesce
 138        space change coalesce
 139        all spaces coalesce
 140        eol spaces
 141        space change
 142        all spaces
 143        EOF
 144        git commit -m "test other space changes" -a &&
 145
 146        test_must_fail git merge master &&
 147        tr -d Q <<-\EOF >test &&
 148        eol spaces Q
 149        space  change
 150        all spa ces
 151        EOF
 152        git commit -m merged -a
 153'
 154
 155test_expect_success 'check combined output (no ignore space)' '
 156        git show >actual.tmp &&
 157        sed -e "1,/^@@@/d" < actual.tmp >actual &&
 158        tr -d Q <<-\EOF >expected &&
 159        --always coalesce
 160        - eol space coalesce
 161        - space change coalesce
 162        - all spaces coalesce
 163        - eol spaces
 164        - space change
 165        - all spaces
 166         -eol space coalesce Q
 167         -space  change coalesce
 168         -all spa ces coalesce
 169        + eol spaces Q
 170        + space  change
 171        + all spa ces
 172        EOF
 173        compare_diff_patch expected actual
 174'
 175
 176test_expect_success 'check combined output (ignore space at eol)' '
 177        git show --ignore-space-at-eol >actual.tmp &&
 178        sed -e "1,/^@@@/d" < actual.tmp >actual &&
 179        tr -d Q <<-\EOF >expected &&
 180        --always coalesce
 181        --eol space coalesce
 182        - space change coalesce
 183        - all spaces coalesce
 184         -space  change coalesce
 185         -all spa ces coalesce
 186          eol spaces Q
 187        - space change
 188        - all spaces
 189        + space  change
 190        + all spa ces
 191        EOF
 192        compare_diff_patch expected actual
 193'
 194
 195test_expect_success 'check combined output (ignore space change)' '
 196        git show -b >actual.tmp &&
 197        sed -e "1,/^@@@/d" < actual.tmp >actual &&
 198        tr -d Q <<-\EOF >expected &&
 199        --always coalesce
 200        --eol space coalesce
 201        --space change coalesce
 202        - all spaces coalesce
 203         -all spa ces coalesce
 204          eol spaces Q
 205          space  change
 206        - all spaces
 207        + all spa ces
 208        EOF
 209        compare_diff_patch expected actual
 210'
 211
 212test_expect_success 'check combined output (ignore all spaces)' '
 213        git show -w >actual.tmp &&
 214        sed -e "1,/^@@@/d" < actual.tmp >actual &&
 215        tr -d Q <<-\EOF >expected &&
 216        --always coalesce
 217        --eol space coalesce
 218        --space change coalesce
 219        --all spaces coalesce
 220          eol spaces Q
 221          space  change
 222          all spa ces
 223        EOF
 224        compare_diff_patch expected actual
 225'
 226
 227test_expect_success 'combine diff coalesce simple' '
 228        >test &&
 229        git add test &&
 230        git commit -m initial &&
 231        test_seq 4 >test &&
 232        git commit -a -m empty1 &&
 233        git branch side1 &&
 234        git checkout HEAD^ &&
 235        test_seq 5 >test &&
 236        git commit -a -m empty2 &&
 237        test_must_fail git merge side1 &&
 238        >test &&
 239        git commit -a -m merge &&
 240        git show >actual.tmp &&
 241        sed -e "1,/^@@@/d" < actual.tmp >actual &&
 242        tr -d Q <<-\EOF >expected &&
 243        --1
 244        --2
 245        --3
 246        --4
 247        - 5
 248        EOF
 249        compare_diff_patch expected actual
 250'
 251
 252test_expect_success 'combine diff coalesce tricky' '
 253        >test &&
 254        git add test &&
 255        git commit -m initial --allow-empty &&
 256        cat <<-\EOF >test &&
 257        3
 258        1
 259        2
 260        3
 261        4
 262        EOF
 263        git commit -a -m empty1 &&
 264        git branch -f side1 &&
 265        git checkout HEAD^ &&
 266        cat <<-\EOF >test &&
 267        1
 268        3
 269        5
 270        4
 271        EOF
 272        git commit -a -m empty2 &&
 273        git branch -f side2 &&
 274        test_must_fail git merge side1 &&
 275        >test &&
 276        git commit -a -m merge &&
 277        git show >actual.tmp &&
 278        sed -e "1,/^@@@/d" < actual.tmp >actual &&
 279        tr -d Q <<-\EOF >expected &&
 280         -3
 281        --1
 282         -2
 283        --3
 284        - 5
 285        --4
 286        EOF
 287        compare_diff_patch expected actual &&
 288        git checkout -f side1 &&
 289        test_must_fail git merge side2 &&
 290        >test &&
 291        git commit -a -m merge &&
 292        git show >actual.tmp &&
 293        sed -e "1,/^@@@/d" < actual.tmp >actual &&
 294        tr -d Q <<-\EOF >expected &&
 295        - 3
 296        --1
 297        - 2
 298        --3
 299         -5
 300        --4
 301        EOF
 302        compare_diff_patch expected actual
 303'
 304
 305test_expect_failure 'combine diff coalesce three parents' '
 306        >test &&
 307        git add test &&
 308        git commit -m initial --allow-empty &&
 309        cat <<-\EOF >test &&
 310        3
 311        1
 312        2
 313        3
 314        4
 315        EOF
 316        git commit -a -m empty1 &&
 317        git checkout -B side1 &&
 318        git checkout HEAD^ &&
 319        cat <<-\EOF >test &&
 320        1
 321        3
 322        7
 323        5
 324        4
 325        EOF
 326        git commit -a -m empty2 &&
 327        git branch -f side2 &&
 328        git checkout HEAD^ &&
 329        cat <<-\EOF >test &&
 330        3
 331        1
 332        6
 333        5
 334        4
 335        EOF
 336        git commit -a -m empty3 &&
 337        >test &&
 338        git add test &&
 339        TREE=$(git write-tree) &&
 340        COMMIT=$(git commit-tree -p HEAD -p side1 -p side2 -m merge $TREE) &&
 341        git show $COMMIT >actual.tmp &&
 342        sed -e "1,/^@@@/d" < actual.tmp >actual &&
 343        tr -d Q <<-\EOF >expected &&
 344        -- 3
 345        ---1
 346        -  6
 347         - 2
 348         --3
 349          -7
 350        - -5
 351        ---4
 352        EOF
 353        compare_diff_patch expected actual
 354'
 355
 356# Test for a bug reported at
 357# https://public-inbox.org/git/20130515143508.GO25742@login.drsnuggles.stderr.nl/
 358# where a delete lines were missing from combined diff output when they
 359# occurred exactly before the context lines of a later change.
 360test_expect_success 'combine diff missing delete bug' '
 361        git commit -m initial --allow-empty &&
 362        cat <<-\EOF >test &&
 363        1
 364        2
 365        3
 366        4
 367        EOF
 368        git add test &&
 369        git commit -a -m side1 &&
 370        git checkout -B side1 &&
 371        git checkout HEAD^ &&
 372        cat <<-\EOF >test &&
 373        0
 374        1
 375        2
 376        3
 377        4modified
 378        EOF
 379        git add test &&
 380        git commit -m side2 &&
 381        git branch -f side2 &&
 382        test_must_fail git merge --no-commit side1 &&
 383        cat <<-\EOF >test &&
 384        1
 385        2
 386        3
 387        4modified
 388        EOF
 389        git add test &&
 390        git commit -a -m merge &&
 391        git diff-tree -c -p HEAD >actual.tmp &&
 392        sed -e "1,/^@@@/d" < actual.tmp >actual &&
 393        tr -d Q <<-\EOF >expected &&
 394        - 0
 395          1
 396          2
 397          3
 398         -4
 399         +4modified
 400        EOF
 401        compare_diff_patch expected actual
 402'
 403
 404test_expect_success 'combine diff gets tree sorting right' '
 405        # create a directory and a file that sort differently in trees
 406        # versus byte-wise (implied "/" sorts after ".")
 407        git checkout -f master &&
 408        mkdir foo &&
 409        echo base >foo/one &&
 410        echo base >foo/two &&
 411        echo base >foo.ext &&
 412        git add foo foo.ext &&
 413        git commit -m base &&
 414
 415        # one side modifies a file in the directory, along with the root
 416        # file...
 417        echo master >foo/one &&
 418        echo master >foo.ext &&
 419        git commit -a -m master &&
 420
 421        # the other side modifies the other file in the directory
 422        git checkout -b other HEAD^ &&
 423        echo other >foo/two &&
 424        git commit -a -m other &&
 425
 426        # And now we merge. The files in the subdirectory will resolve cleanly,
 427        # meaning that a combined diff will not find them interesting. But it
 428        # will find the tree itself interesting, because it had to be merged.
 429        git checkout master &&
 430        git merge other &&
 431
 432        printf "MM\tfoo\n" >expect &&
 433        git diff-tree -c --name-status -t HEAD >actual.tmp &&
 434        sed 1d <actual.tmp >actual &&
 435        test_cmp expect actual
 436'
 437
 438test_expect_success 'setup for --combined-all-paths' '
 439        git branch side1c &&
 440        git branch side2c &&
 441        git checkout side1c &&
 442        test_seq 1 10 >filename-side1c &&
 443        git add filename-side1c &&
 444        git commit -m with &&
 445        git checkout side2c &&
 446        test_seq 1 9 >filename-side2c &&
 447        echo ten >>filename-side2c &&
 448        git add filename-side2c &&
 449        git commit -m iam &&
 450        git checkout -b mergery side1c &&
 451        git merge --no-commit side2c &&
 452        git rm filename-side1c &&
 453        echo eleven >>filename-side2c &&
 454        git mv filename-side2c filename-merged &&
 455        git add filename-merged &&
 456        git commit
 457'
 458
 459test_expect_success '--combined-all-paths and --raw' '
 460        cat <<-\EOF >expect &&
 461        ::100644 100644 100644 f00c965d8307308469e537302baa73048488f162 088bd5d92c2a8e0203ca8e7e4c2a5c692f6ae3f7 333b9c62519f285e1854830ade0fe1ef1d40ee1b RR    filename-side1c filename-side2c filename-merged
 462        EOF
 463        git diff-tree -c -M --raw --combined-all-paths HEAD >actual.tmp &&
 464        sed 1d <actual.tmp >actual &&
 465        test_cmp expect actual
 466'
 467
 468test_expect_success '--combined-all-paths and --cc' '
 469        cat <<-\EOF >expect &&
 470        --- a/filename-side1c
 471        --- a/filename-side2c
 472        +++ b/filename-merged
 473        EOF
 474        git diff-tree --cc -M --combined-all-paths HEAD >actual.tmp &&
 475        grep ^[-+][-+][-+] <actual.tmp >actual &&
 476        test_cmp expect actual
 477'
 478
 479test_expect_success FUNNYNAMES 'setup for --combined-all-paths with funny names' '
 480        git branch side1d &&
 481        git branch side2d &&
 482        git checkout side1d &&
 483        test_seq 1 10 >$(printf "file\twith\ttabs") &&
 484        git add file* &&
 485        git commit -m with &&
 486        git checkout side2d &&
 487        test_seq 1 9 >$(printf "i\tam\ttabbed") &&
 488        echo ten >>$(printf "i\tam\ttabbed") &&
 489        git add *tabbed &&
 490        git commit -m iam &&
 491        git checkout -b funny-names-mergery side1d &&
 492        git merge --no-commit side2d &&
 493        git rm *tabs &&
 494        echo eleven >>$(printf "i\tam\ttabbed") &&
 495        git mv "$(printf "i\tam\ttabbed")" "$(printf "fickle\tnaming")" &&
 496        git add fickle* &&
 497        git commit
 498'
 499
 500test_expect_success FUNNYNAMES '--combined-all-paths and --raw and funny names' '
 501        cat <<-\EOF >expect &&
 502        ::100644 100644 100644 f00c965d8307308469e537302baa73048488f162 088bd5d92c2a8e0203ca8e7e4c2a5c692f6ae3f7 333b9c62519f285e1854830ade0fe1ef1d40ee1b RR    "file\twith\ttabs"      "i\tam\ttabbed" "fickle\tnaming"
 503        EOF
 504        git diff-tree -c -M --raw --combined-all-paths HEAD >actual.tmp &&
 505        sed 1d <actual.tmp >actual &&
 506        test_cmp expect actual
 507'
 508
 509test_expect_success FUNNYNAMES '--combined-all-paths and --raw -and -z and funny names' '
 510        printf "aaf8087c3cbd4db8e185a2d074cf27c53cfb75d7\0::100644 100644 100644 f00c965d8307308469e537302baa73048488f162 088bd5d92c2a8e0203ca8e7e4c2a5c692f6ae3f7 333b9c62519f285e1854830ade0fe1ef1d40ee1b RR\0file\twith\ttabs\0i\tam\ttabbed\0fickle\tnaming\0" >expect &&
 511        git diff-tree -c -M --raw --combined-all-paths -z HEAD >actual &&
 512        test_cmp -a expect actual
 513'
 514
 515test_expect_success FUNNYNAMES '--combined-all-paths and --cc and funny names' '
 516        cat <<-\EOF >expect &&
 517        --- "a/file\twith\ttabs"
 518        --- "a/i\tam\ttabbed"
 519        +++ "b/fickle\tnaming"
 520        EOF
 521        git diff-tree --cc -M --combined-all-paths HEAD >actual.tmp &&
 522        grep ^[-+][-+][-+] <actual.tmp >actual &&
 523        test_cmp expect actual
 524'
 525
 526test_done