(command.CommandList
  children: [
    (command.ShAssignment
      left: <Id.Lit_VarLike 'test_description='>
      pairs: [
        (AssignPair
          left: <Id.Lit_VarLike 'test_description='>
          lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'test_description='> name:test_description)
          op: assign_op.Equal
          rhs: {(DQ <'git hash-object'>)}
        )
      ]
      redirects: []
    )
    (command.Simple
      blame_tok: <.>
      more_env: []
      words: [{<.>} {<'./test-lib.sh'>}]
      redirects: []
      do_fork: T
    )
    (command.ShFunction
      name_tok: <echo_without_newline>
      name: echo_without_newline
      body: 
        (BraceGroup
          left: <Id.Lit_LBrace '{'>
          children: [
            (command.Simple
              blame_tok: <printf>
              more_env: []
              words: [{<printf>} {(SQ <'%s'>)} {(DQ ($ Id.VSub_Star '*'))}]
              redirects: []
              do_fork: T
            )
          ]
          redirects: []
          right: <Id.Lit_RBrace '}'>
        )
    )
    (command.ShFunction
      name_tok: <test_blob_does_not_exist>
      name: test_blob_does_not_exist
      body: 
        (BraceGroup
          left: <Id.Lit_LBrace '{'>
          children: [
            (command.Simple
              blame_tok: <test_expect_success>
              more_env: []
              words: [
                {<test_expect_success>}
                {(SQ <'blob does not exist in database'>)}
                {
                  (DQ <'\n'> <'\t\ttest_must_fail git cat-file blob '> ($ Id.VSub_Number 1) <'\n'> <'\t'>)
                }
              ]
              redirects: []
              do_fork: T
            )
          ]
          redirects: []
          right: <Id.Lit_RBrace '}'>
        )
    )
    (command.ShFunction
      name_tok: <test_blob_exists>
      name: test_blob_exists
      body: 
        (BraceGroup
          left: <Id.Lit_LBrace '{'>
          children: [
            (command.Simple
              blame_tok: <test_expect_success>
              more_env: []
              words: [
                {<test_expect_success>}
                {(SQ <'blob exists in database'>)}
                {(DQ <'\n'> <'\t\tgit cat-file blob '> ($ Id.VSub_Number 1) <'\n'> <'\t'>)}
              ]
              redirects: []
              do_fork: T
            )
          ]
          redirects: []
          right: <Id.Lit_RBrace '}'>
        )
    )
    (command.ShAssignment
      left: <Id.Lit_VarLike 'hello_content='>
      pairs: [
        (AssignPair
          left: <Id.Lit_VarLike 'hello_content='>
          lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'hello_content='> name:hello_content)
          op: assign_op.Equal
          rhs: {(DQ <'Hello World'>)}
        )
      ]
      redirects: []
    )
    (command.ShAssignment
      left: <Id.Lit_VarLike 'hello_sha1='>
      pairs: [
        (AssignPair
          left: <Id.Lit_VarLike 'hello_sha1='>
          lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'hello_sha1='> name:hello_sha1)
          op: assign_op.Equal
          rhs: {<5e1c309dae7f45e0f39b1bf3ac3cd9db12e7d689>}
        )
      ]
      redirects: []
    )
    (command.ShAssignment
      left: <Id.Lit_VarLike 'example_content='>
      pairs: [
        (AssignPair
          left: <Id.Lit_VarLike 'example_content='>
          lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'example_content='> name:example_content)
          op: assign_op.Equal
          rhs: {(DQ <'This is an example'>)}
        )
      ]
      redirects: []
    )
    (command.ShAssignment
      left: <Id.Lit_VarLike 'example_sha1='>
      pairs: [
        (AssignPair
          left: <Id.Lit_VarLike 'example_sha1='>
          lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'example_sha1='> name:example_sha1)
          op: assign_op.Equal
          rhs: {<ddd3f836d3e3fbb7ae289aa9ae83536f76956399>}
        )
      ]
      redirects: []
    )
    (command.ShFunction
      name_tok: <setup_repo>
      name: setup_repo
      body: 
        (BraceGroup
          left: <Id.Lit_LBrace '{'>
          children: [
            (command.Simple
              blame_tok: <echo_without_newline>
              more_env: []
              words: [{<echo_without_newline>} {(DQ ($ Id.VSub_DollarName hello_content))}]
              redirects: [(Redir op:<Id.Redir_Great '>'> loc:(redir_loc.Fd fd:1) arg:{<hello>})]
              do_fork: T
            )
            (command.Simple
              blame_tok: <echo_without_newline>
              more_env: []
              words: [{<echo_without_newline>} {(DQ ($ Id.VSub_DollarName example_content))}]
              redirects: [(Redir op:<Id.Redir_Great '>'> loc:(redir_loc.Fd fd:1) arg:{<example>})]
              do_fork: T
            )
          ]
          redirects: []
          right: <Id.Lit_RBrace '}'>
        )
    )
    (command.ShAssignment
      left: <Id.Lit_VarLike 'test_repo='>
      pairs: [
        (AssignPair
          left: <Id.Lit_VarLike 'test_repo='>
          lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'test_repo='> name:test_repo)
          op: assign_op.Equal
          rhs: {<test>}
        )
      ]
      redirects: []
    )
    (command.ShFunction
      name_tok: <push_repo>
      name: push_repo
      body: 
        (BraceGroup
          left: <Id.Lit_LBrace '{'>
          children: [
            (command.Simple
              blame_tok: <test_create_repo>
              more_env: []
              words: [{<test_create_repo>} {($ Id.VSub_DollarName test_repo)}]
              redirects: []
              do_fork: T
            )
            (command.Simple
              blame_tok: <cd>
              more_env: []
              words: [{<cd>} {($ Id.VSub_DollarName test_repo)}]
              redirects: []
              do_fork: T
            )
            (command.Simple
              blame_tok: <setup_repo>
              more_env: []
              words: [{<setup_repo>}]
              redirects: []
              do_fork: T
            )
          ]
          redirects: []
          right: <Id.Lit_RBrace '}'>
        )
    )
    (command.ShFunction
      name_tok: <pop_repo>
      name: pop_repo
      body: 
        (BraceGroup
          left: <Id.Lit_LBrace '{'>
          children: [
            (command.Simple
              blame_tok: <cd>
              more_env: []
              words: [{<cd>} {<..>}]
              redirects: []
              do_fork: T
            )
            (command.Simple
              blame_tok: <rm>
              more_env: []
              words: [{<rm>} {<-rf>} {($ Id.VSub_DollarName test_repo)}]
              redirects: []
              do_fork: T
            )
          ]
          redirects: []
          right: <Id.Lit_RBrace '}'>
        )
    )
    (command.Simple
      blame_tok: <setup_repo>
      more_env: []
      words: [{<setup_repo>}]
      redirects: []
      do_fork: T
    )
    (command.Simple
      blame_tok: <test_expect_success>
      more_env: []
      words: [
        {<test_expect_success>}
        {(DQ <'multiple \'--stdin\'s are rejected'>)}
        {(SQ <'\n'> <'\techo example | test_must_fail git hash-object --stdin --stdin\n'>)}
      ]
      redirects: []
      do_fork: T
    )
    (command.Simple
      blame_tok: <test_expect_success>
      more_env: []
      words: [
        {<test_expect_success>}
        {(DQ <'Can\'t use --stdin and --stdin-paths together'>)}
        {
          (SQ <'\n'> <'\techo example | test_must_fail git hash-object --stdin --stdin-paths &&\n'> 
            <'\techo example | test_must_fail git hash-object --stdin-paths --stdin\n'>
          )
        }
      ]
      redirects: []
      do_fork: T
    )
    (command.Simple
      blame_tok: <test_expect_success>
      more_env: []
      words: [
        {<test_expect_success>}
        {(DQ <'Can\'t pass filenames as arguments with --stdin-paths'>)}
        {(SQ <'\n'> <'\techo example | test_must_fail git hash-object --stdin-paths hello\n'>)}
      ]
      redirects: []
      do_fork: T
    )
    (command.Simple
      blame_tok: <test_expect_success>
      more_env: []
      words: [
        {<test_expect_success>}
        {(DQ <'Can\'t use --path with --stdin-paths'>)}
        {(SQ <'\n'> <'\techo example | test_must_fail git hash-object --stdin-paths --path=foo\n'>)}
      ]
      redirects: []
      do_fork: T
    )
    (command.Simple
      blame_tok: <test_expect_success>
      more_env: []
      words: [
        {<test_expect_success>}
        {(DQ <'Can\'t use --path with --no-filters'>)}
        {(SQ <'\n'> <'\ttest_must_fail git hash-object --no-filters --path=foo\n'>)}
      ]
      redirects: []
      do_fork: T
    )
    (command.Simple
      blame_tok: <push_repo>
      more_env: []
      words: [{<push_repo>}]
      redirects: []
      do_fork: T
    )
    (command.Simple
      blame_tok: <test_expect_success>
      more_env: []
      words: [
        {<test_expect_success>}
        {(SQ <'hash a file'>)}
        {(SQ <'\n'> <'\ttest $hello_sha1 = $(git hash-object hello)\n'>)}
      ]
      redirects: []
      do_fork: T
    )
    (command.Simple
      blame_tok: <test_blob_does_not_exist>
      more_env: []
      words: [{<test_blob_does_not_exist>} {($ Id.VSub_DollarName hello_sha1)}]
      redirects: []
      do_fork: T
    )
    (command.Simple
      blame_tok: <test_expect_success>
      more_env: []
      words: [
        {<test_expect_success>}
        {(SQ <'hash from stdin'>)}
        {(SQ <'\n'> <'\ttest $example_sha1 = $(git hash-object --stdin < example)\n'>)}
      ]
      redirects: []
      do_fork: T
    )
    (command.Simple
      blame_tok: <test_blob_does_not_exist>
      more_env: []
      words: [{<test_blob_does_not_exist>} {($ Id.VSub_DollarName example_sha1)}]
      redirects: []
      do_fork: T
    )
    (command.Simple
      blame_tok: <test_expect_success>
      more_env: []
      words: [
        {<test_expect_success>}
        {(SQ <'hash a file and write to database'>)}
        {(SQ <'\n'> <'\ttest $hello_sha1 = $(git hash-object -w hello)\n'>)}
      ]
      redirects: []
      do_fork: T
    )
    (command.Simple
      blame_tok: <test_blob_exists>
      more_env: []
      words: [{<test_blob_exists>} {($ Id.VSub_DollarName hello_sha1)}]
      redirects: []
      do_fork: T
    )
    (command.Simple
      blame_tok: <test_expect_success>
      more_env: []
      words: [
        {<test_expect_success>}
        {(SQ <'git hash-object --stdin file1 <file0 first operates on file0, then file1'>)}
        {
          (SQ <'\n'> <'\techo foo > file1 &&\n'> 
            <'\tobname0=$(echo bar | git hash-object --stdin) &&\n'> <'\tobname1=$(git hash-object file1) &&\n'> 
            <'\tobname0new=$(echo bar | git hash-object --stdin file1 | sed -n -e 1p) &&\n'> <'\tobname1new=$(echo bar | git hash-object --stdin file1 | sed -n -e 2p) &&\n'> 
            <'\ttest "$obname0" = "$obname0new" &&\n'> <'\ttest "$obname1" = "$obname1new"\n'>
          )
        }
      ]
      redirects: []
      do_fork: T
    )
    (command.Simple
      blame_tok: <test_expect_success>
      more_env: []
      words: [
        {<test_expect_success>}
        {(SQ <'set up crlf tests'>)}
        {
          (SQ <'\n'> <'\techo fooQ | tr Q "\\\\015" >file0 &&\n'> <'\tcp file0 file1 &&\n'> 
            <'\techo "file0 -crlf" >.gitattributes &&\n'> <'\techo "file1 crlf" >>.gitattributes &&\n'> <'\tgit config core.autocrlf true &&\n'> 
            <'\tfile0_sha=$(git hash-object file0) &&\n'> <'\tfile1_sha=$(git hash-object file1) &&\n'> <'\ttest "$file0_sha" != "$file1_sha"\n'>
          )
        }
      ]
      redirects: []
      do_fork: T
    )
    (command.Simple
      blame_tok: <test_expect_success>
      more_env: []
      words: [
        {<test_expect_success>}
        {(SQ <'check that appropriate filter is invoke when --path is used'>)}
        {
          (SQ <'\n'> <'\tpath1_sha=$(git hash-object --path=file1 file0) &&\n'> 
            <'\tpath0_sha=$(git hash-object --path=file0 file1) &&\n'> <'\ttest "$file0_sha" = "$path0_sha" &&\n'> <'\ttest "$file1_sha" = "$path1_sha" &&\n'> 
            <'\tpath1_sha=$(cat file0 | git hash-object --path=file1 --stdin) &&\n'> <'\tpath0_sha=$(cat file1 | git hash-object --path=file0 --stdin) &&\n'> 
            <'\ttest "$file0_sha" = "$path0_sha" &&\n'> <'\ttest "$file1_sha" = "$path1_sha"\n'>
          )
        }
      ]
      redirects: []
      do_fork: T
    )
    (command.Simple
      blame_tok: <test_expect_success>
      more_env: []
      words: [
        {<test_expect_success>}
        {(SQ <'gitattributes also work in a subdirectory'>)}
        {
          (SQ <'\n'> <'\tmkdir subdir &&\n'> <'\t(\n'> <'\t\tcd subdir &&\n'> 
            <'\t\tsubdir_sha0=$(git hash-object ../file0) &&\n'> <'\t\tsubdir_sha1=$(git hash-object ../file1) &&\n'> <'\t\ttest "$file0_sha" = "$subdir_sha0" &&\n'> 
            <'\t\ttest "$file1_sha" = "$subdir_sha1"\n'> <'\t)\n'>
          )
        }
      ]
      redirects: []
      do_fork: T
    )
    (command.Simple
      blame_tok: <test_expect_success>
      more_env: []
      words: [
        {<test_expect_success>}
        {(SQ <'check that --no-filters option works'>)}
        {
          (SQ <'\n'> <'\tnofilters_file1=$(git hash-object --no-filters file1) &&\n'> 
            <'\ttest "$file0_sha" = "$nofilters_file1" &&\n'> <'\tnofilters_file1=$(cat file1 | git hash-object --stdin) &&\n'> 
            <'\ttest "$file0_sha" = "$nofilters_file1"\n'>
          )
        }
      ]
      redirects: []
      do_fork: T
    )
    (command.Simple
      blame_tok: <test_expect_success>
      more_env: []
      words: [
        {<test_expect_success>}
        {(SQ <'check that --no-filters option works with --stdin-paths'>)}
        {
          (SQ <'\n'> 
            <'\tnofilters_file1=$(echo "file1" | git hash-object --stdin-paths --no-filters) &&\n'> <'\ttest "$file0_sha" = "$nofilters_file1"\n'>
          )
        }
      ]
      redirects: []
      do_fork: T
    )
    (command.Simple blame_tok:<pop_repo> more_env:[] words:[{<pop_repo>}] redirects:[] do_fork:T)
    (command.ForEach
      keyword: <Id.KW_For for>
      iter_names: [args]
      iterable: (for_iter.Words words:[{(DQ <'-w --stdin'>)} {(DQ <'--stdin -w'>)}])
      semi_tok: <Id.Op_Semi _>
      body: 
        (command.DoGroup
          left: <Id.KW_Do do>
          children: [
            (command.Simple
              blame_tok: <push_repo>
              more_env: []
              words: [{<push_repo>}]
              redirects: []
              do_fork: T
            )
            (command.Simple
              blame_tok: <test_expect_success>
              more_env: []
              words: [
                {<test_expect_success>}
                {(DQ <'hash from stdin and write to database ('> ($ Id.VSub_DollarName args) <')'>)}
                {(SQ <'\n'> <'\t\ttest $example_sha1 = $(git hash-object $args < example)\n'> <'\t'>)}
              ]
              redirects: []
              do_fork: T
            )
            (command.Simple
              blame_tok: <test_blob_exists>
              more_env: []
              words: [{<test_blob_exists>} {($ Id.VSub_DollarName example_sha1)}]
              redirects: []
              do_fork: T
            )
            (command.Simple
              blame_tok: <pop_repo>
              more_env: []
              words: [{<pop_repo>}]
              redirects: []
              do_fork: T
            )
          ]
          right: <Id.KW_Done done>
        )
      redirects: []
    )
    (command.ShAssignment
      left: <Id.Lit_VarLike 'filenames='>
      pairs: [
        (AssignPair
          left: <Id.Lit_VarLike 'filenames='>
          lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'filenames='> name:filenames)
          op: assign_op.Equal
          rhs: {(DQ <'hello\n'> <example>)}
        )
      ]
      redirects: []
    )
    (command.ShAssignment
      left: <Id.Lit_VarLike 'sha1s='>
      pairs: [
        (AssignPair
          left: <Id.Lit_VarLike 'sha1s='>
          lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'sha1s='> name:sha1s)
          op: assign_op.Equal
          rhs: {(DQ ($ Id.VSub_DollarName hello_sha1) <'\n'> ($ Id.VSub_DollarName example_sha1))}
        )
      ]
      redirects: []
    )
    (command.Simple
      blame_tok: <test_expect_success>
      more_env: []
      words: [
        {<test_expect_success>}
        {(DQ <'hash two files with names on stdin'>)}
        {
          (SQ <'\n'> 
            <
'\ttest "$sha1s" = "$(echo_without_newline "$filenames" | git hash-object --stdin-paths)"\n'
            >
          )
        }
      ]
      redirects: []
      do_fork: T
    )
    (command.ForEach
      keyword: <Id.KW_For for>
      iter_names: [args]
      iterable: (for_iter.Words words:[{(DQ <'-w --stdin-paths'>)} {(DQ <'--stdin-paths -w'>)}])
      semi_tok: <Id.Op_Semi _>
      body: 
        (command.DoGroup
          left: <Id.KW_Do do>
          children: [
            (command.Simple
              blame_tok: <push_repo>
              more_env: []
              words: [{<push_repo>}]
              redirects: []
              do_fork: T
            )
            (command.Simple
              blame_tok: <test_expect_success>
              more_env: []
              words: [
                {<test_expect_success>}
                {
                  (DQ <'hash two files with names on stdin and write to database ('> 
                    ($ Id.VSub_DollarName args) <')'>
                  )
                }
                {
                  (SQ <'\n'> 
                    <
'\t\ttest "$sha1s" = "$(echo_without_newline "$filenames" | git hash-object $args)"\n'
                    > <'\t'>
                  )
                }
              ]
              redirects: []
              do_fork: T
            )
            (command.Simple
              blame_tok: <test_blob_exists>
              more_env: []
              words: [{<test_blob_exists>} {($ Id.VSub_DollarName hello_sha1)}]
              redirects: []
              do_fork: T
            )
            (command.Simple
              blame_tok: <test_blob_exists>
              more_env: []
              words: [{<test_blob_exists>} {($ Id.VSub_DollarName example_sha1)}]
              redirects: []
              do_fork: T
            )
            (command.Simple
              blame_tok: <pop_repo>
              more_env: []
              words: [{<pop_repo>}]
              redirects: []
              do_fork: T
            )
          ]
          right: <Id.KW_Done done>
        )
      redirects: []
    )
    (command.Simple
      blame_tok: <test_expect_success>
      more_env: []
      words: [
        {<test_expect_success>}
        {(SQ <'too-short tree'>)}
        {
          (SQ <'\n'> <'\techo abc >malformed-tree &&\n'> 
            <'\ttest_must_fail git hash-object -t tree malformed-tree 2>err &&\n'> <'\ttest_i18ngrep "too-short tree object" err\n'>
          )
        }
      ]
      redirects: []
      do_fork: T
    )
    (command.ShFunction
      name_tok: <hex2oct>
      name: hex2oct
      body: 
        (BraceGroup
          left: <Id.Lit_LBrace '{'>
          children: [
            (command.Simple
              blame_tok: <perl>
              more_env: []
              words: [{<perl>} {<-ne>} {(SQ <'printf "\\\\%03o", hex for /../g'>)}]
              redirects: []
              do_fork: T
            )
          ]
          redirects: []
          right: <Id.Lit_RBrace '}'>
        )
    )
    (command.Simple
      blame_tok: <test_expect_success>
      more_env: []
      words: [
        {<test_expect_success>}
        {(SQ <'malformed mode in tree'>)}
        {
          (SQ <'\n'> <'\thex_sha1=$(echo foo | git hash-object --stdin -w) &&\n'> 
            <'\tbin_sha1=$(echo $hex_sha1 | hex2oct) &&\n'> <'\tprintf "9100644 \\0$bin_sha1" >tree-with-malformed-mode &&\n'> 
            <'\ttest_must_fail git hash-object -t tree tree-with-malformed-mode 2>err &&\n'> <'\ttest_i18ngrep "malformed mode in tree entry" err\n'>
          )
        }
      ]
      redirects: []
      do_fork: T
    )
    (command.Simple
      blame_tok: <test_expect_success>
      more_env: []
      words: [
        {<test_expect_success>}
        {(SQ <'empty filename in tree'>)}
        {
          (SQ <'\n'> <'\thex_sha1=$(echo foo | git hash-object --stdin -w) &&\n'> 
            <'\tbin_sha1=$(echo $hex_sha1 | hex2oct) &&\n'> <'\tprintf "100644 \\0$bin_sha1" >tree-with-empty-filename &&\n'> 
            <'\ttest_must_fail git hash-object -t tree tree-with-empty-filename 2>err &&\n'> <'\ttest_i18ngrep "empty filename in tree entry" err\n'>
          )
        }
      ]
      redirects: []
      do_fork: T
    )
    (command.Simple
      blame_tok: <test_expect_success>
      more_env: []
      words: [
        {<test_expect_success>}
        {(SQ <'corrupt commit'>)}
        {(SQ <'\n'> <'\ttest_must_fail git hash-object -t commit --stdin </dev/null\n'>)}
      ]
      redirects: []
      do_fork: T
    )
    (command.Simple
      blame_tok: <test_expect_success>
      more_env: []
      words: [
        {<test_expect_success>}
        {(SQ <'corrupt tag'>)}
        {(SQ <'\n'> <'\ttest_must_fail git hash-object -t tag --stdin </dev/null\n'>)}
      ]
      redirects: []
      do_fork: T
    )
    (command.Simple
      blame_tok: <test_expect_success>
      more_env: []
      words: [
        {<test_expect_success>}
        {(SQ <'hash-object complains about bogus type name'>)}
        {(SQ <'\n'> <'\ttest_must_fail git hash-object -t bogus --stdin </dev/null\n'>)}
      ]
      redirects: []
      do_fork: T
    )
    (command.Simple
      blame_tok: <test_expect_success>
      more_env: []
      words: [
        {<test_expect_success>}
        {(SQ <'hash-object complains about truncated type name'>)}
        {(SQ <'\n'> <'\ttest_must_fail git hash-object -t bl --stdin </dev/null\n'>)}
      ]
      redirects: []
      do_fork: T
    )
    (command.Simple
      blame_tok: <test_expect_success>
      more_env: []
      words: [
        {<test_expect_success>}
        {(SQ <--literally>)}
        {
          (SQ <'\n'> <'\tt=1234567890 &&\n'> 
            <'\techo example | git hash-object -t $t --literally --stdin\n'>
          )
        }
      ]
      redirects: []
      do_fork: T
    )
    (command.Simple
      blame_tok: <test_expect_success>
      more_env: []
      words: [
        {<test_expect_success>}
        {(SQ <'--literally with extra-long type'>)}
        {
          (SQ <'\n'> <'\tt=12345678901234567890123456789012345678901234567890 &&\n'> 
            <'\tt="$t$t$t$t$t$t$t$t$t$t$t$t$t$t$t$t$t$t$t$t$t$t$t$t$t$t$t$t$t$t" &&\n'> <'\techo example | git hash-object -t $t --literally --stdin\n'>
          )
        }
      ]
      redirects: []
      do_fork: T
    )
    (command.Simple
      blame_tok: <test_done>
      more_env: []
      words: [{<test_done>}]
      redirects: []
      do_fork: T
    )
  ]
)