Merge git://repo.or.cz/git-gui
[git] / contrib / remote-helpers / test-hg.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'
10
11 test -n "$TEST_DIRECTORY" || TEST_DIRECTORY=${0%/*}/../../t
12 . "$TEST_DIRECTORY"/test-lib.sh
13
14 if ! test_have_prereq PYTHON
15 then
16         skip_all='skipping remote-hg tests; python not available'
17         test_done
18 fi
19
20 if ! python -c 'import mercurial'
21 then
22         skip_all='skipping remote-hg tests; mercurial not available'
23         test_done
24 fi
25
26 check () {
27         echo $3 >expected &&
28         git --git-dir=$1/.git log --format='%s' -1 $2 >actual
29         test_cmp expected actual
30 }
31
32 check_branch () {
33         if test -n "$3"
34         then
35                 echo $3 >expected &&
36                 hg -R $1 log -r $2 --template '{desc}\n' >actual &&
37                 test_cmp expected actual
38         else
39                 hg -R $1 branches >out &&
40                 ! grep $2 out
41         fi
42 }
43
44 check_bookmark () {
45         if test -n "$3"
46         then
47                 echo $3 >expected &&
48                 hg -R $1 log -r "bookmark('$2')" --template '{desc}\n' >actual &&
49                 test_cmp expected actual
50         else
51                 hg -R $1 bookmarks >out &&
52                 ! grep $2 out
53         fi
54 }
55
56 check_push () {
57         expected_ret=$1 ret=0 ref_ret=0
58
59         shift
60         git push origin "$@" 2>error
61         ret=$?
62         cat error
63
64         while IFS=':' read branch kind
65         do
66                 case "$kind" in
67                 'new')
68                         grep "^ \* \[new branch\] *${branch} -> ${branch}$" error || ref_ret=1
69                         ;;
70                 'non-fast-forward')
71                         grep "^ ! \[rejected\] *${branch} -> ${branch} (non-fast-forward)$" error || ref_ret=1
72                         ;;
73                 'fetch-first')
74                         grep "^ ! \[rejected\] *${branch} -> ${branch} (fetch first)$" error || ref_ret=1
75                         ;;
76                 'forced-update')
77                         grep "^ + [a-f0-9]*\.\.\.[a-f0-9]* *${branch} -> ${branch} (forced update)$" error || ref_ret=1
78                         ;;
79                 '')
80                         grep "^   [a-f0-9]*\.\.[a-f0-9]* *${branch} -> ${branch}$" error || ref_ret=1
81                         ;;
82                 esac
83                 test $ref_ret -ne 0 && echo "match for '$branch' failed" && break
84         done
85
86         if test $expected_ret -ne $ret || test $ref_ret -ne 0
87         then
88                 return 1
89         fi
90
91         return 0
92 }
93
94 setup () {
95         (
96         echo "[ui]"
97         echo "username = H G Wells <wells@example.com>"
98         echo "[extensions]"
99         echo "mq ="
100         ) >>"$HOME"/.hgrc &&
101
102         GIT_AUTHOR_DATE="2007-01-01 00:00:00 +0230" &&
103         GIT_COMMITTER_DATE="$GIT_AUTHOR_DATE" &&
104         export GIT_COMMITTER_DATE GIT_AUTHOR_DATE
105 }
106
107 setup
108
109 test_expect_success 'cloning' '
110         test_when_finished "rm -rf gitrepo*" &&
111
112         (
113         hg init hgrepo &&
114         cd hgrepo &&
115         echo zero >content &&
116         hg add content &&
117         hg commit -m zero
118         ) &&
119
120         git clone "hg::hgrepo" gitrepo &&
121         check gitrepo HEAD zero
122 '
123
124 test_expect_success 'cloning with branches' '
125         test_when_finished "rm -rf gitrepo*" &&
126
127         (
128         cd hgrepo &&
129         hg branch next &&
130         echo next >content &&
131         hg commit -m next
132         ) &&
133
134         git clone "hg::hgrepo" gitrepo &&
135         check gitrepo origin/branches/next next
136 '
137
138 test_expect_success 'cloning with bookmarks' '
139         test_when_finished "rm -rf gitrepo*" &&
140
141         (
142         cd hgrepo &&
143         hg checkout default &&
144         hg bookmark feature-a &&
145         echo feature-a >content &&
146         hg commit -m feature-a
147         ) &&
148
149         git clone "hg::hgrepo" gitrepo &&
150         check gitrepo origin/feature-a feature-a
151 '
152
153 test_expect_success 'update bookmark' '
154         test_when_finished "rm -rf gitrepo*" &&
155
156         (
157         cd hgrepo &&
158         hg bookmark devel
159         ) &&
160
161         (
162         git clone "hg::hgrepo" gitrepo &&
163         cd gitrepo &&
164         git checkout --quiet devel &&
165         echo devel >content &&
166         git commit -a -m devel &&
167         git push --quiet
168         ) &&
169
170         check_bookmark hgrepo devel devel
171 '
172
173 test_expect_success 'new bookmark' '
174         test_when_finished "rm -rf gitrepo*" &&
175
176         (
177         git clone "hg::hgrepo" gitrepo &&
178         cd gitrepo &&
179         git checkout --quiet -b feature-b &&
180         echo feature-b >content &&
181         git commit -a -m feature-b &&
182         git push --quiet origin feature-b
183         ) &&
184
185         check_bookmark hgrepo feature-b feature-b
186 '
187
188 # cleanup previous stuff
189 rm -rf hgrepo
190
191 author_test () {
192         echo $1 >>content &&
193         hg commit -u "$2" -m "add $1" &&
194         echo "$3" >>../expected
195 }
196
197 test_expect_success 'authors' '
198         test_when_finished "rm -rf hgrepo gitrepo" &&
199
200         (
201         hg init hgrepo &&
202         cd hgrepo &&
203
204         touch content &&
205         hg add content &&
206
207         >../expected &&
208         author_test alpha "" "H G Wells <wells@example.com>" &&
209         author_test beta "beta" "beta <unknown>" &&
210         author_test gamma "gamma <test@example.com> (comment)" "gamma <test@example.com>" &&
211         author_test delta "<delta@example.com>" "Unknown <delta@example.com>" &&
212         author_test epsilon "epsilon<test@example.com>" "epsilon <test@example.com>" &&
213         author_test zeta "zeta <test@example.com" "zeta <test@example.com>" &&
214         author_test eta " eta " "eta <unknown>" &&
215         author_test theta "theta < test@example.com >" "theta <test@example.com>" &&
216         author_test iota "iota >test@example.com>" "iota <test@example.com>" &&
217         author_test kappa "kappa < test <at> example <dot> com>" "kappa <unknown>" &&
218         author_test lambda "lambda@example.com" "Unknown <lambda@example.com>" &&
219         author_test mu "mu.mu@example.com" "Unknown <mu.mu@example.com>"
220         ) &&
221
222         git clone "hg::hgrepo" gitrepo &&
223         git --git-dir=gitrepo/.git log --reverse --format="%an <%ae>" >actual &&
224
225         test_cmp expected actual
226 '
227
228 test_expect_success 'strip' '
229         test_when_finished "rm -rf hgrepo gitrepo" &&
230
231         (
232         hg init hgrepo &&
233         cd hgrepo &&
234
235         echo one >>content &&
236         hg add content &&
237         hg commit -m one &&
238
239         echo two >>content &&
240         hg commit -m two
241         ) &&
242
243         git clone "hg::hgrepo" gitrepo &&
244
245         (
246         cd hgrepo &&
247         hg strip 1 &&
248
249         echo three >>content &&
250         hg commit -m three &&
251
252         echo four >>content &&
253         hg commit -m four
254         ) &&
255
256         (
257         cd gitrepo &&
258         git fetch &&
259         git log --format="%s" origin/master >../actual
260         ) &&
261
262         hg -R hgrepo log --template "{desc}\n" >expected &&
263         test_cmp actual expected
264 '
265
266 test_expect_success 'remote push with master bookmark' '
267         test_when_finished "rm -rf hgrepo gitrepo*" &&
268
269         (
270         hg init hgrepo &&
271         cd hgrepo &&
272         echo zero >content &&
273         hg add content &&
274         hg commit -m zero &&
275         hg bookmark master &&
276         echo one >content &&
277         hg commit -m one
278         ) &&
279
280         (
281         git clone "hg::hgrepo" gitrepo &&
282         cd gitrepo &&
283         echo two >content &&
284         git commit -a -m two &&
285         git push
286         ) &&
287
288         check_branch hgrepo default two
289 '
290
291 cat >expected <<\EOF
292 changeset:   0:6e2126489d3d
293 tag:         tip
294 user:        A U Thor <author@example.com>
295 date:        Mon Jan 01 00:00:00 2007 +0230
296 summary:     one
297
298 EOF
299
300 test_expect_success 'remote push from master branch' '
301         test_when_finished "rm -rf hgrepo gitrepo*" &&
302
303         hg init hgrepo &&
304
305         (
306         git init gitrepo &&
307         cd gitrepo &&
308         git remote add origin "hg::../hgrepo" &&
309         echo one >content &&
310         git add content &&
311         git commit -a -m one &&
312         git push origin master
313         ) &&
314
315         hg -R hgrepo log >actual &&
316         cat actual &&
317         test_cmp expected actual &&
318
319         check_branch hgrepo default one
320 '
321
322 GIT_REMOTE_HG_TEST_REMOTE=1
323 export GIT_REMOTE_HG_TEST_REMOTE
324
325 test_expect_success 'remote cloning' '
326         test_when_finished "rm -rf gitrepo*" &&
327
328         (
329         hg init hgrepo &&
330         cd hgrepo &&
331         echo zero >content &&
332         hg add content &&
333         hg commit -m zero
334         ) &&
335
336         git clone "hg::hgrepo" gitrepo &&
337         check gitrepo HEAD zero
338 '
339
340 test_expect_success 'remote update bookmark' '
341         test_when_finished "rm -rf gitrepo*" &&
342
343         (
344         cd hgrepo &&
345         hg bookmark devel
346         ) &&
347
348         (
349         git clone "hg::hgrepo" gitrepo &&
350         cd gitrepo &&
351         git checkout --quiet devel &&
352         echo devel >content &&
353         git commit -a -m devel &&
354         git push --quiet
355         ) &&
356
357         check_bookmark hgrepo devel devel
358 '
359
360 test_expect_success 'remote new bookmark' '
361         test_when_finished "rm -rf gitrepo*" &&
362
363         (
364         git clone "hg::hgrepo" gitrepo &&
365         cd gitrepo &&
366         git checkout --quiet -b feature-b &&
367         echo feature-b >content &&
368         git commit -a -m feature-b &&
369         git push --quiet origin feature-b
370         ) &&
371
372         check_bookmark hgrepo feature-b feature-b
373 '
374
375 test_expect_success 'remote push diverged' '
376         test_when_finished "rm -rf gitrepo*" &&
377
378         git clone "hg::hgrepo" gitrepo &&
379
380         (
381         cd hgrepo &&
382         hg checkout default &&
383         echo bump >content &&
384         hg commit -m bump
385         ) &&
386
387         (
388         cd gitrepo &&
389         echo diverge >content &&
390         git commit -a -m diverged &&
391         check_push 1 <<-\EOF
392         master:non-fast-forward
393         EOF
394         ) &&
395
396         check_branch hgrepo default bump
397 '
398
399 test_expect_success 'remote update bookmark diverge' '
400         test_when_finished "rm -rf gitrepo*" &&
401
402         (
403         cd hgrepo &&
404         hg checkout tip^ &&
405         hg bookmark diverge
406         ) &&
407
408         git clone "hg::hgrepo" gitrepo &&
409
410         (
411         cd hgrepo &&
412         echo "bump bookmark" >content &&
413         hg commit -m "bump bookmark"
414         ) &&
415
416         (
417         cd gitrepo &&
418         git checkout --quiet diverge &&
419         echo diverge >content &&
420         git commit -a -m diverge &&
421         check_push 1 <<-\EOF
422         diverge:fetch-first
423         EOF
424         ) &&
425
426         check_bookmark hgrepo diverge "bump bookmark"
427 '
428
429 test_expect_success 'remote new bookmark multiple branch head' '
430         test_when_finished "rm -rf gitrepo*" &&
431
432         (
433         git clone "hg::hgrepo" gitrepo &&
434         cd gitrepo &&
435         git checkout --quiet -b feature-c HEAD^ &&
436         echo feature-c >content &&
437         git commit -a -m feature-c &&
438         git push --quiet origin feature-c
439         ) &&
440
441         check_bookmark hgrepo feature-c feature-c
442 '
443
444 # cleanup previous stuff
445 rm -rf hgrepo
446
447 setup_big_push () {
448         (
449         hg init hgrepo &&
450         cd hgrepo &&
451         echo zero >content &&
452         hg add content &&
453         hg commit -m zero &&
454         hg bookmark bad_bmark1 &&
455         echo one >content &&
456         hg commit -m one &&
457         hg bookmark bad_bmark2 &&
458         hg bookmark good_bmark &&
459         hg bookmark -i good_bmark &&
460         hg -q branch good_branch &&
461         echo "good branch" >content &&
462         hg commit -m "good branch" &&
463         hg -q branch bad_branch &&
464         echo "bad branch" >content &&
465         hg commit -m "bad branch"
466         ) &&
467
468         git clone "hg::hgrepo" gitrepo &&
469
470         (
471         cd gitrepo &&
472         echo two >content &&
473         git commit -q -a -m two &&
474
475         git checkout -q good_bmark &&
476         echo three >content &&
477         git commit -q -a -m three &&
478
479         git checkout -q bad_bmark1 &&
480         git reset --hard HEAD^ &&
481         echo four >content &&
482         git commit -q -a -m four &&
483
484         git checkout -q bad_bmark2 &&
485         git reset --hard HEAD^ &&
486         echo five >content &&
487         git commit -q -a -m five &&
488
489         git checkout -q -b new_bmark master &&
490         echo six >content &&
491         git commit -q -a -m six &&
492
493         git checkout -q branches/good_branch &&
494         echo seven >content &&
495         git commit -q -a -m seven &&
496         echo eight >content &&
497         git commit -q -a -m eight &&
498
499         git checkout -q branches/bad_branch &&
500         git reset --hard HEAD^ &&
501         echo nine >content &&
502         git commit -q -a -m nine &&
503
504         git checkout -q -b branches/new_branch master &&
505         echo ten >content &&
506         git commit -q -a -m ten
507         )
508 }
509
510 test_expect_success 'remote big push' '
511         test_when_finished "rm -rf hgrepo gitrepo*" &&
512
513         setup_big_push
514
515         (
516         cd gitrepo &&
517
518         check_push 1 --all <<-\EOF
519         master
520         good_bmark
521         branches/good_branch
522         new_bmark:new
523         branches/new_branch:new
524         bad_bmark1:non-fast-forward
525         bad_bmark2:non-fast-forward
526         branches/bad_branch:non-fast-forward
527         EOF
528         ) &&
529
530         check_branch hgrepo default one &&
531         check_branch hgrepo good_branch "good branch" &&
532         check_branch hgrepo bad_branch "bad branch" &&
533         check_branch hgrepo new_branch '' &&
534         check_bookmark hgrepo good_bmark one &&
535         check_bookmark hgrepo bad_bmark1 one &&
536         check_bookmark hgrepo bad_bmark2 one &&
537         check_bookmark hgrepo new_bmark ''
538 '
539
540 test_expect_success 'remote big push fetch first' '
541         test_when_finished "rm -rf hgrepo gitrepo*" &&
542
543         (
544         hg init hgrepo &&
545         cd hgrepo &&
546         echo zero >content &&
547         hg add content &&
548         hg commit -m zero &&
549         hg bookmark bad_bmark &&
550         hg bookmark good_bmark &&
551         hg bookmark -i good_bmark &&
552         hg -q branch good_branch &&
553         echo "good branch" >content &&
554         hg commit -m "good branch" &&
555         hg -q branch bad_branch &&
556         echo "bad branch" >content &&
557         hg commit -m "bad branch"
558         ) &&
559
560         git clone "hg::hgrepo" gitrepo &&
561
562         (
563         cd hgrepo &&
564         hg bookmark -f bad_bmark &&
565         echo update_bmark >content &&
566         hg commit -m "update bmark"
567         ) &&
568
569         (
570         cd gitrepo &&
571         echo two >content &&
572         git commit -q -a -m two &&
573
574         git checkout -q good_bmark &&
575         echo three >content &&
576         git commit -q -a -m three &&
577
578         git checkout -q bad_bmark &&
579         echo four >content &&
580         git commit -q -a -m four &&
581
582         git checkout -q branches/bad_branch &&
583         echo five >content &&
584         git commit -q -a -m five &&
585
586         check_push 1 --all <<-\EOF &&
587         master
588         good_bmark
589         bad_bmark:fetch-first
590         branches/bad_branch:festch-first
591         EOF
592
593         git fetch &&
594
595         check_push 1 --all <<-\EOF
596         master
597         good_bmark
598         bad_bmark:non-fast-forward
599         branches/bad_branch:non-fast-forward
600         EOF
601         )
602 '
603
604 test_expect_failure 'remote big push force' '
605         test_when_finished "rm -rf hgrepo gitrepo*" &&
606
607         setup_big_push
608
609         (
610         cd gitrepo &&
611
612         check_push 0 --force --all <<-\EOF
613         master
614         good_bmark
615         branches/good_branch
616         new_bmark:new
617         branches/new_branch:new
618         bad_bmark1:forced-update
619         bad_bmark2:forced-update
620         branches/bad_branch:forced-update
621         EOF
622         ) &&
623
624         check_branch hgrepo default six &&
625         check_branch hgrepo good_branch eight &&
626         check_branch hgrepo bad_branch nine &&
627         check_branch hgrepo new_branch ten &&
628         check_bookmark hgrepo good_bmark three &&
629         check_bookmark hgrepo bad_bmark1 four &&
630         check_bookmark hgrepo bad_bmark2 five &&
631         check_bookmark hgrepo new_bmark six
632 '
633
634 test_expect_failure 'remote big push dry-run' '
635         test_when_finished "rm -rf hgrepo gitrepo*" &&
636
637         setup_big_push
638
639         (
640         cd gitrepo &&
641
642         check_push 1 --dry-run --all <<-\EOF &&
643         master
644         good_bmark
645         branches/good_branch
646         new_bmark:new
647         branches/new_branch:new
648         bad_bmark1:non-fast-forward
649         bad_bmark2:non-fast-forward
650         branches/bad_branch:non-fast-forward
651         EOF
652
653         check_push 0 --dry-run master good_bmark new_bmark branches/good_branch branches/new_branch <<-\EOF
654         master
655         good_bmark
656         branches/good_branch
657         new_bmark:new
658         branches/new_branch:new
659         EOF
660         ) &&
661
662         check_branch hgrepo default one &&
663         check_branch hgrepo good_branch "good branch" &&
664         check_branch hgrepo bad_branch "bad branch" &&
665         check_branch hgrepo new_branch '' &&
666         check_bookmark hgrepo good_bmark one &&
667         check_bookmark hgrepo bad_bmark1 one &&
668         check_bookmark hgrepo bad_bmark2 one &&
669         check_bookmark hgrepo new_bmark ''
670 '
671
672 test_expect_success 'remote double failed push' '
673         test_when_finished "rm -rf hgrepo gitrepo*" &&
674
675         (
676         hg init hgrepo &&
677         cd hgrepo &&
678         echo zero >content &&
679         hg add content &&
680         hg commit -m zero &&
681         echo one >content &&
682         hg commit -m one
683         ) &&
684
685         (
686         git clone "hg::hgrepo" gitrepo &&
687         cd gitrepo &&
688         git reset --hard HEAD^ &&
689         echo two >content &&
690         git commit -a -m two &&
691         test_expect_code 1 git push &&
692         test_expect_code 1 git push
693         )
694 '
695
696 test_done