(command.CommandList children: [ (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:test_description) op: assign_op.Equal rhs: {(SQ (Token id:Id.Lit_Chars val:'test local clone' span_id:6))} spids: [4] ) ] ) (C {(.)} {(./test-lib.sh)}) (command.ShFunction name: repo_is_hardlinked body: (command.BraceGroup children: [ (command.AndOr ops: [Id.Op_DAmp] children: [ (command.Simple words: [ {(find)} {(DQ ($ Id.VSub_Number '$1') (/objects))} {(-type)} {(f)} {(-links)} {(1)} ] redirects: [ (redir.Redir op: (Token id:Id.Redir_Great val:'>' span_id:36) fd: -1 arg_word: {(output)} ) ] ) (C {(test_line_count)} {(Id.Lit_Equals '=')} {(0)} {(output)}) ] ) ] ) ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'preparing origin repository' span_id:56))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:60) (Token id: Id.Lit_Chars val: '\t: >file && git add . && git commit -m1 &&\n' span_id: 61 ) (Token id:Id.Lit_Chars val:'\tgit clone --bare . a.git &&\n' span_id:62) (Token id:Id.Lit_Chars val:'\tgit clone --bare . x &&\n' span_id:63) (Token id: Id.Lit_Chars val: '\ttest "$(cd a.git && git config --bool core.bare)" = true &&\n' span_id: 64 ) (Token id:Id.Lit_Chars val:'\ttest "$(cd x && git config --bool core.bare)" = true &&\n' span_id:65) (Token id:Id.Lit_Chars val:'\tgit bundle create b1.bundle --all &&\n' span_id:66) (Token id:Id.Lit_Chars val:'\tgit bundle create b2.bundle master &&\n' span_id:67) (Token id:Id.Lit_Chars val:'\tmkdir dir &&\n' span_id:68) (Token id:Id.Lit_Chars val:'\tcp b1.bundle dir/b3 &&\n' span_id:69) (Token id:Id.Lit_Chars val:'\tcp b1.bundle b4\n' span_id:70) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'local clone without .git suffix' span_id:77))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:81) (Token id:Id.Lit_Chars val:'\tgit clone -l -s a b &&\n' span_id:82) (Token id:Id.Lit_Chars val:'\t(cd b &&\n' span_id:83) (Token id: Id.Lit_Chars val: '\ttest "$(git config --bool core.bare)" = false &&\n' span_id: 84 ) (Token id:Id.Lit_Chars val:'\tgit fetch)\n' span_id:85) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'local clone with .git suffix' span_id:92))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:96) (Token id:Id.Lit_Chars val:'\tgit clone -l -s a.git c &&\n' span_id:97) (Token id:Id.Lit_Chars val:'\t(cd c && git fetch)\n' span_id:98) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'local clone from x' span_id:105))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:109) (Token id:Id.Lit_Chars val:'\tgit clone -l -s x y &&\n' span_id:110) (Token id:Id.Lit_Chars val:'\t(cd y && git fetch)\n' span_id:111) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'local clone from x.git that does not exist' span_id:118))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:122) (Token id: Id.Lit_Chars val: '\ttest_must_fail git clone -l -s x.git z\n' span_id: 123 ) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'With -no-hardlinks, local will make a copy' span_id:130))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:134) (Token id: Id.Lit_Chars val: '\tgit clone --bare --no-hardlinks x w &&\n' span_id: 135 ) (Token id:Id.Lit_Chars val:'\t! repo_is_hardlinked w\n' span_id:136) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'Even without -l, local will make a hardlink' span_id:143))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:147) (Token id:Id.Lit_Chars val:'\trm -fr w &&\n' span_id:148) (Token id:Id.Lit_Chars val:'\tgit clone -l --bare x w &&\n' span_id:149) (Token id:Id.Lit_Chars val:'\trepo_is_hardlinked w\n' span_id:150) ) } ) (C {(test_expect_success)} { (SQ (Token id: Id.Lit_Chars val: 'local clone of repo with nonexistent ref in HEAD' span_id: 157 ) ) } { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:161) (Token id: Id.Lit_Chars val: '\techo "ref: refs/heads/nonexistent" > a.git/HEAD &&\n' span_id: 162 ) (Token id:Id.Lit_Chars val:'\tgit clone a d &&\n' span_id:163) (Token id:Id.Lit_Chars val:'\t(cd d &&\n' span_id:164) (Token id:Id.Lit_Chars val:'\tgit fetch &&\n' span_id:165) (Token id: Id.Lit_Chars val: '\ttest ! -e .git/refs/remotes/origin/HEAD)\n' span_id: 166 ) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'bundle clone without .bundle suffix' span_id:173))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:177) (Token id:Id.Lit_Chars val:'\tgit clone dir/b3 &&\n' span_id:178) (Token id:Id.Lit_Chars val:'\t(cd b3 && git fetch)\n' span_id:179) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'bundle clone with .bundle suffix' span_id:186))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:190) (Token id:Id.Lit_Chars val:'\tgit clone b1.bundle &&\n' span_id:191) (Token id:Id.Lit_Chars val:'\t(cd b1 && git fetch)\n' span_id:192) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'bundle clone from b4' span_id:199))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:203) (Token id:Id.Lit_Chars val:'\tgit clone b4 bdl &&\n' span_id:204) (Token id:Id.Lit_Chars val:'\t(cd bdl && git fetch)\n' span_id:205) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'bundle clone from b4.bundle that does not exist' span_id:212))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:216) (Token id: Id.Lit_Chars val: '\ttest_must_fail git clone b4.bundle bb\n' span_id: 217 ) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'bundle clone with nonexistent HEAD' span_id:224))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:228) (Token id:Id.Lit_Chars val:'\tgit clone b2.bundle b2 &&\n' span_id:229) (Token id:Id.Lit_Chars val:'\t(cd b2 &&\n' span_id:230) (Token id:Id.Lit_Chars val:'\tgit fetch &&\n' span_id:231) (Token id: Id.Lit_Chars val: '\ttest_must_fail git rev-parse --verify refs/heads/master)\n' span_id: 232 ) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'clone empty repository' span_id:239))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:243) (Token id:Id.Lit_Chars val:'\tmkdir empty &&\n' span_id:244) (Token id:Id.Lit_Chars val:'\t(cd empty &&\n' span_id:245) (Token id:Id.Lit_Chars val:'\t git init &&\n' span_id:246) (Token id:Id.Lit_Chars val:'\t git config receive.denyCurrentBranch warn) &&\n' span_id:247) (Token id:Id.Lit_Chars val:'\tgit clone empty empty-clone &&\n' span_id:248) (Token id:Id.Lit_Chars val:'\ttest_tick &&\n' span_id:249) (Token id:Id.Lit_Chars val:'\t(cd empty-clone\n' span_id:250) (Token id:Id.Lit_Chars val:'\t echo "content" >> foo &&\n' span_id:251) (Token id:Id.Lit_Chars val:'\t git add foo &&\n' span_id:252) (Token id:Id.Lit_Chars val:'\t git commit -m "Initial commit" &&\n' span_id:253) (Token id:Id.Lit_Chars val:'\t git push origin master &&\n' span_id:254) (Token id:Id.Lit_Chars val:'\t expected=$(git rev-parse master) &&\n' span_id:255) (Token id: Id.Lit_Chars val: '\t actual=$(git --git-dir=../empty/.git rev-parse master) &&\n' span_id: 256 ) (Token id:Id.Lit_Chars val:'\t test $actual = $expected)\n' span_id:257) ) } ) (C {(test_expect_success)} { (SQ (Token id: Id.Lit_Chars val: 'clone empty repository, and then push should not segfault.' span_id: 264 ) ) } { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:268) (Token id:Id.Lit_Chars val:'\trm -fr empty/ empty-clone/ &&\n' span_id:269) (Token id:Id.Lit_Chars val:'\tmkdir empty &&\n' span_id:270) (Token id:Id.Lit_Chars val:'\t(cd empty && git init) &&\n' span_id:271) (Token id:Id.Lit_Chars val:'\tgit clone empty empty-clone &&\n' span_id:272) (Token id:Id.Lit_Chars val:'\t(cd empty-clone &&\n' span_id:273) (Token id:Id.Lit_Chars val:'\ttest_must_fail git push)\n' span_id:274) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'cloning non-existent directory fails' span_id:281))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:285) (Token id:Id.Lit_Chars val:'\trm -rf does-not-exist &&\n' span_id:286) (Token id:Id.Lit_Chars val:'\ttest_must_fail git clone does-not-exist\n' span_id:287) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'cloning non-git directory fails' span_id:294))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:298) (Token id: Id.Lit_Chars val: '\trm -rf not-a-git-repo not-a-git-repo-clone &&\n' span_id: 299 ) (Token id:Id.Lit_Chars val:'\tmkdir not-a-git-repo &&\n' span_id:300) (Token id: Id.Lit_Chars val: '\ttest_must_fail git clone not-a-git-repo not-a-git-repo-clone\n' span_id: 301 ) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'cloning file:// does not hardlink' span_id:308))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:312) (Token id: Id.Lit_Chars val: '\tgit clone --bare file://"$(pwd)"/a non-local &&\n' span_id: 313 ) (Token id:Id.Lit_Chars val:'\t! repo_is_hardlinked non-local\n' span_id:314) ) } ) (C {(test_expect_success)} { (SQ (Token id: Id.Lit_Chars val: 'cloning a local path with --no-local does not hardlink' span_id: 321 ) ) } { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:325) (Token id: Id.Lit_Chars val: '\tgit clone --bare --no-local a force-nonlocal &&\n' span_id: 326 ) (Token id:Id.Lit_Chars val:'\t! repo_is_hardlinked force-nonlocal\n' span_id:327) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'cloning locally respects "-u" for fetching refs' span_id:334))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:338) (Token id: Id.Lit_Chars val: '\ttest_must_fail git clone --bare -u false a should_not_work.git\n' span_id: 339 ) ) } ) (C {(test_done)}) ] )