t / t4200-rerere.shon commit merge-recursive --patience (58a1ece)
   1#!/bin/sh
   2#
   3# Copyright (c) 2006 Johannes E. Schindelin
   4#
   5
   6test_description='git rerere
   7
   8! [fifth] version1
   9 ! [first] first
  10  ! [fourth] version1
  11   ! [master] initial
  12    ! [second] prefer first over second
  13     ! [third] version2
  14------
  15     + [third] version2
  16+      [fifth] version1
  17  +    [fourth] version1
  18+ +  + [third^] third
  19    -  [second] prefer first over second
  20 +  +  [first] first
  21    +  [second^] second
  22++++++ [master] initial
  23'
  24
  25. ./test-lib.sh
  26
  27test_expect_success 'setup' '
  28        cat >a1 <<-\EOF &&
  29        Some title
  30        ==========
  31        Whether '\''tis nobler in the mind to suffer
  32        The slings and arrows of outrageous fortune,
  33        Or to take arms against a sea of troubles,
  34        And by opposing end them? To die: to sleep;
  35        No more; and by a sleep to say we end
  36        The heart-ache and the thousand natural shocks
  37        That flesh is heir to, '\''tis a consummation
  38        Devoutly to be wish'\''d.
  39        EOF
  40
  41        git add a1 &&
  42        test_tick &&
  43        git commit -q -a -m initial &&
  44
  45        cat >>a1 <<-\EOF &&
  46        Some title
  47        ==========
  48        To die, to sleep;
  49        To sleep: perchance to dream: ay, there'\''s the rub;
  50        For in that sleep of death what dreams may come
  51        When we have shuffled off this mortal coil,
  52        Must give us pause: there'\''s the respect
  53        That makes calamity of so long life;
  54        EOF
  55
  56        git checkout -b first &&
  57        test_tick &&
  58        git commit -q -a -m first &&
  59
  60        git checkout -b second master &&
  61        git show first:a1 |
  62        sed -e "s/To die, t/To die! T/" -e "s/Some title/Some Title/" >a1 &&
  63        echo "* END *" >>a1 &&
  64        test_tick &&
  65        git commit -q -a -m second
  66'
  67
  68test_expect_success 'nothing recorded without rerere' '
  69        rm -rf .git/rr-cache &&
  70        git config rerere.enabled false &&
  71        test_must_fail git merge first &&
  72        ! test -d .git/rr-cache
  73'
  74
  75test_expect_success 'activate rerere, old style (conflicting merge)' '
  76        git reset --hard &&
  77        mkdir .git/rr-cache &&
  78        test_might_fail git config --unset rerere.enabled &&
  79        test_must_fail git merge first &&
  80
  81        sha1=$(perl -pe "s/     .*//" .git/MERGE_RR) &&
  82        rr=.git/rr-cache/$sha1 &&
  83        grep "^=======\$" $rr/preimage &&
  84        ! test -f $rr/postimage &&
  85        ! test -f $rr/thisimage
  86'
  87
  88test_expect_success 'rerere.enabled works, too' '
  89        rm -rf .git/rr-cache &&
  90        git config rerere.enabled true &&
  91        git reset --hard &&
  92        test_must_fail git merge first &&
  93
  94        sha1=$(perl -pe "s/     .*//" .git/MERGE_RR) &&
  95        rr=.git/rr-cache/$sha1 &&
  96        grep ^=======$ $rr/preimage
  97'
  98
  99test_expect_success 'set up rr-cache' '
 100        rm -rf .git/rr-cache &&
 101        git config rerere.enabled true &&
 102        git reset --hard &&
 103        test_must_fail git merge first &&
 104        sha1=$(perl -pe "s/     .*//" .git/MERGE_RR) &&
 105        rr=.git/rr-cache/$sha1
 106'
 107
 108test_expect_success 'rr-cache looks sane' '
 109        # no postimage or thisimage yet
 110        ! test -f $rr/postimage &&
 111        ! test -f $rr/thisimage &&
 112
 113        # preimage has right number of lines
 114        cnt=$(sed -ne "/^<<<<<<</,/^>>>>>>>/p" $rr/preimage | wc -l) &&
 115        echo $cnt &&
 116        test $cnt = 13
 117'
 118
 119test_expect_success 'rerere diff' '
 120        git show first:a1 >a1 &&
 121        cat >expect <<-\EOF &&
 122        --- a/a1
 123        +++ b/a1
 124        @@ -1,4 +1,4 @@
 125        -Some Title
 126        +Some title
 127         ==========
 128         Whether '\''tis nobler in the mind to suffer
 129         The slings and arrows of outrageous fortune,
 130        @@ -8,21 +8,11 @@
 131         The heart-ache and the thousand natural shocks
 132         That flesh is heir to, '\''tis a consummation
 133         Devoutly to be wish'\''d.
 134        -<<<<<<<
 135        -Some Title
 136        -==========
 137        -To die! To sleep;
 138        -=======
 139         Some title
 140         ==========
 141         To die, to sleep;
 142        ->>>>>>>
 143         To sleep: perchance to dream: ay, there'\''s the rub;
 144         For in that sleep of death what dreams may come
 145         When we have shuffled off this mortal coil,
 146         Must give us pause: there'\''s the respect
 147         That makes calamity of so long life;
 148        -<<<<<<<
 149        -=======
 150        -* END *
 151        ->>>>>>>
 152        EOF
 153        git rerere diff >out &&
 154        test_cmp expect out
 155'
 156
 157test_expect_success 'rerere status' '
 158        echo a1 >expect &&
 159        git rerere status >out &&
 160        test_cmp expect out
 161'
 162
 163test_expect_success 'first postimage wins' '
 164        git show first:a1 | sed "s/To die: t/To die! T/" >expect &&
 165
 166        git commit -q -a -m "prefer first over second" &&
 167        test -f $rr/postimage &&
 168
 169        git checkout -b third master &&
 170        git show second^:a1 | sed "s/To die: t/To die! T/" >a1 &&
 171        git commit -q -a -m third &&
 172
 173        test_must_fail git pull . first &&
 174        # rerere kicked in
 175        ! grep "^=======\$" a1 &&
 176        test_cmp expect a1
 177'
 178
 179test_expect_success 'rerere clear' '
 180        rm $rr/postimage &&
 181        echo "$sha1     a1" | perl -pe "y/\012/\000/" >.git/MERGE_RR &&
 182        git rerere clear &&
 183        ! test -d $rr
 184'
 185
 186test_expect_success 'set up for garbage collection tests' '
 187        mkdir -p $rr &&
 188        echo Hello >$rr/preimage &&
 189        echo World >$rr/postimage &&
 190
 191        sha2=4000000000000000000000000000000000000000 &&
 192        rr2=.git/rr-cache/$sha2 &&
 193        mkdir $rr2 &&
 194        echo Hello >$rr2/preimage &&
 195
 196        almost_15_days_ago=$((60-15*86400)) &&
 197        just_over_15_days_ago=$((-1-15*86400)) &&
 198        almost_60_days_ago=$((60-60*86400)) &&
 199        just_over_60_days_ago=$((-1-60*86400)) &&
 200
 201        test-chmtime =$almost_60_days_ago $rr/preimage &&
 202        test-chmtime =$almost_15_days_ago $rr2/preimage
 203'
 204
 205test_expect_success 'garbage collection preserves young records' '
 206        git rerere gc &&
 207        test -f $rr/preimage &&
 208        test -f $rr2/preimage
 209'
 210
 211test_expect_success 'old records rest in peace' '
 212        test-chmtime =$just_over_60_days_ago $rr/preimage &&
 213        test-chmtime =$just_over_15_days_ago $rr2/preimage &&
 214        git rerere gc &&
 215        ! test -f $rr/preimage &&
 216        ! test -f $rr2/preimage
 217'
 218
 219test_expect_success 'setup: file2 added differently in two branches' '
 220        git reset --hard &&
 221
 222        git checkout -b fourth &&
 223        echo Hallo >file2 &&
 224        git add file2 &&
 225        test_tick &&
 226        git commit -m version1 &&
 227
 228        git checkout third &&
 229        echo Bello >file2 &&
 230        git add file2 &&
 231        test_tick &&
 232        git commit -m version2 &&
 233
 234        test_must_fail git merge fourth &&
 235        echo Cello >file2 &&
 236        git add file2 &&
 237        git commit -m resolution
 238'
 239
 240test_expect_success 'resolution was recorded properly' '
 241        echo Cello >expected &&
 242
 243        git reset --hard HEAD~2 &&
 244        git checkout -b fifth &&
 245
 246        echo Hallo >file3 &&
 247        git add file3 &&
 248        test_tick &&
 249        git commit -m version1 &&
 250
 251        git checkout third &&
 252        echo Bello >file3 &&
 253        git add file3 &&
 254        test_tick &&
 255        git commit -m version2 &&
 256        git tag version2 &&
 257
 258        test_must_fail git merge fifth &&
 259        test_cmp expected file3 &&
 260        test_must_fail git update-index --refresh
 261'
 262
 263test_expect_success 'rerere.autoupdate' '
 264        git config rerere.autoupdate true &&
 265        git reset --hard &&
 266        git checkout version2 &&
 267        test_must_fail git merge fifth &&
 268        git update-index --refresh
 269'
 270
 271test_expect_success 'merge --rerere-autoupdate' '
 272        test_might_fail git config --unset rerere.autoupdate &&
 273        git reset --hard &&
 274        git checkout version2 &&
 275        test_must_fail git merge --rerere-autoupdate fifth &&
 276        git update-index --refresh
 277'
 278
 279test_expect_success 'merge --no-rerere-autoupdate' '
 280        headblob=$(git rev-parse version2:file3) &&
 281        mergeblob=$(git rev-parse fifth:file3) &&
 282        cat >expected <<-EOF &&
 283        100644 $headblob 2      file3
 284        100644 $mergeblob 3     file3
 285        EOF
 286
 287        git config rerere.autoupdate true &&
 288        git reset --hard &&
 289        git checkout version2 &&
 290        test_must_fail git merge --no-rerere-autoupdate fifth &&
 291        git ls-files -u >actual &&
 292        test_cmp expected actual
 293'
 294
 295test_expect_success 'set up an unresolved merge' '
 296        headblob=$(git rev-parse version2:file3) &&
 297        mergeblob=$(git rev-parse fifth:file3) &&
 298        cat >expected.unresolved <<-EOF &&
 299        100644 $headblob 2      file3
 300        100644 $mergeblob 3     file3
 301        EOF
 302
 303        test_might_fail git config --unset rerere.autoupdate &&
 304        git reset --hard &&
 305        git checkout version2 &&
 306        fifth=$(git rev-parse fifth) &&
 307        echo "$fifth            branch 'fifth' of ." |
 308        git fmt-merge-msg >msg &&
 309        ancestor=$(git merge-base version2 fifth) &&
 310        test_must_fail git merge-recursive "$ancestor" -- HEAD fifth &&
 311
 312        git ls-files --stage >failedmerge &&
 313        cp file3 file3.conflict &&
 314
 315        git ls-files -u >actual &&
 316        test_cmp expected.unresolved actual
 317'
 318
 319test_expect_success 'explicit rerere' '
 320        test_might_fail git config --unset rerere.autoupdate &&
 321        git rm -fr --cached . &&
 322        git update-index --index-info <failedmerge &&
 323        cp file3.conflict file3 &&
 324        test_must_fail git update-index --refresh -q &&
 325
 326        git rerere &&
 327        git ls-files -u >actual &&
 328        test_cmp expected.unresolved actual
 329'
 330
 331test_expect_success 'explicit rerere with autoupdate' '
 332        git config rerere.autoupdate true &&
 333        git rm -fr --cached . &&
 334        git update-index --index-info <failedmerge &&
 335        cp file3.conflict file3 &&
 336        test_must_fail git update-index --refresh -q &&
 337
 338        git rerere &&
 339        git update-index --refresh
 340'
 341
 342test_expect_success 'explicit rerere --rerere-autoupdate overrides' '
 343        git config rerere.autoupdate false &&
 344        git rm -fr --cached . &&
 345        git update-index --index-info <failedmerge &&
 346        cp file3.conflict file3 &&
 347        git rerere &&
 348        git ls-files -u >actual1 &&
 349
 350        git rm -fr --cached . &&
 351        git update-index --index-info <failedmerge &&
 352        cp file3.conflict file3 &&
 353        git rerere --rerere-autoupdate &&
 354        git update-index --refresh &&
 355
 356        git rm -fr --cached . &&
 357        git update-index --index-info <failedmerge &&
 358        cp file3.conflict file3 &&
 359        git rerere --rerere-autoupdate --no-rerere-autoupdate &&
 360        git ls-files -u >actual2 &&
 361
 362        git rm -fr --cached . &&
 363        git update-index --index-info <failedmerge &&
 364        cp file3.conflict file3 &&
 365        git rerere --rerere-autoupdate --no-rerere-autoupdate --rerere-autoupdate &&
 366        git update-index --refresh &&
 367
 368        test_cmp expected.unresolved actual1 &&
 369        test_cmp expected.unresolved actual2
 370'
 371
 372test_expect_success 'rerere --no-no-rerere-autoupdate' '
 373        git rm -fr --cached . &&
 374        git update-index --index-info <failedmerge &&
 375        cp file3.conflict file3 &&
 376        test_must_fail git rerere --no-no-rerere-autoupdate 2>err &&
 377        grep [Uu]sage err &&
 378        test_must_fail git update-index --refresh
 379'
 380
 381test_expect_success 'rerere -h' '
 382        test_must_fail git rerere -h >help &&
 383        grep [Uu]sage help
 384'
 385
 386test_done