#!/bin/sh test_description='undoing resolution' . ./test-lib.sh check_resolve_undo () { msg=$1 shift while case $# in 0) break ;; 1|2|3) die "Bug in check-resolve-undo test" ;; esac do path=$1 shift for stage in 1 2 3 do sha1=$1 shift case "$sha1" in '') continue ;; esac sha1=$(git rev-parse --verify "$sha1") printf "100644 %s %s\t%s\n" $sha1 $stage $path done done >"$msg.expect" && git ls-files --resolve-undo >"$msg.actual" && test_cmp "$msg.expect" "$msg.actual" } prime_resolve_undo () { git reset --hard && git checkout second^0 && test_tick && test_must_fail git merge third^0 && echo merge does not leave anything && check_resolve_undo empty && echo different >fi/le && git add fi/le && echo resolving records && check_resolve_undo recorded fi/le initial:fi/le second:fi/le third:fi/le } test_expect_success setup ' mkdir fi && test_commit initial fi/le first && git branch side && git branch another && test_commit second fi/le second && git checkout side && test_commit third fi/le third && git checkout another && test_commit fourth fi/le fourth && git checkout master ' test_expect_success 'add records switch clears' ' prime_resolve_undo && test_tick && git commit -m merged && echo committing keeps && check_resolve_undo kept fi/le initial:fi/le second:fi/le third:fi/le && git checkout second^0 && echo switching clears && check_resolve_undo cleared ' test_expect_success 'rm records reset clears' ' prime_resolve_undo && test_tick && git commit -m merged && echo committing keeps && check_resolve_undo kept fi/le initial:fi/le second:fi/le third:fi/le && echo merge clears upfront && test_must_fail git merge fourth^0 && check_resolve_undo nuked && git rm -f fi/le && echo resolving records && check_resolve_undo recorded fi/le initial:fi/le HEAD:fi/le fourth:fi/le && git reset --hard && echo resetting discards && check_resolve_undo discarded ' test_expect_success 'plumbing clears' ' prime_resolve_undo && test_tick && git commit -m merged && echo committing keeps && check_resolve_undo kept fi/le initial:fi/le second:fi/le third:fi/le && echo plumbing clear && git update-index --clear-resolve-undo && check_resolve_undo cleared ' test_expect_success 'add records checkout -m undoes' ' prime_resolve_undo && git diff HEAD && git checkout --conflict=merge fi/le && echo checkout used the record and removed it && check_resolve_undo removed && echo the index and the work tree is unmerged again && git diff >actual && grep "^++<<<<<<<" actual ' test_expect_success 'unmerge with plumbing' ' prime_resolve_undo && git update-index --unresolve fi/le && git ls-files -u >actual && test $(wc -l actual && echo "$rerere_id fi/le" >expect && test_cmp expect actual ' test_expect_success 'rerere and rerere forget (subdirectory)' ' rm -fr .git/rr-cache && mkdir .git/rr-cache && prime_resolve_undo && echo record the resolution && (cd fi && git rerere) && rerere_id=$(cd .git/rr-cache && echo */postimage) && rerere_id=${rerere_id%/postimage} && test -f .git/rr-cache/$rerere_id/postimage && (cd fi && git checkout -m le) && echo resurrect the conflict && grep "^=======" fi/le && echo reresolve the conflict && (cd fi && git rerere) && test "z$(cat fi/le)" = zdifferent && echo register the resolution again && (cd fi && git add le) && check_resolve_undo kept fi/le initial:fi/le second:fi/le third:fi/le && test -z "$(git ls-files -u)" && (cd fi && git rerere forget le) && ! test -f .git/rr-cache/$rerere_id/postimage && tr "\0" "\n" <.git/MERGE_RR >actual && echo "$rerere_id fi/le" >expect && test_cmp expect actual ' test_done