(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 submit' 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)
        )
      }
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'init depot' span_id:30))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:34) (Token id:Id.Lit_Chars val:'\t(\n' span_id:35) 
          (Token id:Id.Lit_Chars val:'\t\tcd "$cli" &&\n' span_id:36) (Token id:Id.Lit_Chars val:'\t\techo file1 >file1 &&\n' span_id:37) 
          (Token id:Id.Lit_Chars val:'\t\tp4 add file1 &&\n' span_id:38) (Token id:Id.Lit_Chars val:'\t\tp4 submit -d "change 1"\n' span_id:39) 
          (Token id:Id.Lit_Chars val:'\t)\n' span_id:40)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'is_cli_file_writeable function' span_id:47))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:51) (Token id:Id.Lit_Chars val:'\t(\n' span_id:52) 
          (Token id:Id.Lit_Chars val:'\t\tcd "$cli" &&\n' span_id:53) (Token id:Id.Lit_Chars val:'\t\techo a >a &&\n' span_id:54) 
          (Token id:Id.Lit_Chars val:'\t\tis_cli_file_writeable a &&\n' span_id:55) (Token id:Id.Lit_Chars val:'\t\t! is_cli_file_writeable file1 &&\n' span_id:56) 
          (Token id:Id.Lit_Chars val:'\t\trm a\n' span_id:57) (Token id:Id.Lit_Chars val:'\t)\n' span_id:58)
        )
      }
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'submit with no client dir' span_id:65))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:69) 
          (Token id:Id.Lit_Chars val:'\ttest_when_finished cleanup_git &&\n' span_id:70) (Token id:Id.Lit_Chars val:'\tgit p4 clone --dest="$git" //depot &&\n' span_id:71) 
          (Token id:Id.Lit_Chars val:'\t(\n' span_id:72) (Token id:Id.Lit_Chars val:'\t\tcd "$git" &&\n' span_id:73) 
          (Token id:Id.Lit_Chars val:'\t\techo file2 >file2 &&\n' span_id:74) (Token id:Id.Lit_Chars val:'\t\tgit add file2 &&\n' span_id:75) 
          (Token id:Id.Lit_Chars val:'\t\tgit commit -m "git commit 2" &&\n' span_id:76) (Token id:Id.Lit_Chars val:'\t\trm -rf "$cli" &&\n' span_id:77) 
          (Token
            id: Id.Lit_Chars
            val: '\t\tgit config git-p4.skipSubmitEdit true &&\n'
            span_id: 78
          ) (Token id:Id.Lit_Chars val:'\t\tgit p4 submit\n' span_id:79) 
          (Token id:Id.Lit_Chars val:'\t) &&\n' span_id:80) (Token id:Id.Lit_Chars val:'\t(\n' span_id:81) 
          (Token id:Id.Lit_Chars val:'\t\tcd "$cli" &&\n' span_id:82) (Token id:Id.Lit_Chars val:'\t\ttest_path_is_file file1 &&\n' span_id:83) 
          (Token id:Id.Lit_Chars val:'\t\ttest_path_is_file file2\n' span_id:84) (Token id:Id.Lit_Chars val:'\t)\n' span_id:85)
        )
      }
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'submit --origin' span_id:95))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:99) 
          (Token id:Id.Lit_Chars val:'\ttest_when_finished cleanup_git &&\n' span_id:100) (Token id:Id.Lit_Chars val:'\tgit p4 clone --dest="$git" //depot &&\n' span_id:101) 
          (Token id:Id.Lit_Chars val:'\t(\n' span_id:102) (Token id:Id.Lit_Chars val:'\t\tcd "$git" &&\n' span_id:103) 
          (Token id:Id.Lit_Chars val:'\t\ttest_commit "file3" &&\n' span_id:104) (Token id:Id.Lit_Chars val:'\t\ttest_commit "file4" &&\n' span_id:105) 
          (Token
            id: Id.Lit_Chars
            val: '\t\tgit config git-p4.skipSubmitEdit true &&\n'
            span_id: 106
          ) (Token id:Id.Lit_Chars val:'\t\tgit p4 submit --origin=HEAD^\n' span_id:107) 
          (Token id:Id.Lit_Chars val:'\t) &&\n' span_id:108) (Token id:Id.Lit_Chars val:'\t(\n' span_id:109) 
          (Token id:Id.Lit_Chars val:'\t\tcd "$cli" &&\n' span_id:110) (Token id:Id.Lit_Chars val:'\t\ttest_path_is_missing "file3.t" &&\n' span_id:111) 
          (Token id:Id.Lit_Chars val:'\t\ttest_path_is_file "file4.t"\n' span_id:112) (Token id:Id.Lit_Chars val:'\t)\n' span_id:113)
        )
      }
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'submit --dry-run' span_id:120))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:124) 
          (Token id:Id.Lit_Chars val:'\ttest_when_finished cleanup_git &&\n' span_id:125) (Token id:Id.Lit_Chars val:'\tgit p4 clone --dest="$git" //depot &&\n' span_id:126) 
          (Token id:Id.Lit_Chars val:'\t(\n' span_id:127) (Token id:Id.Lit_Chars val:'\t\tcd "$git" &&\n' span_id:128) 
          (Token id:Id.Lit_Chars val:'\t\ttest_commit "dry-run1" &&\n' span_id:129) (Token id:Id.Lit_Chars val:'\t\ttest_commit "dry-run2" &&\n' span_id:130) 
          (Token id:Id.Lit_Chars val:'\t\tgit p4 submit --dry-run >out &&\n' span_id:131) (Token id:Id.Lit_Chars val:'\t\ttest_i18ngrep "Would apply" out\n' span_id:132) 
          (Token id:Id.Lit_Chars val:'\t) &&\n' span_id:133) (Token id:Id.Lit_Chars val:'\t(\n' span_id:134) 
          (Token id:Id.Lit_Chars val:'\t\tcd "$cli" &&\n' span_id:135) (Token id:Id.Lit_Chars val:'\t\ttest_path_is_missing "dry-run1.t" &&\n' span_id:136) 
          (Token id:Id.Lit_Chars val:'\t\ttest_path_is_missing "dry-run2.t"\n' span_id:137) (Token id:Id.Lit_Chars val:'\t)\n' span_id:138)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'submit --dry-run --export-labels' span_id:145))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:149) 
          (Token id:Id.Lit_Chars val:'\ttest_when_finished cleanup_git &&\n' span_id:150) (Token id:Id.Lit_Chars val:'\tgit p4 clone --dest="$git" //depot &&\n' span_id:151) 
          (Token id:Id.Lit_Chars val:'\t(\n' span_id:152) (Token id:Id.Lit_Chars val:'\t\tcd "$git" &&\n' span_id:153) 
          (Token id:Id.Lit_Chars val:'\t\techo dry-run1 >dry-run1 &&\n' span_id:154) (Token id:Id.Lit_Chars val:'\t\tgit add dry-run1 &&\n' span_id:155) 
          (Token
            id: Id.Lit_Chars
            val: '\t\tgit commit -m "dry-run1" dry-run1 &&\n'
            span_id: 156
          ) (Token id:Id.Lit_Chars val:'\t\tgit config git-p4.skipSubmitEdit true &&\n' span_id:157) 
          (Token id:Id.Lit_Chars val:'\t\tgit p4 submit &&\n' span_id:158) (Token id:Id.Lit_Chars val:'\t\techo dry-run2 >dry-run2 &&\n' span_id:159) 
          (Token id:Id.Lit_Chars val:'\t\tgit add dry-run2 &&\n' span_id:160) (Token id:Id.Lit_Chars val:'\t\tgit commit -m "dry-run2" dry-run2 &&\n' span_id:161) 
          (Token
            id: Id.Lit_Chars
            val: '\t\tgit tag -m "dry-run-tag1" dry-run-tag1 HEAD^ &&\n'
            span_id: 162
          ) (Token id:Id.Lit_Chars val:'\t\tgit p4 submit --dry-run --export-labels >out &&\n' span_id:163) 
          (Token
            id: Id.Lit_Chars
            val: '\t\ttest_i18ngrep "Would create p4 label" out\n'
            span_id: 164
          ) (Token id:Id.Lit_Chars val:'\t) &&\n' span_id:165) (Token id:Id.Lit_Chars val:'\t(\n' span_id:166) 
          (Token id:Id.Lit_Chars val:'\t\tcd "$cli" &&\n' span_id:167) (Token id:Id.Lit_Chars val:'\t\ttest_path_is_file "dry-run1" &&\n' span_id:168) 
          (Token id:Id.Lit_Chars val:'\t\ttest_path_is_missing "dry-run2"\n' span_id:169) (Token id:Id.Lit_Chars val:'\t)\n' span_id:170)
        )
      }
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'submit with allowSubmit' span_id:177))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:181) 
          (Token id:Id.Lit_Chars val:'\ttest_when_finished cleanup_git &&\n' span_id:182) (Token id:Id.Lit_Chars val:'\tgit p4 clone --dest="$git" //depot &&\n' span_id:183) 
          (Token id:Id.Lit_Chars val:'\t(\n' span_id:184) (Token id:Id.Lit_Chars val:'\t\tcd "$git" &&\n' span_id:185) 
          (Token id:Id.Lit_Chars val:'\t\ttest_commit "file5" &&\n' span_id:186) (Token id:Id.Lit_Chars val:'\t\tgit config git-p4.skipSubmitEdit true &&\n' span_id:187) 
          (Token
            id: Id.Lit_Chars
            val: '\t\tgit config git-p4.allowSubmit "nobranch" &&\n'
            span_id: 188
          ) (Token id:Id.Lit_Chars val:'\t\ttest_must_fail git p4 submit &&\n' span_id:189) 
          (Token
            id: Id.Lit_Chars
            val: '\t\tgit config git-p4.allowSubmit "nobranch,master" &&\n'
            span_id: 190
          ) (Token id:Id.Lit_Chars val:'\t\tgit p4 submit\n' span_id:191) 
          (Token id:Id.Lit_Chars val:'\t)\n' span_id:192)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'submit with master branch name from argv' span_id:199))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:203) 
          (Token id:Id.Lit_Chars val:'\ttest_when_finished cleanup_git &&\n' span_id:204) (Token id:Id.Lit_Chars val:'\tgit p4 clone --dest="$git" //depot &&\n' span_id:205) 
          (Token id:Id.Lit_Chars val:'\t(\n' span_id:206) (Token id:Id.Lit_Chars val:'\t\tcd "$git" &&\n' span_id:207) 
          (Token id:Id.Lit_Chars val:'\t\ttest_commit "file6" &&\n' span_id:208) (Token id:Id.Lit_Chars val:'\t\tgit config git-p4.skipSubmitEdit true &&\n' span_id:209) 
          (Token
            id: Id.Lit_Chars
            val: '\t\ttest_must_fail git p4 submit nobranch &&\n'
            span_id: 210
          ) (Token id:Id.Lit_Chars val:'\t\tgit branch otherbranch &&\n' span_id:211) 
          (Token id:Id.Lit_Chars val:'\t\tgit reset --hard HEAD^ &&\n' span_id:212) (Token id:Id.Lit_Chars val:'\t\ttest_commit "file7" &&\n' span_id:213) 
          (Token id:Id.Lit_Chars val:'\t\tgit p4 submit otherbranch\n' span_id:214) (Token id:Id.Lit_Chars val:'\t) &&\n' span_id:215) (Token id:Id.Lit_Chars val:'\t(\n' span_id:216) 
          (Token id:Id.Lit_Chars val:'\t\tcd "$cli" &&\n' span_id:217) (Token id:Id.Lit_Chars val:'\t\ttest_path_is_file "file6.t" &&\n' span_id:218) 
          (Token id:Id.Lit_Chars val:'\t\ttest_path_is_missing "file7.t"\n' span_id:219) (Token id:Id.Lit_Chars val:'\t)\n' span_id:220)
        )
      }
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'submit modify' span_id:237))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:241) 
          (Token id:Id.Lit_Chars val:'\ttest_when_finished cleanup_git &&\n' span_id:242) (Token id:Id.Lit_Chars val:'\tgit p4 clone --dest="$git" //depot &&\n' span_id:243) 
          (Token id:Id.Lit_Chars val:'\t(\n' span_id:244) (Token id:Id.Lit_Chars val:'\t\tcd "$git" &&\n' span_id:245) 
          (Token
            id: Id.Lit_Chars
            val: '\t\tgit config git-p4.skipSubmitEdit true &&\n'
            span_id: 246
          ) (Token id:Id.Lit_Chars val:'\t\techo line >>file1 &&\n' span_id:247) 
          (Token id:Id.Lit_Chars val:'\t\tgit add file1 &&\n' span_id:248) (Token id:Id.Lit_Chars val:'\t\tgit commit -m file1 &&\n' span_id:249) 
          (Token id:Id.Lit_Chars val:'\t\tgit p4 submit\n' span_id:250) (Token id:Id.Lit_Chars val:'\t) &&\n' span_id:251) (Token id:Id.Lit_Chars val:'\t(\n' span_id:252) 
          (Token id:Id.Lit_Chars val:'\t\tcd "$cli" &&\n' span_id:253) (Token id:Id.Lit_Chars val:'\t\ttest_path_is_file file1 &&\n' span_id:254) 
          (Token id:Id.Lit_Chars val:'\t\ttest_line_count = 2 file1\n' span_id:255) (Token id:Id.Lit_Chars val:'\t)\n' span_id:256)
        )
      }
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'submit add' span_id:263))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:267) 
          (Token id:Id.Lit_Chars val:'\ttest_when_finished cleanup_git &&\n' span_id:268) (Token id:Id.Lit_Chars val:'\tgit p4 clone --dest="$git" //depot &&\n' span_id:269) 
          (Token id:Id.Lit_Chars val:'\t(\n' span_id:270) (Token id:Id.Lit_Chars val:'\t\tcd "$git" &&\n' span_id:271) 
          (Token
            id: Id.Lit_Chars
            val: '\t\tgit config git-p4.skipSubmitEdit true &&\n'
            span_id: 272
          ) (Token id:Id.Lit_Chars val:'\t\techo file13 >file13 &&\n' span_id:273) 
          (Token id:Id.Lit_Chars val:'\t\tgit add file13 &&\n' span_id:274) (Token id:Id.Lit_Chars val:'\t\tgit commit -m file13 &&\n' span_id:275) 
          (Token id:Id.Lit_Chars val:'\t\tgit p4 submit\n' span_id:276) (Token id:Id.Lit_Chars val:'\t) &&\n' span_id:277) (Token id:Id.Lit_Chars val:'\t(\n' span_id:278) 
          (Token id:Id.Lit_Chars val:'\t\tcd "$cli" &&\n' span_id:279) (Token id:Id.Lit_Chars val:'\t\ttest_path_is_file file13\n' span_id:280) 
          (Token id:Id.Lit_Chars val:'\t)\n' span_id:281)
        )
      }
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'submit delete' span_id:288))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:292) 
          (Token id:Id.Lit_Chars val:'\ttest_when_finished cleanup_git &&\n' span_id:293) (Token id:Id.Lit_Chars val:'\tgit p4 clone --dest="$git" //depot &&\n' span_id:294) 
          (Token id:Id.Lit_Chars val:'\t(\n' span_id:295) (Token id:Id.Lit_Chars val:'\t\tcd "$git" &&\n' span_id:296) 
          (Token
            id: Id.Lit_Chars
            val: '\t\tgit config git-p4.skipSubmitEdit true &&\n'
            span_id: 297
          ) (Token id:Id.Lit_Chars val:'\t\tgit rm file4.t &&\n' span_id:298) 
          (Token id:Id.Lit_Chars val:'\t\tgit commit -m "delete file4.t" &&\n' span_id:299) (Token id:Id.Lit_Chars val:'\t\tgit p4 submit\n' span_id:300) 
          (Token id:Id.Lit_Chars val:'\t) &&\n' span_id:301) (Token id:Id.Lit_Chars val:'\t(\n' span_id:302) 
          (Token id:Id.Lit_Chars val:'\t\tcd "$cli" &&\n' span_id:303) (Token id:Id.Lit_Chars val:'\t\ttest_path_is_missing file4.t\n' span_id:304) 
          (Token id:Id.Lit_Chars val:'\t)\n' span_id:305)
        )
      }
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'submit copy' span_id:312))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:316) 
          (Token id:Id.Lit_Chars val:'\ttest_when_finished cleanup_git &&\n' span_id:317) (Token id:Id.Lit_Chars val:'\tgit p4 clone --dest="$git" //depot &&\n' span_id:318) 
          (Token id:Id.Lit_Chars val:'\t(\n' span_id:319) (Token id:Id.Lit_Chars val:'\t\tcd "$git" &&\n' span_id:320) 
          (Token
            id: Id.Lit_Chars
            val: '\t\tgit config git-p4.skipSubmitEdit true &&\n'
            span_id: 321
          ) (Token id:Id.Lit_Chars val:'\t\tgit config git-p4.detectCopies true &&\n' span_id:322) 
          (Token
            id: Id.Lit_Chars
            val: '\t\tgit config git-p4.detectCopiesHarder true &&\n'
            span_id: 323
          ) (Token id:Id.Lit_Chars val:'\t\tcp file5.t file5.ta &&\n' span_id:324) 
          (Token id:Id.Lit_Chars val:'\t\tgit add file5.ta &&\n' span_id:325) (Token id:Id.Lit_Chars val:'\t\tgit commit -m "copy to file5.ta" &&\n' span_id:326) 
          (Token id:Id.Lit_Chars val:'\t\tgit p4 submit\n' span_id:327) (Token id:Id.Lit_Chars val:'\t) &&\n' span_id:328) (Token id:Id.Lit_Chars val:'\t(\n' span_id:329) 
          (Token id:Id.Lit_Chars val:'\t\tcd "$cli" &&\n' span_id:330) (Token id:Id.Lit_Chars val:'\t\ttest_path_is_file file5.ta &&\n' span_id:331) 
          (Token id:Id.Lit_Chars val:'\t\t! is_cli_file_writeable file5.ta\n' span_id:332) (Token id:Id.Lit_Chars val:'\t)\n' span_id:333)
        )
      }
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'submit rename' span_id:340))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:344) 
          (Token id:Id.Lit_Chars val:'\ttest_when_finished cleanup_git &&\n' span_id:345) (Token id:Id.Lit_Chars val:'\tgit p4 clone --dest="$git" //depot &&\n' span_id:346) 
          (Token id:Id.Lit_Chars val:'\t(\n' span_id:347) (Token id:Id.Lit_Chars val:'\t\tcd "$git" &&\n' span_id:348) 
          (Token
            id: Id.Lit_Chars
            val: '\t\tgit config git-p4.skipSubmitEdit true &&\n'
            span_id: 349
          ) (Token id:Id.Lit_Chars val:'\t\tgit config git-p4.detectRenames true &&\n' span_id:350) 
          (Token id:Id.Lit_Chars val:'\t\tgit mv file6.t file6.ta &&\n' span_id:351) (Token id:Id.Lit_Chars val:'\t\tgit commit -m "rename file6.t to file6.ta" &&\n' span_id:352) 
          (Token id:Id.Lit_Chars val:'\t\tgit p4 submit\n' span_id:353) (Token id:Id.Lit_Chars val:'\t) &&\n' span_id:354) (Token id:Id.Lit_Chars val:'\t(\n' span_id:355) 
          (Token id:Id.Lit_Chars val:'\t\tcd "$cli" &&\n' span_id:356) (Token id:Id.Lit_Chars val:'\t\ttest_path_is_missing file6.t &&\n' span_id:357) 
          (Token id:Id.Lit_Chars val:'\t\ttest_path_is_file file6.ta &&\n' span_id:358) (Token id:Id.Lit_Chars val:'\t\t! is_cli_file_writeable file6.ta\n' span_id:359) 
          (Token id:Id.Lit_Chars val:'\t)\n' span_id:360)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'simple one-line description' span_id:379))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:383) 
          (Token id:Id.Lit_Chars val:'\ttest_when_finished cleanup_git &&\n' span_id:384) (Token id:Id.Lit_Chars val:'\tgit p4 clone --dest="$git" //depot &&\n' span_id:385) 
          (Token id:Id.Lit_Chars val:'\t(\n' span_id:386) (Token id:Id.Lit_Chars val:'\t\tcd "$git" &&\n' span_id:387) 
          (Token id:Id.Lit_Chars val:'\t\techo desc2 >desc2 &&\n' span_id:388) (Token id:Id.Lit_Chars val:'\t\tgit add desc2 &&\n' span_id:389) 
          (Token id:Id.Lit_Chars val:'\t\tcat >msg <<-EOF &&\n' span_id:390) (Token id:Id.Lit_Chars val:'\t\tOne-line description line for desc2.\n' span_id:391) 
          (Token id:Id.Lit_Chars val:'\t\tEOF\n' span_id:392) (Token id:Id.Lit_Chars val:'\t\tgit commit -F - <msg &&\n' span_id:393) 
          (Token
            id: Id.Lit_Chars
            val: '\t\tgit config git-p4.skipSubmitEdit true &&\n'
            span_id: 394
          ) (Token id:Id.Lit_Chars val:'\t\tgit p4 submit &&\n' span_id:395) 
          (Token
            id: Id.Lit_Chars
            val: '\t\tchange=$(p4 -G changes -m 1 //depot/... | \\\n'
            span_id: 396
          ) (Token id:Id.Lit_Chars val:'\t\t\t marshal_dump change) &&\n' span_id:397) 
          (Token
            id: Id.Lit_Chars
            val: '\t\t# marshal_dump always adds a newline\n'
            span_id: 398
          ) 
          (Token
            id: Id.Lit_Chars
            val: '\t\tp4 -G describe $change | marshal_dump desc | sed \\$d >pmsg &&\n'
            span_id: 399
          ) (Token id:Id.Lit_Chars val:'\t\ttest_cmp msg pmsg\n' span_id:400) 
          (Token id:Id.Lit_Chars val:'\t)\n' span_id:401)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'description with odd formatting' span_id:408))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:412) 
          (Token id:Id.Lit_Chars val:'\ttest_when_finished cleanup_git &&\n' span_id:413) (Token id:Id.Lit_Chars val:'\tgit p4 clone --dest="$git" //depot &&\n' span_id:414) 
          (Token id:Id.Lit_Chars val:'\t(\n' span_id:415) (Token id:Id.Lit_Chars val:'\t\tcd "$git" &&\n' span_id:416) 
          (Token id:Id.Lit_Chars val:'\t\techo desc3 >desc3 &&\n' span_id:417) (Token id:Id.Lit_Chars val:'\t\tgit add desc3 &&\n' span_id:418) 
          (Token id:Id.Lit_Chars val:'\t\t(\n' span_id:419) 
          (Token
            id: Id.Lit_Chars
            val: '\t\t\tprintf "subject line\\n\\n\\tExtra tab\\nline.\\n\\n" &&\n'
            span_id: 420
          ) 
          (Token
            id: Id.Lit_Chars
            val: '\t\t\tprintf "Description:\\n\\tBogus description marker\\n\\n" &&\n'
            span_id: 421
          ) (Token id:Id.Lit_Chars val:'\t\t\t# git commit eats trailing newlines; only use one\n' span_id:422) 
          (Token
            id: Id.Lit_Chars
            val: '\t\t\tprintf "Files:\\n\\tBogus descs marker\\n"\n'
            span_id: 423
          ) (Token id:Id.Lit_Chars val:'\t\t) >msg &&\n' span_id:424) 
          (Token id:Id.Lit_Chars val:'\t\tgit commit -F - <msg &&\n' span_id:425) (Token id:Id.Lit_Chars val:'\t\tgit config git-p4.skipSubmitEdit true &&\n' span_id:426) 
          (Token id:Id.Lit_Chars val:'\t\tgit p4 submit &&\n' span_id:427) (Token id:Id.Lit_Chars val:'\t\tchange=$(p4 -G changes -m 1 //depot/... | \\\n' span_id:428) 
          (Token id:Id.Lit_Chars val:'\t\t\t marshal_dump change) &&\n' span_id:429) (Token id:Id.Lit_Chars val:'\t\t# marshal_dump always adds a newline\n' span_id:430) 
          (Token
            id: Id.Lit_Chars
            val: '\t\tp4 -G describe $change | marshal_dump desc | sed \\$d >pmsg &&\n'
            span_id: 431
          ) (Token id:Id.Lit_Chars val:'\t\ttest_cmp msg pmsg\n' span_id:432) 
          (Token id:Id.Lit_Chars val:'\t)\n' span_id:433)
        )
      }
    )
    (command.ShFunction
      name: make_job
      body: 
        (command.BraceGroup
          children: [
            (command.AndOr
              ops: [Id.Op_DAmp Id.Op_DAmp]
              children: [
                (command.ShAssignment
                  pairs: [
                    (assign_pair
                      lhs: (sh_lhs_expr.Name name:name)
                      op: assign_op.Equal
                      rhs: {(DQ ($ Id.VSub_Number '$1'))}
                      spids: [444]
                    )
                  ]
                )
                (command.ShAssignment
                  pairs: [
                    (assign_pair
                      lhs: (sh_lhs_expr.Name name:tab)
                      op: assign_op.Equal
                      rhs: 
                        {
                          (DQ 
                            (command_sub
                              left_token: (Token id:Id.Left_DollarParen val:'$(' span_id:454)
                              command_list: 
                                (command.CommandList
                                  children: [
                                    (C {(printf)} 
                                      {
                                        (word_part.EscapedLiteral
                                          token: (Token id:Id.Lit_EscapedChar val:'\\\\' span_id:457)
                                        ) (t)
                                      }
                                    )
                                  ]
                                )
                            )
                          )
                        }
                      spids: [452]
                    )
                  ]
                )
                (command.Pipeline
                  children: [
                    (C {(p4)} {(job)} {(-o)})
                    (C {(sed)} {(-e)} {(DQ ('/^Job:/s/.*/Job: ') ($ Id.VSub_DollarName '$name') (/))} 
                      {(-e)} {(DQ ('/^Description/{ n; s/.*/') ($ Id.VSub_DollarName '$tab') (' job text/; }'))}
                    )
                    (C {(p4)} {(job)} {(-i)})
                  ]
                  negated: F
                )
              ]
            )
          ]
        )
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'description with Jobs section at end' span_id:511))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:515) 
          (Token id:Id.Lit_Chars val:'\ttest_when_finished cleanup_git &&\n' span_id:516) (Token id:Id.Lit_Chars val:'\tgit p4 clone --dest="$git" //depot &&\n' span_id:517) 
          (Token id:Id.Lit_Chars val:'\t(\n' span_id:518) (Token id:Id.Lit_Chars val:'\t\tcd "$git" &&\n' span_id:519) 
          (Token id:Id.Lit_Chars val:'\t\techo desc4 >desc4 &&\n' span_id:520) (Token id:Id.Lit_Chars val:'\t\tgit add desc4 &&\n' span_id:521) 
          (Token id:Id.Lit_Chars val:'\t\techo 6060842 >jobname &&\n' span_id:522) (Token id:Id.Lit_Chars val:'\t\t(\n' span_id:523) 
          (Token
            id: Id.Lit_Chars
            val: '\t\t\tprintf "subject line\\n\\n\\tExtra tab\\nline.\\n\\n" &&\n'
            span_id: 524
          ) (Token id:Id.Lit_Chars val:'\t\t\tprintf "Files:\\n\\tBogus files marker\\n" &&\n' span_id:525) 
          (Token id:Id.Lit_Chars val:'\t\t\tprintf "Junk: 3164175\\n" &&\n' span_id:526) (Token id:Id.Lit_Chars val:'\t\t\tprintf "Jobs: $(cat jobname)\\n"\n' span_id:527) 
          (Token id:Id.Lit_Chars val:'\t\t) >msg &&\n' span_id:528) (Token id:Id.Lit_Chars val:'\t\tgit commit -F - <msg &&\n' span_id:529) 
          (Token
            id: Id.Lit_Chars
            val: '\t\tgit config git-p4.skipSubmitEdit true &&\n'
            span_id: 530
          ) (Token id:Id.Lit_Chars val:'\t\t# build a job\n' span_id:531) 
          (Token id:Id.Lit_Chars val:'\t\tmake_job $(cat jobname) &&\n' span_id:532) (Token id:Id.Lit_Chars val:'\t\tgit p4 submit &&\n' span_id:533) 
          (Token
            id: Id.Lit_Chars
            val: '\t\tchange=$(p4 -G changes -m 1 //depot/... | \\\n'
            span_id: 534
          ) (Token id:Id.Lit_Chars val:'\t\t\t marshal_dump change) &&\n' span_id:535) 
          (Token
            id: Id.Lit_Chars
            val: '\t\t# marshal_dump always adds a newline\n'
            span_id: 536
          ) 
          (Token
            id: Id.Lit_Chars
            val: '\t\tp4 -G describe $change | marshal_dump desc | sed \\$d >pmsg &&\n'
            span_id: 537
          ) (Token id:Id.Lit_Chars val:'\t\t# make sure Jobs line and all following is gone\n' span_id:538) 
          (Token id:Id.Lit_Chars val:'\t\tsed "/^Jobs:/,\\$d" msg >jmsg &&\n' span_id:539) (Token id:Id.Lit_Chars val:'\t\ttest_cmp jmsg pmsg &&\n' span_id:540) 
          (Token id:Id.Lit_Chars val:'\t\t# make sure p4 knows about job\n' span_id:541) (Token id:Id.Lit_Chars val:'\t\tp4 -G describe $change | marshal_dump job0 >job0 &&\n' span_id:542) 
          (Token id:Id.Lit_Chars val:'\t\ttest_cmp jobname job0\n' span_id:543) (Token id:Id.Lit_Chars val:'\t)\n' span_id:544)
        )
      }
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'description with Jobs and values on separate lines'
            span_id: 551
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:555) 
          (Token id:Id.Lit_Chars val:'\ttest_when_finished cleanup_git &&\n' span_id:556) (Token id:Id.Lit_Chars val:'\tgit p4 clone --dest="$git" //depot &&\n' span_id:557) 
          (Token id:Id.Lit_Chars val:'\t(\n' span_id:558) (Token id:Id.Lit_Chars val:'\t\tcd "$git" &&\n' span_id:559) 
          (Token id:Id.Lit_Chars val:'\t\techo desc5 >desc5 &&\n' span_id:560) (Token id:Id.Lit_Chars val:'\t\tgit add desc5 &&\n' span_id:561) 
          (Token id:Id.Lit_Chars val:'\t\techo PROJ-6060842 >jobname1 &&\n' span_id:562) (Token id:Id.Lit_Chars val:'\t\techo PROJ-6060847 >jobname2 &&\n' span_id:563) 
          (Token id:Id.Lit_Chars val:'\t\t(\n' span_id:564) 
          (Token
            id: Id.Lit_Chars
            val: '\t\t\tprintf "subject line\\n\\n\\tExtra tab\\nline.\\n\\n" &&\n'
            span_id: 565
          ) (Token id:Id.Lit_Chars val:'\t\t\tprintf "Files:\\n\\tBogus files marker\\n" &&\n' span_id:566) 
          (Token id:Id.Lit_Chars val:'\t\t\tprintf "Junk: 3164175\\n" &&\n' span_id:567) (Token id:Id.Lit_Chars val:'\t\t\tprintf "Jobs:\\n" &&\n' span_id:568) 
          (Token
            id: Id.Lit_Chars
            val: '\t\t\tprintf "\\t$(cat jobname1)\\n" &&\n'
            span_id: 569
          ) (Token id:Id.Lit_Chars val:'\t\t\tprintf "\\t$(cat jobname2)\\n"\n' span_id:570) 
          (Token id:Id.Lit_Chars val:'\t\t) >msg &&\n' span_id:571) (Token id:Id.Lit_Chars val:'\t\tgit commit -F - <msg &&\n' span_id:572) 
          (Token
            id: Id.Lit_Chars
            val: '\t\tgit config git-p4.skipSubmitEdit true &&\n'
            span_id: 573
          ) (Token id:Id.Lit_Chars val:'\t\t# build two jobs\n' span_id:574) 
          (Token id:Id.Lit_Chars val:'\t\tmake_job $(cat jobname1) &&\n' span_id:575) (Token id:Id.Lit_Chars val:'\t\tmake_job $(cat jobname2) &&\n' span_id:576) 
          (Token id:Id.Lit_Chars val:'\t\tgit p4 submit &&\n' span_id:577) (Token id:Id.Lit_Chars val:'\t\tchange=$(p4 -G changes -m 1 //depot/... | \\\n' span_id:578) 
          (Token id:Id.Lit_Chars val:'\t\t\t marshal_dump change) &&\n' span_id:579) (Token id:Id.Lit_Chars val:'\t\t# marshal_dump always adds a newline\n' span_id:580) 
          (Token
            id: Id.Lit_Chars
            val: '\t\tp4 -G describe $change | marshal_dump desc | sed \\$d >pmsg &&\n'
            span_id: 581
          ) (Token id:Id.Lit_Chars val:'\t\t# make sure Jobs line and all following is gone\n' span_id:582) 
          (Token id:Id.Lit_Chars val:'\t\tsed "/^Jobs:/,\\$d" msg >jmsg &&\n' span_id:583) (Token id:Id.Lit_Chars val:'\t\ttest_cmp jmsg pmsg &&\n' span_id:584) 
          (Token
            id: Id.Lit_Chars
            val: '\t\t# make sure p4 knows about the two jobs\n'
            span_id: 585
          ) (Token id:Id.Lit_Chars val:'\t\tp4 -G describe $change >change &&\n' span_id:586) 
          (Token id:Id.Lit_Chars val:'\t\t(\n' span_id:587) (Token id:Id.Lit_Chars val:'\t\t\tmarshal_dump job0 <change &&\n' span_id:588) 
          (Token id:Id.Lit_Chars val:'\t\t\tmarshal_dump job1 <change\n' span_id:589) (Token id:Id.Lit_Chars val:'\t\t) | sort >jobs &&\n' span_id:590) 
          (Token
            id: Id.Lit_Chars
            val: '\t\tcat jobname1 jobname2 | sort >expected &&\n'
            span_id: 591
          ) (Token id:Id.Lit_Chars val:'\t\ttest_cmp expected jobs\n' span_id:592) 
          (Token id:Id.Lit_Chars val:'\t)\n' span_id:593)
        )
      }
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'description with Jobs section and bogus following text'
            span_id: 600
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:604) 
          (Token id:Id.Lit_Chars val:'\ttest_when_finished cleanup_git &&\n' span_id:605) (Token id:Id.Lit_Chars val:'\tgit p4 clone --dest="$git" //depot &&\n' span_id:606) 
          (Token id:Id.Lit_Chars val:'\t(\n' span_id:607) (Token id:Id.Lit_Chars val:'\t\tcd "$git" &&\n' span_id:608) 
          (Token id:Id.Lit_Chars val:'\t\techo desc6 >desc6 &&\n' span_id:609) (Token id:Id.Lit_Chars val:'\t\tgit add desc6 &&\n' span_id:610) 
          (Token id:Id.Lit_Chars val:'\t\techo 6060843 >jobname &&\n' span_id:611) (Token id:Id.Lit_Chars val:'\t\t(\n' span_id:612) 
          (Token
            id: Id.Lit_Chars
            val: '\t\t\tprintf "subject line\\n\\n\\tExtra tab\\nline.\\n\\n" &&\n'
            span_id: 613
          ) (Token id:Id.Lit_Chars val:'\t\t\tprintf "Files:\\n\\tBogus files marker\\n" &&\n' span_id:614) 
          (Token id:Id.Lit_Chars val:'\t\t\tprintf "Junk: 3164175\\n" &&\n' span_id:615) (Token id:Id.Lit_Chars val:'\t\t\tprintf "Jobs: $(cat jobname)\\n" &&\n' span_id:616) 
          (Token id:Id.Lit_Chars val:'\t\t\tprintf "MoreJunk: 3711\\n"\n' span_id:617) (Token id:Id.Lit_Chars val:'\t\t) >msg &&\n' span_id:618) 
          (Token id:Id.Lit_Chars val:'\t\tgit commit -F - <msg &&\n' span_id:619) (Token id:Id.Lit_Chars val:'\t\tgit config git-p4.skipSubmitEdit true &&\n' span_id:620) 
          (Token id:Id.Lit_Chars val:'\t\t# build a job\n' span_id:621) (Token id:Id.Lit_Chars val:'\t\tmake_job $(cat jobname) &&\n' span_id:622) 
          (Token
            id: Id.Lit_Chars
            val: '\t\ttest_must_fail git p4 submit 2>err &&\n'
            span_id: 623
          ) (Token id:Id.Lit_Chars val:'\t\ttest_i18ngrep "Unknown field name" err\n' span_id:624) 
          (Token id:Id.Lit_Chars val:'\t) &&\n' span_id:625) (Token id:Id.Lit_Chars val:'\t(\n' span_id:626) 
          (Token id:Id.Lit_Chars val:'\t\tcd "$cli" &&\n' span_id:627) (Token id:Id.Lit_Chars val:'\t\tp4 revert desc6 &&\n' span_id:628) 
          (Token id:Id.Lit_Chars val:'\t\trm -f desc6\n' span_id:629) (Token id:Id.Lit_Chars val:'\t)\n' span_id:630)
        )
      }
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'submit --prepare-p4-only' span_id:637))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:641) 
          (Token id:Id.Lit_Chars val:'\ttest_when_finished cleanup_git &&\n' span_id:642) (Token id:Id.Lit_Chars val:'\tgit p4 clone --dest="$git" //depot &&\n' span_id:643) 
          (Token id:Id.Lit_Chars val:'\t(\n' span_id:644) (Token id:Id.Lit_Chars val:'\t\tcd "$git" &&\n' span_id:645) 
          (Token
            id: Id.Lit_Chars
            val: '\t\techo prep-only-add >prep-only-add &&\n'
            span_id: 646
          ) (Token id:Id.Lit_Chars val:'\t\tgit add prep-only-add &&\n' span_id:647) 
          (Token id:Id.Lit_Chars val:'\t\tgit commit -m "prep only add" &&\n' span_id:648) (Token id:Id.Lit_Chars val:'\t\tgit p4 submit --prepare-p4-only >out &&\n' span_id:649) 
          (Token
            id: Id.Lit_Chars
            val: '\t\ttest_i18ngrep "prepared for submission" out &&\n'
            span_id: 650
          ) (Token id:Id.Lit_Chars val:'\t\ttest_i18ngrep "must be deleted" out &&\n' span_id:651) 
          (Token
            id: Id.Lit_Chars
            val: '\t\ttest_i18ngrep ! "everything below this line is just the diff" out\n'
            span_id: 652
          ) (Token id:Id.Lit_Chars val:'\t) &&\n' span_id:653) (Token id:Id.Lit_Chars val:'\t(\n' span_id:654) 
          (Token id:Id.Lit_Chars val:'\t\tcd "$cli" &&\n' span_id:655) (Token id:Id.Lit_Chars val:'\t\ttest_path_is_file prep-only-add &&\n' span_id:656) 
          (Token
            id: Id.Lit_Chars
            val: '\t\tp4 fstat -T action prep-only-add | grep -w add\n'
            span_id: 657
          ) (Token id:Id.Lit_Chars val:'\t)\n' span_id:658)
        )
      }
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'kill p4d' span_id:665))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:669) 
          (Token id:Id.Lit_Chars val:'\tkill_p4d\n' span_id:670)
        )
      }
    )
    (C {(test_done)})
  ]
)