| #!/bin/sh |
| # |
| # Copyright (c) 2006 Johannes E. Schindelin |
| # |
| |
| test_description='git rerere |
| ' |
| |
| . ./test-lib.sh |
| |
| test_expect_success 'setup' " |
| cat > a1 <<- EOF && |
| Some title |
| ========== |
| Whether 'tis nobler in the mind to suffer |
| The slings and arrows of outrageous fortune, |
| Or to take arms against a sea of troubles, |
| And by opposing end them? To die: to sleep; |
| No more; and by a sleep to say we end |
| The heart-ache and the thousand natural shocks |
| That flesh is heir to, 'tis a consummation |
| Devoutly to be wish'd. |
| EOF |
| |
| git add a1 && |
| git commit -q -a -m initial && |
| |
| git checkout -b first && |
| cat >> a1 <<- EOF && |
| Some title |
| ========== |
| To die, to sleep; |
| To sleep: perchance to dream: ay, there's the rub; |
| For in that sleep of death what dreams may come |
| When we have shuffled off this mortal coil, |
| Must give us pause: there's the respect |
| That makes calamity of so long life; |
| EOF |
| git commit -q -a -m first && |
| |
| git checkout -b second master && |
| git show first:a1 | |
| sed -e 's/To die, t/To die! T/' -e 's/Some title/Some Title/' > a1 && |
| echo '* END *' >>a1 && |
| git commit -q -a -m second |
| " |
| |
| test_expect_success 'nothing recorded without rerere' ' |
| (rm -rf .git/rr-cache; git config rerere.enabled false) && |
| test_must_fail git merge first && |
| ! test -d .git/rr-cache |
| ' |
| |
| # activate rerere, old style |
| test_expect_success 'conflicting merge' ' |
| git reset --hard && |
| mkdir .git/rr-cache && |
| git config --unset rerere.enabled && |
| test_must_fail git merge first |
| ' |
| |
| sha1=$(perl -pe 's/ .*//' .git/MERGE_RR) |
| rr=.git/rr-cache/$sha1 |
| test_expect_success 'recorded preimage' "grep ^=======$ $rr/preimage" |
| |
| test_expect_success 'rerere.enabled works, too' ' |
| rm -rf .git/rr-cache && |
| git config rerere.enabled true && |
| git reset --hard && |
| test_must_fail git merge first && |
| grep ^=======$ $rr/preimage |
| ' |
| |
| test_expect_success 'no postimage or thisimage yet' \ |
| "test ! -f $rr/postimage -a ! -f $rr/thisimage" |
| |
| test_expect_success 'preimage has right number of lines' ' |
| |
| cnt=$(sed -ne "/^<<<<<<</,/^>>>>>>>/p" $rr/preimage | wc -l) && |
| test $cnt = 13 |
| |
| ' |
| |
| git show first:a1 > a1 |
| |
| cat > expect << EOF |
| --- a/a1 |
| +++ b/a1 |
| @@ -1,4 +1,4 @@ |
| -Some Title |
| +Some title |
| ========== |
| Whether 'tis nobler in the mind to suffer |
| The slings and arrows of outrageous fortune, |
| @@ -8,21 +8,11 @@ |
| The heart-ache and the thousand natural shocks |
| That flesh is heir to, 'tis a consummation |
| Devoutly to be wish'd. |
| -<<<<<<< |
| -Some Title |
| -========== |
| -To die! To sleep; |
| -======= |
| Some title |
| ========== |
| To die, to sleep; |
| ->>>>>>> |
| To sleep: perchance to dream: ay, there's the rub; |
| For in that sleep of death what dreams may come |
| When we have shuffled off this mortal coil, |
| Must give us pause: there's the respect |
| That makes calamity of so long life; |
| -<<<<<<< |
| -======= |
| -* END * |
| ->>>>>>> |
| EOF |
| git rerere diff > out |
| |
| test_expect_success 'rerere diff' 'test_cmp expect out' |
| |
| cat > expect << EOF |
| a1 |
| EOF |
| |
| git rerere status > out |
| |
| test_expect_success 'rerere status' 'test_cmp expect out' |
| |
| test_expect_success 'commit succeeds' \ |
| "git commit -q -a -m 'prefer first over second'" |
| |
| test_expect_success 'recorded postimage' "test -f $rr/postimage" |
| |
| test_expect_success 'another conflicting merge' ' |
| git checkout -b third master && |
| git show second^:a1 | sed "s/To die: t/To die! T/" > a1 && |
| git commit -q -a -m third && |
| test_must_fail git pull . first |
| ' |
| |
| git show first:a1 | sed 's/To die: t/To die! T/' > expect |
| test_expect_success 'rerere kicked in' "! grep ^=======$ a1" |
| |
| test_expect_success 'rerere prefers first change' 'test_cmp a1 expect' |
| |
| rm $rr/postimage |
| echo "$sha1 a1" | perl -pe 'y/\012/\000/' > .git/MERGE_RR |
| |
| test_expect_success 'rerere clear' 'git rerere clear' |
| |
| test_expect_success 'clear removed the directory' "test ! -d $rr" |
| |
| mkdir $rr |
| echo Hello > $rr/preimage |
| echo World > $rr/postimage |
| |
| sha2=4000000000000000000000000000000000000000 |
| rr2=.git/rr-cache/$sha2 |
| mkdir $rr2 |
| echo Hello > $rr2/preimage |
| |
| almost_15_days_ago=$((60-15*86400)) |
| just_over_15_days_ago=$((-1-15*86400)) |
| almost_60_days_ago=$((60-60*86400)) |
| just_over_60_days_ago=$((-1-60*86400)) |
| |
| test-chmtime =$almost_60_days_ago $rr/preimage |
| test-chmtime =$almost_15_days_ago $rr2/preimage |
| |
| test_expect_success 'garbage collection (part1)' 'git rerere gc' |
| |
| test_expect_success 'young records still live' \ |
| "test -f $rr/preimage && test -f $rr2/preimage" |
| |
| test-chmtime =$just_over_60_days_ago $rr/preimage |
| test-chmtime =$just_over_15_days_ago $rr2/preimage |
| |
| test_expect_success 'garbage collection (part2)' 'git rerere gc' |
| |
| test_expect_success 'old records rest in peace' \ |
| "test ! -f $rr/preimage && test ! -f $rr2/preimage" |
| |
| test_expect_success 'file2 added differently in two branches' ' |
| git reset --hard && |
| git checkout -b fourth && |
| echo Hallo > file2 && |
| git add file2 && |
| git commit -m version1 && |
| git checkout third && |
| echo Bello > file2 && |
| git add file2 && |
| git commit -m version2 && |
| test_must_fail git merge fourth && |
| echo Cello > file2 && |
| git add file2 && |
| git commit -m resolution |
| ' |
| |
| test_expect_success 'resolution was recorded properly' ' |
| git reset --hard HEAD~2 && |
| git checkout -b fifth && |
| echo Hallo > file3 && |
| git add file3 && |
| git commit -m version1 && |
| git checkout third && |
| echo Bello > file3 && |
| git add file3 && |
| git commit -m version2 && |
| git tag version2 && |
| test_must_fail git merge fifth && |
| test Cello = "$(cat file3)" && |
| test 0 != $(git ls-files -u | wc -l) |
| ' |
| |
| test_expect_success 'rerere.autoupdate' ' |
| git config rerere.autoupdate true |
| git reset --hard && |
| git checkout version2 && |
| test_must_fail git merge fifth && |
| test 0 = $(git ls-files -u | wc -l) |
| ' |
| |
| test_expect_success 'merge --rerere-autoupdate' ' |
| git config --unset rerere.autoupdate |
| git reset --hard && |
| git checkout version2 && |
| test_must_fail git merge --rerere-autoupdate fifth && |
| test 0 = $(git ls-files -u | wc -l) |
| ' |
| |
| test_expect_success 'merge --no-rerere-autoupdate' ' |
| git config rerere.autoupdate true |
| git reset --hard && |
| git checkout version2 && |
| test_must_fail git merge --no-rerere-autoupdate fifth && |
| test 2 = $(git ls-files -u | wc -l) |
| ' |
| |
| test_done |