#!/bin/sh global test_description := ''fetch/clone from a shallow clone'' source ./test-lib.sh proc commit { echo $1 >tracked && git add tracked && git commit -m $1 } test_expect_success 'setup' ' commit 1 && commit 2 && commit 3 && commit 4 && git config --global transfer.fsckObjects true ' test_expect_success 'setup shallow clone' ' 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 ' test_expect_success 'clone from shallow clone' ' git clone --no-local shallow shallow2 && ( cd shallow2 && git fsck && git log --format=%s >actual && cat <expect && 4 3 EOF test_cmp expect actual ) ' test_expect_success 'fetch from shallow clone' ' ( cd shallow && commit 5 ) && ( cd shallow2 && git fetch && git fsck && git log --format=%s origin/master >actual && cat <expect && 5 4 3 EOF test_cmp expect actual ) ' test_expect_success 'fetch --depth from shallow clone' ' ( cd shallow && commit 6 ) && ( cd shallow2 && git fetch --depth=2 && git fsck && git log --format=%s origin/master >actual && cat <expect && 6 5 EOF test_cmp expect actual ) ' test_expect_success 'fetch --unshallow from shallow clone' ' ( cd shallow2 && git fetch --unshallow && git fsck && git log --format=%s origin/master >actual && cat <expect && 6 5 4 3 EOF test_cmp expect actual ) ' test_expect_success 'fetch something upstream has but hidden by clients shallow boundaries' ' # the blob "1" is available in .git but hidden by the # shallow2/.git/shallow and it should be resent ! git --git-dir=shallow2/.git cat-file blob $(echo 1|git hash-object --stdin) >/dev/null && echo 1 >1.t && git add 1.t && git commit -m add-1-back && ( cd shallow2 && git fetch ../.git +refs/heads/master:refs/remotes/top/master && git fsck && git log --format=%s top/master >actual && cat <expect && add-1-back 4 3 EOF test_cmp expect actual ) && git --git-dir=shallow2/.git cat-file blob $(echo 1|git hash-object --stdin) >/dev/null ' test_expect_success 'fetch that requires changes in .git/shallow is filtered' ' ( cd shallow && git checkout --orphan no-shallow && commit no-shallow ) && git init notshallow && ( cd notshallow && git fetch ../shallow/.git refs/heads/*:refs/remotes/shallow/*&& git for-each-ref --format="%(refname)" >actual.refs && cat <expect.refs && refs/remotes/shallow/no-shallow EOF test_cmp expect.refs actual.refs && git log --format=%s shallow/no-shallow >actual && cat <expect && no-shallow EOF test_cmp expect actual ) ' test_expect_success 'fetch --update-shallow' ' ( cd shallow && git checkout master && commit 7 && git tag -m foo heavy-tag HEAD^ && git tag light-tag HEAD^:tracked ) && ( cd notshallow && git fetch --update-shallow ../shallow/.git refs/heads/*:refs/remotes/shallow/* && git fsck && git for-each-ref --sort=refname --format="%(refname)" >actual.refs && cat <expect.refs && refs/remotes/shallow/master refs/remotes/shallow/no-shallow refs/tags/heavy-tag refs/tags/light-tag EOF test_cmp expect.refs actual.refs && git log --format=%s shallow/master >actual && cat <expect && 7 6 5 4 3 EOF test_cmp expect actual ) ' test_expect_success POSIXPERM,SANITY 'shallow fetch from a read-only repo' ' cp -R .git read-only.git && find read-only.git -print | xargs chmod -w && test_when_finished "find read-only.git -type d -print | xargs chmod +w" && git clone --no-local --depth=2 read-only.git from-read-only && git --git-dir=from-read-only/.git log --format=%s >actual && cat >expect <)} 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"> <"\tcommit 1 &&\n"> <"\tcommit 2 &&\n"> <"\tcommit 3 &&\n"> <"\tcommit 4 &&\n"> <"\tgit config --global transfer.fsckObjects true\n"> ) } ) (C {(test_expect_success)} {(SQ <"setup shallow clone">)} { (SQ <"\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"> ) } ) (C {(test_expect_success)} {(SQ <"clone from shallow clone">)} { (SQ <"\n"> <"\tgit clone --no-local shallow shallow2 &&\n"> <"\t(\n"> <"\tcd shallow2 &&\n"> <"\tgit fsck &&\n"> <"\tgit log --format=%s >actual &&\n"> <"\tcat <expect &&\n"> <"4\n"> <"3\n"> <"EOF\n"> <"\ttest_cmp expect actual\n"> <"\t)\n"> ) } ) (C {(test_expect_success)} {(SQ <"fetch from shallow clone">)} { (SQ <"\n"> <"\t(\n"> <"\tcd shallow &&\n"> <"\tcommit 5\n"> <"\t) &&\n"> <"\t(\n"> <"\tcd shallow2 &&\n"> <"\tgit fetch &&\n"> <"\tgit fsck &&\n"> <"\tgit log --format=%s origin/master >actual &&\n"> <"\tcat <expect &&\n"> <"5\n"> <"4\n"> <"3\n"> <"EOF\n"> <"\ttest_cmp expect actual\n"> <"\t)\n"> ) } ) (C {(test_expect_success)} {(SQ <"fetch --depth from shallow clone">)} { (SQ <"\n"> <"\t(\n"> <"\tcd shallow &&\n"> <"\tcommit 6\n"> <"\t) &&\n"> <"\t(\n"> <"\tcd shallow2 &&\n"> <"\tgit fetch --depth=2 &&\n"> <"\tgit fsck &&\n"> <"\tgit log --format=%s origin/master >actual &&\n"> <"\tcat <expect &&\n"> <"6\n"> <"5\n"> <"EOF\n"> <"\ttest_cmp expect actual\n"> <"\t)\n"> ) } ) (C {(test_expect_success)} {(SQ <"fetch --unshallow from shallow clone">)} { (SQ <"\n"> <"\t(\n"> <"\tcd shallow2 &&\n"> <"\tgit fetch --unshallow &&\n"> <"\tgit fsck &&\n"> <"\tgit log --format=%s origin/master >actual &&\n"> <"\tcat <expect &&\n"> <"6\n"> <"5\n"> <"4\n"> <"3\n"> <"EOF\n"> <"\ttest_cmp expect actual\n"> <"\t)\n"> ) } ) (C {(test_expect_success)} {(SQ <"fetch something upstream has but hidden by clients shallow boundaries">)} { (SQ <"\n"> <"\t# the blob \"1\" is available in .git but hidden by the\n"> <"\t# shallow2/.git/shallow and it should be resent\n"> <"\t! git --git-dir=shallow2/.git cat-file blob $(echo 1|git hash-object --stdin) >/dev/null &&\n"> <"\techo 1 >1.t &&\n"> <"\tgit add 1.t &&\n"> <"\tgit commit -m add-1-back &&\n"> <"\t(\n"> <"\tcd shallow2 &&\n"> <"\tgit fetch ../.git +refs/heads/master:refs/remotes/top/master &&\n"> <"\tgit fsck &&\n"> <"\tgit log --format=%s top/master >actual &&\n"> <"\tcat <expect &&\n"> <"add-1-back\n"> <"4\n"> <"3\n"> <"EOF\n"> <"\ttest_cmp expect actual\n"> <"\t) &&\n"> < "\tgit --git-dir=shallow2/.git cat-file blob $(echo 1|git hash-object --stdin) >/dev/null\n" > <"\n"> ) } ) (C {(test_expect_success)} {(SQ <"fetch that requires changes in .git/shallow is filtered">)} { (SQ <"\n"> <"\t(\n"> <"\tcd shallow &&\n"> <"\tgit checkout --orphan no-shallow &&\n"> <"\tcommit no-shallow\n"> <"\t) &&\n"> <"\tgit init notshallow &&\n"> <"\t(\n"> <"\tcd notshallow &&\n"> <"\tgit fetch ../shallow/.git refs/heads/*:refs/remotes/shallow/*&&\n"> <"\tgit for-each-ref --format=\"%(refname)\" >actual.refs &&\n"> <"\tcat <expect.refs &&\n"> <"refs/remotes/shallow/no-shallow\n"> <"EOF\n"> <"\ttest_cmp expect.refs actual.refs &&\n"> <"\tgit log --format=%s shallow/no-shallow >actual &&\n"> <"\tcat <expect &&\n"> <"no-shallow\n"> <"EOF\n"> <"\ttest_cmp expect actual\n"> <"\t)\n"> ) } ) (C {(test_expect_success)} {(SQ <"fetch --update-shallow">)} { (SQ <"\n"> <"\t(\n"> <"\tcd shallow &&\n"> <"\tgit checkout master &&\n"> <"\tcommit 7 &&\n"> <"\tgit tag -m foo heavy-tag HEAD^ &&\n"> <"\tgit tag light-tag HEAD^:tracked\n"> <"\t) &&\n"> <"\t(\n"> <"\tcd notshallow &&\n"> <"\tgit fetch --update-shallow ../shallow/.git refs/heads/*:refs/remotes/shallow/* &&\n"> <"\tgit fsck &&\n"> <"\tgit for-each-ref --sort=refname --format=\"%(refname)\" >actual.refs &&\n"> <"\tcat <expect.refs &&\n"> <"refs/remotes/shallow/master\n"> <"refs/remotes/shallow/no-shallow\n"> <"refs/tags/heavy-tag\n"> <"refs/tags/light-tag\n"> <"EOF\n"> <"\ttest_cmp expect.refs actual.refs &&\n"> <"\tgit log --format=%s shallow/master >actual &&\n"> <"\tcat <expect &&\n"> <"7\n"> <"6\n"> <"5\n"> <"4\n"> <"3\n"> <"EOF\n"> <"\ttest_cmp expect actual\n"> <"\t)\n"> ) } ) (C {(test_expect_success)} {(POSIXPERM) (Lit_Comma ",") (SANITY)} {(SQ <"shallow fetch from a read-only repo">)} { (SQ <"\n"> <"\tcp -R .git read-only.git &&\n"> <"\tfind read-only.git -print | xargs chmod -w &&\n"> <"\ttest_when_finished \"find read-only.git -type d -print | xargs chmod +w\" &&\n"> <"\tgit clone --no-local --depth=2 read-only.git from-read-only &&\n"> <"\tgit --git-dir=from-read-only/.git log --format=%s >actual &&\n"> <"\tcat >expect < <"add-1-back\n"> <"4\n"> <"EOF\n"> <"\ttest_cmp expect actual\n"> ) } ) (C {(test_done)}) ] )