(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 archive and git get-tar-commit-id test\n'
                  span_id: 15
                ) (Token id:Id.Lit_Chars val:'\n' span_id:16) 
                (Token
                  id: Id.Lit_Chars
                  val: 'This test covers the topics of file contents, commit date handling and\n'
                  span_id: 17
                ) (Token id:Id.Lit_Chars val:'commit id embedding:\n' span_id:18) 
                (Token id:Id.Lit_Chars val:'\n' span_id:19) 
                (Token
                  id: Id.Lit_Chars
                  val: '  The contents of the repository is compared to the extracted tar\n'
                  span_id: 20
                ) 
                (Token
                  id: Id.Lit_Chars
                  val: '  archive.  The repository contains simple text files, symlinks and a\n'
                  span_id: 21
                ) 
                (Token
                  id: Id.Lit_Chars
                  val: '  binary file (/bin/sh).  Only paths shorter than 99 characters are\n'
                  span_id: 22
                ) (Token id:Id.Lit_Chars val:'  used.\n' span_id:23) (Token id:Id.Lit_Chars val:'\n' span_id:24) 
                (Token
                  id: Id.Lit_Chars
                  val: '  git archive applies the commit date to every file in the archive it\n'
                  span_id: 25
                ) 
                (Token
                  id: Id.Lit_Chars
                  val: '  creates.  The test sets the commit date to a specific value and checks\n'
                  span_id: 26
                ) (Token id:Id.Lit_Chars val:'  if the tar archive contains that value.\n' span_id:27) 
                (Token id:Id.Lit_Chars val:'\n' span_id:28) 
                (Token
                  id: Id.Lit_Chars
                  val: '  When giving git archive a commit id (in contrast to a tree id) it\n'
                  span_id: 29
                ) 
                (Token
                  id: Id.Lit_Chars
                  val: '  embeds this commit id into the tar archive as a comment.  The test\n'
                  span_id: 30
                ) 
                (Token
                  id: Id.Lit_Chars
                  val: '  checks the ability of git get-tar-commit-id to figure it out from the\n'
                  span_id: 31
                ) (Token id:Id.Lit_Chars val:'  tar file.\n' span_id:32) (Token id:Id.Lit_Chars val:'\n' span_id:33)
              )
            }
          spids: [13]
        )
      ]
    )
    (C {(.)} {(./test-lib.sh)})
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:SUBSTFORMAT)
          op: assign_op.Equal
          rhs: {(Id.Lit_Other '%') (H) (Id.Lit_Other '%') (n)}
          spids: [42]
        )
      ]
    )
    (C {(test_lazy_prereq)} {(TAR_NEEDS_PAX_FALLBACK)} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:54) (Token id:Id.Lit_Chars val:'\t(\n' span_id:55) 
          (Token id:Id.Lit_Chars val:'\t\tmkdir pax &&\n' span_id:56) (Token id:Id.Lit_Chars val:'\t\tcd pax &&\n' span_id:57) 
          (Token
            id: Id.Lit_Chars
            val: '\t\t"$TAR" xf "$TEST_DIRECTORY"/t5000/pax.tar &&\n'
            span_id: 58
          ) (Token id:Id.Lit_Chars val:'\t\ttest -f PaxHeaders.1791/file\n' span_id:59) 
          (Token id:Id.Lit_Chars val:'\t)\n' span_id:60)
        )
      }
    )
    (C {(test_lazy_prereq)} {(GZIP)} {(SQ (Token id:Id.Lit_Chars val:'gzip --version' span_id:69))})
    (command.ShFunction
      name: get_pax_header
      body: 
        (command.BraceGroup
          children: [
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:file)
                  op: assign_op.Equal
                  rhs: {($ Id.VSub_Number '$1')}
                  spids: [80]
                )
              ]
            )
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:header)
                  op: assign_op.Equal
                  rhs: {($ Id.VSub_Number '$2') (Id.Lit_Equals '=')}
                  spids: [84]
                )
              ]
            )
            (command.WhileUntil
              keyword: (Token id:Id.KW_While val:while span_id:90)
              cond: [(C {(read)} {(len)} {(rest)})]
              body: 
                (command.DoGroup
                  children: [
                    (command.If
                      arms: [
                        (if_arm
                          cond: [
                            (C {(test)} {(DQ ($ Id.VSub_DollarName '$len'))} {(Id.Lit_Equals '=')} 
                              {
                                (command_sub
                                  left_token: (Token id:Id.Left_DollarParen val:'$(' span_id:112)
                                  command_list: 
                                    (command.CommandList
                                      children: [
                                        (command.Pipeline
                                          children: [
                                            (C {(echo)} 
                                              {
                                                (DQ ($ Id.VSub_DollarName '$len') (' ') 
                                                  ($ Id.VSub_DollarName '$rest')
                                                )
                                              }
                                            )
                                            (C {(wc)} {(-c)})
                                          ]
                                          negated: F
                                        )
                                      ]
                                    )
                                )
                              }
                            )
                          ]
                          action: [
                            (command.Case
                              to_match: {(DQ ($ Id.VSub_DollarName '$rest'))}
                              arms: [
                                (case_arm
                                  pat_list: [{($ Id.VSub_DollarName '$header') (Id.Lit_Star '*')}]
                                  action: [
                                    (C {(echo)} 
                                      {
                                        (DQ 
                                          (braced_var_sub
                                            token: (Token id:Id.VSub_Name val:rest span_id:150)
                                            suffix_op: 
                                              (suffix_op.Unary
                                                op_id: Id.VOp1_Pound
                                                arg_word: {($ Id.VSub_DollarName '$header')}
                                              )
                                          )
                                        )
                                      }
                                    )
                                  ]
                                  spids: [141 143 157 -1]
                                )
                              ]
                            )
                          ]
                          spids: [102 129]
                        )
                      ]
                    )
                  ]
                )
              redirects: [
                (redir.Redir
                  op: (Token id:Id.Redir_Less val:'<' span_id:168)
                  fd: -1
                  arg_word: {(DQ ($ Id.VSub_DollarName '$file'))}
                )
              ]
            )
          ]
        )
    )
    (command.ShFunction
      name: check_tar
      body: 
        (command.BraceGroup
          children: [
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:tarfile)
                  op: assign_op.Equal
                  rhs: {($ Id.VSub_Number '$1') (.tar)}
                  spids: [183]
                )
              ]
            )
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:listfile)
                  op: assign_op.Equal
                  rhs: {($ Id.VSub_Number '$1') (.lst)}
                  spids: [188]
                )
              ]
            )
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:dir)
                  op: assign_op.Equal
                  rhs: {($ Id.VSub_Number '$1')}
                  spids: [193]
                )
              ]
            )
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:dir_with_prefix)
                  op: assign_op.Equal
                  rhs: {($ Id.VSub_DollarName '$dir') (/) ($ Id.VSub_Number '$2')}
                  spids: [197]
                )
              ]
            )
            (C {(test_expect_success)} 
              {(SQ (Token id:Id.Lit_Chars val:' extract tar archive' span_id:207))} 
              {
                (SQ (Token id:Id.Lit_Chars val:'\n' span_id:211) 
                  (Token
                    id: Id.Lit_Chars
                    val: '\t\t(mkdir $dir && cd $dir && "$TAR" xf -) <$tarfile\n'
                    span_id: 212
                  ) (Token id:Id.Lit_Chars val:'\t' span_id:213)
                )
              }
            )
            (C {(test_expect_success)} {(TAR_NEEDS_PAX_FALLBACK)} 
              {(SQ (Token id:Id.Lit_Chars val:' interpret pax headers' span_id:223))} 
              {
                (SQ (Token id:Id.Lit_Chars val:'\n' span_id:227) 
                  (Token id:Id.Lit_Chars val:'\t\t(\n' span_id:228) (Token id:Id.Lit_Chars val:'\t\t\tcd $dir &&\n' span_id:229) 
                  (Token
                    id: Id.Lit_Chars
                    val: '\t\t\tfor header in *.paxheader\n'
                    span_id: 230
                  ) (Token id:Id.Lit_Chars val:'\t\t\tdo\n' span_id:231) 
                  (Token
                    id: Id.Lit_Chars
                    val: '\t\t\t\tdata=${header%.paxheader}.data &&\n'
                    span_id: 232
                  ) (Token id:Id.Lit_Chars val:'\t\t\t\tif test -h $data || test -e $data\n' span_id:233) 
                  (Token id:Id.Lit_Chars val:'\t\t\t\tthen\n' span_id:234) (Token id:Id.Lit_Chars val:'\t\t\t\t\tpath=$(get_pax_header $header path) &&\n' span_id:235) 
                  (Token
                    id: Id.Lit_Chars
                    val: '\t\t\t\t\tif test -n "$path"\n'
                    span_id: 236
                  ) (Token id:Id.Lit_Chars val:'\t\t\t\t\tthen\n' span_id:237) 
                  (Token
                    id: Id.Lit_Chars
                    val: '\t\t\t\t\t\tmv "$data" "$path"\n'
                    span_id: 238
                  ) (Token id:Id.Lit_Chars val:'\t\t\t\t\tfi\n' span_id:239) 
                  (Token id:Id.Lit_Chars val:'\t\t\t\tfi\n' span_id:240) (Token id:Id.Lit_Chars val:'\t\t\tdone\n' span_id:241) 
                  (Token id:Id.Lit_Chars val:'\t\t)\n' span_id:242) (Token id:Id.Lit_Chars val:'\t' span_id:243)
                )
              }
            )
            (C {(test_expect_success)} 
              {(SQ (Token id:Id.Lit_Chars val:' validate filenames' span_id:251))} 
              {
                (SQ (Token id:Id.Lit_Chars val:'\n' span_id:255) 
                  (Token
                    id: Id.Lit_Chars
                    val: '\t\t(cd ${dir_with_prefix}a && find .) | sort >$listfile &&\n'
                    span_id: 256
                  ) (Token id:Id.Lit_Chars val:'\t\ttest_cmp a.lst $listfile\n' span_id:257) 
                  (Token id:Id.Lit_Chars val:'\t' span_id:258)
                )
              }
            )
            (C {(test_expect_success)} 
              {(SQ (Token id:Id.Lit_Chars val:' validate file contents' span_id:266))} 
              {
                (SQ (Token id:Id.Lit_Chars val:'\n' span_id:270) 
                  (Token
                    id: Id.Lit_Chars
                    val: '\t\tdiff -r a ${dir_with_prefix}a\n'
                    span_id: 271
                  ) (Token id:Id.Lit_Chars val:'\t' span_id:272)
                )
              }
            )
          ]
        )
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'populate workdir' span_id:283))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'mkdir a &&\n' span_id:289) 
          (Token id:Id.Lit_Chars val:'     echo simple textfile >a/a &&\n' span_id:290) 
          (Token
            id: Id.Lit_Chars
            val: '     ten=0123456789 && hundred=$ten$ten$ten$ten$ten$ten$ten$ten$ten$ten &&\n'
            span_id: 291
          ) (Token id:Id.Lit_Chars val:'     echo long filename >a/four$hundred &&\n' span_id:292) 
          (Token id:Id.Lit_Chars val:'     mkdir a/bin &&\n' span_id:293) (Token id:Id.Lit_Chars val:'     test-genrandom "frotz" 500000 >a/bin/sh &&\n' span_id:294) 
          (Token
            id: Id.Lit_Chars
            val: '     printf "A\\$Format:%s\\$O" "$SUBSTFORMAT" >a/substfile1 &&\n'
            span_id: 295
          ) (Token id:Id.Lit_Chars val:'     printf "A not substituted O" >a/substfile2 &&\n' span_id:296) 
          (Token
            id: Id.Lit_Chars
            val: '     if test_have_prereq SYMLINKS; then\n'
            span_id: 297
          ) (Token id:Id.Lit_Chars val:'\tln -s a a/l1\n' span_id:298) 
          (Token id:Id.Lit_Chars val:'     else\n' span_id:299) (Token id:Id.Lit_Chars val:'\tprintf %s a > a/l1\n' span_id:300) 
          (Token id:Id.Lit_Chars val:'     fi &&\n' span_id:301) (Token id:Id.Lit_Chars val:'     (p=long_path_to_a_file && cd a &&\n' span_id:302) 
          (Token
            id: Id.Lit_Chars
            val: '      for depth in 1 2 3 4 5; do mkdir $p && cd $p; done &&\n'
            span_id: 303
          ) (Token id:Id.Lit_Chars val:'      echo text >file_with_long_path) &&\n' span_id:304) 
          (Token id:Id.Lit_Chars val:'     (cd a && find .) | sort >a.lst' span_id:305)
        )
      }
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'add ignored file' span_id:314))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'echo ignore me >a/ignored &&\n' span_id:320) 
          (Token
            id: Id.Lit_Chars
            val: '     echo ignored export-ignore >.git/info/attributes'
            span_id: 321
          )
        )
      }
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'add files to repository' span_id:328))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:332) 
          (Token id:Id.Lit_Chars val:'\tgit add a &&\n' span_id:333) 
          (Token
            id: Id.Lit_Chars
            val: '\tGIT_COMMITTER_DATE="2005-05-27 22:00" git commit -m initial\n'
            span_id: 334
          )
        )
      }
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'setup export-subst' span_id:341))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:345) 
          (Token
            id: Id.Lit_Chars
            val: '\techo "substfile?" export-subst >>.git/info/attributes &&\n'
            span_id: 346
          ) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit log --max-count=1 "--pretty=format:A${SUBSTFORMAT}O" HEAD \\\n'
            span_id: 347
          ) (Token id:Id.Lit_Chars val:'\t\t>a/substfile1\n' span_id:348)
        )
      }
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'create bare clone' span_id:357))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'git clone --bare . bare.git &&\n' span_id:363) 
          (Token
            id: Id.Lit_Chars
            val: '     cp .git/info/attributes bare.git/info/attributes'
            span_id: 364
          )
        )
      }
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'remove ignored file' span_id:373))} 
      {(SQ (Token id:Id.Lit_Chars val:'rm a/ignored' span_id:379))}
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'git archive' span_id:388))} 
      {(SQ (Token id:Id.Lit_Chars val:'git archive HEAD >b.tar' span_id:394))}
    )
    (C {(check_tar)} {(b)})
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'git archive --prefix=prefix/' span_id:406))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:410) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit archive --prefix=prefix/ HEAD >with_prefix.tar\n'
            span_id: 411
          )
        )
      }
    )
    (C {(check_tar)} {(with_prefix)} {(prefix/)})
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'git-archive --prefix=olde-' span_id:425))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:429) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit archive --prefix=olde- HEAD >with_olde-prefix.tar\n'
            span_id: 430
          )
        )
      }
    )
    (C {(check_tar)} {(with_olde-prefix)} {(olde-)})
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'git archive on large files' span_id:444))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:448) 
          (Token
            id: Id.Lit_Chars
            val: '    test_config core.bigfilethreshold 1 &&\n'
            span_id: 449
          ) (Token id:Id.Lit_Chars val:'    git archive HEAD >b3.tar &&\n' span_id:450) 
          (Token id:Id.Lit_Chars val:'    test_cmp_bin b.tar b3.tar\n' span_id:451)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'git archive in a bare repo' span_id:460))} {(SQ (Token id:Id.Lit_Chars val:'(cd bare.git && git archive HEAD) >b3.tar' span_id:466))}
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'git archive vs. the same in a bare repo' span_id:475))} {(SQ (Token id:Id.Lit_Chars val:'test_cmp_bin b.tar b3.tar' span_id:481))}
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'git archive with --output' span_id:488))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'git archive --output=b4.tar HEAD &&\n' span_id:494) 
          (Token id:Id.Lit_Chars val:'    test_cmp_bin b.tar b4.tar' span_id:495)
        )
      }
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'git archive --remote' span_id:502))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'git archive --remote=. HEAD >b5.tar &&\n' span_id:508) 
          (Token id:Id.Lit_Chars val:'    test_cmp_bin b.tar b5.tar' span_id:509)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'validate file modification time' span_id:518))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'mkdir extract &&\n' span_id:524) 
          (Token
            id: Id.Lit_Chars
            val: '     "$TAR" xf b.tar -C extract a/a &&\n'
            span_id: 525
          ) (Token id:Id.Lit_Chars val:'     test-chmtime -v +0 extract/a/a |cut -f 1 >b.mtime &&\n' span_id:526) 
          (Token
            id: Id.Lit_Chars
            val: '     echo "1117231200" >expected.mtime &&\n'
            span_id: 527
          ) (Token id:Id.Lit_Chars val:'     test_cmp expected.mtime b.mtime' span_id:528)
        )
      }
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'git get-tar-commit-id' span_id:537))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'git get-tar-commit-id <b.tar >b.commitid &&\n' span_id:543) 
          (Token
            id: Id.Lit_Chars
            val: '     test_cmp .git/$(git symbolic-ref HEAD) b.commitid'
            span_id: 544
          )
        )
      }
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'git archive with --output, override inferred format'
            span_id: 551
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:555) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit archive --format=tar --output=d4.zip HEAD &&\n'
            span_id: 556
          ) (Token id:Id.Lit_Chars val:'\ttest_cmp_bin b.tar d4.zip\n' span_id:557)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'git archive --list outside of a git repo' span_id:566))} {(SQ (Token id:Id.Lit_Chars val:'GIT_DIR=some/non-existing/directory git archive --list' span_id:572))}
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'clients cannot access unreachable commits' span_id:579))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:583) 
          (Token id:Id.Lit_Chars val:'\ttest_commit unreachable &&\n' span_id:584) (Token id:Id.Lit_Chars val:'\tsha1=$(git rev-parse HEAD) &&\n' span_id:585) 
          (Token id:Id.Lit_Chars val:'\tgit reset --hard HEAD^ &&\n' span_id:586) (Token id:Id.Lit_Chars val:'\tgit archive $sha1 >remote.tar &&\n' span_id:587) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest_must_fail git archive --remote=. $sha1 >remote.tar\n'
            span_id: 588
          )
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'upload-archive can allow unreachable commits' span_id:595))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:599) 
          (Token id:Id.Lit_Chars val:'\ttest_commit unreachable1 &&\n' span_id:600) (Token id:Id.Lit_Chars val:'\tsha1=$(git rev-parse HEAD) &&\n' span_id:601) 
          (Token id:Id.Lit_Chars val:'\tgit reset --hard HEAD^ &&\n' span_id:602) (Token id:Id.Lit_Chars val:'\tgit archive $sha1 >remote.tar &&\n' span_id:603) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest_config uploadarchive.allowUnreachable true &&\n'
            span_id: 604
          ) (Token id:Id.Lit_Chars val:'\tgit archive --remote=. $sha1 >remote.tar\n' span_id:605)
        )
      }
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'setup tar filters' span_id:612))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:616) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit config tar.tar.foo.command "tr ab ba" &&\n'
            span_id: 617
          ) (Token id:Id.Lit_Chars val:'\tgit config tar.bar.command "tr ab ba" &&\n' span_id:618) 
          (Token id:Id.Lit_Chars val:'\tgit config tar.bar.remote true &&\n' span_id:619) (Token id:Id.Lit_Chars val:'\tgit config tar.invalid baz\n' span_id:620)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'archive --list mentions user filter' span_id:627))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:631) 
          (Token id:Id.Lit_Chars val:'\tgit archive --list >output &&\n' span_id:632) (Token id:Id.Lit_Chars val:'\tgrep "^tar\\.foo\\$" output &&\n' span_id:633) 
          (Token id:Id.Lit_Chars val:'\tgrep "^bar\\$" output\n' span_id:634)
        )
      }
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'archive --list shows only enabled remote filters'
            span_id: 641
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:645) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit archive --list --remote=. >output &&\n'
            span_id: 646
          ) (Token id:Id.Lit_Chars val:'\t! grep "^tar\\.foo\\$" output &&\n' span_id:647) 
          (Token id:Id.Lit_Chars val:'\tgrep "^bar\\$" output\n' span_id:648)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'invoke tar filter by format' span_id:655))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:659) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit archive --format=tar.foo HEAD >config.tar.foo &&\n'
            span_id: 660
          ) (Token id:Id.Lit_Chars val:'\ttr ab ba <config.tar.foo >config.tar &&\n' span_id:661) 
          (Token id:Id.Lit_Chars val:'\ttest_cmp_bin b.tar config.tar &&\n' span_id:662) (Token id:Id.Lit_Chars val:'\tgit archive --format=bar HEAD >config.bar &&\n' span_id:663) 
          (Token id:Id.Lit_Chars val:'\ttr ab ba <config.bar >config.tar &&\n' span_id:664) (Token id:Id.Lit_Chars val:'\ttest_cmp_bin b.tar config.tar\n' span_id:665)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'invoke tar filter by extension' span_id:672))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:676) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit archive -o config-implicit.tar.foo HEAD &&\n'
            span_id: 677
          ) (Token id:Id.Lit_Chars val:'\ttest_cmp_bin config.tar.foo config-implicit.tar.foo &&\n' span_id:678) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit archive -o config-implicit.bar HEAD &&\n'
            span_id: 679
          ) (Token id:Id.Lit_Chars val:'\ttest_cmp_bin config.tar.foo config-implicit.bar\n' span_id:680)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'default output format remains tar' span_id:687))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:691) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit archive -o config-implicit.baz HEAD &&\n'
            span_id: 692
          ) (Token id:Id.Lit_Chars val:'\ttest_cmp_bin b.tar config-implicit.baz\n' span_id:693)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'extension matching requires dot' span_id:700))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:704) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit archive -o config-implicittar.foo HEAD &&\n'
            span_id: 705
          ) (Token id:Id.Lit_Chars val:'\ttest_cmp_bin b.tar config-implicittar.foo\n' span_id:706)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'only enabled filters are available remotely' span_id:713))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:717) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest_must_fail git archive --remote=. --format=tar.foo HEAD \\\n'
            span_id: 718
          ) (Token id:Id.Lit_Chars val:'\t\t>remote.tar.foo &&\n' span_id:719) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit archive --remote=. --format=bar >remote.bar HEAD &&\n'
            span_id: 720
          ) (Token id:Id.Lit_Chars val:'\ttest_cmp_bin remote.bar config.bar\n' span_id:721)
        )
      }
    )
    (C {(test_expect_success)} {(GZIP)} 
      {(SQ (Token id:Id.Lit_Chars val:'git archive --format=tgz' span_id:730))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:734) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit archive --format=tgz HEAD >j.tgz\n'
            span_id: 735
          )
        )
      }
    )
    (C {(test_expect_success)} {(GZIP)} 
      {(SQ (Token id:Id.Lit_Chars val:'git archive --format=tar.gz' span_id:744))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:748) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit archive --format=tar.gz HEAD >j1.tar.gz &&\n'
            span_id: 749
          ) (Token id:Id.Lit_Chars val:'\ttest_cmp_bin j.tgz j1.tar.gz\n' span_id:750)
        )
      }
    )
    (C {(test_expect_success)} {(GZIP)} 
      {(SQ (Token id:Id.Lit_Chars val:'infer tgz from .tgz filename' span_id:759))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:763) 
          (Token id:Id.Lit_Chars val:'\tgit archive --output=j2.tgz HEAD &&\n' span_id:764) (Token id:Id.Lit_Chars val:'\ttest_cmp_bin j.tgz j2.tgz\n' span_id:765)
        )
      }
    )
    (C {(test_expect_success)} {(GZIP)} 
      {(SQ (Token id:Id.Lit_Chars val:'infer tgz from .tar.gz filename' span_id:774))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:778) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit archive --output=j3.tar.gz HEAD &&\n'
            span_id: 779
          ) (Token id:Id.Lit_Chars val:'\ttest_cmp_bin j.tgz j3.tar.gz\n' span_id:780)
        )
      }
    )
    (C {(test_expect_success)} {(GZIP)} {(SQ (Token id:Id.Lit_Chars val:'extract tgz file' span_id:789))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:793) 
          (Token id:Id.Lit_Chars val:'\tgzip -d -c <j.tgz >j.tar &&\n' span_id:794) (Token id:Id.Lit_Chars val:'\ttest_cmp_bin b.tar j.tar\n' span_id:795)
        )
      }
    )
    (C {(test_expect_success)} {(GZIP)} 
      {(SQ (Token id:Id.Lit_Chars val:'remote tar.gz is allowed by default' span_id:804))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:808) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit archive --remote=. --format=tar.gz HEAD >remote.tar.gz &&\n'
            span_id: 809
          ) (Token id:Id.Lit_Chars val:'\ttest_cmp_bin j.tgz remote.tar.gz\n' span_id:810)
        )
      }
    )
    (C {(test_expect_success)} {(GZIP)} 
      {(SQ (Token id:Id.Lit_Chars val:'remote tar.gz can be disabled' span_id:819))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:823) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit config tar.tar.gz.remote false &&\n'
            span_id: 824
          ) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest_must_fail git archive --remote=. --format=tar.gz HEAD \\\n'
            span_id: 825
          ) (Token id:Id.Lit_Chars val:'\t\t>remote.tar.gz\n' span_id:826)
        )
      }
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'archive and :(glob)' span_id:833))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:837) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit archive -v HEAD -- ":(glob)**/sh" >/dev/null 2>actual &&\n'
            span_id: 838
          ) (Token id:Id.Lit_Chars val:'\tcat >expect <<EOF &&\n' span_id:839) 
          (Token id:Id.Lit_Chars val:'a/\n' span_id:840) (Token id:Id.Lit_Chars val:'a/bin/\n' span_id:841) 
          (Token id:Id.Lit_Chars val:'a/bin/sh\n' span_id:842) (Token id:Id.Lit_Chars val:'EOF\n' span_id:843) 
          (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual\n' span_id:844)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'catch non-matching pathspec' span_id:851))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:855) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest_must_fail git archive -v HEAD -- "*.abc" >/dev/null\n'
            span_id: 856
          )
        )
      }
    )
    (command.ShFunction
      name: tar_info
      body: 
        (command.BraceGroup
          children: [
            (command.Pipeline
              children: [
                (C {(DQ ($ Id.VSub_DollarName '$TAR'))} {(tvf)} {(DQ ($ Id.VSub_Number '$1'))})
                (C {(awk)} 
                  {
                    (SQ (Token id:Id.Lit_Chars val:'{\n' span_id:911) 
                      (Token
                        id: Id.Lit_Chars
                        val: '\t\tsplit($4, date, "-")\n'
                        span_id: 912
                      ) (Token id:Id.Lit_Chars val:'\t\tprint $3 " " date[1]\n' span_id:913) 
                      (Token id:Id.Lit_Chars val:'\t}' span_id:914)
                    )
                  }
                )
              ]
              negated: F
            )
          ]
        )
    )
    (C {(test_lazy_prereq)} {(TAR_HUGE)} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:940) 
          (Token id:Id.Lit_Chars val:'\techo "68719476737 4147" >expect &&\n' span_id:941) 
          (Token
            id: Id.Lit_Chars
            val: '\ttar_info "$TEST_DIRECTORY"/t5000/huge-and-future.tar >actual &&\n'
            span_id: 942
          ) (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual\n' span_id:943)
        )
      }
    )
    (C {(test_expect_success)} {(LONG_IS_64BIT)} 
      {(SQ (Token id:Id.Lit_Chars val:'set up repository with huge blob' span_id:952))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:956) 
          (Token id:Id.Lit_Chars val:'\tobj_d=19 &&\n' span_id:957) (Token id:Id.Lit_Chars val:'\tobj_f=f9c8273ec45a8938e6999cb59b3ff66739902a &&\n' span_id:958) 
          (Token id:Id.Lit_Chars val:'\tobj=${obj_d}${obj_f} &&\n' span_id:959) (Token id:Id.Lit_Chars val:'\tmkdir -p .git/objects/$obj_d &&\n' span_id:960) 
          (Token
            id: Id.Lit_Chars
            val: '\tcp "$TEST_DIRECTORY"/t5000/$obj .git/objects/$obj_d/$obj_f &&\n'
            span_id: 961
          ) (Token id:Id.Lit_Chars val:'\trm -f .git/index &&\n' span_id:962) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit update-index --add --cacheinfo 100644,$obj,huge &&\n'
            span_id: 963
          ) (Token id:Id.Lit_Chars val:'\tgit commit -m huge\n' span_id:964)
        )
      }
    )
    (C {(test_expect_success)} {(LONG_IS_64BIT)} 
      {(SQ (Token id:Id.Lit_Chars val:'generate tar with huge size' span_id:979))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:983) 
          (Token id:Id.Lit_Chars val:'\t{\n' span_id:984) (Token id:Id.Lit_Chars val:'\t\tgit archive HEAD\n' span_id:985) 
          (Token id:Id.Lit_Chars val:'\t\techo $? >exit-code\n' span_id:986) (Token id:Id.Lit_Chars val:'\t} | test_copy_bytes 4096 >huge.tar &&\n' span_id:987) 
          (Token id:Id.Lit_Chars val:'\techo 141 >expect &&\n' span_id:988) (Token id:Id.Lit_Chars val:'\ttest_cmp expect exit-code\n' span_id:989)
        )
      }
    )
    (C {(test_expect_success)} {(TAR_HUGE) (Id.Lit_Comma ',') (LONG_IS_64BIT)} 
      {(SQ (Token id:Id.Lit_Chars val:'system tar can read our huge size' span_id:1000))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:1004) 
          (Token id:Id.Lit_Chars val:'\techo 68719476737 >expect &&\n' span_id:1005) (Token id:Id.Lit_Chars val:'\ttar_info huge.tar | cut -d" " -f1 >actual &&\n' span_id:1006) 
          (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual\n' span_id:1007)
        )
      }
    )
    (C {(test_expect_success)} {(LONG_IS_64BIT)} 
      {(SQ (Token id:Id.Lit_Chars val:'set up repository with far-future commit' span_id:1016))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:1020) 
          (Token id:Id.Lit_Chars val:'\trm -f .git/index &&\n' span_id:1021) (Token id:Id.Lit_Chars val:'\techo content >file &&\n' span_id:1022) 
          (Token id:Id.Lit_Chars val:'\tgit add file &&\n' span_id:1023) (Token id:Id.Lit_Chars val:'\tGIT_COMMITTER_DATE="@68719476737 +0000" \\\n' span_id:1024) 
          (Token id:Id.Lit_Chars val:'\t\tgit commit -m "tempori parendum"\n' span_id:1025)
        )
      }
    )
    (C {(test_expect_success)} {(LONG_IS_64BIT)} 
      {(SQ (Token id:Id.Lit_Chars val:'generate tar with future mtime' span_id:1034))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:1038) 
          (Token id:Id.Lit_Chars val:'\tgit archive HEAD >future.tar\n' span_id:1039)
        )
      }
    )
    (C {(test_expect_success)} {(TAR_HUGE) (Id.Lit_Comma ',') (LONG_IS_64BIT)} 
      {(SQ (Token id:Id.Lit_Chars val:'system tar can read our future mtime' span_id:1050))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:1054) 
          (Token id:Id.Lit_Chars val:'\techo 4147 >expect &&\n' span_id:1055) (Token id:Id.Lit_Chars val:'\ttar_info future.tar | cut -d" " -f2 >actual &&\n' span_id:1056) 
          (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual\n' span_id:1057)
        )
      }
    )
    (C {(test_done)})
  ]
)