(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 p4 fetching changes in multiple blocks' span_id:6))}
          spids: [4]
        )
      ]
    )
    (C {(.)} {(./lib-git-p4.sh)})
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'start p4d' span_id:18))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:22) 
          (Token id:Id.Lit_Chars val:'\tstart_p4d\n' span_id:23)
        )
      }
    )
    (command.ShFunction
      name: create_restricted_group
      body: 
        (command.BraceGroup
          children: [
            (command.Simple
              words: [{(p4)} {(group)} {(-i)}]
              redirects: [
                (redir.HereDoc
                  op: (Token id:Id.Redir_DLessDash val:'<<-' span_id:40)
                  fd: -1
                  here_begin: {(EOF)}
                  here_end_span_id: 48
                  stdin_parts: [
                    ('Group: restricted\n')
                    ('MaxResults: 7\n')
                    ('MaxScanRows: 40\n')
                    ('Users: author\n')
                  ]
                )
              ]
            )
          ]
        )
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'Create group with limited maxrows' span_id:55))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:59) 
          (Token id:Id.Lit_Chars val:'\tcreate_restricted_group\n' span_id:60)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'Create a repo with many changes' span_id:67))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:71) (Token id:Id.Lit_Chars val:'\t(\n' span_id:72) 
          (Token
            id: Id.Lit_Chars
            val: '\t\tclient_view "//depot/included/... //client/included/..." \\\n'
            span_id: 73
          ) (Token id:Id.Lit_Chars val:'\t\t\t    "//depot/excluded/... //client/excluded/..." &&\n' span_id:74) 
          (Token
            id: Id.Lit_Chars
            val: '\t\tmkdir -p "$cli/included" "$cli/excluded" &&\n'
            span_id: 75
          ) (Token id:Id.Lit_Chars val:'\t\tcd "$cli/included" &&\n' span_id:76) 
          (Token id:Id.Lit_Chars val:'\t\t>file.txt &&\n' span_id:77) (Token id:Id.Lit_Chars val:'\t\tp4 add file.txt &&\n' span_id:78) 
          (Token id:Id.Lit_Chars val:'\t\tp4 submit -d "Add file.txt" &&\n' span_id:79) (Token id:Id.Lit_Chars val:'\t\tfor i in $(test_seq 0 5)\n' span_id:80) 
          (Token id:Id.Lit_Chars val:'\t\tdo\n' span_id:81) (Token id:Id.Lit_Chars val:'\t\t\t>outer$i.txt &&\n' span_id:82) 
          (Token id:Id.Lit_Chars val:'\t\t\tp4 add outer$i.txt &&\n' span_id:83) (Token id:Id.Lit_Chars val:'\t\t\tp4 submit -d "Adding outer$i.txt" &&\n' span_id:84) 
          (Token id:Id.Lit_Chars val:'\t\t\tfor j in $(test_seq 0 5)\n' span_id:85) (Token id:Id.Lit_Chars val:'\t\t\tdo\n' span_id:86) 
          (Token id:Id.Lit_Chars val:'\t\t\t\tp4 edit file.txt &&\n' span_id:87) (Token id:Id.Lit_Chars val:'\t\t\t\techo $i$j >file.txt &&\n' span_id:88) 
          (Token
            id: Id.Lit_Chars
            val: '\t\t\t\tp4 submit -d "Commit $i$j" || exit\n'
            span_id: 89
          ) (Token id:Id.Lit_Chars val:'\t\t\tdone || exit\n' span_id:90) 
          (Token id:Id.Lit_Chars val:'\t\tdone\n' span_id:91) (Token id:Id.Lit_Chars val:'\t)\n' span_id:92)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'Default user cannot fetch changes' span_id:99))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:103) 
          (Token id:Id.Lit_Chars val:'\t! p4 changes -m 1 //depot/...\n' span_id:104)
        )
      }
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'Clone the repo' span_id:111))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:115) 
          (Token
            id: Id.Lit_Chars
            val: 
'\tgit p4 clone --dest="$git" --changes-block-size=7 --verbose //depot/included@all\n'
            span_id: 116
          )
        )
      }
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'All files are present' span_id:123))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:127) 
          (Token id:Id.Lit_Chars val:'\techo file.txt >expected &&\n' span_id:128) 
          (Token
            id: Id.Lit_Chars
            val: 
'\ttest_write_lines outer0.txt outer1.txt outer2.txt outer3.txt outer4.txt >>expected &&\n'
            span_id: 129
          ) (Token id:Id.Lit_Chars val:'\ttest_write_lines outer5.txt >>expected &&\n' span_id:130) 
          (Token id:Id.Lit_Chars val:'\tls "$git" >current &&\n' span_id:131) (Token id:Id.Lit_Chars val:'\ttest_cmp expected current\n' span_id:132)
        )
      }
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'file.txt is correct' span_id:139))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:143) 
          (Token id:Id.Lit_Chars val:'\techo 55 >expected &&\n' span_id:144) (Token id:Id.Lit_Chars val:'\ttest_cmp expected "$git/file.txt"\n' span_id:145)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'Correct number of commits' span_id:152))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:156) 
          (Token
            id: Id.Lit_Chars
            val: '\t(cd "$git" && git log --oneline) >log &&\n'
            span_id: 157
          ) (Token id:Id.Lit_Chars val:'\twc -l log &&\n' span_id:158) 
          (Token id:Id.Lit_Chars val:'\ttest_line_count = 43 log\n' span_id:159)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'Previous version of file.txt is correct' span_id:166))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:170) 
          (Token
            id: Id.Lit_Chars
            val: '\t(cd "$git" && git checkout HEAD^^) &&\n'
            span_id: 171
          ) (Token id:Id.Lit_Chars val:'\techo 53 >expected &&\n' span_id:172) 
          (Token id:Id.Lit_Chars val:'\ttest_cmp expected "$git/file.txt"\n' span_id:173)
        )
      }
    )
    (command.ShFunction
      name: p4_add_file
      body: 
        (command.BraceGroup
          children: [
            (command.Subshell
              command_list: 
                (command.CommandList
                  children: [
                    (command.AndOr
                      ops: [Id.Op_DAmp Id.Op_DAmp Id.Op_DAmp]
                      children: [
                        (C {(cd)} {(DQ ($ Id.VSub_DollarName '$cli'))})
                        (command.Simple
                          redirects: [
                            (redir.Redir
                              op: (Token id:Id.Redir_Great val:'>' span_id:198)
                              fd: -1
                              arg_word: {($ Id.VSub_Number '$1')}
                            )
                          ]
                        )
                        (C {(p4)} {(add)} {($ Id.VSub_Number '$1')})
                        (C {(p4)} {(submit)} {(-d)} {(DQ ('Added file ') ($ Id.VSub_Number '$1'))} 
                          {($ Id.VSub_Number '$1')}
                        )
                      ]
                    )
                  ]
                )
            )
          ]
        )
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'Add some more files' span_id:235))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:239) 
          (Token id:Id.Lit_Chars val:'\tfor i in $(test_seq 0 10)\n' span_id:240) (Token id:Id.Lit_Chars val:'\tdo\n' span_id:241) 
          (Token id:Id.Lit_Chars val:'\t\tp4_add_file "included/x$i" &&\n' span_id:242) (Token id:Id.Lit_Chars val:'\t\tp4_add_file "excluded/x$i"\n' span_id:243) 
          (Token id:Id.Lit_Chars val:'\tdone &&\n' span_id:244) (Token id:Id.Lit_Chars val:'\tfor i in $(test_seq 0 10)\n' span_id:245) 
          (Token id:Id.Lit_Chars val:'\tdo\n' span_id:246) (Token id:Id.Lit_Chars val:'\t\tp4_add_file "excluded/y$i"\n' span_id:247) 
          (Token id:Id.Lit_Chars val:'\tdone\n' span_id:248)
        )
      }
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'Syncing files' span_id:261))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:265) 
          (Token id:Id.Lit_Chars val:'\t(\n' span_id:266) (Token id:Id.Lit_Chars val:'\t\tcd "$git" &&\n' span_id:267) 
          (Token
            id: Id.Lit_Chars
            val: '\t\tgit p4 sync --changes-block-size=7 &&\n'
            span_id: 268
          ) (Token id:Id.Lit_Chars val:'\t\tgit checkout p4/master &&\n' span_id:269) 
          (Token id:Id.Lit_Chars val:'\t\tls -l x* > log &&\n' span_id:270) (Token id:Id.Lit_Chars val:'\t\ttest_line_count = 11 log\n' span_id:271) 
          (Token id:Id.Lit_Chars val:'\t)\n' span_id:272)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'Create a repo with multiple depot paths' span_id:288))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:292) 
          (Token
            id: Id.Lit_Chars
            val: '\tclient_view "//depot/pathA/... //client/pathA/..." \\\n'
            span_id: 293
          ) (Token id:Id.Lit_Chars val:'\t\t    "//depot/pathB/... //client/pathB/..." &&\n' span_id:294) 
          (Token
            id: Id.Lit_Chars
            val: '\tmkdir -p "$cli/pathA" "$cli/pathB" &&\n'
            span_id: 295
          ) (Token id:Id.Lit_Chars val:'\tfor p in pathA pathB\n' span_id:296) 
          (Token id:Id.Lit_Chars val:'\tdo\n' span_id:297) (Token id:Id.Lit_Chars val:'\t\tfor i in $(test_seq 1 10)\n' span_id:298) 
          (Token id:Id.Lit_Chars val:'\t\tdo\n' span_id:299) (Token id:Id.Lit_Chars val:'\t\t\tp4_add_file "$p/file$p$i"\n' span_id:300) 
          (Token id:Id.Lit_Chars val:'\t\tdone\n' span_id:301) (Token id:Id.Lit_Chars val:'\tdone\n' span_id:302)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'Clone repo with multiple depot paths' 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 "$git" &&\n' span_id:315) 
          (Token
            id: Id.Lit_Chars
            val: '\t\tgit p4 clone --changes-block-size=4 //depot/pathA@all //depot/pathB@all \\\n'
            span_id: 316
          ) (Token id:Id.Lit_Chars val:'\t\t\t--destination=dest &&\n' span_id:317) 
          (Token id:Id.Lit_Chars val:'\t\tls -1 dest >log &&\n' span_id:318) (Token id:Id.Lit_Chars val:'\t\ttest_line_count = 20 log\n' span_id:319) 
          (Token id:Id.Lit_Chars val:'\t)\n' span_id:320)
        )
      }
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'kill p4d' span_id:327))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:331) 
          (Token id:Id.Lit_Chars val:'\tkill_p4d\n' span_id:332)
        )
      }
    )
    (C {(test_done)})
  ]
)