Merge branch 'do/rebase-i-arbitrary'
[git] / t / t2030-unresolve-info.sh
1 #!/bin/sh
2
3 test_description='undoing resolution'
4
5 . ./test-lib.sh
6
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
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
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
43 }
44
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
56 '
57
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
67 '
68
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 &&
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
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 &&
95
96         echo plumbing clear &&
97         git update-index --clear-resolve-undo &&
98         check_resolve_undo cleared
99 '
100
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
110 '
111
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
117 '
118
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
142 '
143
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
168 '
169
170 test_done