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