| #!/bin/sh |
| # |
| # Copyright (c) 2010 Sverre Rabbelier |
| # |
| |
| test_description='Test python remote-helper framework' |
| |
| . ./test-lib.sh |
| |
| if ! test_have_prereq PYTHON ; then |
| skip_all='skipping python remote-helper tests, python not available' |
| test_done |
| fi |
| |
| "$PYTHON_PATH" -c ' |
| import sys |
| if sys.hexversion < 0x02040000: |
| sys.exit(1) |
| ' || { |
| skip_all='skipping python remote-helper tests, python version < 2.4' |
| test_done |
| } |
| |
| compare_refs() { |
| git --git-dir="$1/.git" rev-parse --verify $2 >expect && |
| git --git-dir="$3/.git" rev-parse --verify $4 >actual && |
| test_cmp expect actual |
| } |
| |
| test_expect_success 'setup repository' ' |
| git init --bare server/.git && |
| git clone server public && |
| (cd public && |
| echo content >file && |
| git add file && |
| git commit -m one && |
| git push origin master) |
| ' |
| |
| test_expect_success 'cloning from local repo' ' |
| git clone "testpy::${PWD}/server" localclone && |
| test_cmp public/file localclone/file |
| ' |
| |
| test_expect_success 'cloning from remote repo' ' |
| git clone "testpy::file://${PWD}/server" clone && |
| test_cmp public/file clone/file |
| ' |
| |
| test_expect_success 'create new commit on remote' ' |
| (cd public && |
| echo content >>file && |
| git commit -a -m two && |
| git push) |
| ' |
| |
| test_expect_success 'pulling from local repo' ' |
| (cd localclone && git pull) && |
| test_cmp public/file localclone/file |
| ' |
| |
| test_expect_success 'pulling from remote remote' ' |
| (cd clone && git pull) && |
| test_cmp public/file clone/file |
| ' |
| |
| test_expect_success 'pushing to local repo' ' |
| (cd localclone && |
| echo content >>file && |
| git commit -a -m three && |
| git push) && |
| compare_refs localclone HEAD server HEAD |
| ' |
| |
| # Generally, skip this test. It demonstrates a now-fixed race in |
| # git-remote-testpy, but is too slow to leave in for general use. |
| : test_expect_success 'racily pushing to local repo' ' |
| test_when_finished "rm -rf server2 localclone2" && |
| cp -R server server2 && |
| git clone "testpy::${PWD}/server2" localclone2 && |
| (cd localclone2 && |
| echo content >>file && |
| git commit -a -m three && |
| GIT_REMOTE_TESTGIT_SLEEPY=2 git push) && |
| compare_refs localclone2 HEAD server2 HEAD |
| ' |
| |
| test_expect_success 'synch with changes from localclone' ' |
| (cd clone && |
| git pull) |
| ' |
| |
| test_expect_success 'pushing remote local repo' ' |
| (cd clone && |
| echo content >>file && |
| git commit -a -m four && |
| git push) && |
| compare_refs clone HEAD server HEAD |
| ' |
| |
| test_expect_success 'fetch new branch' ' |
| (cd public && |
| git checkout -b new && |
| echo content >>file && |
| git commit -a -m five && |
| git push origin new |
| ) && |
| (cd localclone && |
| git fetch origin new |
| ) && |
| compare_refs public HEAD localclone FETCH_HEAD |
| ' |
| |
| test_expect_success 'fetch multiple branches' ' |
| (cd localclone && |
| git fetch |
| ) && |
| compare_refs server master localclone refs/remotes/origin/master && |
| compare_refs server new localclone refs/remotes/origin/new |
| ' |
| |
| test_expect_success 'push when remote has extra refs' ' |
| (cd clone && |
| echo content >>file && |
| git commit -a -m six && |
| git push |
| ) && |
| compare_refs clone master server master |
| ' |
| |
| test_expect_success 'push new branch by name' ' |
| (cd clone && |
| git checkout -b new-name && |
| echo content >>file && |
| git commit -a -m seven && |
| git push origin new-name |
| ) && |
| compare_refs clone HEAD server refs/heads/new-name |
| ' |
| |
| test_expect_failure 'push new branch with old:new refspec' ' |
| (cd clone && |
| git push origin new-name:new-refspec |
| ) && |
| compare_refs clone HEAD server refs/heads/new-refspec |
| ' |
| |
| test_expect_success 'proper failure checks for fetching' ' |
| (GIT_REMOTE_TESTGIT_FAILURE=1 && |
| export GIT_REMOTE_TESTGIT_FAILURE && |
| cd localclone && |
| test_must_fail git fetch 2>&1 | \ |
| grep "Error while running fast-import" |
| ) |
| ' |
| |
| # We sleep to give fast-export a chance to catch the SIGPIPE |
| test_expect_failure 'proper failure checks for pushing' ' |
| (GIT_REMOTE_TESTGIT_FAILURE=1 && |
| export GIT_REMOTE_TESTGIT_FAILURE && |
| GIT_REMOTE_TESTGIT_SLEEPY=1 && |
| export GIT_REMOTE_TESTGIT_SLEEPY && |
| cd localclone && |
| test_must_fail git push --all 2>&1 | \ |
| grep "Error while running fast-export" |
| ) |
| ' |
| |
| test_done |