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 'executable bit' '
113 mkdir -p tmp && cd tmp &&
114 test_when_finished "cd .. && rm -rf tmp" &&
115
116 (
117 git init -q gitrepo &&
118 cd gitrepo &&
119 echo alpha > alpha &&
120 chmod 0644 alpha &&
121 git add alpha &&
122 git commit -m "add alpha" &&
123 chmod 0755 alpha &&
124 git add alpha &&
125 git commit -m "set executable bit" &&
126 chmod 0644 alpha &&
127 git add alpha &&
128 git commit -m "clear executable bit"
129 ) &&
130
131 for x in hg git; do
132 (
133 hg_clone_$x gitrepo hgrepo-$x &&
134 cd hgrepo-$x &&
135 hg_log . &&
136 hg manifest -r 1 -v &&
137 hg manifest -v
138 ) > output-$x &&
139
140 git_clone_$x hgrepo-$x gitrepo2-$x &&
141 git_log gitrepo2-$x > log-$x
142 done &&
143 cp -r log-* output-* /tmp/foo/ &&
144
145 test_cmp output-hg output-git &&
146 test_cmp log-hg log-git
147'
148
149test_expect_success 'symlink' '
150 mkdir -p tmp && cd tmp &&
151 test_when_finished "cd .. && rm -rf tmp" &&
152
153 (
154 git init -q gitrepo &&
155 cd gitrepo &&
156 echo alpha > alpha &&
157 git add alpha &&
158 git commit -m "add alpha" &&
159 ln -s alpha beta &&
160 git add beta &&
161 git commit -m "add beta"
162 ) &&
163
164 for x in hg git; do
165 (
166 hg_clone_$x gitrepo hgrepo-$x &&
167 cd hgrepo-$x &&
168 hg_log . &&
169 hg manifest -v
170 ) > output-$x &&
171
172 git_clone_$x hgrepo-$x gitrepo2-$x &&
173 git_log gitrepo2-$x > log-$x
174 done &&
175
176 test_cmp output-hg output-git &&
177 test_cmp log-hg log-git
178'
179
180test_expect_success 'merge conflict 1' '
181 mkdir -p tmp && cd tmp &&
182 test_when_finished "cd .. && rm -rf tmp" &&
183
184 (
185 hg init hgrepo1 &&
186 cd hgrepo1 &&
187 echo A > afile &&
188 hg add afile &&
189 hg ci -m "origin" &&
190
191 echo B > afile &&
192 hg ci -m "A->B" &&
193
194 hg up -r0 &&
195 echo C > afile &&
196 hg ci -m "A->C" &&
197
198 hg merge -r1 || true &&
199 echo C > afile &&
200 hg resolve -m afile &&
201 hg ci -m "merge to C"
202 ) &&
203
204 for x in hg git; do
205 git_clone_$x hgrepo1 gitrepo-$x &&
206 hg_clone_$x gitrepo-$x hgrepo2-$x &&
207 hg_log hgrepo2-$x > hg-log-$x &&
208 git_log gitrepo-$x > git-log-$x
209 done &&
210
211 test_cmp hg-log-hg hg-log-git &&
212 test_cmp git-log-hg git-log-git
213'
214
215test_expect_success 'merge conflict 2' '
216 mkdir -p tmp && cd tmp &&
217 test_when_finished "cd .. && rm -rf tmp" &&
218
219 (
220 hg init hgrepo1 &&
221 cd hgrepo1 &&
222 echo A > afile &&
223 hg add afile &&
224 hg ci -m "origin" &&
225
226 echo B > afile &&
227 hg ci -m "A->B" &&
228
229 hg up -r0 &&
230 echo C > afile &&
231 hg ci -m "A->C" &&
232
233 hg merge -r1 || true &&
234 echo B > afile &&
235 hg resolve -m afile &&
236 hg ci -m "merge to B"
237 ) &&
238
239 for x in hg git; do
240 git_clone_$x hgrepo1 gitrepo-$x &&
241 hg_clone_$x gitrepo-$x hgrepo2-$x &&
242 hg_log hgrepo2-$x > hg-log-$x &&
243 git_log gitrepo-$x > git-log-$x
244 done &&
245
246 test_cmp hg-log-hg hg-log-git &&
247 test_cmp git-log-hg git-log-git
248'
249
250test_expect_success 'converged merge' '
251 mkdir -p tmp && cd tmp &&
252 test_when_finished "cd .. && rm -rf tmp" &&
253
254 (
255 hg init hgrepo1 &&
256 cd hgrepo1 &&
257 echo A > afile &&
258 hg add afile &&
259 hg ci -m "origin" &&
260
261 echo B > afile &&
262 hg ci -m "A->B" &&
263
264 echo C > afile &&
265 hg ci -m "B->C" &&
266
267 hg up -r0 &&
268 echo C > afile &&
269 hg ci -m "A->C" &&
270
271 hg merge -r2 || true &&
272 hg ci -m "merge"
273 ) &&
274
275 for x in hg git; do
276 git_clone_$x hgrepo1 gitrepo-$x &&
277 hg_clone_$x gitrepo-$x hgrepo2-$x &&
278 hg_log hgrepo2-$x > hg-log-$x &&
279 git_log gitrepo-$x > git-log-$x
280 done &&
281
282 test_cmp hg-log-hg hg-log-git &&
283 test_cmp git-log-hg git-log-git
284'
285
286test_expect_success 'encoding' '
287 mkdir -p tmp && cd tmp &&
288 test_when_finished "cd .. && rm -rf tmp" &&
289
290 (
291 git init -q gitrepo &&
292 cd gitrepo &&
293
294 echo alpha > alpha &&
295 git add alpha &&
296 git commit -m "add älphà" &&
297
298 export GIT_AUTHOR_NAME="tést èncödîng" &&
299 echo beta > beta &&
300 git add beta &&
301 git commit -m "add beta" &&
302
303 echo gamma > gamma &&
304 git add gamma &&
305 git commit -m "add gämmâ" &&
306
307 : TODO git config i18n.commitencoding latin-1 &&
308 echo delta > delta &&
309 git add delta &&
310 git commit -m "add déltà"
311 ) &&
312
313 for x in hg git; do
314 hg_clone_$x gitrepo hgrepo-$x &&
315 git_clone_$x hgrepo-$x gitrepo2-$x &&
316
317 HGENCODING=utf-8 hg_log hgrepo-$x > hg-log-$x &&
318 git_log gitrepo2-$x > git-log-$x
319 done &&
320
321 test_cmp hg-log-hg hg-log-git &&
322 test_cmp git-log-hg git-log-git
323'
324
325test_expect_success 'file removal' '
326 mkdir -p tmp && cd tmp &&
327 test_when_finished "cd .. && rm -rf tmp" &&
328
329 (
330 git init -q gitrepo &&
331 cd gitrepo &&
332 echo alpha > alpha &&
333 git add alpha &&
334 git commit -m "add alpha" &&
335 echo beta > beta &&
336 git add beta &&
337 git commit -m "add beta"
338 mkdir foo &&
339 echo blah > foo/bar &&
340 git add foo &&
341 git commit -m "add foo" &&
342 git rm alpha &&
343 git commit -m "remove alpha" &&
344 git rm foo/bar &&
345 git commit -m "remove foo/bar"
346 ) &&
347
348 for x in hg git; do
349 (
350 hg_clone_$x gitrepo hgrepo-$x &&
351 cd hgrepo-$x &&
352 hg_log . &&
353 hg manifest -r 3 &&
354 hg manifest
355 ) > output-$x &&
356
357 git_clone_$x hgrepo-$x gitrepo2-$x &&
358 git_log gitrepo2-$x > log-$x
359 done &&
360
361 test_cmp output-hg output-git &&
362 test_cmp log-hg log-git
363'
364
365test_expect_success 'git tags' '
366 mkdir -p tmp && cd tmp &&
367 test_when_finished "cd .. && rm -rf tmp" &&
368
369 (
370 git init -q gitrepo &&
371 cd gitrepo &&
372 git config receive.denyCurrentBranch ignore &&
373 echo alpha > alpha &&
374 git add alpha &&
375 git commit -m "add alpha" &&
376 git tag alpha &&
377
378 echo beta > beta &&
379 git add beta &&
380 git commit -m "add beta" &&
381 git tag -a -m "added tag beta" beta
382 ) &&
383
384 for x in hg git; do
385 hg_clone_$x gitrepo hgrepo-$x &&
386 hg_log hgrepo-$x > log-$x
387 done &&
388
389 test_cmp log-hg log-git
390'
391
392test_expect_success 'hg author' '
393 mkdir -p tmp && cd tmp &&
394 test_when_finished "cd .. && rm -rf tmp" &&
395
396 for x in hg git; do
397 (
398 git init -q gitrepo-$x &&
399 cd gitrepo-$x &&
400
401 echo alpha > alpha &&
402 git add alpha &&
403 git commit -m "add alpha" &&
404 git checkout -q -b not-master
405 ) &&
406
407 (
408 hg_clone_$x gitrepo-$x hgrepo-$x &&
409 cd hgrepo-$x &&
410
411 hg co master &&
412 echo beta > beta &&
413 hg add beta &&
414 hg commit -u "test" -m "add beta" &&
415
416 echo gamma >> beta &&
417 hg commit -u "test <test@example.com> (comment)" -m "modify beta" &&
418
419 echo gamma > gamma &&
420 hg add gamma &&
421 hg commit -u "<test@example.com>" -m "add gamma" &&
422
423 echo delta > delta &&
424 hg add delta &&
425 hg commit -u "name<test@example.com>" -m "add delta" &&
426
427 echo epsilon > epsilon &&
428 hg add epsilon &&
429 hg commit -u "name <test@example.com" -m "add epsilon" &&
430
431 echo zeta > zeta &&
432 hg add zeta &&
433 hg commit -u " test " -m "add zeta" &&
434
435 echo eta > eta &&
436 hg add eta &&
437 hg commit -u "test < test@example.com >" -m "add eta" &&
438
439 echo theta > theta &&
440 hg add theta &&
441 hg commit -u "test >test@example.com>" -m "add theta" &&
442
443 echo iota > iota &&
444 hg add iota &&
445 hg commit -u "test <test <at> example <dot> com>" -m "add iota"
446 ) &&
447
448 hg_push_$x hgrepo-$x gitrepo-$x &&
449 hg_clone_$x gitrepo-$x hgrepo2-$x &&
450
451 hg_log hgrepo2-$x > hg-log-$x &&
452 git_log gitrepo-$x > git-log-$x
453 done &&
454
455 test_cmp git-log-hg git-log-git &&
456
457 test_cmp hg-log-hg hg-log-git &&
458 test_cmp git-log-hg git-log-git
459'
460
461test_expect_success 'hg branch' '
462 mkdir -p tmp && cd tmp &&
463 test_when_finished "cd .. && rm -rf tmp" &&
464
465 for x in hg git; do
466 (
467 git init -q gitrepo-$x &&
468 cd gitrepo-$x &&
469
470 echo alpha > alpha &&
471 git add alpha &&
472 git commit -q -m "add alpha" &&
473 git checkout -q -b not-master
474 ) &&
475
476 (
477 hg_clone_$x gitrepo-$x hgrepo-$x &&
478
479 cd hgrepo-$x &&
480 hg -q co master &&
481 hg mv alpha beta &&
482 hg -q commit -m "rename alpha to beta" &&
483 hg branch gamma | grep -v "permanent and global" &&
484 hg -q commit -m "started branch gamma"
485 ) &&
486
487 hg_push_$x hgrepo-$x gitrepo-$x &&
488 hg_clone_$x gitrepo-$x hgrepo2-$x &&
489
490 hg_log hgrepo2-$x > hg-log-$x &&
491 git_log gitrepo-$x > git-log-$x
492 done &&
493
494 test_cmp hg-log-hg hg-log-git &&
495 test_cmp git-log-hg git-log-git
496'
497
498test_expect_success 'hg tags' '
499 mkdir -p tmp && cd tmp &&
500 test_when_finished "cd .. && rm -rf tmp" &&
501
502 for x in hg git; do
503 (
504 git init -q gitrepo-$x &&
505 cd gitrepo-$x &&
506
507 echo alpha > alpha &&
508 git add alpha &&
509 git commit -m "add alpha" &&
510 git checkout -q -b not-master
511 ) &&
512
513 (
514 hg_clone_$x gitrepo-$x hgrepo-$x &&
515
516 cd hgrepo-$x &&
517 hg co master &&
518 hg tag alpha
519 ) &&
520
521 hg_push_$x hgrepo-$x gitrepo-$x &&
522 hg_clone_$x gitrepo-$x hgrepo2-$x &&
523
524 (
525 git --git-dir=gitrepo-$x/.git tag -l &&
526 hg_log hgrepo2-$x &&
527 cat hgrepo2-$x/.hgtags
528 ) > output-$x
529 done &&
530
531 test_cmp output-hg output-git
532'
533
534test_done