f2620650ce1d25252210c07db20e54f99bd515c6
   1#!/bin/sh
   2
   3test_description='undoing resolution'
   4
   5. ./test-lib.sh
   6
   7check_resolve_undo () {
   8        msg=$1
   9        shift
  10        while case $# in
  11        0)      break ;;
  12        1|2|3)  die "Bug in check-resolve-undo test" ;;
  13        esac
  14        do
  15                path=$1
  16                shift
  17                for stage in 1 2 3
  18                do
  19                        sha1=$1
  20                        shift
  21                        case "$sha1" in
  22                        '') continue ;;
  23                        esac
  24                        sha1=$(git rev-parse --verify "$sha1")
  25                        printf "100644 %s %s\t%s\n" $sha1 $stage $path
  26                done
  27        done >"$msg.expect" &&
  28        git ls-files --resolve-undo >"$msg.actual" &&
  29        test_cmp "$msg.expect" "$msg.actual"
  30}
  31
  32prime_resolve_undo () {
  33        git reset --hard &&
  34        git checkout second^0 &&
  35        test_tick &&
  36        test_must_fail git merge third^0 &&
  37        echo merge does not leave anything &&
  38        check_resolve_undo empty &&
  39        echo different >fi/le &&
  40        git add fi/le &&
  41        echo resolving records &&
  42        check_resolve_undo recorded fi/le initial:fi/le second:fi/le third:fi/le
  43}
  44
  45test_expect_success setup '
  46        mkdir fi &&
  47        test_commit initial fi/le first &&
  48        git branch side &&
  49        git branch another &&
  50        test_commit second fi/le second &&
  51        git checkout side &&
  52        test_commit third fi/le third &&
  53        git checkout another &&
  54        test_commit fourth fi/le fourth &&
  55        git checkout master
  56'
  57
  58test_expect_success 'add records switch clears' '
  59        prime_resolve_undo &&
  60        test_tick &&
  61        git commit -m merged &&
  62        echo committing keeps &&
  63        check_resolve_undo kept fi/le initial:fi/le second:fi/le third:fi/le &&
  64        git checkout second^0 &&
  65        echo switching clears &&
  66        check_resolve_undo cleared
  67'
  68
  69test_expect_success 'rm records reset clears' '
  70        prime_resolve_undo &&
  71        test_tick &&
  72        git commit -m merged &&
  73        echo committing keeps &&
  74        check_resolve_undo kept fi/le initial:fi/le second:fi/le third:fi/le &&
  75
  76        echo merge clears upfront &&
  77        test_must_fail git merge fourth^0 &&
  78        check_resolve_undo nuked &&
  79
  80        git rm -f fi/le &&
  81        echo resolving records &&
  82        check_resolve_undo recorded fi/le initial:fi/le HEAD:fi/le fourth:fi/le &&
  83
  84        git reset --hard &&
  85        echo resetting discards &&
  86        check_resolve_undo discarded
  87'
  88
  89test_expect_success 'plumbing clears' '
  90        prime_resolve_undo &&
  91        test_tick &&
  92        git commit -m merged &&
  93        echo committing keeps &&
  94        check_resolve_undo kept fi/le initial:fi/le second:fi/le third:fi/le &&
  95
  96        echo plumbing clear &&
  97        git update-index --clear-resolve-undo &&
  98        check_resolve_undo cleared
  99'
 100
 101test_expect_success 'add records checkout -m undoes' '
 102        prime_resolve_undo &&
 103        git diff HEAD &&
 104        git checkout --conflict=merge fi/le &&
 105        echo checkout used the record and removed it &&
 106        check_resolve_undo removed &&
 107        echo the index and the work tree is unmerged again &&
 108        git diff >actual &&
 109        grep "^++<<<<<<<" actual
 110'
 111
 112test_expect_success 'unmerge with plumbing' '
 113        prime_resolve_undo &&
 114        git update-index --unresolve fi/le &&
 115        git ls-files -u >actual &&
 116        test_line_count = 3 actual
 117'
 118
 119test_expect_success 'rerere and rerere forget' '
 120        mkdir .git/rr-cache &&
 121        prime_resolve_undo &&
 122        echo record the resolution &&
 123        git rerere &&
 124        rerere_id=$(cd .git/rr-cache && echo */postimage) &&
 125        rerere_id=${rerere_id%/postimage} &&
 126        test -f .git/rr-cache/$rerere_id/postimage &&
 127        git checkout -m fi/le &&
 128        echo resurrect the conflict &&
 129        grep "^=======" fi/le &&
 130        echo reresolve the conflict &&
 131        git rerere &&
 132        test "z$(cat fi/le)" = zdifferent &&
 133        echo register the resolution again &&
 134        git add fi/le &&
 135        check_resolve_undo kept fi/le initial:fi/le second:fi/le third:fi/le &&
 136        test -z "$(git ls-files -u)" &&
 137        git rerere forget fi/le &&
 138        ! test -f .git/rr-cache/$rerere_id/postimage &&
 139        tr "\0" "\n" <.git/MERGE_RR >actual &&
 140        echo "$rerere_id        fi/le" >expect &&
 141        test_cmp expect actual
 142'
 143
 144test_expect_success 'rerere and rerere forget (subdirectory)' '
 145        rm -fr .git/rr-cache &&
 146        mkdir .git/rr-cache &&
 147        prime_resolve_undo &&
 148        echo record the resolution &&
 149        (cd fi && git rerere) &&
 150        rerere_id=$(cd .git/rr-cache && echo */postimage) &&
 151        rerere_id=${rerere_id%/postimage} &&
 152        test -f .git/rr-cache/$rerere_id/postimage &&
 153        (cd fi && git checkout -m le) &&
 154        echo resurrect the conflict &&
 155        grep "^=======" fi/le &&
 156        echo reresolve the conflict &&
 157        (cd fi && git rerere) &&
 158        test "z$(cat fi/le)" = zdifferent &&
 159        echo register the resolution again &&
 160        (cd fi && git add le) &&
 161        check_resolve_undo kept fi/le initial:fi/le second:fi/le third:fi/le &&
 162        test -z "$(git ls-files -u)" &&
 163        (cd fi && git rerere forget le) &&
 164        ! test -f .git/rr-cache/$rerere_id/postimage &&
 165        tr "\0" "\n" <.git/MERGE_RR >actual &&
 166        echo "$rerere_id        fi/le" >expect &&
 167        test_cmp expect actual
 168'
 169
 170test_done