contrib / remote-helpers / test-hg-hg-git.shon commit remote-hg: small performance improvement (1a2636c)
   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        git clone -q "hg::$PWD/$1" $2
  31}
  32
  33# clone to an hg repo with git
  34hg_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
  46git_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
  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 >log &&
  82        grep -v 'tag: *default/' log
  83}
  84
  85git_log () {
  86        git --git-dir=$1/.git fast-export --branches
  87}
  88
  89setup () {
  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        export HGEDITOR=/usr/bin/true
 107
 108        export GIT_AUTHOR_DATE="2007-01-01 00:00:00 +0230"
 109        export GIT_COMMITTER_DATE="$GIT_AUTHOR_DATE"
 110}
 111
 112setup
 113
 114test_expect_success 'executable bit' '
 115        mkdir -p tmp && cd tmp &&
 116        test_when_finished "cd .. && rm -rf tmp" &&
 117
 118        (
 119        git init -q gitrepo &&
 120        cd gitrepo &&
 121        echo alpha > alpha &&
 122        chmod 0644 alpha &&
 123        git add alpha &&
 124        git commit -m "add alpha" &&
 125        chmod 0755 alpha &&
 126        git add alpha &&
 127        git commit -m "set executable bit" &&
 128        chmod 0644 alpha &&
 129        git add alpha &&
 130        git commit -m "clear executable bit"
 131        ) &&
 132
 133        for x in hg git; do
 134                (
 135                hg_clone_$x gitrepo hgrepo-$x &&
 136                cd hgrepo-$x &&
 137                hg_log . &&
 138                hg manifest -r 1 -v &&
 139                hg manifest -v
 140                ) > output-$x &&
 141
 142                git_clone_$x hgrepo-$x gitrepo2-$x &&
 143                git_log gitrepo2-$x > log-$x
 144        done &&
 145
 146        test_cmp output-hg output-git &&
 147        test_cmp log-hg log-git
 148'
 149
 150test_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
 181test_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
 216test_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
 251test_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
 287test_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        export GIT_AUTHOR_NAME="tést èncödîng" &&
 300        echo beta > beta &&
 301        git add beta &&
 302        git commit -m "add beta" &&
 303
 304        echo gamma > gamma &&
 305        git add gamma &&
 306        git commit -m "add gämmâ" &&
 307
 308        : TODO git config i18n.commitencoding latin-1 &&
 309        echo delta > delta &&
 310        git add delta &&
 311        git commit -m "add déltà"
 312        ) &&
 313
 314        for x in hg git; do
 315                hg_clone_$x gitrepo hgrepo-$x &&
 316                git_clone_$x hgrepo-$x gitrepo2-$x &&
 317
 318                HGENCODING=utf-8 hg_log hgrepo-$x > hg-log-$x &&
 319                git_log gitrepo2-$x > git-log-$x
 320        done &&
 321
 322        test_cmp hg-log-hg hg-log-git &&
 323        test_cmp git-log-hg git-log-git
 324'
 325
 326test_expect_success 'file removal' '
 327        mkdir -p tmp && cd tmp &&
 328        test_when_finished "cd .. && rm -rf tmp" &&
 329
 330        (
 331        git init -q gitrepo &&
 332        cd gitrepo &&
 333        echo alpha > alpha &&
 334        git add alpha &&
 335        git commit -m "add alpha" &&
 336        echo beta > beta &&
 337        git add beta &&
 338        git commit -m "add beta"
 339        mkdir foo &&
 340        echo blah > foo/bar &&
 341        git add foo &&
 342        git commit -m "add foo" &&
 343        git rm alpha &&
 344        git commit -m "remove alpha" &&
 345        git rm foo/bar &&
 346        git commit -m "remove foo/bar"
 347        ) &&
 348
 349        for x in hg git; do
 350                (
 351                hg_clone_$x gitrepo hgrepo-$x &&
 352                cd hgrepo-$x &&
 353                hg_log . &&
 354                hg manifest -r 3 &&
 355                hg manifest
 356                ) > output-$x &&
 357
 358                git_clone_$x hgrepo-$x gitrepo2-$x &&
 359                git_log gitrepo2-$x > log-$x
 360        done &&
 361
 362        test_cmp output-hg output-git &&
 363        test_cmp log-hg log-git
 364'
 365
 366test_expect_success 'git tags' '
 367        mkdir -p tmp && cd tmp &&
 368        test_when_finished "cd .. && rm -rf tmp" &&
 369
 370        (
 371        git init -q gitrepo &&
 372        cd gitrepo &&
 373        git config receive.denyCurrentBranch ignore &&
 374        echo alpha > alpha &&
 375        git add alpha &&
 376        git commit -m "add alpha" &&
 377        git tag alpha &&
 378
 379        echo beta > beta &&
 380        git add beta &&
 381        git commit -m "add beta" &&
 382        git tag -a -m "added tag beta" beta
 383        ) &&
 384
 385        for x in hg git; do
 386                hg_clone_$x gitrepo hgrepo-$x &&
 387                hg_log hgrepo-$x > log-$x
 388        done &&
 389
 390        test_cmp log-hg log-git
 391'
 392
 393test_expect_success 'hg author' '
 394        mkdir -p tmp && cd tmp &&
 395        test_when_finished "cd .. && rm -rf tmp" &&
 396
 397        for x in hg git; do
 398                (
 399                git init -q gitrepo-$x &&
 400                cd gitrepo-$x &&
 401
 402                echo alpha > alpha &&
 403                git add alpha &&
 404                git commit -m "add alpha" &&
 405                git checkout -q -b not-master
 406                ) &&
 407
 408                (
 409                hg_clone_$x gitrepo-$x hgrepo-$x &&
 410                cd hgrepo-$x &&
 411
 412                hg co master &&
 413                echo beta > beta &&
 414                hg add beta &&
 415                hg commit -u "test" -m "add beta" &&
 416
 417                echo gamma >> beta &&
 418                hg commit -u "test <test@example.com> (comment)" -m "modify beta" &&
 419
 420                echo gamma > gamma &&
 421                hg add gamma &&
 422                hg commit -u "<test@example.com>" -m "add gamma" &&
 423
 424                echo delta > delta &&
 425                hg add delta &&
 426                hg commit -u "name<test@example.com>" -m "add delta" &&
 427
 428                echo epsilon > epsilon &&
 429                hg add epsilon &&
 430                hg commit -u "name <test@example.com" -m "add epsilon" &&
 431
 432                echo zeta > zeta &&
 433                hg add zeta &&
 434                hg commit -u " test " -m "add zeta" &&
 435
 436                echo eta > eta &&
 437                hg add eta &&
 438                hg commit -u "test < test@example.com >" -m "add eta" &&
 439
 440                echo theta > theta &&
 441                hg add theta &&
 442                hg commit -u "test >test@example.com>" -m "add theta" &&
 443
 444                echo iota > iota &&
 445                hg add iota &&
 446                hg commit -u "test <test <at> example <dot> com>" -m "add iota"
 447                ) &&
 448
 449                hg_push_$x hgrepo-$x gitrepo-$x &&
 450                hg_clone_$x gitrepo-$x hgrepo2-$x &&
 451
 452                hg_log hgrepo2-$x > hg-log-$x &&
 453                git_log gitrepo-$x > git-log-$x
 454        done &&
 455
 456        test_cmp git-log-hg git-log-git &&
 457
 458        test_cmp hg-log-hg hg-log-git &&
 459        test_cmp git-log-hg git-log-git
 460'
 461
 462test_expect_success 'hg branch' '
 463        mkdir -p tmp && cd tmp &&
 464        test_when_finished "cd .. && rm -rf tmp" &&
 465
 466        for x in hg git; do
 467                (
 468                git init -q gitrepo-$x &&
 469                cd gitrepo-$x &&
 470
 471                echo alpha > alpha &&
 472                git add alpha &&
 473                git commit -q -m "add alpha" &&
 474                git checkout -q -b not-master
 475                ) &&
 476
 477                (
 478                hg_clone_$x gitrepo-$x hgrepo-$x &&
 479
 480                cd hgrepo-$x &&
 481                hg -q co master &&
 482                hg mv alpha beta &&
 483                hg -q commit -m "rename alpha to beta" &&
 484                hg branch gamma | grep -v "permanent and global" &&
 485                hg -q commit -m "started branch gamma"
 486                ) &&
 487
 488                hg_push_$x hgrepo-$x gitrepo-$x &&
 489                hg_clone_$x gitrepo-$x hgrepo2-$x &&
 490
 491                hg_log hgrepo2-$x > hg-log-$x &&
 492                git_log gitrepo-$x > git-log-$x
 493        done &&
 494
 495        test_cmp hg-log-hg hg-log-git &&
 496        test_cmp git-log-hg git-log-git
 497'
 498
 499test_expect_success 'hg tags' '
 500        mkdir -p tmp && cd tmp &&
 501        test_when_finished "cd .. && rm -rf tmp" &&
 502
 503        for x in hg git; do
 504                (
 505                git init -q gitrepo-$x &&
 506                cd gitrepo-$x &&
 507
 508                echo alpha > alpha &&
 509                git add alpha &&
 510                git commit -m "add alpha" &&
 511                git checkout -q -b not-master
 512                ) &&
 513
 514                (
 515                hg_clone_$x gitrepo-$x hgrepo-$x &&
 516
 517                cd hgrepo-$x &&
 518                hg co master &&
 519                hg tag alpha
 520                ) &&
 521
 522                hg_push_$x hgrepo-$x gitrepo-$x &&
 523                hg_clone_$x gitrepo-$x hgrepo2-$x &&
 524
 525                (
 526                git --git-dir=gitrepo-$x/.git tag -l &&
 527                hg_log hgrepo2-$x &&
 528                cat hgrepo2-$x/.hgtags
 529                ) > output-$x
 530        done &&
 531
 532        test_cmp output-hg output-git
 533'
 534
 535test_done