#!/bin/sh test_description='push from/to a shallow clone' . ./test-lib.sh commit() { echo "$1" >tracked && git add tracked && git commit -m "$1" } test_expect_success 'setup' ' git config --global transfer.fsckObjects true && commit 1 && commit 2 && commit 3 && commit 4 && git clone . full && ( git init full-abc && cd full-abc && commit a && commit b && commit c ) && git clone --no-local --depth=2 .git shallow && git --git-dir=shallow/.git log --format=%s >actual && cat <<EOF >expect && 4 3 EOF test_cmp expect actual && git clone --no-local --depth=2 full-abc/.git shallow2 && git --git-dir=shallow2/.git log --format=%s >actual && cat <<EOF >expect && c b EOF test_cmp expect actual ' test_expect_success 'push from shallow clone' ' ( cd shallow && commit 5 && git push ../.git +master:refs/remotes/shallow/master ) && git log --format=%s shallow/master >actual && git fsck && cat <<EOF >expect && 5 4 3 2 1 EOF test_cmp expect actual ' test_expect_success 'push from shallow clone, with grafted roots' ' ( cd shallow2 && test_must_fail git push ../.git +master:refs/remotes/shallow2/master 2>err && grep "shallow2/master.*shallow update not allowed" err ) && test_must_fail git rev-parse shallow2/master && git fsck ' test_expect_success 'add new shallow root with receive.updateshallow on' ' test_config receive.shallowupdate true && ( cd shallow2 && git push ../.git +master:refs/remotes/shallow2/master ) && git log --format=%s shallow2/master >actual && git fsck && cat <<EOF >expect && c b EOF test_cmp expect actual ' test_expect_success 'push from shallow to shallow' ' ( cd shallow && git --git-dir=../shallow2/.git config receive.shallowupdate true && git push ../shallow2/.git +master:refs/remotes/shallow/master && git --git-dir=../shallow2/.git config receive.shallowupdate false ) && ( cd shallow2 && git log --format=%s shallow/master >actual && git fsck && cat <<EOF >expect && 5 4 3 EOF test_cmp expect actual ) ' test_expect_success 'push from full to shallow' ' ! git --git-dir=shallow2/.git cat-file blob $(echo 1|git hash-object --stdin) && commit 1 && git push shallow2/.git +master:refs/remotes/top/master && ( cd shallow2 && git log --format=%s top/master >actual && git fsck && cat <<EOF >expect && 1 4 3 EOF test_cmp expect actual && git cat-file blob $(echo 1|git hash-object --stdin) >/dev/null ) ' test_done