(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)})
  ]
)