(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 custom script in place of pack-objects' span_id:6))}
          spids: [4]
        )
      ]
    )
    (C {(.)} {(./test-lib.sh)})
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'create some history to fetch' span_id:17))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:21) 
          (Token id:Id.Lit_Chars val:'\ttest_commit one &&\n' span_id:22) (Token id:Id.Lit_Chars val:'\ttest_commit two\n' span_id:23)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'create debugging hook script' span_id:30))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:34) 
          (Token id:Id.Lit_Chars val:'\twrite_script .git/hook <<-\\EOF\n' span_id:35) (Token id:Id.Lit_Chars val:'\t\techo >&2 "hook running"\n' span_id:36) 
          (Token id:Id.Lit_Chars val:'\t\techo "$*" >hook.args\n' span_id:37) (Token id:Id.Lit_Chars val:'\t\tcat >hook.stdin\n' span_id:38) 
          (Token id:Id.Lit_Chars val:'\t\t"$@" <hook.stdin >hook.stdout\n' span_id:39) (Token id:Id.Lit_Chars val:'\t\tcat hook.stdout\n' span_id:40) 
          (Token id:Id.Lit_Chars val:'\tEOF\n' span_id:41)
        )
      }
    )
    (command.ShFunction
      name: clear_hook_results
      body: 
        (command.BraceGroup
          children: [(C {(rm)} {(-rf)} {(.git/hook.) (Id.Lit_Star '*')} {(dst.git)})]
        )
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'hook runs via global config' span_id:68))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:72) 
          (Token id:Id.Lit_Chars val:'\tclear_hook_results &&\n' span_id:73) (Token id:Id.Lit_Chars val:'\ttest_config_global uploadpack.packObjectsHook ./hook &&\n' span_id:74) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit clone --no-local . dst.git 2>stderr &&\n'
            span_id: 75
          ) (Token id:Id.Lit_Chars val:'\tgrep "hook running" stderr\n' span_id:76)
        )
      }
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'hook outputs are sane' span_id:83))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:87) 
          (Token
            id: Id.Lit_Chars
            val: '\t# check that we recorded a usable pack\n'
            span_id: 88
          ) (Token id:Id.Lit_Chars val:'\tgit index-pack --stdin <.git/hook.stdout &&\n' span_id:89) 
          (Token id:Id.Lit_Chars val:'\n' span_id:90) (Token id:Id.Lit_Chars val:'\t# check that we recorded args and stdin. We do not check\n' span_id:91) 
          (Token
            id: Id.Lit_Chars
            val: '\t# the full argument list or the exact pack contents, as it would make\n'
            span_id: 92
          ) 
          (Token
            id: Id.Lit_Chars
            val: '\t# the test brittle. So just sanity check that we could replay\n'
            span_id: 93
          ) (Token id:Id.Lit_Chars val:'\t# the packing procedure.\n' span_id:94) 
          (Token id:Id.Lit_Chars val:'\tgrep "^git" .git/hook.args &&\n' span_id:95) (Token id:Id.Lit_Chars val:'\t$(cat .git/hook.args) <.git/hook.stdin >replay\n' span_id:96)
        )
      }
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'hook runs from -c config' span_id:103))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:107) 
          (Token id:Id.Lit_Chars val:'\tclear_hook_results &&\n' span_id:108) (Token id:Id.Lit_Chars val:'\tgit clone --no-local \\\n' span_id:109) 
          (Token
            id: Id.Lit_Chars
            val: '\t  -u "git -c uploadpack.packObjectsHook=./hook upload-pack" \\\n'
            span_id: 110
          ) (Token id:Id.Lit_Chars val:'\t  . dst.git 2>stderr &&\n' span_id:111) 
          (Token id:Id.Lit_Chars val:'\tgrep "hook running" stderr\n' span_id:112)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'hook does not run from repo config' span_id:119))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:123) 
          (Token id:Id.Lit_Chars val:'\tclear_hook_results &&\n' span_id:124) (Token id:Id.Lit_Chars val:'\ttest_config uploadpack.packObjectsHook "./hook" &&\n' span_id:125) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit clone --no-local . dst.git 2>stderr &&\n'
            span_id: 126
          ) (Token id:Id.Lit_Chars val:'\t! grep "hook running" stderr &&\n' span_id:127) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest_path_is_missing .git/hook.args &&\n'
            span_id: 128
          ) (Token id:Id.Lit_Chars val:'\ttest_path_is_missing .git/hook.stdin &&\n' span_id:129) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest_path_is_missing .git/hook.stdout\n'
            span_id: 130
          )
        )
      }
    )
    (C {(test_done)})
  ]
)