1#!/bin/sh
2#
3# Copyright (c) 2012 Felipe Contreras
4#
5# Base commands from hg-git tests:
6# https://bitbucket.org/durin42/hg-git/src
7#
8
9test_description='Test remote-hg output compared to hg-git'
10
11. ./test-lib.sh
12
13if ! test_have_prereq PYTHON; then
14 skip_all='skipping remote-hg tests; python not available'
15 test_done
16fi
17
18if ! "$PYTHON_PATH" -c 'import mercurial'; then
19 skip_all='skipping remote-hg tests; mercurial not available'
20 test_done
21fi
22
23if ! "$PYTHON_PATH" -c 'import hggit'; then
24 skip_all='skipping remote-hg tests; hg-git not available'
25 test_done
26fi
27
28# clone to a git repo with git
29git_clone_git () {
30 hg -R $1 bookmark -f -r tip master &&
31 git clone -q "hg::$PWD/$1" $2
32}
33
34# clone to an hg repo with git
35hg_clone_git () {
36 (
37 hg init $2 &&
38 cd $1 &&
39 git push -q "hg::$PWD/../$2" 'refs/tags/*:refs/tags/*' 'refs/heads/*:refs/heads/*'
40 ) &&
41
42 (cd $2 && hg -q update)
43}
44
45# clone to a git repo with hg
46git_clone_hg () {
47 (
48 git init -q $2 &&
49 cd $1 &&
50 hg bookmark -f -r tip master &&
51 hg -q push -r master ../$2 || true
52 )
53}
54
55# clone to an hg repo with hg
56hg_clone_hg () {
57 hg -q clone $1 $2
58}
59
60# push an hg repo with git
61hg_push_git () {
62 (
63 cd $2
64 old=$(git symbolic-ref --short HEAD)
65 git checkout -q -b tmp &&
66 git fetch -q "hg::$PWD/../$1" 'refs/tags/*:refs/tags/*' 'refs/heads/*:refs/heads/*' &&
67 git checkout -q $old &&
68 git branch -q -D tmp 2> /dev/null || true
69 )
70}
71
72# push an hg git repo with hg
73hg_push_hg () {
74 (
75 cd $1 &&
76 hg -q push ../$2 || true
77 )
78}
79
80hg_log () {
81 hg -R $1 log --graph --debug | grep -v 'tag: *default/'
82}
83
84git_log () {
85 git --git-dir=$1/.git fast-export --branches
86}
87
88setup () {
89 (
90 echo "[ui]"
91 echo "username = A U Thor <author@example.com>"
92 echo "[defaults]"
93 echo "backout = -d \"0 0\""
94 echo "commit = -d \"0 0\""
95 echo "debugrawcommit = -d \"0 0\""
96 echo "tag = -d \"0 0\""
97 echo "[extensions]"
98 echo "hgext.bookmarks ="
99 echo "hggit ="
100 ) >> "$HOME"/.hgrc &&
101 git config --global receive.denycurrentbranch warn
102 git config --global remote-hg.hg-git-compat true
103
104 export HGEDITOR=/usr/bin/true
105
106 export GIT_AUTHOR_DATE="2007-01-01 00:00:00 +0230"
107 export GIT_COMMITTER_DATE="$GIT_AUTHOR_DATE"
108}
109
110setup
111
112test_expect_success 'merge conflict 1' '
113 mkdir -p tmp && cd tmp &&
114 test_when_finished "cd .. && rm -rf tmp" &&
115
116 (
117 hg init hgrepo1 &&
118 cd hgrepo1 &&
119 echo A > afile &&
120 hg add afile &&
121 hg ci -m "origin" &&
122
123 echo B > afile &&
124 hg ci -m "A->B" &&
125
126 hg up -r0 &&
127 echo C > afile &&
128 hg ci -m "A->C" &&
129
130 hg merge -r1 || true &&
131 echo C > afile &&
132 hg resolve -m afile &&
133 hg ci -m "merge to C"
134 ) &&
135
136 for x in hg git; do
137 git_clone_$x hgrepo1 gitrepo-$x &&
138 hg_clone_$x gitrepo-$x hgrepo2-$x &&
139 hg_log hgrepo2-$x > hg-log-$x &&
140 git_log gitrepo-$x > git-log-$x
141 done &&
142
143 test_cmp hg-log-hg hg-log-git &&
144 test_cmp git-log-hg git-log-git
145'
146
147test_expect_success 'merge conflict 2' '
148 mkdir -p tmp && cd tmp &&
149 test_when_finished "cd .. && rm -rf tmp" &&
150
151 (
152 hg init hgrepo1 &&
153 cd hgrepo1 &&
154 echo A > afile &&
155 hg add afile &&
156 hg ci -m "origin" &&
157
158 echo B > afile &&
159 hg ci -m "A->B" &&
160
161 hg up -r0 &&
162 echo C > afile &&
163 hg ci -m "A->C" &&
164
165 hg merge -r1 || true &&
166 echo B > afile &&
167 hg resolve -m afile &&
168 hg ci -m "merge to B"
169 ) &&
170
171 for x in hg git; do
172 git_clone_$x hgrepo1 gitrepo-$x &&
173 hg_clone_$x gitrepo-$x hgrepo2-$x &&
174 hg_log hgrepo2-$x > hg-log-$x &&
175 git_log gitrepo-$x > git-log-$x
176 done &&
177
178 test_cmp hg-log-hg hg-log-git &&
179 test_cmp git-log-hg git-log-git
180'
181
182test_expect_success 'converged merge' '
183 mkdir -p tmp && cd tmp &&
184 test_when_finished "cd .. && rm -rf tmp" &&
185
186 (
187 hg init hgrepo1 &&
188 cd hgrepo1 &&
189 echo A > afile &&
190 hg add afile &&
191 hg ci -m "origin" &&
192
193 echo B > afile &&
194 hg ci -m "A->B" &&
195
196 echo C > afile &&
197 hg ci -m "B->C" &&
198
199 hg up -r0 &&
200 echo C > afile &&
201 hg ci -m "A->C" &&
202
203 hg merge -r2 || true &&
204 hg ci -m "merge"
205 ) &&
206
207 for x in hg git; do
208 git_clone_$x hgrepo1 gitrepo-$x &&
209 hg_clone_$x gitrepo-$x hgrepo2-$x &&
210 hg_log hgrepo2-$x > hg-log-$x &&
211 git_log gitrepo-$x > git-log-$x
212 done &&
213
214 test_cmp hg-log-hg hg-log-git &&
215 test_cmp git-log-hg git-log-git
216'
217
218test_expect_success 'encoding' '
219 mkdir -p tmp && cd tmp &&
220 test_when_finished "cd .. && rm -rf tmp" &&
221
222 (
223 git init -q gitrepo &&
224 cd gitrepo &&
225
226 echo alpha > alpha &&
227 git add alpha &&
228 git commit -m "add älphà" &&
229
230 export GIT_AUTHOR_NAME="tést èncödîng" &&
231 echo beta > beta &&
232 git add beta &&
233 git commit -m "add beta" &&
234
235 echo gamma > gamma &&
236 git add gamma &&
237 git commit -m "add gämmâ" &&
238
239 : TODO git config i18n.commitencoding latin-1 &&
240 echo delta > delta &&
241 git add delta &&
242 git commit -m "add déltà"
243 ) &&
244
245 for x in hg git; do
246 hg_clone_$x gitrepo hgrepo-$x &&
247 git_clone_$x hgrepo-$x gitrepo2-$x &&
248
249 HGENCODING=utf-8 hg_log hgrepo-$x > hg-log-$x &&
250 git_log gitrepo2-$x > git-log-$x
251 done &&
252
253 test_cmp hg-log-hg hg-log-git &&
254 test_cmp git-log-hg git-log-git
255'
256
257test_expect_success 'file removal' '
258 mkdir -p tmp && cd tmp &&
259 test_when_finished "cd .. && rm -rf tmp" &&
260
261 (
262 git init -q gitrepo &&
263 cd gitrepo &&
264 echo alpha > alpha &&
265 git add alpha &&
266 git commit -m "add alpha" &&
267 echo beta > beta &&
268 git add beta &&
269 git commit -m "add beta"
270 mkdir foo &&
271 echo blah > foo/bar &&
272 git add foo &&
273 git commit -m "add foo" &&
274 git rm alpha &&
275 git commit -m "remove alpha" &&
276 git rm foo/bar &&
277 git commit -m "remove foo/bar"
278 ) &&
279
280 for x in hg git; do
281 (
282 hg_clone_$x gitrepo hgrepo-$x &&
283 cd hgrepo-$x &&
284 hg_log . &&
285 hg manifest -r 3 &&
286 hg manifest
287 ) > output-$x &&
288
289 git_clone_$x hgrepo-$x gitrepo2-$x &&
290 git_log gitrepo2-$x > log-$x
291 done &&
292
293 test_cmp output-hg output-git &&
294 test_cmp log-hg log-git
295'
296
297test_expect_success 'git tags' '
298 mkdir -p tmp && cd tmp &&
299 test_when_finished "cd .. && rm -rf tmp" &&
300
301 (
302 git init -q gitrepo &&
303 cd gitrepo &&
304 git config receive.denyCurrentBranch ignore &&
305 echo alpha > alpha &&
306 git add alpha &&
307 git commit -m "add alpha" &&
308 git tag alpha &&
309
310 echo beta > beta &&
311 git add beta &&
312 git commit -m "add beta" &&
313 git tag -a -m "added tag beta" beta
314 ) &&
315
316 for x in hg git; do
317 hg_clone_$x gitrepo hgrepo-$x &&
318 hg_log hgrepo-$x > log-$x
319 done &&
320
321 test_cmp log-hg log-git
322'
323
324test_expect_success 'hg author' '
325 mkdir -p tmp && cd tmp &&
326 test_when_finished "cd .. && rm -rf tmp" &&
327
328 for x in hg git; do
329 (
330 git init -q gitrepo-$x &&
331 cd gitrepo-$x &&
332
333 echo alpha > alpha &&
334 git add alpha &&
335 git commit -m "add alpha" &&
336 git checkout -q -b not-master
337 ) &&
338
339 (
340 hg_clone_$x gitrepo-$x hgrepo-$x &&
341 cd hgrepo-$x &&
342
343 hg co master &&
344 echo beta > beta &&
345 hg add beta &&
346 hg commit -u "test" -m "add beta" &&
347
348 echo gamma >> beta &&
349 hg commit -u "test <test@example.com> (comment)" -m "modify beta" &&
350
351 echo gamma > gamma &&
352 hg add gamma &&
353 hg commit -u "<test@example.com>" -m "add gamma" &&
354
355 echo delta > delta &&
356 hg add delta &&
357 hg commit -u "name<test@example.com>" -m "add delta" &&
358
359 echo epsilon > epsilon &&
360 hg add epsilon &&
361 hg commit -u "name <test@example.com" -m "add epsilon" &&
362
363 echo zeta > zeta &&
364 hg add zeta &&
365 hg commit -u " test " -m "add zeta" &&
366
367 echo eta > eta &&
368 hg add eta &&
369 hg commit -u "test < test@example.com >" -m "add eta" &&
370
371 echo theta > theta &&
372 hg add theta &&
373 hg commit -u "test >test@example.com>" -m "add theta"
374 ) &&
375
376 hg_push_$x hgrepo-$x gitrepo-$x &&
377 hg_clone_$x gitrepo-$x hgrepo2-$x &&
378
379 hg_log hgrepo2-$x > hg-log-$x &&
380 git_log gitrepo-$x > git-log-$x
381 done &&
382
383 test_cmp git-log-hg git-log-git &&
384
385 test_cmp hg-log-hg hg-log-git &&
386 test_cmp git-log-hg git-log-git
387'
388
389test_expect_success 'hg branch' '
390 mkdir -p tmp && cd tmp &&
391 test_when_finished "cd .. && rm -rf tmp" &&
392
393 for x in hg git; do
394 (
395 git init -q gitrepo-$x &&
396 cd gitrepo-$x &&
397
398 echo alpha > alpha &&
399 git add alpha &&
400 git commit -q -m "add alpha" &&
401 git checkout -q -b not-master
402 ) &&
403
404 (
405 hg_clone_$x gitrepo-$x hgrepo-$x &&
406
407 cd hgrepo-$x &&
408 hg -q co master &&
409 hg mv alpha beta &&
410 hg -q commit -m "rename alpha to beta" &&
411 hg branch gamma | grep -v "permanent and global" &&
412 hg -q commit -m "started branch gamma"
413 ) &&
414
415 hg_push_$x hgrepo-$x gitrepo-$x &&
416 hg_clone_$x gitrepo-$x hgrepo2-$x &&
417
418 hg_log hgrepo2-$x > hg-log-$x &&
419 git_log gitrepo-$x > git-log-$x
420 done &&
421
422 test_cmp hg-log-hg hg-log-git &&
423 test_cmp git-log-hg git-log-git
424'
425
426test_expect_success 'hg tags' '
427 mkdir -p tmp && cd tmp &&
428 test_when_finished "cd .. && rm -rf tmp" &&
429
430 for x in hg git; do
431 (
432 git init -q gitrepo-$x &&
433 cd gitrepo-$x &&
434
435 echo alpha > alpha &&
436 git add alpha &&
437 git commit -m "add alpha" &&
438 git checkout -q -b not-master
439 ) &&
440
441 (
442 hg_clone_$x gitrepo-$x hgrepo-$x &&
443
444 cd hgrepo-$x &&
445 hg co master &&
446 hg tag alpha
447 ) &&
448
449 hg_push_$x hgrepo-$x gitrepo-$x &&
450 hg_clone_$x gitrepo-$x hgrepo2-$x &&
451
452 (
453 git --git-dir=gitrepo-$x/.git tag -l &&
454 hg_log hgrepo2-$x &&
455 cat hgrepo2-$x/.hgtags
456 ) > output-$x
457 done &&
458
459 test_cmp output-hg output-git
460'
461
462test_done