#!/bin/sh global test_description := ''push from/to a shallow clone'' source ./test-lib.sh proc 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 <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 <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 <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 <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 <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 <expect && 1 4 3 EOF test_cmp expect actual && git cat-file blob $(echo 1|git hash-object --stdin) >/dev/null ) ' test_done (CommandList children: [ (Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (LhsName name:test_description) op: Equal rhs: {(SQ <"push from/to a shallow clone">)} spids: [4] ) ] spids: [4] ) (C {(.)} {(./test-lib.sh)}) (FuncDef name: commit body: (BraceGroup children: [ (AndOr children: [ (SimpleCommand words: [{(echo)} {(DQ ($ VSub_Number "$1"))}] redirects: [(Redir op_id:Redir_Great fd:-1 arg_word:{(tracked)} spids:[28])] ) (AndOr children: [ (C {(git)} {(add)} {(tracked)}) (C {(git)} {(commit)} {(-m)} {(DQ ($ VSub_Number "$1"))}) ] op_id: Op_DAmp ) ] op_id: Op_DAmp ) ] spids: [19] ) spids: [15 18] ) (C {(test_expect_success)} {(SQ )} { (SQ <"\n"> <"\tgit config --global transfer.fsckObjects true &&\n"> <"\tcommit 1 &&\n"> <"\tcommit 2 &&\n"> <"\tcommit 3 &&\n"> <"\tcommit 4 &&\n"> <"\tgit clone . full &&\n"> <"\t(\n"> <"\tgit init full-abc &&\n"> <"\tcd full-abc &&\n"> <"\tcommit a &&\n"> <"\tcommit b &&\n"> <"\tcommit c\n"> <"\t) &&\n"> <"\tgit clone --no-local --depth=2 .git shallow &&\n"> <"\tgit --git-dir=shallow/.git log --format=%s >actual &&\n"> <"\tcat <expect &&\n"> <"4\n"> <"3\n"> <"EOF\n"> <"\ttest_cmp expect actual &&\n"> <"\tgit clone --no-local --depth=2 full-abc/.git shallow2 &&\n"> <"\tgit --git-dir=shallow2/.git log --format=%s >actual &&\n"> <"\tcat <expect &&\n"> <"c\n"> <"b\n"> <"EOF\n"> <"\ttest_cmp expect actual\n"> ) } ) (C {(test_expect_success)} {(SQ <"push from shallow clone">)} { (SQ <"\n"> <"\t(\n"> <"\tcd shallow &&\n"> <"\tcommit 5 &&\n"> <"\tgit push ../.git +master:refs/remotes/shallow/master\n"> <"\t) &&\n"> <"\tgit log --format=%s shallow/master >actual &&\n"> <"\tgit fsck &&\n"> <"\tcat <expect &&\n"> <"5\n"> <"4\n"> <"3\n"> <"2\n"> <"1\n"> <"EOF\n"> <"\ttest_cmp expect actual\n"> ) } ) (C {(test_expect_success)} {(SQ <"push from shallow clone, with grafted roots">)} { (SQ <"\n"> <"\t(\n"> <"\tcd shallow2 &&\n"> <"\ttest_must_fail git push ../.git +master:refs/remotes/shallow2/master 2>err &&\n"> <"\tgrep \"shallow2/master.*shallow update not allowed\" err\n"> <"\t) &&\n"> <"\ttest_must_fail git rev-parse shallow2/master &&\n"> <"\tgit fsck\n"> ) } ) (C {(test_expect_success)} {(SQ <"add new shallow root with receive.updateshallow on">)} { (SQ <"\n"> <"\ttest_config receive.shallowupdate true &&\n"> <"\t(\n"> <"\tcd shallow2 &&\n"> <"\tgit push ../.git +master:refs/remotes/shallow2/master\n"> <"\t) &&\n"> <"\tgit log --format=%s shallow2/master >actual &&\n"> <"\tgit fsck &&\n"> <"\tcat <expect &&\n"> <"c\n"> <"b\n"> <"EOF\n"> <"\ttest_cmp expect actual\n"> ) } ) (C {(test_expect_success)} {(SQ <"push from shallow to shallow">)} { (SQ <"\n"> <"\t(\n"> <"\tcd shallow &&\n"> <"\tgit --git-dir=../shallow2/.git config receive.shallowupdate true &&\n"> <"\tgit push ../shallow2/.git +master:refs/remotes/shallow/master &&\n"> <"\tgit --git-dir=../shallow2/.git config receive.shallowupdate false\n"> <"\t) &&\n"> <"\t(\n"> <"\tcd shallow2 &&\n"> <"\tgit log --format=%s shallow/master >actual &&\n"> <"\tgit fsck &&\n"> <"\tcat <expect &&\n"> <"5\n"> <"4\n"> <"3\n"> <"EOF\n"> <"\ttest_cmp expect actual\n"> <"\t)\n"> ) } ) (C {(test_expect_success)} {(SQ <"push from full to shallow">)} { (SQ <"\n"> <"\t! git --git-dir=shallow2/.git cat-file blob $(echo 1|git hash-object --stdin) &&\n"> <"\tcommit 1 &&\n"> <"\tgit push shallow2/.git +master:refs/remotes/top/master &&\n"> <"\t(\n"> <"\tcd shallow2 &&\n"> <"\tgit log --format=%s top/master >actual &&\n"> <"\tgit fsck &&\n"> <"\tcat <expect &&\n"> <"1\n"> <"4\n"> <"3\n"> <"EOF\n"> <"\ttest_cmp expect actual &&\n"> <"\tgit cat-file blob $(echo 1|git hash-object --stdin) >/dev/null\n"> <"\t)\n"> ) } ) (C {(test_done)}) ] )