blob: cb7effe0a3e38eeba92b43682de9be68e677099e [file] [log] [blame]
Junio C Hamano9d9a2f42009-12-25 10:08:04 -08001#!/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 &&
Johannes Sixt5a9f0392010-01-21 09:23:48 +010039 echo different >fi/le &&
40 git add fi/le &&
Junio C Hamano9d9a2f42009-12-25 10:08:04 -080041 echo resolving records &&
Johannes Sixt5a9f0392010-01-21 09:23:48 +010042 check_resolve_undo recorded fi/le initial:fi/le second:fi/le third:fi/le
Junio C Hamano9d9a2f42009-12-25 10:08:04 -080043}
44
45test_expect_success setup '
Johannes Sixt5a9f0392010-01-21 09:23:48 +010046 mkdir fi &&
47 test_commit initial fi/le first &&
Junio C Hamano9d9a2f42009-12-25 10:08:04 -080048 git branch side &&
49 git branch another &&
Johannes Sixt5a9f0392010-01-21 09:23:48 +010050 test_commit second fi/le second &&
Junio C Hamano9d9a2f42009-12-25 10:08:04 -080051 git checkout side &&
Johannes Sixt5a9f0392010-01-21 09:23:48 +010052 test_commit third fi/le third &&
Junio C Hamano9d9a2f42009-12-25 10:08:04 -080053 git checkout another &&
Johannes Sixt5a9f0392010-01-21 09:23:48 +010054 test_commit fourth fi/le fourth &&
Junio C Hamano9d9a2f42009-12-25 10:08:04 -080055 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 &&
Johannes Sixt5a9f0392010-01-21 09:23:48 +010063 check_resolve_undo kept fi/le initial:fi/le second:fi/le third:fi/le &&
Junio C Hamano9d9a2f42009-12-25 10:08:04 -080064 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 &&
Johannes Sixt5a9f0392010-01-21 09:23:48 +010074 check_resolve_undo kept fi/le initial:fi/le second:fi/le third:fi/le &&
Junio C Hamano9d9a2f42009-12-25 10:08:04 -080075
76 echo merge clears upfront &&
77 test_must_fail git merge fourth^0 &&
78 check_resolve_undo nuked &&
79
Johannes Sixt5a9f0392010-01-21 09:23:48 +010080 git rm -f fi/le &&
Junio C Hamano9d9a2f42009-12-25 10:08:04 -080081 echo resolving records &&
Johannes Sixt5a9f0392010-01-21 09:23:48 +010082 check_resolve_undo recorded fi/le initial:fi/le HEAD:fi/le fourth:fi/le &&
Junio C Hamano9d9a2f42009-12-25 10:08:04 -080083
84 git reset --hard &&
85 echo resetting discards &&
86 check_resolve_undo discarded
87'
88
Junio C Hamano4a39f792009-12-25 10:31:26 -080089test_expect_success 'plumbing clears' '
90 prime_resolve_undo &&
91 test_tick &&
92 git commit -m merged &&
93 echo committing keeps &&
Johannes Sixt5a9f0392010-01-21 09:23:48 +010094 check_resolve_undo kept fi/le initial:fi/le second:fi/le third:fi/le &&
Junio C Hamano4a39f792009-12-25 10:31:26 -080095
96 echo plumbing clear &&
97 git update-index --clear-resolve-undo &&
98 check_resolve_undo cleared
99'
100
Junio C Hamano4421a822009-12-25 11:57:11 -0800101test_expect_success 'add records checkout -m undoes' '
102 prime_resolve_undo &&
103 git diff HEAD &&
Johannes Sixt5a9f0392010-01-21 09:23:48 +0100104 git checkout --conflict=merge fi/le &&
Junio C Hamano4421a822009-12-25 11:57:11 -0800105 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
Junio C Hamano8aa38562009-12-25 13:40:02 -0800112test_expect_success 'unmerge with plumbing' '
113 prime_resolve_undo &&
Johannes Sixt5a9f0392010-01-21 09:23:48 +0100114 git update-index --unresolve fi/le &&
Junio C Hamano8aa38562009-12-25 13:40:02 -0800115 git ls-files -u >actual &&
116 test $(wc -l <actual) = 3
117'
118
Johannes Sixt5a9f0392010-01-21 09:23:48 +0100119test_expect_success 'rerere and rerere forget' '
Junio C Hamanodea45622009-12-25 15:51:32 -0800120 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 &&
Johannes Sixt5a9f0392010-01-21 09:23:48 +0100127 git checkout -m fi/le &&
Junio C Hamanodea45622009-12-25 15:51:32 -0800128 echo resurrect the conflict &&
Johannes Sixt5a9f0392010-01-21 09:23:48 +0100129 grep "^=======" fi/le &&
Junio C Hamanodea45622009-12-25 15:51:32 -0800130 echo reresolve the conflict &&
131 git rerere &&
Johannes Sixt5a9f0392010-01-21 09:23:48 +0100132 test "z$(cat fi/le)" = zdifferent &&
Junio C Hamanodea45622009-12-25 15:51:32 -0800133 echo register the resolution again &&
Johannes Sixt5a9f0392010-01-21 09:23:48 +0100134 git add fi/le &&
135 check_resolve_undo kept fi/le initial:fi/le second:fi/le third:fi/le &&
Junio C Hamanodea45622009-12-25 15:51:32 -0800136 test -z "$(git ls-files -u)" &&
Johannes Sixt5a9f0392010-01-21 09:23:48 +0100137 git rerere forget fi/le &&
Junio C Hamanodea45622009-12-25 15:51:32 -0800138 ! test -f .git/rr-cache/$rerere_id/postimage &&
139 tr "\0" "\n" <.git/MERGE_RR >actual &&
Johannes Sixt5a9f0392010-01-21 09:23:48 +0100140 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 &&
Junio C Hamanodea45622009-12-25 15:51:32 -0800167 test_cmp expect actual
168'
169
Junio C Hamano9d9a2f42009-12-25 10:08:04 -0800170test_done