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#
   8test_description='Test bidirectionality of remote-hg'
  10. ./test-lib.sh
  12if ! test_have_prereq PYTHON; then
  14        skip_all='skipping remote-hg tests; python not available'
  15        test_done
  16fi
  17if ! "$PYTHON_PATH" -c 'import mercurial'; then
  19        skip_all='skipping remote-hg tests; mercurial not available'
  20        test_done
  21fi
  22# clone to a git repo
  24git_clone () {
  25        hg -R $1 bookmark -f -r tip master &&
  26        git clone -q "hg::$PWD/$1" $2
  27}
  28# clone to an hg repo
  30hg_clone () {
  31        (
  32        hg init $2 &&
  33        cd $1 &&
  34        git push -q "hg::$PWD/../$2" 'refs/tags/*:refs/tags/*' 'refs/heads/*:refs/heads/*'
  35        ) &&
  36        (cd $2 && hg -q update)
  38}
  39# push an hg repo
  41hg_push () {
  42        (
  43        cd $2
  44        old=$(git symbolic-ref --short HEAD)
  45        git checkout -q -b tmp &&
  46        git fetch -q "hg::$PWD/../$1" 'refs/tags/*:refs/tags/*' 'refs/heads/*:refs/heads/*' &&
  47        git checkout -q $old &&
  48        git branch -q -D tmp 2> /dev/null || true
  49        )
  50}
  51hg_log () {
  53        hg -R $1 log --graph --debug | grep -v 'tag: *default/'
  54}
  55setup () {
  57        (
  58        echo "[ui]"
  59        echo "username = A U Thor <author@example.com>"
  60        echo "[defaults]"
  61        echo "backout = -d \"0 0\""
  62        echo "commit = -d \"0 0\""
  63        echo "debugrawcommit = -d \"0 0\""
  64        echo "tag = -d \"0 0\""
  65        ) >> "$HOME"/.hgrc &&
  66        git config --global remote-hg.hg-git-compat true
  67        export HGEDITOR=/usr/bin/true
  69        export GIT_AUTHOR_DATE="2007-01-01 00:00:00 +0230"
  71        export GIT_COMMITTER_DATE="$GIT_AUTHOR_DATE"
  72}
  73setup
  75test_expect_success 'encoding' '
  77        mkdir -p tmp && cd tmp &&
  78        test_when_finished "cd .. && rm -rf tmp" &&
  79        (
  81        git init -q gitrepo &&
  82        cd gitrepo &&
  83        echo alpha > alpha &&
  85        git add alpha &&
  86        git commit -m "add älphà" &&
  87        export GIT_AUTHOR_NAME="tést èncödîng" &&
  89        echo beta > beta &&
  90        git add beta &&
  91        git commit -m "add beta" &&
  92        echo gamma > gamma &&
  94        git add gamma &&
  95        git commit -m "add gämmâ" &&
  96        : TODO git config i18n.commitencoding latin-1 &&
  98        echo delta > delta &&
  99        git add delta &&
 100        git commit -m "add déltà"
 101        ) &&
 102        hg_clone gitrepo hgrepo &&
 104        git_clone hgrepo gitrepo2 &&
 105        hg_clone gitrepo2 hgrepo2 &&
 106        HGENCODING=utf-8 hg_log hgrepo > expected &&
 108        HGENCODING=utf-8 hg_log hgrepo2 > actual &&
 109        test_cmp expected actual
 111'
 112test_expect_success 'file removal' '
 114        mkdir -p tmp && cd tmp &&
 115        test_when_finished "cd .. && rm -rf tmp" &&
 116        (
 118        git init -q gitrepo &&
 119        cd gitrepo &&
 120        echo alpha > alpha &&
 121        git add alpha &&
 122        git commit -m "add alpha" &&
 123        echo beta > beta &&
 124        git add beta &&
 125        git commit -m "add beta"
 126        mkdir foo &&
 127        echo blah > foo/bar &&
 128        git add foo &&
 129        git commit -m "add foo" &&
 130        git rm alpha &&
 131        git commit -m "remove alpha" &&
 132        git rm foo/bar &&
 133        git commit -m "remove foo/bar"
 134        ) &&
 135        hg_clone gitrepo hgrepo &&
 137        git_clone hgrepo gitrepo2 &&
 138        hg_clone gitrepo2 hgrepo2 &&
 139        hg_log hgrepo > expected &&
 141        hg_log hgrepo2 > actual &&
 142        test_cmp expected actual
 144'
 145test_expect_success 'git tags' '
 147        mkdir -p tmp && cd tmp &&
 148        test_when_finished "cd .. && rm -rf tmp" &&
 149        (
 151        git init -q gitrepo &&
 152        cd gitrepo &&
 153        git config receive.denyCurrentBranch ignore &&
 154        echo alpha > alpha &&
 155        git add alpha &&
 156        git commit -m "add alpha" &&
 157        git tag alpha &&
 158        echo beta > beta &&
 160        git add beta &&
 161        git commit -m "add beta" &&
 162        git tag -a -m "added tag beta" beta
 163        ) &&
 164        hg_clone gitrepo hgrepo &&
 166        git_clone hgrepo gitrepo2 &&
 167        hg_clone gitrepo2 hgrepo2 &&
 168        hg_log hgrepo > expected &&
 170        hg_log hgrepo2 > actual &&
 171        test_cmp expected actual
 173'
 174test_expect_success 'hg branch' '
 176        mkdir -p tmp && cd tmp &&
 177        test_when_finished "cd .. && rm -rf tmp" &&
 178        (
 180        git init -q gitrepo &&
 181        cd gitrepo &&
 182        echo alpha > alpha &&
 184        git add alpha &&
 185        git commit -q -m "add alpha" &&
 186        git checkout -q -b not-master
 187        ) &&
 188        (
 190        hg_clone gitrepo hgrepo &&
 191        cd hgrepo &&
 193        hg -q co master &&
 194        hg mv alpha beta &&
 195        hg -q commit -m "rename alpha to beta" &&
 196        hg branch gamma | grep -v "permanent and global" &&
 197        hg -q commit -m "started branch gamma"
 198        ) &&
 199        hg_push hgrepo gitrepo &&
 201        hg_clone gitrepo hgrepo2 &&
 202        : TODO, avoid "master" bookmark &&
 204        (cd hgrepo2 && hg checkout gamma) &&
 205        hg_log hgrepo > expected &&
 207        hg_log hgrepo2 > actual &&
 208        test_cmp expected actual
 210'
 211test_expect_success 'hg tags' '
 213        mkdir -p tmp && cd tmp &&
 214        test_when_finished "cd .. && rm -rf tmp" &&
 215        (
 217        git init -q gitrepo &&
 218        cd gitrepo &&
 219        echo alpha > alpha &&
 221        git add alpha &&
 222        git commit -m "add alpha" &&
 223        git checkout -q -b not-master
 224        ) &&
 225        (
 227        hg_clone gitrepo hgrepo &&
 228        cd hgrepo &&
 230        hg co master &&
 231        hg tag alpha
 232        ) &&
 233        hg_push hgrepo gitrepo &&
 235        hg_clone gitrepo hgrepo2 &&
 236        hg_log hgrepo > expected &&
 238        hg_log hgrepo2 > actual &&
 239        test_cmp expected actual
 241'
 242test_done