Merge branch 'cb/maint-orphan-merge-noclobber'
[git/kirr.git] / t / t2030-unresolve-info.sh
blobcb7effe0a3e38eeba92b43682de9be68e677099e
1 #!/bin/sh
3 test_description='undoing resolution'
5 . ./test-lib.sh
7 check_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
15 path=$1
16 shift
17 for stage in 1 2 3
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"
32 prime_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
45 test_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
58 test_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
69 test_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 &&
76 echo merge clears upfront &&
77 test_must_fail git merge fourth^0 &&
78 check_resolve_undo nuked &&
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 &&
84 git reset --hard &&
85 echo resetting discards &&
86 check_resolve_undo discarded
89 test_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 &&
96 echo plumbing clear &&
97 git update-index --clear-resolve-undo &&
98 check_resolve_undo cleared
101 test_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
112 test_expect_success 'unmerge with plumbing' '
113 prime_resolve_undo &&
114 git update-index --unresolve fi/le &&
115 git ls-files -u >actual &&
116 test $(wc -l <actual) = 3
119 test_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
144 test_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
170 test_done