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