#!/bin/sh test_description='pushing to a mirror repository' GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=master export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME . ./test-lib.sh D=$(pwd) invert () { if "$@"; then return 1 else return 0 fi } mk_repo_pair () { rm -rf master mirror && mkdir mirror && ( cd mirror && git init && git config receive.denyCurrentBranch warn ) && mkdir master && ( cd master && git init && git remote add $1 up ../mirror ) } # BRANCH tests test_expect_success 'push mirror creates new branches' ' mk_repo_pair && ( cd master && echo one >foo && git add foo && git commit -m one && git push --mirror up ) && master_master=$(cd master && git show-ref -s --verify refs/heads/master) && mirror_master=$(cd mirror && git show-ref -s --verify refs/heads/master) && test "$master_master" = "$mirror_master" ' test_expect_success 'push mirror updates existing branches' ' mk_repo_pair && ( cd master && echo one >foo && git add foo && git commit -m one && git push --mirror up && echo two >foo && git add foo && git commit -m two && git push --mirror up ) && master_master=$(cd master && git show-ref -s --verify refs/heads/master) && mirror_master=$(cd mirror && git show-ref -s --verify refs/heads/master) && test "$master_master" = "$mirror_master" ' test_expect_success 'push mirror force updates existing branches' ' mk_repo_pair && ( cd master && echo one >foo && git add foo && git commit -m one && git push --mirror up && echo two >foo && git add foo && git commit -m two && git push --mirror up && git reset --hard HEAD^ && git push --mirror up ) && master_master=$(cd master && git show-ref -s --verify refs/heads/master) && mirror_master=$(cd mirror && git show-ref -s --verify refs/heads/master) && test "$master_master" = "$mirror_master" ' test_expect_success 'push mirror removes branches' ' mk_repo_pair && ( cd master && echo one >foo && git add foo && git commit -m one && git branch remove master && git push --mirror up && git branch -D remove && git push --mirror up ) && ( cd mirror && invert git show-ref -s --verify refs/heads/remove ) ' test_expect_success 'push mirror adds, updates and removes branches together' ' mk_repo_pair && ( cd master && echo one >foo && git add foo && git commit -m one && git branch remove master && git push --mirror up && git branch -D remove && git branch add master && echo two >foo && git add foo && git commit -m two && git push --mirror up ) && master_master=$(cd master && git show-ref -s --verify refs/heads/master) && master_add=$(cd master && git show-ref -s --verify refs/heads/add) && mirror_master=$(cd mirror && git show-ref -s --verify refs/heads/master) && mirror_add=$(cd mirror && git show-ref -s --verify refs/heads/add) && test "$master_master" = "$mirror_master" && test "$master_add" = "$mirror_add" && ( cd mirror && invert git show-ref -s --verify refs/heads/remove ) ' # TAG tests test_expect_success 'push mirror creates new tags' ' mk_repo_pair && ( cd master && echo one >foo && git add foo && git commit -m one && git tag -f tmaster master && git push --mirror up ) && master_master=$(cd master && git show-ref -s --verify refs/tags/tmaster) && mirror_master=$(cd mirror && git show-ref -s --verify refs/tags/tmaster) && test "$master_master" = "$mirror_master" ' test_expect_success 'push mirror updates existing tags' ' mk_repo_pair && ( cd master && echo one >foo && git add foo && git commit -m one && git tag -f tmaster master && git push --mirror up && echo two >foo && git add foo && git commit -m two && git tag -f tmaster master && git push --mirror up ) && master_master=$(cd master && git show-ref -s --verify refs/tags/tmaster) && mirror_master=$(cd mirror && git show-ref -s --verify refs/tags/tmaster) && test "$master_master" = "$mirror_master" ' test_expect_success 'push mirror force updates existing tags' ' mk_repo_pair && ( cd master && echo one >foo && git add foo && git commit -m one && git tag -f tmaster master && git push --mirror up && echo two >foo && git add foo && git commit -m two && git tag -f tmaster master && git push --mirror up && git reset --hard HEAD^ && git tag -f tmaster master && git push --mirror up ) && master_master=$(cd master && git show-ref -s --verify refs/tags/tmaster) && mirror_master=$(cd mirror && git show-ref -s --verify refs/tags/tmaster) && test "$master_master" = "$mirror_master" ' test_expect_success 'push mirror removes tags' ' mk_repo_pair && ( cd master && echo one >foo && git add foo && git commit -m one && git tag -f tremove master && git push --mirror up && git tag -d tremove && git push --mirror up ) && ( cd mirror && invert git show-ref -s --verify refs/tags/tremove ) ' test_expect_success 'push mirror adds, updates and removes tags together' ' mk_repo_pair && ( cd master && echo one >foo && git add foo && git commit -m one && git tag -f tmaster master && git tag -f tremove master && git push --mirror up && git tag -d tremove && git tag tadd master && echo two >foo && git add foo && git commit -m two && git tag -f tmaster master && git push --mirror up ) && master_master=$(cd master && git show-ref -s --verify refs/tags/tmaster) && master_add=$(cd master && git show-ref -s --verify refs/tags/tadd) && mirror_master=$(cd mirror && git show-ref -s --verify refs/tags/tmaster) && mirror_add=$(cd mirror && git show-ref -s --verify refs/tags/tadd) && test "$master_master" = "$mirror_master" && test "$master_add" = "$mirror_add" && ( cd mirror && invert git show-ref -s --verify refs/tags/tremove ) ' test_expect_success 'remote.foo.mirror adds and removes branches' ' mk_repo_pair --mirror && ( cd master && echo one >foo && git add foo && git commit -m one && git branch keep master && git branch remove master && git push up && git branch -D remove && git push up ) && ( cd mirror && git show-ref -s --verify refs/heads/keep && invert git show-ref -s --verify refs/heads/remove ) ' test_expect_success 'remote.foo.mirror=no has no effect' ' mk_repo_pair && ( cd master && echo one >foo && git add foo && git commit -m one && git config --add remote.up.mirror no && git branch keep master && git push --mirror up && git branch -D keep && git push up : ) && ( cd mirror && git show-ref -s --verify refs/heads/keep ) ' test_expect_success 'push to mirrored repository with refspec fails' ' mk_repo_pair && ( cd master && echo one >foo && git add foo && git commit -m one && git config --add remote.up.mirror true && test_must_fail git push up master ) ' test_done