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