(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:'.git file\n' span_id:6) (Token id:Id.Lit_Chars val:'\n' span_id:7) (Token id:Id.Lit_Chars val:'Verify that plumbing commands work when .git is a file\n' span_id:8) ) } spids: [4] ) ] ) (C {(.)} {(./test-lib.sh)}) (command.ShFunction name: objpath body: (command.BraceGroup children: [ (command.Pipeline children: [ (C {(echo)} {(DQ ($ Id.VSub_Number '$1'))}) (C {(sed)} {(-e)} {(SQ (Token id:Id.Lit_Chars val:'s|\\(..\\)|\\1/|' span_id:36))}) ] negated: F ) ] ) ) (command.ShFunction name: objck body: (command.BraceGroup children: [ (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:p) op: assign_op.Equal rhs: { (command_sub left_token: (Token id:Id.Left_DollarParen val:'$(' span_id:50) command_list: (command.CommandList children: [(C {(objpath)} {(DQ ($ Id.VSub_Number '$1'))})] ) ) } spids: [49] ) ] ) (command.If arms: [ (if_arm cond: [ (C {(test)} {(Id.KW_Bang '!')} {(-f)} {(DQ ($ Id.VSub_DollarName '$REAL') (/objects/) ($ Id.VSub_DollarName '$p'))} ) ] action: [ (C {(echo)} { (DQ ('Object not found: ') ($ Id.VSub_DollarName '$REAL') (/objects/) ($ Id.VSub_DollarName '$p') ) } ) (C {(false)}) ] spids: [59 74] ) ] ) ] ) ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'initial setup' span_id:98))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:102) (Token id:Id.Lit_Chars val:'\tREAL="$(pwd)/.real" &&\n' span_id:103) (Token id:Id.Lit_Chars val:'\tmv .git "$REAL"\n' span_id:104) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'bad setup: invalid .git file format' span_id:111))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:115) (Token id:Id.Lit_Chars val:'\techo "gitdir $REAL" >.git &&\n' span_id:116) (Token id:Id.Lit_Chars val:'\tif git rev-parse 2>.err\n' span_id:117) (Token id:Id.Lit_Chars val:'\tthen\n' span_id:118) (Token id:Id.Lit_Chars val:'\t\techo "git rev-parse accepted an invalid .git file"\n' span_id:119) (Token id:Id.Lit_Chars val:'\t\tfalse\n' span_id:120) (Token id:Id.Lit_Chars val:'\tfi &&\n' span_id:121) (Token id: Id.Lit_Chars val: '\tif ! grep "Invalid gitfile format" .err\n' span_id: 122 ) (Token id:Id.Lit_Chars val:'\tthen\n' span_id:123) (Token id: Id.Lit_Chars val: '\t\techo "git rev-parse returned wrong error"\n' span_id: 124 ) (Token id:Id.Lit_Chars val:'\t\tfalse\n' span_id:125) (Token id:Id.Lit_Chars val:'\tfi\n' span_id:126) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'bad setup: invalid .git file path' span_id:133))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:137) (Token id:Id.Lit_Chars val:'\techo "gitdir: $REAL.not" >.git &&\n' span_id:138) (Token id:Id.Lit_Chars val:'\tif git rev-parse 2>.err\n' span_id:139) (Token id:Id.Lit_Chars val:'\tthen\n' span_id:140) (Token id: Id.Lit_Chars val: '\t\techo "git rev-parse accepted an invalid .git file path"\n' span_id: 141 ) (Token id:Id.Lit_Chars val:'\t\tfalse\n' span_id:142) (Token id:Id.Lit_Chars val:'\tfi &&\n' span_id:143) (Token id:Id.Lit_Chars val:'\tif ! grep "Not a git repository" .err\n' span_id:144) (Token id:Id.Lit_Chars val:'\tthen\n' span_id:145) (Token id:Id.Lit_Chars val:'\t\techo "git rev-parse returned wrong error"\n' span_id:146) (Token id:Id.Lit_Chars val:'\t\tfalse\n' span_id:147) (Token id:Id.Lit_Chars val:'\tfi\n' span_id:148) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'final setup + check rev-parse --git-dir' span_id:155))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:159) (Token id:Id.Lit_Chars val:'\techo "gitdir: $REAL" >.git &&\n' span_id:160) (Token id:Id.Lit_Chars val:'\ttest "$REAL" = "$(git rev-parse --git-dir)"\n' span_id:161) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'check hash-object' span_id:168))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:172) (Token id:Id.Lit_Chars val:'\techo "foo" >bar &&\n' span_id:173) (Token id:Id.Lit_Chars val:'\tSHA=$(cat bar | git hash-object -w --stdin) &&\n' span_id:174) (Token id:Id.Lit_Chars val:'\tobjck $SHA\n' span_id:175) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'check cat-file' span_id:182))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:186) (Token id:Id.Lit_Chars val:'\tgit cat-file blob $SHA >actual &&\n' span_id:187) (Token id:Id.Lit_Chars val:'\ttest_cmp bar actual\n' span_id:188) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'check update-index' span_id:195))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:199) (Token id:Id.Lit_Chars val:'\tif test -f "$REAL/index"\n' span_id:200) (Token id:Id.Lit_Chars val:'\tthen\n' span_id:201) (Token id:Id.Lit_Chars val:'\t\techo "Hmm, $REAL/index exists?"\n' span_id:202) (Token id:Id.Lit_Chars val:'\t\tfalse\n' span_id:203) (Token id:Id.Lit_Chars val:'\tfi &&\n' span_id:204) (Token id:Id.Lit_Chars val:'\trm -f "$REAL/objects/$(objpath $SHA)" &&\n' span_id:205) (Token id:Id.Lit_Chars val:'\tgit update-index --add bar &&\n' span_id:206) (Token id:Id.Lit_Chars val:'\tif ! test -f "$REAL/index"\n' span_id:207) (Token id:Id.Lit_Chars val:'\tthen\n' span_id:208) (Token id:Id.Lit_Chars val:'\t\techo "$REAL/index not found"\n' span_id:209) (Token id:Id.Lit_Chars val:'\t\tfalse\n' span_id:210) (Token id:Id.Lit_Chars val:'\tfi &&\n' span_id:211) (Token id:Id.Lit_Chars val:'\tobjck $SHA\n' span_id:212) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'check write-tree' span_id:219))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:223) (Token id:Id.Lit_Chars val:'\tSHA=$(git write-tree) &&\n' span_id:224) (Token id:Id.Lit_Chars val:'\tobjck $SHA\n' span_id:225) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'check commit-tree' span_id:232))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:236) (Token id: Id.Lit_Chars val: '\tSHA=$(echo "commit bar" | git commit-tree $SHA) &&\n' span_id: 237 ) (Token id:Id.Lit_Chars val:'\tobjck $SHA\n' span_id:238) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'check rev-list' span_id:245))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:249) (Token id:Id.Lit_Chars val:'\techo $SHA >"$REAL/HEAD" &&\n' span_id:250) (Token id:Id.Lit_Chars val:'\ttest "$SHA" = "$(git rev-list HEAD)"\n' span_id:251) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'setup_git_dir twice in subdir' span_id:258))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:262) (Token id:Id.Lit_Chars val:'\tgit init sgd &&\n' span_id:263) (Token id:Id.Lit_Chars val:'\t(\n' span_id:264) (Token id:Id.Lit_Chars val:'\t\tcd sgd &&\n' span_id:265) (Token id:Id.Lit_Chars val:'\t\tgit config alias.lsfi ls-files &&\n' span_id:266) (Token id:Id.Lit_Chars val:'\t\tmv .git .realgit &&\n' span_id:267) (Token id:Id.Lit_Chars val:'\t\techo "gitdir: .realgit" >.git &&\n' span_id:268) (Token id:Id.Lit_Chars val:'\t\tmkdir subdir &&\n' span_id:269) (Token id:Id.Lit_Chars val:'\t\tcd subdir &&\n' span_id:270) (Token id:Id.Lit_Chars val:'\t\t>foo &&\n' span_id:271) (Token id:Id.Lit_Chars val:'\t\tgit add foo &&\n' span_id:272) (Token id:Id.Lit_Chars val:'\t\tgit lsfi >actual &&\n' span_id:273) (Token id:Id.Lit_Chars val:'\t\techo foo >expected &&\n' span_id:274) (Token id:Id.Lit_Chars val:'\t\ttest_cmp expected actual\n' span_id:275) (Token id:Id.Lit_Chars val:'\t)\n' span_id:276) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'enter_repo non-strict mode' span_id:283))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:287) (Token id:Id.Lit_Chars val:'\ttest_create_repo enter_repo &&\n' span_id:288) (Token id:Id.Lit_Chars val:'\t(\n' span_id:289) (Token id:Id.Lit_Chars val:'\t\tcd enter_repo &&\n' span_id:290) (Token id:Id.Lit_Chars val:'\t\ttest_tick &&\n' span_id:291) (Token id:Id.Lit_Chars val:'\t\ttest_commit foo &&\n' span_id:292) (Token id:Id.Lit_Chars val:'\t\tmv .git .realgit &&\n' span_id:293) (Token id:Id.Lit_Chars val:'\t\techo "gitdir: .realgit" >.git\n' span_id:294) (Token id:Id.Lit_Chars val:'\t) &&\n' span_id:295) (Token id:Id.Lit_Chars val:'\tgit ls-remote enter_repo >actual &&\n' span_id:296) (Token id:Id.Lit_Chars val:'\tcat >expected <<-\\EOF &&\n' span_id:297) (Token id: Id.Lit_Chars val: '\t946e985ab20de757ca5b872b16d64e92ff3803a9\tHEAD\n' span_id: 298 ) (Token id: Id.Lit_Chars val: '\t946e985ab20de757ca5b872b16d64e92ff3803a9\trefs/heads/master\n' span_id: 299 ) (Token id:Id.Lit_Chars val:'\t946e985ab20de757ca5b872b16d64e92ff3803a9\trefs/tags/foo\n' span_id:300) (Token id:Id.Lit_Chars val:'\tEOF\n' span_id:301) (Token id:Id.Lit_Chars val:'\ttest_cmp expected actual\n' span_id:302) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'enter_repo linked checkout' span_id:309))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:313) (Token id:Id.Lit_Chars val:'\t(\n' span_id:314) (Token id:Id.Lit_Chars val:'\t\tcd enter_repo &&\n' span_id:315) (Token id: Id.Lit_Chars val: '\t\tgit worktree add ../foo refs/tags/foo\n' span_id: 316 ) (Token id:Id.Lit_Chars val:'\t) &&\n' span_id:317) (Token id:Id.Lit_Chars val:'\tgit ls-remote foo >actual &&\n' span_id:318) (Token id:Id.Lit_Chars val:'\tcat >expected <<-\\EOF &&\n' span_id:319) (Token id: Id.Lit_Chars val: '\t946e985ab20de757ca5b872b16d64e92ff3803a9\tHEAD\n' span_id: 320 ) (Token id: Id.Lit_Chars val: '\t946e985ab20de757ca5b872b16d64e92ff3803a9\trefs/heads/master\n' span_id: 321 ) (Token id:Id.Lit_Chars val:'\t946e985ab20de757ca5b872b16d64e92ff3803a9\trefs/tags/foo\n' span_id:322) (Token id:Id.Lit_Chars val:'\tEOF\n' span_id:323) (Token id:Id.Lit_Chars val:'\ttest_cmp expected actual\n' span_id:324) ) } ) (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'enter_repo strict mode' span_id:331))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:335) (Token id: Id.Lit_Chars val: '\tgit ls-remote --upload-pack="git upload-pack --strict" foo/.git >actual &&\n' span_id: 336 ) (Token id:Id.Lit_Chars val:'\tcat >expected <<-\\EOF &&\n' span_id:337) (Token id: Id.Lit_Chars val: '\t946e985ab20de757ca5b872b16d64e92ff3803a9\tHEAD\n' span_id: 338 ) (Token id: Id.Lit_Chars val: '\t946e985ab20de757ca5b872b16d64e92ff3803a9\trefs/heads/master\n' span_id: 339 ) (Token id:Id.Lit_Chars val:'\t946e985ab20de757ca5b872b16d64e92ff3803a9\trefs/tags/foo\n' span_id:340) (Token id:Id.Lit_Chars val:'\tEOF\n' span_id:341) (Token id:Id.Lit_Chars val:'\ttest_cmp expected actual\n' span_id:342) ) } ) (C {(test_done)}) ] )