(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: 'gitweb as standalone script (http status tests).\n'
                  span_id: 15
                ) (Token id:Id.Lit_Chars val:'\n' span_id:16) 
                (Token
                  id: Id.Lit_Chars
                  val: 'This test runs gitweb (git web interface) as a CGI script from the\n'
                  span_id: 17
                ) 
                (Token
                  id: Id.Lit_Chars
                  val: 'commandline, and checks that it returns the expected HTTP status\n'
                  span_id: 18
                ) (Token id:Id.Lit_Chars val:'code and message.' span_id:19)
              )
            }
          spids: [13]
        )
      ]
    )
    (C {(.)} {(./gitweb-lib.sh)})
    (command.AndOr
      ops: [Id.Op_DAmp]
      children: [
        (command.Simple
          words: [{(perl)} {(-MHTTP) (Id.Lit_Other ':') (Id.Lit_Other ':') (Date)} {(-e)} {(0)}]
          redirects: [
            (redir.Redir
              op: (Token id:Id.Redir_Great val:'>' span_id:52)
              fd: -1
              arg_word: {(/dev/null)}
            )
            (redir.Redir
              op: (Token id:Id.Redir_GreatAnd val:'2>&' span_id:55)
              fd: 2
              arg_word: {(1)}
            )
          ]
        )
        (C {(test_set_prereq)} {(DATE_PARSER)})
      ]
    )
    (command.AndOr
      ops: [Id.Op_DAmp]
      children: [
        (command.Simple
          words: [{(perl)} {(-MTime) (Id.Lit_Other ':') (Id.Lit_Other ':') (ParseDate)} {(-e)} {(0)}]
          redirects: [
            (redir.Redir
              op: (Token id:Id.Redir_Great val:'>' span_id:75)
              fd: -1
              arg_word: {(/dev/null)}
            )
            (redir.Redir
              op: (Token id:Id.Redir_GreatAnd val:'2>&' span_id:78)
              fd: 2
              arg_word: {(1)}
            )
          ]
        )
        (C {(test_set_prereq)} {(DATE_PARSER)})
      ]
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:setup span_id:98))} 
      {(DQ ('\n') ("\ttest_commit 'SnapshotTests' 'i can has snapshot'\n"))}
    )
    (command.Simple
      words: [{(cat)}]
      redirects: [
        (redir.Redir
          op: (Token id:Id.Redir_DGreat val:'>>' span_id:110)
          fd: -1
          arg_word: {(gitweb_config.perl)}
        )
        (redir.HereDoc
          op: (Token id:Id.Redir_DLess val:'<<' span_id:113)
          fd: -1
          here_begin: 
            {(word_part.EscapedLiteral token:(Token id:Id.Lit_EscapedChar val:'\\E' span_id:114)) 
              (OF)
            }
          here_end_span_id: 118
          stdin_parts: [("$feature{'snapshot'}{'override'} = 0;\n")]
        )
      ]
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'snapshots: tgz only default format enabled' span_id:125))} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'gitweb_run "p=.git;a=snapshot;h=HEAD;sf=tgz" &&\n'
            span_id: 131
          ) (Token id:Id.Lit_Chars val:'    grep "Status: 200 OK" gitweb.output &&\n' span_id:132) 
          (Token
            id: Id.Lit_Chars
            val: '    gitweb_run "p=.git;a=snapshot;h=HEAD;sf=tbz2" &&\n'
            span_id: 133
          ) 
          (Token
            id: Id.Lit_Chars
            val: '    grep "403 - Unsupported snapshot format" gitweb.output &&\n'
            span_id: 134
          ) (Token id:Id.Lit_Chars val:'    gitweb_run "p=.git;a=snapshot;h=HEAD;sf=txz" &&\n' span_id:135) 
          (Token
            id: Id.Lit_Chars
            val: '    grep "403 - Snapshot format not allowed" gitweb.output &&\n'
            span_id: 136
          ) (Token id:Id.Lit_Chars val:'    gitweb_run "p=.git;a=snapshot;h=HEAD;sf=zip" &&\n' span_id:137) 
          (Token
            id: Id.Lit_Chars
            val: '    grep "403 - Unsupported snapshot format" gitweb.output'
            span_id: 138
          )
        )
      }
    )
    (command.Simple
      words: [{(cat)}]
      redirects: [
        (redir.Redir
          op: (Token id:Id.Redir_DGreat val:'>>' span_id:145)
          fd: -1
          arg_word: {(gitweb_config.perl)}
        )
        (redir.HereDoc
          op: (Token id:Id.Redir_DLess val:'<<' span_id:148)
          fd: -1
          here_begin: 
            {(word_part.EscapedLiteral token:(Token id:Id.Lit_EscapedChar val:'\\E' span_id:149)) 
              (OF)
            }
          here_end_span_id: 153
          stdin_parts: [("$feature{'snapshot'}{'default'} = ['tgz','tbz2','txz','zip'];\n")]
        )
      ]
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'snapshots: all enabled in default, use default disabled value'
            span_id: 160
          )
        )
      } 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'gitweb_run "p=.git;a=snapshot;h=HEAD;sf=tgz" &&\n'
            span_id: 166
          ) (Token id:Id.Lit_Chars val:'    grep "Status: 200 OK" gitweb.output &&\n' span_id:167) 
          (Token
            id: Id.Lit_Chars
            val: '    gitweb_run "p=.git;a=snapshot;h=HEAD;sf=tbz2" &&\n'
            span_id: 168
          ) (Token id:Id.Lit_Chars val:'    grep "Status: 200 OK" gitweb.output &&\n' span_id:169) 
          (Token
            id: Id.Lit_Chars
            val: '    gitweb_run "p=.git;a=snapshot;h=HEAD;sf=txz" &&\n'
            span_id: 170
          ) 
          (Token
            id: Id.Lit_Chars
            val: '    grep "403 - Snapshot format not allowed" gitweb.output &&\n'
            span_id: 171
          ) (Token id:Id.Lit_Chars val:'    gitweb_run "p=.git;a=snapshot;h=HEAD;sf=zip" &&\n' span_id:172) 
          (Token id:Id.Lit_Chars val:'    grep "Status: 200 OK" gitweb.output' span_id:173)
        )
      }
    )
    (command.Simple
      words: [{(cat)}]
      redirects: [
        (redir.Redir
          op: (Token id:Id.Redir_DGreat val:'>>' span_id:180)
          fd: -1
          arg_word: {(gitweb_config.perl)}
        )
        (redir.HereDoc
          op: (Token id:Id.Redir_DLess val:'<<' span_id:183)
          fd: -1
          here_begin: 
            {(word_part.EscapedLiteral token:(Token id:Id.Lit_EscapedChar val:'\\E' span_id:184)) 
              (OF)
            }
          here_end_span_id: 188
          stdin_parts: [("$known_snapshot_formats{'zip'}{'disabled'} = 1;\n")]
        )
      ]
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'snapshots: zip explicitly disabled' span_id:195))} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'gitweb_run "p=.git;a=snapshot;h=HEAD;sf=zip" &&\n'
            span_id: 201
          ) (Token id:Id.Lit_Chars val:'    grep "403 - Snapshot format not allowed" gitweb.output' span_id:202)
        )
      }
    )
    (C {(test_debug)} {(SQ (Token id:Id.Lit_Chars val:'cat gitweb.output' span_id:208))})
    (command.Simple
      words: [{(cat)}]
      redirects: [
        (redir.Redir
          op: (Token id:Id.Redir_DGreat val:'>>' span_id:215)
          fd: -1
          arg_word: {(gitweb_config.perl)}
        )
        (redir.HereDoc
          op: (Token id:Id.Redir_DLess val:'<<' span_id:218)
          fd: -1
          here_begin: 
            {(word_part.EscapedLiteral token:(Token id:Id.Lit_EscapedChar val:'\\E' span_id:219)) 
              (OF)
            }
          here_end_span_id: 223
          stdin_parts: [("$known_snapshot_formats{'tgz'}{'disabled'} = 0;\n")]
        )
      ]
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'snapshots: tgz explicitly enabled' span_id:230))} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'gitweb_run "p=.git;a=snapshot;h=HEAD;sf=tgz" &&\n'
            span_id: 236
          ) (Token id:Id.Lit_Chars val:'    grep "Status: 200 OK" gitweb.output' span_id:237)
        )
      }
    )
    (C {(test_debug)} {(SQ (Token id:Id.Lit_Chars val:'cat gitweb.headers' span_id:243))})
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'snapshots: good tree-ish id' span_id:258))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:262) 
          (Token
            id: Id.Lit_Chars
            val: '\tgitweb_run "p=.git;a=snapshot;h=master;sf=tgz" &&\n'
            span_id: 263
          ) (Token id:Id.Lit_Chars val:'\tgrep "Status: 200 OK" gitweb.output\n' span_id:264)
        )
      }
    )
    (C {(test_debug)} {(SQ (Token id:Id.Lit_Chars val:'cat gitweb.headers' span_id:270))})
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'snapshots: bad tree-ish id' span_id:277))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:281) 
          (Token
            id: Id.Lit_Chars
            val: '\tgitweb_run "p=.git;a=snapshot;h=frizzumFrazzum;sf=tgz" &&\n'
            span_id: 282
          ) (Token id:Id.Lit_Chars val:'\tgrep "404 - Object does not exist" gitweb.output\n' span_id:283)
        )
      }
    )
    (C {(test_debug)} {(SQ (Token id:Id.Lit_Chars val:'cat gitweb.output' span_id:289))})
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'snapshots: bad tree-ish id (tagged object)' span_id:296))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:300) 
          (Token id:Id.Lit_Chars val:'\techo object > tag-object &&\n' span_id:301) (Token id:Id.Lit_Chars val:'\tgit add tag-object &&\n' span_id:302) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest_tick && git commit -m "Object to be tagged" &&\n'
            span_id: 303
          ) (Token id:Id.Lit_Chars val:'\tgit tag tagged-object $(git hash-object tag-object) &&\n' span_id:304) 
          (Token
            id: Id.Lit_Chars
            val: '\tgitweb_run "p=.git;a=snapshot;h=tagged-object;sf=tgz" &&\n'
            span_id: 305
          ) (Token id:Id.Lit_Chars val:'\tgrep "400 - Object is not a tree-ish" gitweb.output\n' span_id:306)
        )
      }
    )
    (C {(test_debug)} {(SQ (Token id:Id.Lit_Chars val:'cat gitweb.output' span_id:312))})
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'snapshots: good object id' span_id:319))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:323) 
          (Token
            id: Id.Lit_Chars
            val: '\tID=$(git rev-parse --verify HEAD) &&\n'
            span_id: 324
          ) (Token id:Id.Lit_Chars val:'\tgitweb_run "p=.git;a=snapshot;h=$ID;sf=tgz" &&\n' span_id:325) 
          (Token id:Id.Lit_Chars val:'\tgrep "Status: 200 OK" gitweb.output\n' span_id:326)
        )
      }
    )
    (C {(test_debug)} {(SQ (Token id:Id.Lit_Chars val:'cat gitweb.headers' span_id:332))})
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'snapshots: bad object id' span_id:339))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:343) 
          (Token
            id: Id.Lit_Chars
            val: '\tgitweb_run "p=.git;a=snapshot;h=abcdef01234;sf=tgz" &&\n'
            span_id: 344
          ) (Token id:Id.Lit_Chars val:'\tgrep "404 - Object does not exist" gitweb.output\n' span_id:345)
        )
      }
    )
    (C {(test_debug)} {(SQ (Token id:Id.Lit_Chars val:'cat gitweb.output' span_id:351))})
    (C {(test_expect_success)} {(DATE_PARSER)} 
      {(SQ (Token id:Id.Lit_Chars val:'modification: feed last-modified' span_id:367))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:371) 
          (Token
            id: Id.Lit_Chars
            val: '\tgitweb_run "p=.git;a=atom;h=master" &&\n'
            span_id: 372
          ) (Token id:Id.Lit_Chars val:'\tgrep "Status: 200 OK" gitweb.headers &&\n' span_id:373) 
          (Token
            id: Id.Lit_Chars
            val: '\tgrep "Last-modified: Thu, 7 Apr 2005 22:14:13 +0000" gitweb.headers\n'
            span_id: 374
          )
        )
      }
    )
    (C {(test_debug)} {(SQ (Token id:Id.Lit_Chars val:'cat gitweb.headers' span_id:380))})
    (C {(test_expect_success)} {(DATE_PARSER)} 
      {(SQ (Token id:Id.Lit_Chars val:'modification: feed if-modified-since (modified)' span_id:389))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:393) 
          (Token
            id: Id.Lit_Chars
            val: '\tHTTP_IF_MODIFIED_SINCE="Wed, 6 Apr 2005 22:14:13 +0000" &&\n'
            span_id: 394
          ) (Token id:Id.Lit_Chars val:'\texport HTTP_IF_MODIFIED_SINCE &&\n' span_id:395) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest_when_finished "unset HTTP_IF_MODIFIED_SINCE" &&\n'
            span_id: 396
          ) (Token id:Id.Lit_Chars val:'\tgitweb_run "p=.git;a=atom;h=master" &&\n' span_id:397) 
          (Token
            id: Id.Lit_Chars
            val: '\tgrep "Status: 200 OK" gitweb.headers\n'
            span_id: 398
          )
        )
      }
    )
    (C {(test_debug)} {(SQ (Token id:Id.Lit_Chars val:'cat gitweb.headers' span_id:404))})
    (C {(test_expect_success)} {(DATE_PARSER)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'modification: feed if-modified-since (unmodified)'
            span_id: 413
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:417) 
          (Token
            id: Id.Lit_Chars
            val: '\tHTTP_IF_MODIFIED_SINCE="Thu, 7 Apr 2005 22:14:13 +0000" &&\n'
            span_id: 418
          ) (Token id:Id.Lit_Chars val:'\texport HTTP_IF_MODIFIED_SINCE &&\n' span_id:419) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest_when_finished "unset HTTP_IF_MODIFIED_SINCE" &&\n'
            span_id: 420
          ) (Token id:Id.Lit_Chars val:'\tgitweb_run "p=.git;a=atom;h=master" &&\n' span_id:421) 
          (Token
            id: Id.Lit_Chars
            val: '\tgrep "Status: 304 Not Modified" gitweb.headers\n'
            span_id: 422
          )
        )
      }
    )
    (C {(test_debug)} {(SQ (Token id:Id.Lit_Chars val:'cat gitweb.headers' span_id:428))})
    (C {(test_expect_success)} {(DATE_PARSER)} 
      {(SQ (Token id:Id.Lit_Chars val:'modification: snapshot last-modified' span_id:437))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:441) 
          (Token
            id: Id.Lit_Chars
            val: '\tgitweb_run "p=.git;a=snapshot;h=master;sf=tgz" &&\n'
            span_id: 442
          ) (Token id:Id.Lit_Chars val:'\tgrep "Status: 200 OK" gitweb.headers &&\n' span_id:443) 
          (Token
            id: Id.Lit_Chars
            val: '\tgrep "Last-modified: Thu, 7 Apr 2005 22:14:13 +0000" gitweb.headers\n'
            span_id: 444
          )
        )
      }
    )
    (C {(test_debug)} {(SQ (Token id:Id.Lit_Chars val:'cat gitweb.headers' span_id:450))})
    (C {(test_expect_success)} {(DATE_PARSER)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'modification: snapshot if-modified-since (modified)'
            span_id: 459
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:463) 
          (Token
            id: Id.Lit_Chars
            val: '\tHTTP_IF_MODIFIED_SINCE="Wed, 6 Apr 2005 22:14:13 +0000" &&\n'
            span_id: 464
          ) (Token id:Id.Lit_Chars val:'\texport HTTP_IF_MODIFIED_SINCE &&\n' span_id:465) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest_when_finished "unset HTTP_IF_MODIFIED_SINCE" &&\n'
            span_id: 466
          ) (Token id:Id.Lit_Chars val:'\tgitweb_run "p=.git;a=snapshot;h=master;sf=tgz" &&\n' span_id:467) 
          (Token
            id: Id.Lit_Chars
            val: '\tgrep "Status: 200 OK" gitweb.headers\n'
            span_id: 468
          )
        )
      }
    )
    (C {(test_debug)} {(SQ (Token id:Id.Lit_Chars val:'cat gitweb.headers' span_id:474))})
    (C {(test_expect_success)} {(DATE_PARSER)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'modification: snapshot if-modified-since (unmodified)'
            span_id: 483
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:487) 
          (Token
            id: Id.Lit_Chars
            val: '\tHTTP_IF_MODIFIED_SINCE="Thu, 7 Apr 2005 22:14:13 +0000" &&\n'
            span_id: 488
          ) (Token id:Id.Lit_Chars val:'\texport HTTP_IF_MODIFIED_SINCE &&\n' span_id:489) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest_when_finished "unset HTTP_IF_MODIFIED_SINCE" &&\n'
            span_id: 490
          ) (Token id:Id.Lit_Chars val:'\tgitweb_run "p=.git;a=snapshot;h=master;sf=tgz" &&\n' span_id:491) 
          (Token
            id: Id.Lit_Chars
            val: '\tgrep "Status: 304 Not Modified" gitweb.headers\n'
            span_id: 492
          )
        )
      }
    )
    (C {(test_debug)} {(SQ (Token id:Id.Lit_Chars val:'cat gitweb.headers' span_id:498))})
    (C {(test_expect_success)} {(DATE_PARSER)} 
      {(SQ (Token id:Id.Lit_Chars val:'modification: tree snapshot' span_id:507))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:511) 
          (Token
            id: Id.Lit_Chars
            val: '\tID=$(git rev-parse --verify HEAD^{tree}) &&\n'
            span_id: 512
          ) 
          (Token
            id: Id.Lit_Chars
            val: '\tHTTP_IF_MODIFIED_SINCE="Wed, 6 Apr 2005 22:14:13 +0000" &&\n'
            span_id: 513
          ) (Token id:Id.Lit_Chars val:'\texport HTTP_IF_MODIFIED_SINCE &&\n' span_id:514) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest_when_finished "unset HTTP_IF_MODIFIED_SINCE" &&\n'
            span_id: 515
          ) (Token id:Id.Lit_Chars val:'\tgitweb_run "p=.git;a=snapshot;h=$ID;sf=tgz" &&\n' span_id:516) 
          (Token
            id: Id.Lit_Chars
            val: '\tgrep "Status: 200 OK" gitweb.headers &&\n'
            span_id: 517
          ) (Token id:Id.Lit_Chars val:'\t! grep -i "last-modified" gitweb.headers\n' span_id:518)
        )
      }
    )
    (C {(test_debug)} {(SQ (Token id:Id.Lit_Chars val:'cat gitweb.headers' span_id:524))})
    (command.Simple
      words: [{(cat)}]
      redirects: [
        (redir.Redir
          op: (Token id:Id.Redir_DGreat val:'>>' span_id:540)
          fd: -1
          arg_word: {(gitweb_config.perl)}
        )
        (redir.HereDoc
          op: (Token id:Id.Redir_DLess val:'<<' span_id:543)
          fd: -1
          here_begin: 
            {(word_part.EscapedLiteral token:(Token id:Id.Lit_EscapedChar val:'\\E' span_id:544)) 
              (OF)
            }
          here_end_span_id: 548
          stdin_parts: [('our $maxload = -1;\n')]
        )
      ]
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'load checking: load too high (default action)' span_id:553))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:557) 
          (Token id:Id.Lit_Chars val:'\tgitweb_run "p=.git" &&\n' span_id:558) 
          (Token
            id: Id.Lit_Chars
            val: '\tgrep "Status: 503 Service Unavailable" gitweb.headers &&\n'
            span_id: 559
          ) 
          (Token
            id: Id.Lit_Chars
            val: '\tgrep "503 - The load average on the server is too high" gitweb.body\n'
            span_id: 560
          )
        )
      }
    )
    (C {(test_debug)} {(SQ (Token id:Id.Lit_Chars val:'cat gitweb.headers' span_id:566))})
    (command.Simple
      words: [{(cat)}]
      redirects: [
        (redir.Redir
          op: (Token id:Id.Redir_DGreat val:'>>' span_id:575)
          fd: -1
          arg_word: {(gitweb_config.perl)}
        )
        (redir.HereDoc
          op: (Token id:Id.Redir_DLess val:'<<' span_id:578)
          fd: -1
          here_begin: 
            {(word_part.EscapedLiteral token:(Token id:Id.Lit_EscapedChar val:'\\E' span_id:579)) 
              (OF)
            }
          here_end_span_id: 583
          stdin_parts: [('our $maxload = undef;\n')]
        )
      ]
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'invalid arguments: invalid regexp (in project search)'
            span_id: 596
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:600) 
          (Token
            id: Id.Lit_Chars
            val: '\tgitweb_run "a=project_list;s=*\\.git;sr=1" &&\n'
            span_id: 601
          ) (Token id:Id.Lit_Chars val:'\tgrep "Status: 400" gitweb.headers &&\n' span_id:602) 
          (Token
            id: Id.Lit_Chars
            val: '\tgrep "400 - Invalid.*regexp" gitweb.body\n'
            span_id: 603
          )
        )
      }
    )
    (C {(test_debug)} {(SQ (Token id:Id.Lit_Chars val:'cat gitweb.headers' span_id:609))})
    (C {(test_done)})
  ]
)