(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 filetype tests' 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:'p4 client newlines, unix' span_id:45))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:49) (Token id:Id.Lit_Chars val:'\t(\n' span_id:50) 
          (Token id:Id.Lit_Chars val:'\t\tcd "$cli" &&\n' span_id:51) 
          (Token
            id: Id.Lit_Chars
            val: '\t\tp4 client -o | sed "/LineEnd/s/:.*/:unix/" | p4 client -i &&\n'
            span_id: 52
          ) (Token id:Id.Lit_Chars val:'\t\tprintf "unix\\ncrlf\\n" >f-unix &&\n' span_id:53) 
          (Token
            id: Id.Lit_Chars
            val: '\t\tprintf "unix\\r\\ncrlf\\r\\n" >f-unix-as-crlf &&\n'
            span_id: 54
          ) (Token id:Id.Lit_Chars val:'\t\tp4 add -t text f-unix &&\n' span_id:55) 
          (Token id:Id.Lit_Chars val:'\t\tp4 submit -d f-unix &&\n' span_id:56) (Token id:Id.Lit_Chars val:'\n' span_id:57) 
          (Token
            id: Id.Lit_Chars
            val: '\t\t# LineEnd: unix; should be no change after sync\n'
            span_id: 58
          ) (Token id:Id.Lit_Chars val:'\t\tcp f-unix f-unix-orig &&\n' span_id:59) 
          (Token id:Id.Lit_Chars val:'\t\tp4 sync -f &&\n' span_id:60) (Token id:Id.Lit_Chars val:'\t\ttest_cmp f-unix-orig f-unix &&\n' span_id:61) 
          (Token id:Id.Lit_Chars val:'\n' span_id:62) (Token id:Id.Lit_Chars val:'\t\t# make sure stored in repo as unix newlines\n' span_id:63) 
          (Token
            id: Id.Lit_Chars
            val: '\t\t# use sed to eat python-appended newline\n'
            span_id: 64
          ) (Token id:Id.Lit_Chars val:'\t\tp4 -G print //depot/f-unix | marshal_dump data 2 |\\\n' span_id:65) 
          (Token id:Id.Lit_Chars val:'\t\t    sed \\$d >f-unix-p4-print &&\n' span_id:66) (Token id:Id.Lit_Chars val:'\t\ttest_cmp f-unix-orig f-unix-p4-print &&\n' span_id:67) 
          (Token id:Id.Lit_Chars val:'\n' span_id:68) (Token id:Id.Lit_Chars val:'\t\t# switch to win, make sure lf -> crlf\n' span_id:69) 
          (Token
            id: Id.Lit_Chars
            val: '\t\tp4 client -o | sed "/LineEnd/s/:.*/:win/" | p4 client -i &&\n'
            span_id: 70
          ) (Token id:Id.Lit_Chars val:'\t\tp4 sync -f &&\n' span_id:71) 
          (Token id:Id.Lit_Chars val:'\t\ttest_cmp f-unix-as-crlf f-unix\n' span_id:72) (Token id:Id.Lit_Chars val:'\t)\n' span_id:73)
        )
      }
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'p4 client newlines, win' span_id:80))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:84) (Token id:Id.Lit_Chars val:'\t(\n' span_id:85) 
          (Token id:Id.Lit_Chars val:'\t\tcd "$cli" &&\n' span_id:86) 
          (Token
            id: Id.Lit_Chars
            val: '\t\tp4 client -o | sed "/LineEnd/s/:.*/:win/" | p4 client -i &&\n'
            span_id: 87
          ) (Token id:Id.Lit_Chars val:'\t\tprintf "win\\r\\ncrlf\\r\\n" >f-win &&\n' span_id:88) 
          (Token
            id: Id.Lit_Chars
            val: '\t\tprintf "win\\ncrlf\\n" >f-win-as-lf &&\n'
            span_id: 89
          ) (Token id:Id.Lit_Chars val:'\t\tp4 add -t text f-win &&\n' span_id:90) 
          (Token id:Id.Lit_Chars val:'\t\tp4 submit -d f-win &&\n' span_id:91) (Token id:Id.Lit_Chars val:'\n' span_id:92) 
          (Token
            id: Id.Lit_Chars
            val: '\t\t# LineEnd: win; should be no change after sync\n'
            span_id: 93
          ) (Token id:Id.Lit_Chars val:'\t\tcp f-win f-win-orig &&\n' span_id:94) 
          (Token id:Id.Lit_Chars val:'\t\tp4 sync -f &&\n' span_id:95) (Token id:Id.Lit_Chars val:'\t\ttest_cmp f-win-orig f-win &&\n' span_id:96) 
          (Token id:Id.Lit_Chars val:'\n' span_id:97) (Token id:Id.Lit_Chars val:'\t\t# make sure stored in repo as unix newlines\n' span_id:98) 
          (Token
            id: Id.Lit_Chars
            val: '\t\t# use sed to eat python-appened newline\n'
            span_id: 99
          ) (Token id:Id.Lit_Chars val:'\t\tp4 -G print //depot/f-win | marshal_dump data 2 |\\\n' span_id:100) 
          (Token id:Id.Lit_Chars val:'\t\t    sed \\$d >f-win-p4-print &&\n' span_id:101) (Token id:Id.Lit_Chars val:'\t\ttest_cmp f-win-as-lf f-win-p4-print &&\n' span_id:102) 
          (Token id:Id.Lit_Chars val:'\n' span_id:103) (Token id:Id.Lit_Chars val:'\t\t# switch to unix, make sure lf -> crlf\n' span_id:104) 
          (Token
            id: Id.Lit_Chars
            val: '\t\tp4 client -o | sed "/LineEnd/s/:.*/:unix/" | p4 client -i &&\n'
            span_id: 105
          ) (Token id:Id.Lit_Chars val:'\t\tp4 sync -f &&\n' span_id:106) 
          (Token id:Id.Lit_Chars val:'\t\ttest_cmp f-win-as-lf f-win\n' span_id:107) (Token id:Id.Lit_Chars val:'\t)\n' span_id:108)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'ensure blobs store only lf newlines' span_id:115))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:119) 
          (Token id:Id.Lit_Chars val:'\ttest_when_finished cleanup_git &&\n' span_id:120) (Token id:Id.Lit_Chars val:'\t(\n' span_id:121) 
          (Token id:Id.Lit_Chars val:'\t\tcd "$git" &&\n' span_id:122) (Token id:Id.Lit_Chars val:'\t\tgit init &&\n' span_id:123) 
          (Token id:Id.Lit_Chars val:'\t\tgit p4 sync //depot@all &&\n' span_id:124) (Token id:Id.Lit_Chars val:'\n' span_id:125) 
          (Token
            id: Id.Lit_Chars
            val: '\t\t# verify the files in .git are stored only with newlines\n'
            span_id: 126
          ) 
          (Token
            id: Id.Lit_Chars
            val: '\t\to=$(git ls-tree p4/master -- f-unix | cut -f1 | cut -d\\  -f3) &&\n'
            span_id: 127
          ) (Token id:Id.Lit_Chars val:'\t\tgit cat-file blob $o >f-unix-blob &&\n' span_id:128) 
          (Token
            id: Id.Lit_Chars
            val: '\t\ttest_cmp "$cli"/f-unix-orig f-unix-blob &&\n'
            span_id: 129
          ) (Token id:Id.Lit_Chars val:'\n' span_id:130) 
          (Token
            id: Id.Lit_Chars
            val: '\t\to=$(git ls-tree p4/master -- f-win | cut -f1 | cut -d\\  -f3) &&\n'
            span_id: 131
          ) (Token id:Id.Lit_Chars val:'\t\tgit cat-file blob $o >f-win-blob &&\n' span_id:132) 
          (Token
            id: Id.Lit_Chars
            val: '\t\ttest_cmp "$cli"/f-win-as-lf f-win-blob &&\n'
            span_id: 133
          ) (Token id:Id.Lit_Chars val:'\n' span_id:134) 
          (Token id:Id.Lit_Chars val:'\t\trm f-unix-blob f-win-blob\n' span_id:135) (Token id:Id.Lit_Chars val:'\t)\n' span_id:136)
        )
      }
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'gitattributes setting eol=lf produces lf newlines'
            span_id: 143
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:147) 
          (Token id:Id.Lit_Chars val:'\ttest_when_finished cleanup_git &&\n' span_id:148) (Token id:Id.Lit_Chars val:'\t(\n' span_id:149) 
          (Token
            id: Id.Lit_Chars
            val: '\t\t# checkout the files and make sure core.eol works as planned\n'
            span_id: 150
          ) (Token id:Id.Lit_Chars val:'\t\tcd "$git" &&\n' span_id:151) 
          (Token id:Id.Lit_Chars val:'\t\tgit init &&\n' span_id:152) (Token id:Id.Lit_Chars val:'\t\techo "* eol=lf" >.gitattributes &&\n' span_id:153) 
          (Token id:Id.Lit_Chars val:'\t\tgit p4 sync //depot@all &&\n' span_id:154) (Token id:Id.Lit_Chars val:'\t\tgit checkout -b master p4/master &&\n' span_id:155) 
          (Token
            id: Id.Lit_Chars
            val: '\t\ttest_cmp "$cli"/f-unix-orig f-unix &&\n'
            span_id: 156
          ) (Token id:Id.Lit_Chars val:'\t\ttest_cmp "$cli"/f-win-as-lf f-win\n' span_id:157) 
          (Token id:Id.Lit_Chars val:'\t)\n' span_id:158)
        )
      }
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'gitattributes setting eol=crlf produces crlf newlines'
            span_id: 165
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:169) 
          (Token id:Id.Lit_Chars val:'\ttest_when_finished cleanup_git &&\n' span_id:170) (Token id:Id.Lit_Chars val:'\t(\n' span_id:171) 
          (Token
            id: Id.Lit_Chars
            val: '\t\t# checkout the files and make sure core.eol works as planned\n'
            span_id: 172
          ) (Token id:Id.Lit_Chars val:'\t\tcd "$git" &&\n' span_id:173) 
          (Token id:Id.Lit_Chars val:'\t\tgit init &&\n' span_id:174) (Token id:Id.Lit_Chars val:'\t\techo "* eol=crlf" >.gitattributes &&\n' span_id:175) 
          (Token id:Id.Lit_Chars val:'\t\tgit p4 sync //depot@all &&\n' span_id:176) (Token id:Id.Lit_Chars val:'\t\tgit checkout -b master p4/master &&\n' span_id:177) 
          (Token
            id: Id.Lit_Chars
            val: '\t\ttest_cmp "$cli"/f-unix-as-crlf f-unix &&\n'
            span_id: 178
          ) (Token id:Id.Lit_Chars val:'\t\ttest_cmp "$cli"/f-win-orig f-win\n' span_id:179) 
          (Token id:Id.Lit_Chars val:'\t)\n' span_id:180)
        )
      }
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'crlf cleanup' span_id:187))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:191) 
          (Token id:Id.Lit_Chars val:'\t(\n' span_id:192) (Token id:Id.Lit_Chars val:'\t\tcd "$cli" &&\n' span_id:193) 
          (Token id:Id.Lit_Chars val:'\t\trm f-unix-orig f-unix-as-crlf &&\n' span_id:194) (Token id:Id.Lit_Chars val:'\t\trm f-win-orig f-win-as-lf &&\n' span_id:195) 
          (Token
            id: Id.Lit_Chars
            val: '\t\tp4 client -o | sed "/LineEnd/s/:.*/:unix/" | p4 client -i &&\n'
            span_id: 196
          ) (Token id:Id.Lit_Chars val:'\t\tp4 sync -f\n' span_id:197) 
          (Token id:Id.Lit_Chars val:'\t)\n' span_id:198)
        )
      }
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'utf-16 file create' span_id:205))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:209) 
          (Token id:Id.Lit_Chars val:'\t(\n' span_id:210) (Token id:Id.Lit_Chars val:'\t\tcd "$cli" &&\n' span_id:211) 
          (Token id:Id.Lit_Chars val:'\n' span_id:212) (Token id:Id.Lit_Chars val:'\t\t# p4 saves this verbatim\n' span_id:213) 
          (Token
            id: Id.Lit_Chars
            val: '\t\tprintf "three\\nline\\ntext\\n" >f-ascii &&\n'
            span_id: 214
          ) (Token id:Id.Lit_Chars val:'\t\tp4 add -t text f-ascii &&\n' span_id:215) 
          (Token id:Id.Lit_Chars val:'\n' span_id:216) (Token id:Id.Lit_Chars val:'\t\t# p4 adds \\377\\376 header\n' span_id:217) 
          (Token id:Id.Lit_Chars val:'\t\tcp f-ascii f-ascii-as-utf16 &&\n' span_id:218) (Token id:Id.Lit_Chars val:'\t\tp4 add -t utf16 f-ascii-as-utf16 &&\n' span_id:219) 
          (Token id:Id.Lit_Chars val:'\n' span_id:220) (Token id:Id.Lit_Chars val:'\t\t# p4 saves this exactly as iconv produced it\n' span_id:221) 
          (Token
            id: Id.Lit_Chars
            val: '\t\tprintf "three\\nline\\ntext\\n" | iconv -f ascii -t utf-16 >f-utf16 &&\n'
            span_id: 222
          ) (Token id:Id.Lit_Chars val:'\t\tp4 add -t utf16 f-utf16 &&\n' span_id:223) 
          (Token id:Id.Lit_Chars val:'\n' span_id:224) (Token id:Id.Lit_Chars val:'\t\t# this also is unchanged\n' span_id:225) 
          (Token id:Id.Lit_Chars val:'\t\tcp f-utf16 f-utf16-as-text &&\n' span_id:226) (Token id:Id.Lit_Chars val:'\t\tp4 add -t text f-utf16-as-text &&\n' span_id:227) 
          (Token id:Id.Lit_Chars val:'\n' span_id:228) (Token id:Id.Lit_Chars val:'\t\tp4 submit -d "f files" &&\n' span_id:229) 
          (Token id:Id.Lit_Chars val:'\n' span_id:230) (Token id:Id.Lit_Chars val:'\t\t# force update of client files\n' span_id:231) 
          (Token id:Id.Lit_Chars val:'\t\tp4 sync -f\n' span_id:232) (Token id:Id.Lit_Chars val:'\t)\n' span_id:233)
        )
      }
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'utf-16 file test' span_id:240))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:244) 
          (Token id:Id.Lit_Chars val:'\ttest_when_finished cleanup_git &&\n' span_id:245) (Token id:Id.Lit_Chars val:'\tgit p4 clone --dest="$git" //depot@all &&\n' span_id:246) 
          (Token id:Id.Lit_Chars val:'\t(\n' span_id:247) (Token id:Id.Lit_Chars val:'\t\tcd "$git" &&\n' span_id:248) 
          (Token id:Id.Lit_Chars val:'\n' span_id:249) (Token id:Id.Lit_Chars val:'\t\ttest_cmp "$cli/f-ascii" f-ascii &&\n' span_id:250) 
          (Token
            id: Id.Lit_Chars
            val: '\t\ttest_cmp "$cli/f-ascii-as-utf16" f-ascii-as-utf16 &&\n'
            span_id: 251
          ) (Token id:Id.Lit_Chars val:'\t\ttest_cmp "$cli/f-utf16" f-utf16 &&\n' span_id:252) 
          (Token
            id: Id.Lit_Chars
            val: '\t\ttest_cmp "$cli/f-utf16-as-text" f-utf16-as-text\n'
            span_id: 253
          ) (Token id:Id.Lit_Chars val:'\t)\n' span_id:254)
        )
      }
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'keyword file create' 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 "$cli" &&\n' span_id:267) 
          (Token id:Id.Lit_Chars val:'\n' span_id:268) 
          (Token
            id: Id.Lit_Chars
            val: '\t\tprintf "id\\n\\$Id\\$\\n\\$Author\\$\\ntext\\n" >k-text-k &&\n'
            span_id: 269
          ) (Token id:Id.Lit_Chars val:'\t\tp4 add -t text+k k-text-k &&\n' span_id:270) 
          (Token id:Id.Lit_Chars val:'\n' span_id:271) (Token id:Id.Lit_Chars val:'\t\tcp k-text-k k-text-ko &&\n' span_id:272) 
          (Token id:Id.Lit_Chars val:'\t\tp4 add -t text+ko k-text-ko &&\n' span_id:273) (Token id:Id.Lit_Chars val:'\n' span_id:274) 
          (Token
            id: Id.Lit_Chars
            val: '\t\tcat k-text-k | iconv -f ascii -t utf-16 >k-utf16-k &&\n'
            span_id: 275
          ) (Token id:Id.Lit_Chars val:'\t\tp4 add -t utf16+k k-utf16-k &&\n' span_id:276) 
          (Token id:Id.Lit_Chars val:'\n' span_id:277) (Token id:Id.Lit_Chars val:'\t\tcp k-utf16-k k-utf16-ko &&\n' span_id:278) 
          (Token id:Id.Lit_Chars val:'\t\tp4 add -t utf16+ko k-utf16-ko &&\n' span_id:279) (Token id:Id.Lit_Chars val:'\n' span_id:280) 
          (Token id:Id.Lit_Chars val:'\t\tp4 submit -d "k files" &&\n' span_id:281) (Token id:Id.Lit_Chars val:'\t\tp4 sync -f\n' span_id:282) 
          (Token id:Id.Lit_Chars val:'\t)\n' span_id:283)
        )
      }
    )
    (command.ShFunction
      name: build_smush
      body: 
        (command.BraceGroup
          children: [
            (command.AndOr
              ops: [Id.Op_DAmp]
              children: [
                (command.Simple
                  words: [{(cat)}]
                  redirects: [
                    (redir.Redir
                      op: (Token id:Id.Redir_Great val:'>' span_id:296)
                      fd: -1
                      arg_word: {(k_smush.py)}
                    )
                    (redir.HereDoc
                      op: (Token id:Id.Redir_DLessDash val:'<<-' span_id:299)
                      fd: -1
                      here_begin: 
                        {
                          (word_part.EscapedLiteral
                            token: (Token id:Id.Lit_EscapedChar val:'\\E' span_id:300)
                          ) (OF)
                        }
                      here_end_span_id: 307
                      stdin_parts: [
                        ('import re, sys\n')
                        (
"sys.stdout.write(re.sub(r'(?i)\\$(Id|Header|Author|Date|DateTime|Change|File|Revision):[^$]*\\$', r'$\\1$', sys.stdin.read()))\n"
                        )
                      ]
                    )
                  ]
                )
                (command.Simple
                  words: [{(cat)}]
                  redirects: [
                    (redir.Redir
                      op: (Token id:Id.Redir_Great val:'>' span_id:311)
                      fd: -1
                      arg_word: {(ko_smush.py)}
                    )
                    (redir.HereDoc
                      op: (Token id:Id.Redir_DLessDash val:'<<-' span_id:314)
                      fd: -1
                      here_begin: 
                        {
                          (word_part.EscapedLiteral
                            token: (Token id:Id.Lit_EscapedChar val:'\\E' span_id:315)
                          ) (OF)
                        }
                      here_end_span_id: 320
                      stdin_parts: [
                        ('import re, sys\n')
                        (
"sys.stdout.write(re.sub(r'(?i)\\$(Id|Header):[^$]*\\$', r'$\\1$', sys.stdin.read()))\n"
                        )
                      ]
                    )
                  ]
                )
              ]
            )
          ]
        )
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'keyword file test' span_id:327))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:331) 
          (Token id:Id.Lit_Chars val:'\tbuild_smush &&\n' span_id:332) (Token id:Id.Lit_Chars val:'\ttest_when_finished rm -f k_smush.py ko_smush.py &&\n' span_id:333) 
          (Token id:Id.Lit_Chars val:'\ttest_when_finished cleanup_git &&\n' span_id:334) (Token id:Id.Lit_Chars val:'\tgit p4 clone --dest="$git" //depot@all &&\n' span_id:335) 
          (Token id:Id.Lit_Chars val:'\t(\n' span_id:336) (Token id:Id.Lit_Chars val:'\t\tcd "$git" &&\n' span_id:337) 
          (Token id:Id.Lit_Chars val:'\n' span_id:338) (Token id:Id.Lit_Chars val:'\t\t# text, ensure unexpanded\n' span_id:339) 
          (Token
            id: Id.Lit_Chars
            val: 
'\t\t"$PYTHON_PATH" "$TRASH_DIRECTORY/k_smush.py" <"$cli/k-text-k" >cli-k-text-k-smush &&\n'
            span_id: 340
          ) (Token id:Id.Lit_Chars val:'\t\ttest_cmp cli-k-text-k-smush k-text-k &&\n' span_id:341) 
          (Token
            id: Id.Lit_Chars
            val: 
'\t\t"$PYTHON_PATH" "$TRASH_DIRECTORY/ko_smush.py" <"$cli/k-text-ko" >cli-k-text-ko-smush &&\n'
            span_id: 342
          ) (Token id:Id.Lit_Chars val:'\t\ttest_cmp cli-k-text-ko-smush k-text-ko &&\n' span_id:343) 
          (Token id:Id.Lit_Chars val:'\n' span_id:344) 
          (Token
            id: Id.Lit_Chars
            val: '\t\t# utf16, even though p4 expands keywords, git p4 does not\n'
            span_id: 345
          ) (Token id:Id.Lit_Chars val:'\t\t# try to undo that\n' span_id:346) 
          (Token
            id: Id.Lit_Chars
            val: '\t\ttest_cmp "$cli/k-utf16-k" k-utf16-k &&\n'
            span_id: 347
          ) (Token id:Id.Lit_Chars val:'\t\ttest_cmp "$cli/k-utf16-ko" k-utf16-ko\n' span_id:348) 
          (Token id:Id.Lit_Chars val:'\t)\n' span_id:349)
        )
      }
    )
    (command.ShFunction
      name: build_gendouble
      body: 
        (command.BraceGroup
          children: [
            (command.Simple
              words: [{(cat)}]
              redirects: [
                (redir.Redir
                  op: (Token id:Id.Redir_Great val:'>' span_id:362)
                  fd: -1
                  arg_word: {(gendouble.py)}
                )
                (redir.HereDoc
                  op: (Token id:Id.Redir_DLessDash val:'<<-' span_id:365)
                  fd: -1
                  here_begin: 
                    {
                      (word_part.EscapedLiteral
                        token: (Token id:Id.Lit_EscapedChar val:'\\E' span_id:366)
                      ) (OF)
                    }
                  here_end_span_id: 378
                  stdin_parts: [
                    ('import sys\n')
                    ('import struct\n')
                    ('\n')
                    ('s = struct.pack(b">LL18s",\n')
                    ('0x00051607,  # AppleDouble\n')
                    ('0x00020000,  # version 2\n')
                    ('b""          # pad to 26 bytes\n')
                    (')\n')
                    ("getattr(sys.stdout, 'buffer', sys.stdout).write(s)\n")
                  ]
                )
              ]
            )
          ]
        )
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'ignore apple' span_id:385))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:389) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest_when_finished rm -f gendouble.py &&\n'
            span_id: 390
          ) (Token id:Id.Lit_Chars val:'\tbuild_gendouble &&\n' span_id:391) 
          (Token id:Id.Lit_Chars val:'\t(\n' span_id:392) (Token id:Id.Lit_Chars val:'\t\tcd "$cli" &&\n' span_id:393) 
          (Token
            id: Id.Lit_Chars
            val: '\t\ttest-genrandom apple 1024 >double.png &&\n'
            span_id: 394
          ) 
          (Token
            id: Id.Lit_Chars
            val: '\t\t"$PYTHON_PATH" "$TRASH_DIRECTORY/gendouble.py" >%double.png &&\n'
            span_id: 395
          ) (Token id:Id.Lit_Chars val:'\t\tp4 add -t apple double.png &&\n' span_id:396) 
          (Token id:Id.Lit_Chars val:'\t\tp4 submit -d appledouble\n' span_id:397) (Token id:Id.Lit_Chars val:'\t) &&\n' span_id:398) 
          (Token id:Id.Lit_Chars val:'\ttest_when_finished cleanup_git &&\n' span_id:399) (Token id:Id.Lit_Chars val:'\tgit p4 clone --dest="$git" //depot@all &&\n' span_id:400) 
          (Token id:Id.Lit_Chars val:'\t(\n' span_id:401) (Token id:Id.Lit_Chars val:'\t\tcd "$git" &&\n' span_id:402) 
          (Token id:Id.Lit_Chars val:'\t\ttest ! -f double.png\n' span_id:403) (Token id:Id.Lit_Chars val:'\t)\n' span_id:404)
        )
      }
    )
    (C {(test_expect_success)} {(SYMLINKS)} 
      {(SQ (Token id:Id.Lit_Chars val:'create p4 symlink' span_id:413))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:417) 
          (Token id:Id.Lit_Chars val:'\tcd "$cli" &&\n' span_id:418) (Token id:Id.Lit_Chars val:'\tln -s symlink-target symlink &&\n' span_id:419) 
          (Token id:Id.Lit_Chars val:'\tp4 add symlink &&\n' span_id:420) (Token id:Id.Lit_Chars val:'\tp4 submit -d "add symlink"\n' span_id:421)
        )
      }
    )
    (C {(test_expect_success)} {(SYMLINKS)} 
      {(SQ (Token id:Id.Lit_Chars val:'ensure p4 symlink parsed correctly' span_id:430))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:434) 
          (Token id:Id.Lit_Chars val:'\ttest_when_finished cleanup_git &&\n' span_id:435) (Token id:Id.Lit_Chars val:'\tgit p4 clone --dest="$git" //depot@all &&\n' span_id:436) 
          (Token id:Id.Lit_Chars val:'\t(\n' span_id:437) (Token id:Id.Lit_Chars val:'\t\tcd "$git" &&\n' span_id:438) 
          (Token id:Id.Lit_Chars val:'\t\ttest -L symlink &&\n' span_id:439) (Token id:Id.Lit_Chars val:'\t\ttest $(readlink symlink) = symlink-target\n' span_id:440) 
          (Token id:Id.Lit_Chars val:'\t)\n' span_id:441)
        )
      }
    )
    (C {(test_expect_success)} {(SYMLINKS)} 
      {(SQ (Token id:Id.Lit_Chars val:'empty symlink target' span_id:450))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:454) 
          (Token id:Id.Lit_Chars val:'\t(\n' span_id:455) (Token id:Id.Lit_Chars val:'\t\t# first create the file as a file\n' span_id:456) 
          (Token id:Id.Lit_Chars val:'\t\tcd "$cli" &&\n' span_id:457) (Token id:Id.Lit_Chars val:'\t\t>empty-symlink &&\n' span_id:458) 
          (Token id:Id.Lit_Chars val:'\t\tp4 add empty-symlink &&\n' span_id:459) (Token id:Id.Lit_Chars val:'\t\tp4 submit -d "add empty-symlink as a file"\n' span_id:460) 
          (Token id:Id.Lit_Chars val:'\t) &&\n' span_id:461) (Token id:Id.Lit_Chars val:'\t(\n' span_id:462) 
          (Token
            id: Id.Lit_Chars
            val: '\t\t# now change it to be a symlink to "target1"\n'
            span_id: 463
          ) (Token id:Id.Lit_Chars val:'\t\tcd "$cli" &&\n' span_id:464) 
          (Token id:Id.Lit_Chars val:'\t\tp4 edit empty-symlink &&\n' span_id:465) (Token id:Id.Lit_Chars val:'\t\tp4 reopen -t symlink empty-symlink &&\n' span_id:466) 
          (Token id:Id.Lit_Chars val:'\t\trm empty-symlink &&\n' span_id:467) (Token id:Id.Lit_Chars val:'\t\tln -s target1 empty-symlink &&\n' span_id:468) 
          (Token id:Id.Lit_Chars val:'\t\tp4 add empty-symlink &&\n' span_id:469) (Token id:Id.Lit_Chars val:'\t\tp4 submit -d "make empty-symlink point to target1"\n' span_id:470) 
          (Token id:Id.Lit_Chars val:'\t) &&\n' span_id:471) (Token id:Id.Lit_Chars val:'\t(\n' span_id:472) 
          (Token
            id: Id.Lit_Chars
            val: '\t\t# Hack the p4 depot to make the symlink point to nothing;\n'
            span_id: 473
          ) (Token id:Id.Lit_Chars val:'\t\t# this should not happen in reality, but shows up\n' span_id:474) 
          (Token id:Id.Lit_Chars val:'\t\t# in p4 repos in the wild.\n' span_id:475) (Token id:Id.Lit_Chars val:'\t\t#\n' span_id:476) 
          (Token
            id: Id.Lit_Chars
            val: '\t\t# The sed expression changes this:\n'
            span_id: 477
          ) (Token id:Id.Lit_Chars val:'\t\t#     @@\n' span_id:478) 
          (Token id:Id.Lit_Chars val:'\t\t#     text\n' span_id:479) (Token id:Id.Lit_Chars val:'\t\t#     @target1\n' span_id:480) 
          (Token id:Id.Lit_Chars val:'\t\t#     @\n' span_id:481) (Token id:Id.Lit_Chars val:'\t\t# to this:\n' span_id:482) 
          (Token id:Id.Lit_Chars val:'\t\t#     @@\n' span_id:483) (Token id:Id.Lit_Chars val:'\t\t#     text\n' span_id:484) 
          (Token id:Id.Lit_Chars val:'\t\t#     @@\n' span_id:485) (Token id:Id.Lit_Chars val:'\t\t#\n' span_id:486) 
          (Token id:Id.Lit_Chars val:'\t\tcd "$db/depot" &&\n' span_id:487) (Token id:Id.Lit_Chars val:'\t\tsed "/@target1/{; s/target1/@/; n; d; }" \\\n' span_id:488) 
          (Token
            id: Id.Lit_Chars
            val: '\t\t    empty-symlink,v >empty-symlink,v.tmp &&\n'
            span_id: 489
          ) (Token id:Id.Lit_Chars val:'\t\tmv empty-symlink,v.tmp empty-symlink,v\n' span_id:490) 
          (Token id:Id.Lit_Chars val:'\t) &&\n' span_id:491) (Token id:Id.Lit_Chars val:'\t(\n' span_id:492) 
          (Token
            id: Id.Lit_Chars
            val: '\t\t# Make sure symlink really is empty.  Asking\n'
            span_id: 493
          ) (Token id:Id.Lit_Chars val:'\t\t# p4 to sync here will make it generate errors.\n' span_id:494) 
          (Token id:Id.Lit_Chars val:'\t\tcd "$cli" &&\n' span_id:495) (Token id:Id.Lit_Chars val:'\t\tp4 print -q //depot/empty-symlink#2 >out &&\n' span_id:496) 
          (Token id:Id.Lit_Chars val:'\t\ttest ! -s out\n' span_id:497) (Token id:Id.Lit_Chars val:'\t) &&\n' span_id:498) 
          (Token id:Id.Lit_Chars val:'\ttest_when_finished cleanup_git &&\n' span_id:499) (Token id:Id.Lit_Chars val:'\n' span_id:500) 
          (Token
            id: Id.Lit_Chars
            val: '\t# make sure git p4 handles it without error\n'
            span_id: 501
          ) (Token id:Id.Lit_Chars val:'\tgit p4 clone --dest="$git" //depot@all &&\n' span_id:502) 
          (Token id:Id.Lit_Chars val:'\n' span_id:503) (Token id:Id.Lit_Chars val:'\t# fix the symlink, make it point to "target2"\n' span_id:504) 
          (Token id:Id.Lit_Chars val:'\t(\n' span_id:505) (Token id:Id.Lit_Chars val:'\t\tcd "$cli" &&\n' span_id:506) 
          (Token id:Id.Lit_Chars val:'\t\tp4 open empty-symlink &&\n' span_id:507) (Token id:Id.Lit_Chars val:'\t\trm empty-symlink &&\n' span_id:508) 
          (Token id:Id.Lit_Chars val:'\t\tln -s target2 empty-symlink &&\n' span_id:509) (Token id:Id.Lit_Chars val:'\t\tp4 submit -d "make empty-symlink point to target2"\n' span_id:510) 
          (Token id:Id.Lit_Chars val:'\t) &&\n' span_id:511) (Token id:Id.Lit_Chars val:'\tcleanup_git &&\n' span_id:512) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit p4 clone --dest="$git" //depot@all &&\n'
            span_id: 513
          ) (Token id:Id.Lit_Chars val:'\t(\n' span_id:514) 
          (Token id:Id.Lit_Chars val:'\t\tcd "$git" &&\n' span_id:515) (Token id:Id.Lit_Chars val:'\t\ttest $(readlink empty-symlink) = target2\n' span_id:516) 
          (Token id:Id.Lit_Chars val:'\t)\n' span_id:517)
        )
      }
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'kill p4d' span_id:524))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:528) 
          (Token id:Id.Lit_Chars val:'\tkill_p4d\n' span_id:529)
        )
      }
    )
    (C {(test_done)})
  ]
)