README-TESTLIB-TG: fix typo
[topgit/pro.git] / t / t1200-index-merge-one-file.sh
blob36313425e4b848d9ff8b3dd8ad8a6b428d31ae99
1 #!/bin/sh
3 test_description='check tg index-merge-one-file works correctly'
5 . ./test-lib.sh
7 test_plan 325
9 version1="$(printf '%s\n' one two three | git hash-object -w -t blob --stdin)" || die
10 version2="$(printf '%s\n' alpha beta gamma | git hash-object -w -t blob --stdin)" || die
11 version3="$(printf '%s\n' setup check | git hash-object -w -t blob --stdin)" || die
13 cat <<EOT >check
14 100644 4cb29ea 1 test
15 100644 85c3040 2 test
16 100644 2488d99 3 test
17 EOT
19 tg_exec_path="$(tg --exec-path)" && [ -n "$tg_exec_path" ] || die
20 tg_imof="$tg_exec_path/tg--index-merge-one-file"
21 [ -f "$tg_imof" ] && [ -x "$tg_imof" ] || die
23 write_script run-index-merge-one-file <<EOT || die
24 >"$PWD/.toolran" &&
25 "$tg_imof" \$USE_STRATEGY "\$@"
26 EOT
28 # $1, $2, $3 => "<n>" in $version<n> for hash of base (1), ours (2), theirs (3) stages
29 # $4 file name to use for all three
30 prepare_test() {
31 rm -f .git/index
32 [ "$1$2$3" = "000" ] ||
34 [ -z "$1" ] || [ "$1" = "0" ] ||
35 eval printf \''100644 %s 1\011%s\n'\' "\"\$version$1\"" '"$4"' #'
36 [ -z "$2" ] || [ "$2" = "0" ] ||
37 eval printf \''100644 %s 2\011%s\n'\' "\"\$version$2\"" '"$4"' #'
38 [ -z "$1" ] || [ "$3" = "0" ] ||
39 eval printf \''100644 %s 3\011%s\n'\' "\"\$version$3\"" '"$4"' #'
40 } | git update-index --index-info
43 # $1 expected result
44 # 0 is none
45 # 1, 2 or 3 is $version<n> hash at stage 0
46 # -1 is 2 or more stage >0 entries but no stage 0 entries
47 # $2 expected file name for all entries
48 check_index() {
49 cnt=0
50 badname=
51 badmode=
52 sawstage0=
53 while read mode hash stage name junk && [ -n "$name" ]; do
54 cnt=$(( $cnt + 1 ))
55 [ "$name" = "$2" ] || badname=1
56 [ "$mode" = "100644" ] || badmode=1
57 [ "$stage" != "0" ] || sawstage0="${hash:-1}"
58 done <<-EOT
59 $(git ls-files --full-name -s :/)
60 EOT
61 [ -z "$badname" ] || say_color error "# found wrong name in index"
62 [ -z "$badmode" ] || say_color error "# found wrong (not 100644) mode in index"
63 isbad=
64 if [ "$1" = "0" ]; then
65 if [ $cnt -gt 0 ]; then
66 isbad=1
67 say_color error "# expected no index entries, found $cnt"
69 elif [ "$1" = "-1" ]; then
70 if [ $cnt -lt 2 ]; then
71 isbad=1
72 say_color error "# expected at least 2 index entries, found $cnt"
74 if [ -n "$sawstage0" ]; then
75 isbad=1
76 say_color error "# expected only conflict index stages but found stage 0"
78 else
79 eval check="\"\$version$1\""
80 if [ $cnt -ne 1 ]; then
81 isbad=1
82 say_color error "# expected exactly one index entry, found $cnt"
83 elif [ -z "$sawstage0" ]; then
84 isbad=1
85 say_color error "# expected exactly one stage 0 index entry"
86 elif [ "$check" != "$sawstage0" ]; then
87 isbad=1
88 say_color error "# expected stage 0 hash $check but found $sawstage0"
91 [ -z "$isbad" ] || git ls-files --full-name --abbrev -s | sed 's/^/# /'
92 return ${isbad:-0}
95 check_table() {
96 if [ "$1" = "3" ]; then
97 shift
98 check_index "-1" "$@"
99 else
100 check_index "$@"
104 run_index_merge() {
105 strat=
106 case "$1" in
107 'r') strat="--remove";;
108 't') strat="--theirs";;
109 'm') strat="--merge";;
110 'o');;
111 *) die;;
112 esac
113 sane_unset USE_STRATEGY
114 [ -z "$strat" ] || USE_STRATEGY="$strat" && export USE_STRATEGY
115 rm -f ".toolran" ".git/index-save"
116 cp -f ".git/index" ".git/index-save"
117 #ucnt="$(( $(git ls-files --unmerged --full-name --abbrev :/ | wc -l) ))" || :
118 git merge-index "$PWD/run-index-merge-one-file" -a || :
119 [ -e ".toolran" ] ||
121 GIT_INDEX_FILE=".git/index-save" && export GIT_INDEX_FILE &&
122 ucnt="$(( $(git ls-files --unmerged --full-name --abbrev :/ | wc -l) ))" || : &&
123 [ "$ucnt" = "0" ]
124 ) ||
126 say_color error "git merge-index did not run our tool"
127 return 1
131 test_expect_success 'setup' '
132 prepare_test 1 2 3 test &&
133 git ls-files --full-name --abbrev -s >lsfiles &&
134 test_cmp lsfiles check
137 while read base ours theirs strategy tgresult gresult; do
138 test_expect_success "b=$base o=$ours t=$theirs s=$strategy r=$tgresult .topdeps" '
139 prepare_test "$base" "$ours" "$theirs" ".topdeps" &&
140 run_index_merge "$strategy" &&
141 check_table "$tgresult" ".topdeps"
143 test_expect_success "b=$base o=$ours t=$theirs s=$strategy r=$tgresult .topmsg" '
144 prepare_test "$base" "$ours" "$theirs" ".topmsg" &&
145 run_index_merge "$strategy" &&
146 check_table "$tgresult" ".topmsg"
148 test_expect_success "b=$base o=$ours t=$theirs s=$strategy r=$gresult testfile" '
149 prepare_test "$base" "$ours" "$theirs" "testfile" &&
150 run_index_merge "$strategy" &&
151 check_table "$gresult" "testfile"
153 # Test Table
154 # BASE OURS THEIRS STRATEGY TGRESULT GRESULT
155 # where BASE, OURS, THEIRS can be 0 (none), 1 (version1) or 2 (version2)
156 # STRATEGY is 'r' (remove), 't' (theirs), 'o' (ours) or 'm' (merge)
157 # RESULT is 0, 1, 2 or 3 (conflicted)
158 done <<EOT
159 0 0 0 r 0 0
160 0 0 0 t 0 0
161 0 0 0 o 0 0
162 0 0 0 m 0 0
163 0 0 1 r 0 1
164 0 0 1 t 1 1
165 0 0 1 o 0 1
166 0 0 1 m 1 1
167 0 0 2 r 0 2
168 0 0 2 t 2 2
169 0 0 2 o 0 2
170 0 0 2 m 2 2
171 0 1 0 r 0 1
172 0 1 0 t 0 1
173 0 1 0 o 1 1
174 0 1 0 m 1 1
175 0 1 1 r 0 1
176 0 1 1 t 1 1
177 0 1 1 o 1 1
178 0 1 1 m 1 1
179 0 1 2 r 0 3
180 0 1 2 t 2 3
181 0 1 2 o 1 3
182 0 1 2 m 3 3
183 0 2 0 r 0 2
184 0 2 0 t 0 2
185 0 2 0 o 2 2
186 0 2 0 m 2 2
187 0 2 1 r 0 3
188 0 2 1 t 1 3
189 0 2 1 o 2 3
190 0 2 1 m 3 3
191 0 2 2 r 0 2
192 0 2 2 t 2 2
193 0 2 2 o 2 2
194 0 2 2 m 2 2
195 1 0 0 r 0 0
196 1 0 0 t 0 0
197 1 0 0 o 0 0
198 1 0 0 m 0 0
199 1 0 1 r 0 0
200 1 0 1 t 1 0
201 1 0 1 o 0 0
202 1 0 1 m 0 0
203 1 0 2 r 0 3
204 1 0 2 t 2 3
205 1 0 2 o 0 3
206 1 0 2 m 3 3
207 1 1 0 r 0 0
208 1 1 0 t 0 0
209 1 1 0 o 1 0
210 1 1 0 m 0 0
211 1 1 1 r 0 1
212 1 1 1 t 1 1
213 1 1 1 o 1 1
214 1 1 1 m 1 1
215 1 1 2 r 0 2
216 1 1 2 t 2 2
217 1 1 2 o 1 2
218 1 1 2 m 2 2
219 1 2 0 r 0 3
220 1 2 0 t 0 3
221 1 2 0 o 2 3
222 1 2 0 m 3 3
223 1 2 1 r 0 2
224 1 2 1 t 1 2
225 1 2 1 o 2 2
226 1 2 1 m 2 2
227 1 2 2 r 0 2
228 1 2 2 t 2 2
229 1 2 2 o 2 2
230 1 2 2 m 2 2
231 2 0 0 r 0 0
232 2 0 0 t 0 0
233 2 0 0 o 0 0
234 2 0 0 m 0 0
235 2 0 1 r 0 3
236 2 0 1 t 1 3
237 2 0 1 o 0 3
238 2 0 1 m 3 3
239 2 0 2 r 0 0
240 2 0 2 t 2 0
241 2 0 2 o 0 0
242 2 0 2 m 0 0
243 2 1 0 r 0 3
244 2 1 0 t 0 3
245 2 1 0 o 1 3
246 2 1 0 m 3 3
247 2 1 1 r 0 1
248 2 1 1 t 1 1
249 2 1 1 o 1 1
250 2 1 1 m 1 1
251 2 1 2 r 0 1
252 2 1 2 t 2 1
253 2 1 2 o 1 1
254 2 1 2 m 1 1
255 2 2 0 r 0 0
256 2 2 0 t 0 0
257 2 2 0 o 2 0
258 2 2 0 m 0 0
259 2 2 1 r 0 1
260 2 2 1 t 1 1
261 2 2 1 o 2 1
262 2 2 1 m 1 1
263 2 2 2 r 0 2
264 2 2 2 t 2 2
265 2 2 2 o 2 2
266 2 2 2 m 2 2
269 test_done