(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 rcs keywords' 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: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\tcat <<-\\EOF >filek &&\n' span_id:52) 
          (Token id:Id.Lit_Chars val:'\t\t$Id$\n' span_id:53) (Token id:Id.Lit_Chars val:'\t\t/* $Revision$ */\n' span_id:54) 
          (Token id:Id.Lit_Chars val:'\t\t# $Change$\n' span_id:55) (Token id:Id.Lit_Chars val:'\t\tline4\n' span_id:56) 
          (Token id:Id.Lit_Chars val:'\t\tline5\n' span_id:57) (Token id:Id.Lit_Chars val:'\t\tline6\n' span_id:58) 
          (Token id:Id.Lit_Chars val:'\t\tline7\n' span_id:59) (Token id:Id.Lit_Chars val:'\t\tline8\n' span_id:60) 
          (Token id:Id.Lit_Chars val:'\t\tEOF\n' span_id:61) 
          (Token
            id: Id.Lit_Chars
            val: '\t\tsed "s/Revision/Revision: do not scrub me/" <filek >fileko &&\n'
            span_id: 62
          ) (Token id:Id.Lit_Chars val:'\t\tsed "s/Id/Id: do not scrub me/" <fileko >file_text &&\n' span_id:63) 
          (Token id:Id.Lit_Chars val:'\t\tp4 add -t text+k filek &&\n' span_id:64) (Token id:Id.Lit_Chars val:'\t\tp4 submit -d "filek" &&\n' span_id:65) 
          (Token id:Id.Lit_Chars val:'\t\tp4 add -t text+ko fileko &&\n' span_id:66) (Token id:Id.Lit_Chars val:'\t\tp4 submit -d "fileko" &&\n' span_id:67) 
          (Token id:Id.Lit_Chars val:'\t\tp4 add -t text file_text &&\n' span_id:68) (Token id:Id.Lit_Chars val:'\t\tp4 submit -d "file_text"\n' span_id:69) 
          (Token id:Id.Lit_Chars val:'\t)\n' span_id:70)
        )
      }
    )
    (command.ShFunction
      name: write_scrub_scripts
      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:93)
                      fd: -1
                      arg_word: {(DQ ($ Id.VSub_DollarName '$TRASH_DIRECTORY') (/scrub_k.py))}
                    )
                    (redir.HereDoc
                      op: (Token id:Id.Redir_DLessDash val:'<<-' span_id:99)
                      fd: -1
                      here_begin: 
                        {
                          (word_part.EscapedLiteral
                            token: (Token id:Id.Lit_EscapedChar val:'\\E' span_id:100)
                          ) (OF)
                        }
                      here_end_span_id: 107
                      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:111)
                      fd: -1
                      arg_word: {(DQ ($ Id.VSub_DollarName '$TRASH_DIRECTORY') (/scrub_ko.py))}
                    )
                    (redir.HereDoc
                      op: (Token id:Id.Redir_DLessDash val:'<<-' span_id:117)
                      fd: -1
                      here_begin: 
                        {
                          (word_part.EscapedLiteral
                            token: (Token id:Id.Lit_EscapedChar val:'\\E' span_id:118)
                          ) (OF)
                        }
                      here_end_span_id: 123
                      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:'scrub scripts' span_id:130))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:134) 
          (Token id:Id.Lit_Chars val:'\twrite_scrub_scripts\n' span_id:135)
        )
      }
    )
    (command.ShFunction
      name: scrub_k_check
      body: 
        (command.BraceGroup
          children: [
            (command.AndOr
              ops: [Id.Op_DAmp Id.Op_DAmp Id.Op_DAmp Id.Op_DAmp Id.Op_DAmp]
              children: [
                (command.ShAssignment
                  pairs: [
                    (assign_pair
                      lhs: (sh_lhs_expr.Name name:file)
                      op: assign_op.Equal
                      rhs: {(DQ ($ Id.VSub_Number '$1'))}
                      spids: [159]
                    )
                  ]
                )
                (command.ShAssignment
                  pairs: [
                    (assign_pair
                      lhs: (sh_lhs_expr.Name name:scrub)
                      op: assign_op.Equal
                      rhs: 
                        {
                          (DQ ($ Id.VSub_DollarName '$TRASH_DIRECTORY') (/) 
                            ($ Id.VSub_DollarName '$file')
                          )
                        }
                      spids: [167]
                    )
                  ]
                )
                (command.Simple
                  words: [
                    {(DQ ($ Id.VSub_DollarName '$PYTHON_PATH'))}
                    {(DQ ($ Id.VSub_DollarName '$TRASH_DIRECTORY') (/scrub_k.py))}
                  ]
                  redirects: [
                    (redir.Redir
                      op: (Token id:Id.Redir_Less val:'<' span_id:186)
                      fd: -1
                      arg_word: {(DQ ($ Id.VSub_DollarName '$git') (/) ($ Id.VSub_DollarName '$file'))}
                    )
                    (redir.Redir
                      op: (Token id:Id.Redir_Great val:'>' span_id:193)
                      fd: -1
                      arg_word: {(DQ ($ Id.VSub_DollarName '$scrub'))}
                    )
                  ]
                )
                (command.Pipeline
                  children: [
                    (C {(test_cmp)} 
                      {(DQ ($ Id.VSub_DollarName '$cli') (/) ($ Id.VSub_DollarName '$file'))} {(DQ ($ Id.VSub_DollarName '$scrub'))}
                    )
                  ]
                  negated: T
                )
                (C {(test_cmp)} {(DQ ($ Id.VSub_DollarName '$git') (/) ($ Id.VSub_DollarName '$file'))} 
                  {(DQ ($ Id.VSub_DollarName '$scrub'))}
                )
                (C {(rm)} {(DQ ($ Id.VSub_DollarName '$scrub'))})
              ]
            )
          ]
        )
    )
    (command.ShFunction
      name: scrub_ko_check
      body: 
        (command.BraceGroup
          children: [
            (command.AndOr
              ops: [Id.Op_DAmp Id.Op_DAmp Id.Op_DAmp Id.Op_DAmp Id.Op_DAmp]
              children: [
                (command.ShAssignment
                  pairs: [
                    (assign_pair
                      lhs: (sh_lhs_expr.Name name:file)
                      op: assign_op.Equal
                      rhs: {(DQ ($ Id.VSub_Number '$1'))}
                      spids: [249]
                    )
                  ]
                )
                (command.ShAssignment
                  pairs: [
                    (assign_pair
                      lhs: (sh_lhs_expr.Name name:scrub)
                      op: assign_op.Equal
                      rhs: 
                        {
                          (DQ ($ Id.VSub_DollarName '$TRASH_DIRECTORY') (/) 
                            ($ Id.VSub_DollarName '$file')
                          )
                        }
                      spids: [257]
                    )
                  ]
                )
                (command.Simple
                  words: [
                    {(DQ ($ Id.VSub_DollarName '$PYTHON_PATH'))}
                    {(DQ ($ Id.VSub_DollarName '$TRASH_DIRECTORY') (/scrub_ko.py))}
                  ]
                  redirects: [
                    (redir.Redir
                      op: (Token id:Id.Redir_Less val:'<' span_id:276)
                      fd: -1
                      arg_word: {(DQ ($ Id.VSub_DollarName '$git') (/) ($ Id.VSub_DollarName '$file'))}
                    )
                    (redir.Redir
                      op: (Token id:Id.Redir_Great val:'>' span_id:283)
                      fd: -1
                      arg_word: {(DQ ($ Id.VSub_DollarName '$scrub'))}
                    )
                  ]
                )
                (command.Pipeline
                  children: [
                    (C {(test_cmp)} 
                      {(DQ ($ Id.VSub_DollarName '$cli') (/) ($ Id.VSub_DollarName '$file'))} {(DQ ($ Id.VSub_DollarName '$scrub'))}
                    )
                  ]
                  negated: T
                )
                (C {(test_cmp)} {(DQ ($ Id.VSub_DollarName '$git') (/) ($ Id.VSub_DollarName '$file'))} 
                  {(DQ ($ Id.VSub_DollarName '$scrub'))}
                )
                (C {(rm)} {(DQ ($ Id.VSub_DollarName '$scrub'))})
              ]
            )
          ]
        )
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'edit far away from RCS lines' span_id:347))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:351) 
          (Token id:Id.Lit_Chars val:'\ttest_when_finished cleanup_git &&\n' span_id:352) (Token id:Id.Lit_Chars val:'\tgit p4 clone --dest="$git" //depot &&\n' span_id:353) 
          (Token id:Id.Lit_Chars val:'\t(\n' span_id:354) (Token id:Id.Lit_Chars val:'\t\tcd "$git" &&\n' span_id:355) 
          (Token
            id: Id.Lit_Chars
            val: '\t\tgit config git-p4.skipSubmitEdit true &&\n'
            span_id: 356
          ) (Token id:Id.Lit_Chars val:'\t\tsed "s/^line7/line7 edit/" <filek >filek.tmp &&\n' span_id:357) 
          (Token id:Id.Lit_Chars val:'\t\tmv -f filek.tmp filek &&\n' span_id:358) (Token id:Id.Lit_Chars val:'\t\tgit commit -m "filek line7 edit" filek &&\n' span_id:359) 
          (Token id:Id.Lit_Chars val:'\t\tgit p4 submit &&\n' span_id:360) (Token id:Id.Lit_Chars val:'\t\tscrub_k_check filek\n' span_id:361) 
          (Token id:Id.Lit_Chars val:'\t)\n' span_id:362)
        )
      }
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'edit near RCS lines' span_id:378))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:382) 
          (Token id:Id.Lit_Chars val:'\ttest_when_finished cleanup_git &&\n' span_id:383) (Token id:Id.Lit_Chars val:'\tgit p4 clone --dest="$git" //depot &&\n' span_id:384) 
          (Token id:Id.Lit_Chars val:'\t(\n' span_id:385) (Token id:Id.Lit_Chars val:'\t\tcd "$git" &&\n' span_id:386) 
          (Token
            id: Id.Lit_Chars
            val: '\t\tgit config git-p4.skipSubmitEdit true &&\n'
            span_id: 387
          ) (Token id:Id.Lit_Chars val:'\t\tgit config git-p4.attemptRCSCleanup true &&\n' span_id:388) 
          (Token
            id: Id.Lit_Chars
            val: '\t\tsed "s/^line4/line4 edit/" <filek >filek.tmp &&\n'
            span_id: 389
          ) (Token id:Id.Lit_Chars val:'\t\tmv -f filek.tmp filek &&\n' span_id:390) 
          (Token
            id: Id.Lit_Chars
            val: '\t\tgit commit -m "filek line4 edit" filek &&\n'
            span_id: 391
          ) (Token id:Id.Lit_Chars val:'\t\tgit p4 submit &&\n' span_id:392) 
          (Token id:Id.Lit_Chars val:'\t\tscrub_k_check filek\n' span_id:393) (Token id:Id.Lit_Chars val:'\t)\n' span_id:394)
        )
      }
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'edit keyword lines' span_id:410))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:414) 
          (Token id:Id.Lit_Chars val:'\ttest_when_finished cleanup_git &&\n' span_id:415) (Token id:Id.Lit_Chars val:'\tgit p4 clone --dest="$git" //depot &&\n' span_id:416) 
          (Token id:Id.Lit_Chars val:'\t(\n' span_id:417) (Token id:Id.Lit_Chars val:'\t\tcd "$git" &&\n' span_id:418) 
          (Token
            id: Id.Lit_Chars
            val: '\t\tgit config git-p4.skipSubmitEdit true &&\n'
            span_id: 419
          ) (Token id:Id.Lit_Chars val:'\t\tgit config git-p4.attemptRCSCleanup true &&\n' span_id:420) 
          (Token
            id: Id.Lit_Chars
            val: '\t\tsed "/Revision/d" <filek >filek.tmp &&\n'
            span_id: 421
          ) (Token id:Id.Lit_Chars val:'\t\tmv -f filek.tmp filek &&\n' span_id:422) 
          (Token
            id: Id.Lit_Chars
            val: '\t\tgit commit -m "filek remove Revision line" filek &&\n'
            span_id: 423
          ) (Token id:Id.Lit_Chars val:'\t\tgit p4 submit &&\n' span_id:424) 
          (Token id:Id.Lit_Chars val:'\t\tscrub_k_check filek\n' span_id:425) (Token id:Id.Lit_Chars val:'\t)\n' span_id:426)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'scrub ko files differently' span_id:442))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:446) 
          (Token id:Id.Lit_Chars val:'\ttest_when_finished cleanup_git &&\n' span_id:447) (Token id:Id.Lit_Chars val:'\tgit p4 clone --dest="$git" //depot &&\n' span_id:448) 
          (Token id:Id.Lit_Chars val:'\t(\n' span_id:449) (Token id:Id.Lit_Chars val:'\t\tcd "$git" &&\n' span_id:450) 
          (Token
            id: Id.Lit_Chars
            val: '\t\tgit config git-p4.skipSubmitEdit true &&\n'
            span_id: 451
          ) (Token id:Id.Lit_Chars val:'\t\tgit config git-p4.attemptRCSCleanup true &&\n' span_id:452) 
          (Token
            id: Id.Lit_Chars
            val: '\t\tsed "s/^line4/line4 edit/" <fileko >fileko.tmp &&\n'
            span_id: 453
          ) (Token id:Id.Lit_Chars val:'\t\tmv -f fileko.tmp fileko &&\n' span_id:454) 
          (Token
            id: Id.Lit_Chars
            val: '\t\tgit commit -m "fileko line4 edit" fileko &&\n'
            span_id: 455
          ) (Token id:Id.Lit_Chars val:'\t\tgit p4 submit &&\n' span_id:456) 
          (Token id:Id.Lit_Chars val:'\t\tscrub_ko_check fileko &&\n' span_id:457) (Token id:Id.Lit_Chars val:'\t\t! scrub_k_check fileko\n' span_id:458) 
          (Token id:Id.Lit_Chars val:'\t)\n' span_id:459)
        )
      }
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'cleanup after failure' span_id:469))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:473) 
          (Token id:Id.Lit_Chars val:'\t(\n' span_id:474) (Token id:Id.Lit_Chars val:'\t\tcd "$cli" &&\n' span_id:475) 
          (Token id:Id.Lit_Chars val:'\t\tp4 revert ...\n' span_id:476) (Token id:Id.Lit_Chars val:'\t)\n' span_id:477)
        )
      }
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'ktext expansion should not expand multi-line $File::'
            span_id: 487
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:491) 
          (Token id:Id.Lit_Chars val:'\t(\n' span_id:492) (Token id:Id.Lit_Chars val:'\t\tcd "$cli" &&\n' span_id:493) 
          (Token id:Id.Lit_Chars val:'\t\tcat >lv.pm <<-\\EOF\n' span_id:494) (Token id:Id.Lit_Chars val:'\t\tmy $wanted = sub { my $f = $File::Find::name;\n' span_id:495) 
          (Token
            id: Id.Lit_Chars
            val: '\t\t\t\t    if ( -f && $f =~ /foo/ ) {\n'
            span_id: 496
          ) (Token id:Id.Lit_Chars val:'\t\tEOF\n' span_id:497) 
          (Token id:Id.Lit_Chars val:'\t\tp4 add -t ktext lv.pm &&\n' span_id:498) (Token id:Id.Lit_Chars val:'\t\tp4 submit -d "lv.pm"\n' span_id:499) 
          (Token id:Id.Lit_Chars val:'\t) &&\n' span_id:500) (Token id:Id.Lit_Chars val:'\ttest_when_finished cleanup_git &&\n' span_id:501) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit p4 clone --dest="$git" //depot &&\n'
            span_id: 502
          ) (Token id:Id.Lit_Chars val:'\t(\n' span_id:503) 
          (Token id:Id.Lit_Chars val:'\t\tcd "$git" &&\n' span_id:504) (Token id:Id.Lit_Chars val:'\t\ttest_cmp "$cli/lv.pm" lv.pm\n' span_id:505) 
          (Token id:Id.Lit_Chars val:'\t)\n' span_id:506)
        )
      }
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'do not scrub plain text' span_id:537))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:541) 
          (Token id:Id.Lit_Chars val:'\ttest_when_finished cleanup_git &&\n' span_id:542) (Token id:Id.Lit_Chars val:'\tgit p4 clone --dest="$git" //depot &&\n' span_id:543) 
          (Token id:Id.Lit_Chars val:'\t(\n' span_id:544) (Token id:Id.Lit_Chars val:'\t\tcd "$git" &&\n' span_id:545) 
          (Token
            id: Id.Lit_Chars
            val: '\t\tgit config git-p4.skipSubmitEdit true &&\n'
            span_id: 546
          ) (Token id:Id.Lit_Chars val:'\t\tgit config git-p4.attemptRCSCleanup true &&\n' span_id:547) 
          (Token
            id: Id.Lit_Chars
            val: '\t\tsed "s/^line4/line4 edit/" <file_text >file_text.tmp &&\n'
            span_id: 548
          ) (Token id:Id.Lit_Chars val:'\t\tmv -f file_text.tmp file_text &&\n' span_id:549) 
          (Token
            id: Id.Lit_Chars
            val: '\t\tgit commit -m "file_text line4 edit" file_text &&\n'
            span_id: 550
          ) (Token id:Id.Lit_Chars val:'\t\t(\n' span_id:551) 
          (Token id:Id.Lit_Chars val:'\t\t\tcd "$cli" &&\n' span_id:552) (Token id:Id.Lit_Chars val:'\t\t\tp4 open file_text &&\n' span_id:553) 
          (Token
            id: Id.Lit_Chars
            val: '\t\t\tsed "s/^line5/line5 p4 edit/" <file_text >file_text.tmp &&\n'
            span_id: 554
          ) (Token id:Id.Lit_Chars val:'\t\t\tmv -f file_text.tmp file_text &&\n' span_id:555) 
          (Token id:Id.Lit_Chars val:'\t\t\tp4 submit -d "file5 p4 edit"\n' span_id:556) (Token id:Id.Lit_Chars val:'\t\t) &&\n' span_id:557) 
          (Token
            id: Id.Lit_Chars
            val: '\t\techo s | test_expect_code 1 git p4 submit &&\n'
            span_id: 558
          ) (Token id:Id.Lit_Chars val:'\t\t(\n' span_id:559) 
          (Token
            id: Id.Lit_Chars
            val: '\t\t\t# make sure the file is not left open\n'
            span_id: 560
          ) (Token id:Id.Lit_Chars val:'\t\t\tcd "$cli" &&\n' span_id:561) 
          (Token id:Id.Lit_Chars val:'\t\t\t! p4 fstat -T action file_text\n' span_id:562) (Token id:Id.Lit_Chars val:'\t\t)\n' span_id:563) (Token id:Id.Lit_Chars val:'\t)\n' span_id:564)
        )
      }
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'cleanup after failure 2' span_id:574))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:578) 
          (Token id:Id.Lit_Chars val:'\t(\n' span_id:579) (Token id:Id.Lit_Chars val:'\t\tcd "$cli" &&\n' span_id:580) 
          (Token id:Id.Lit_Chars val:'\t\tp4 revert ...\n' span_id:581) (Token id:Id.Lit_Chars val:'\t)\n' span_id:582)
        )
      }
    )
    (command.ShFunction
      name: create_kw_file
      body: 
        (command.BraceGroup
          children: [
            (command.Simple
              words: [{(cat)}]
              redirects: [
                (redir.HereDoc
                  op: (Token id:Id.Redir_DLess val:'<<' span_id:596)
                  fd: -1
                  here_begin: 
                    {
                      (word_part.EscapedLiteral
                        token: (Token id:Id.Lit_EscapedChar val:'\\E' span_id:597)
                      ) (OF)
                    }
                  here_end_span_id: 613
                  stdin_parts: [
                    ('/* A file\n')
                    ('\tId: $Id$\n')
                    ('\tRevision: $Revision$\n')
                    ('\tFile: $File$\n')
                    (' */\n')
                    ('int main(int argc, const char **argv) {\n')
                    ('\treturn 0;\n')
                    ('}\n')
                  ]
                )
                (redir.Redir
                  op: (Token id:Id.Redir_Great val:'>' span_id:600)
                  fd: -1
                  arg_word: {(DQ ($ Id.VSub_Number '$1'))}
                )
              ]
            )
          ]
        )
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'add kwfile' span_id:620))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:624) 
          (Token id:Id.Lit_Chars val:'\t(\n' span_id:625) (Token id:Id.Lit_Chars val:'\t\tcd "$cli" &&\n' span_id:626) 
          (Token id:Id.Lit_Chars val:'\t\techo file1 >file1 &&\n' span_id:627) (Token id:Id.Lit_Chars val:'\t\tp4 add file1 &&\n' span_id:628) 
          (Token id:Id.Lit_Chars val:'\t\tp4 submit -d "file 1" &&\n' span_id:629) (Token id:Id.Lit_Chars val:'\t\tcreate_kw_file kwfile1.c &&\n' span_id:630) 
          (Token id:Id.Lit_Chars val:'\t\tp4 add kwfile1.c &&\n' span_id:631) (Token id:Id.Lit_Chars val:'\t\tp4 submit -d "Add rcw kw file" kwfile1.c\n' span_id:632) 
          (Token id:Id.Lit_Chars val:'\t)\n' span_id:633)
        )
      }
    )
    (command.ShFunction
      name: p4_append_to_file
      body: 
        (command.BraceGroup
          children: [
            (command.AndOr
              ops: [Id.Op_DAmp Id.Op_DAmp Id.Op_DAmp]
              children: [
                (command.ShAssignment
                  pairs: [
                    (assign_pair
                      lhs: (sh_lhs_expr.Name name:f)
                      op: assign_op.Equal
                      rhs: {(DQ ($ Id.VSub_Number '$1'))}
                      spids: [645]
                    )
                  ]
                )
                (C {(p4)} {(edit)} {(-t)} {(ktext)} {(DQ ($ Id.VSub_DollarName '$f'))})
                (command.Simple
                  words: [
                    {(echo)}
                    {
                      (DQ ('/* ') 
                        (command_sub
                          left_token: (Token id:Id.Left_DollarParen val:'$(' span_id:672)
                          command_list: (command.CommandList children:[(C {(date)})])
                        ) (' */')
                      )
                    }
                  ]
                  redirects: [
                    (redir.Redir
                      op: (Token id:Id.Redir_DGreat val:'>>' span_id:678)
                      fd: -1
                      arg_word: {(DQ ($ Id.VSub_DollarName '$f'))}
                    )
                  ]
                )
                (C {(p4)} {(submit)} {(-d)} {(DQ ('appending a line in p4'))})
              ]
            )
          ]
        )
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'cope with rcs keyword expansion damage' span_id:714))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:718) 
          (Token id:Id.Lit_Chars val:'\ttest_when_finished cleanup_git &&\n' span_id:719) (Token id:Id.Lit_Chars val:'\tgit p4 clone --dest="$git" //depot &&\n' span_id:720) 
          (Token id:Id.Lit_Chars val:'\t(\n' span_id:721) (Token id:Id.Lit_Chars val:'\t\tcd "$git" &&\n' span_id:722) 
          (Token
            id: Id.Lit_Chars
            val: '\t\tgit config git-p4.skipSubmitEdit true &&\n'
            span_id: 723
          ) (Token id:Id.Lit_Chars val:'\t\tgit config git-p4.attemptRCSCleanup true &&\n' span_id:724) 
          (Token
            id: Id.Lit_Chars
            val: '\t\t(cd "$cli" && p4_append_to_file kwfile1.c) &&\n'
            span_id: 725
          ) (Token id:Id.Lit_Chars val:'\t\told_lines=$(wc -l <kwfile1.c) &&\n' span_id:726) 
          (Token
            id: Id.Lit_Chars
            val: '\t\tperl -n -i -e "print unless m/Revision:/" kwfile1.c &&\n'
            span_id: 727
          ) (Token id:Id.Lit_Chars val:'\t\tnew_lines=$(wc -l <kwfile1.c) &&\n' span_id:728) 
          (Token
            id: Id.Lit_Chars
            val: '\t\ttest $new_lines = $(($old_lines - 1)) &&\n'
            span_id: 729
          ) (Token id:Id.Lit_Chars val:'\n' span_id:730) 
          (Token id:Id.Lit_Chars val:'\t\tgit add kwfile1.c &&\n' span_id:731) (Token id:Id.Lit_Chars val:'\t\tgit commit -m "Zap an RCS kw line" &&\n' span_id:732) 
          (Token id:Id.Lit_Chars val:'\t\tgit p4 submit &&\n' span_id:733) (Token id:Id.Lit_Chars val:'\t\tgit p4 rebase &&\n' span_id:734) 
          (Token id:Id.Lit_Chars val:'\t\tgit diff p4/master &&\n' span_id:735) (Token id:Id.Lit_Chars val:'\t\tgit p4 commit &&\n' span_id:736) 
          (Token id:Id.Lit_Chars val:'\t\techo "try modifying in both" &&\n' span_id:737) (Token id:Id.Lit_Chars val:'\t\tcd "$cli" &&\n' span_id:738) 
          (Token id:Id.Lit_Chars val:'\t\tp4 edit kwfile1.c &&\n' span_id:739) (Token id:Id.Lit_Chars val:'\t\techo "line from p4" >>kwfile1.c &&\n' span_id:740) 
          (Token
            id: Id.Lit_Chars
            val: '\t\tp4 submit -d "add a line in p4" kwfile1.c &&\n'
            span_id: 741
          ) (Token id:Id.Lit_Chars val:'\t\tcd "$git" &&\n' span_id:742) 
          (Token
            id: Id.Lit_Chars
            val: '\t\techo "line from git at the top" | cat - kwfile1.c >kwfile1.c.new &&\n'
            span_id: 743
          ) (Token id:Id.Lit_Chars val:'\t\tmv kwfile1.c.new kwfile1.c &&\n' span_id:744) 
          (Token
            id: Id.Lit_Chars
            val: '\t\tgit commit -m "Add line in git at the top" kwfile1.c &&\n'
            span_id: 745
          ) (Token id:Id.Lit_Chars val:'\t\tgit p4 rebase &&\n' span_id:746) 
          (Token id:Id.Lit_Chars val:'\t\tgit p4 submit\n' span_id:747) (Token id:Id.Lit_Chars val:'\t)\n' span_id:748)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'cope with rcs keyword file deletion' span_id:755))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:759) 
          (Token id:Id.Lit_Chars val:'\ttest_when_finished cleanup_git &&\n' span_id:760) (Token id:Id.Lit_Chars val:'\t(\n' span_id:761) 
          (Token id:Id.Lit_Chars val:'\t\tcd "$cli" &&\n' span_id:762) (Token id:Id.Lit_Chars val:'\t\techo "\\$Revision\\$" >kwdelfile.c &&\n' span_id:763) 
          (Token id:Id.Lit_Chars val:'\t\tp4 add -t ktext kwdelfile.c &&\n' span_id:764) (Token id:Id.Lit_Chars val:'\t\tp4 submit -d "Add file to be deleted" &&\n' span_id:765) 
          (Token id:Id.Lit_Chars val:'\t\tcat kwdelfile.c &&\n' span_id:766) (Token id:Id.Lit_Chars val:'\t\tgrep 1 kwdelfile.c\n' span_id:767) 
          (Token id:Id.Lit_Chars val:'\t) &&\n' span_id:768) (Token id:Id.Lit_Chars val:'\tgit p4 clone --dest="$git" //depot &&\n' span_id:769) 
          (Token id:Id.Lit_Chars val:'\t(\n' span_id:770) (Token id:Id.Lit_Chars val:'\t\tcd "$git" &&\n' span_id:771) 
          (Token id:Id.Lit_Chars val:'\t\tgrep Revision kwdelfile.c &&\n' span_id:772) (Token id:Id.Lit_Chars val:'\t\tgit rm -f kwdelfile.c &&\n' span_id:773) 
          (Token
            id: Id.Lit_Chars
            val: '\t\tgit commit -m "Delete a file containing RCS keywords" &&\n'
            span_id: 774
          ) (Token id:Id.Lit_Chars val:'\t\tgit config git-p4.skipSubmitEdit true &&\n' span_id:775) 
          (Token
            id: Id.Lit_Chars
            val: '\t\tgit config git-p4.attemptRCSCleanup true &&\n'
            span_id: 776
          ) (Token id:Id.Lit_Chars val:'\t\tgit p4 submit\n' span_id:777) 
          (Token id:Id.Lit_Chars val:'\t) &&\n' span_id:778) (Token id:Id.Lit_Chars val:'\t(\n' span_id:779) 
          (Token id:Id.Lit_Chars val:'\t\tcd "$cli" &&\n' span_id:780) (Token id:Id.Lit_Chars val:'\t\tp4 sync &&\n' span_id:781) 
          (Token id:Id.Lit_Chars val:'\t\t! test -f kwdelfile.c\n' span_id:782) (Token id:Id.Lit_Chars val:'\t)\n' span_id:783)
        )
      }
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'Add keywords in git which match the default p4 values'
            span_id: 796
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:800) 
          (Token id:Id.Lit_Chars val:'\ttest_when_finished cleanup_git &&\n' span_id:801) (Token id:Id.Lit_Chars val:'\tgit p4 clone --dest="$git" //depot &&\n' span_id:802) 
          (Token id:Id.Lit_Chars val:'\t(\n' span_id:803) (Token id:Id.Lit_Chars val:'\t\tcd "$git" &&\n' span_id:804) 
          (Token
            id: Id.Lit_Chars
            val: '\t\techo "NewKW: \\$Revision\\$" >>kwfile1.c &&\n'
            span_id: 805
          ) (Token id:Id.Lit_Chars val:'\t\tgit add kwfile1.c &&\n' span_id:806) 
          (Token
            id: Id.Lit_Chars
            val: '\t\tgit commit -m "Adding RCS keywords in git" &&\n'
            span_id: 807
          ) (Token id:Id.Lit_Chars val:'\t\tgit config git-p4.skipSubmitEdit true &&\n' span_id:808) 
          (Token
            id: Id.Lit_Chars
            val: '\t\tgit config git-p4.attemptRCSCleanup true &&\n'
            span_id: 809
          ) (Token id:Id.Lit_Chars val:'\t\tgit p4 submit\n' span_id:810) 
          (Token id:Id.Lit_Chars val:'\t) &&\n' span_id:811) (Token id:Id.Lit_Chars val:'\t(\n' span_id:812) 
          (Token id:Id.Lit_Chars val:'\t\tcd "$cli" &&\n' span_id:813) (Token id:Id.Lit_Chars val:'\t\tp4 sync &&\n' span_id:814) 
          (Token id:Id.Lit_Chars val:'\t\ttest -f kwfile1.c &&\n' span_id:815) (Token id:Id.Lit_Chars val:'\t\tgrep "NewKW.*Revision.*[0-9]" kwfile1.c\n' span_id:816) 
          (Token id:Id.Lit_Chars val:'\n' span_id:817) (Token id:Id.Lit_Chars val:'\t)\n' span_id:818)
        )
      }
    )
    (C {(test_expect_failure)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'Add keywords in git which do not match the default p4 values'
            span_id: 834
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:838) 
          (Token id:Id.Lit_Chars val:'\ttest_when_finished cleanup_git &&\n' span_id:839) (Token id:Id.Lit_Chars val:'\tgit p4 clone --dest="$git" //depot &&\n' span_id:840) 
          (Token id:Id.Lit_Chars val:'\t(\n' span_id:841) (Token id:Id.Lit_Chars val:'\t\tcd "$git" &&\n' span_id:842) 
          (Token
            id: Id.Lit_Chars
            val: '\t\techo "NewKW2: \\$Revision:1\\$" >>kwfile1.c &&\n'
            span_id: 843
          ) (Token id:Id.Lit_Chars val:'\t\tgit add kwfile1.c &&\n' span_id:844) 
          (Token
            id: Id.Lit_Chars
            val: '\t\tgit commit -m "Adding RCS keywords in git" &&\n'
            span_id: 845
          ) (Token id:Id.Lit_Chars val:'\t\tgit config git-p4.skipSubmitEdit true &&\n' span_id:846) 
          (Token
            id: Id.Lit_Chars
            val: '\t\tgit config git-p4.attemptRCSCleanup true &&\n'
            span_id: 847
          ) (Token id:Id.Lit_Chars val:'\t\tgit p4 submit\n' span_id:848) 
          (Token id:Id.Lit_Chars val:'\t) &&\n' span_id:849) (Token id:Id.Lit_Chars val:'\t(\n' span_id:850) 
          (Token id:Id.Lit_Chars val:'\t\tcd "$cli" &&\n' span_id:851) (Token id:Id.Lit_Chars val:'\t\tp4 sync &&\n' span_id:852) 
          (Token
            id: Id.Lit_Chars
            val: '\t\tgrep "NewKW2.*Revision.*[0-9]" kwfile1.c\n'
            span_id: 853
          ) (Token id:Id.Lit_Chars val:'\n' span_id:854) (Token id:Id.Lit_Chars val:'\t)\n' span_id:855)
        )
      }
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'kill p4d' span_id:862))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:866) 
          (Token id:Id.Lit_Chars val:'\tkill_p4d\n' span_id:867)
        )
      }
    )
    (C {(test_done)})
  ]
)