(command.CommandList
  children: [
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:test_description)
          op: assign_op.Equal
          rhs: 
            {
              (SQ <'git-cvsserver and git refspecs\n'> <'\n'> 
                <'tests ability for git-cvsserver to switch between and compare\n'> <'tags, branches and other git refspecs'>
              )
            }
          spids: [4]
        )
      ]
    )
    (C {<.>} {<'./test-lib.sh'>})
    (command.ShFunction
      name: check_start_tree
      body: 
        (BraceGroup
          children: [
            (C {<rm>} {<-f>} {(DQ ($ Id.VSub_DollarName '$WORKDIR') <'/list.expected'>)})
            (command.Simple
              words: [{<echo>} {(DQ <'start '> ($ Id.VSub_Number '$1'))}]
              redirects: [
                (redir
                  op: <Id.Redir_DGreat '>>'>
                  loc: (redir_loc.Fd fd:1)
                  arg: {(DQ (${ Id.VSub_Name WORKDIR) <'/check.log'>)}
                )
              ]
              do_fork: T
            )
          ]
        )
    )
    (command.ShFunction
      name: check_file
      body: 
        (BraceGroup
          children: [
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:sandbox)
                  op: assign_op.Equal
                  rhs: {(DQ ($ Id.VSub_Number '$1'))}
                  spids: [64]
                )
              ]
            )
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:file)
                  op: assign_op.Equal
                  rhs: {(DQ ($ Id.VSub_Number '$2'))}
                  spids: [70]
                )
              ]
            )
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:ver)
                  op: assign_op.Equal
                  rhs: {(DQ ($ Id.VSub_Number '$3'))}
                  spids: [76]
                )
              ]
            )
            (command.Simple
              words: [{<git>} {<show>} {(DQ (${ Id.VSub_Name ver) <':'> (${ Id.VSub_Name file))}]
              redirects: [
                (redir
                  op: <Id.Redir_Great '>'>
                  loc: (redir_loc.Fd fd:1)
                  arg: {(DQ ($ Id.VSub_DollarName '$WORKDIR') <'/check.got'>)}
                )
                (redir
                  op: <Id.Redir_Great '2>'>
                  loc: (redir_loc.Fd fd:2)
                  arg: {(DQ ($ Id.VSub_DollarName '$WORKDIR') <'/check.stderr'>)}
                )
              ]
              more_env: [(env_pair name:GIT_DIR val:{($ Id.VSub_DollarName '$SERVERDIR')} spids:[82])]
              do_fork: T
            )
            (C {<test_cmp>} {(DQ ($ Id.VSub_DollarName '$WORKDIR') <'/check.got'>)} 
              {(DQ ($ Id.VSub_DollarName '$sandbox') <'/'> ($ Id.VSub_DollarName '$file'))}
            )
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:stat)
                  op: assign_op.Equal
                  rhs: {($ Id.VSub_QMark '$?')}
                  spids: [128]
                )
              ]
            )
            (command.Simple
              words: [
                {<echo>}
                {
                  (DQ <'check_file '> ($ Id.VSub_DollarName '$sandbox') <' '> 
                    ($ Id.VSub_DollarName '$file') <' '> ($ Id.VSub_DollarName '$ver') <' : '> ($ Id.VSub_DollarName '$stat')
                  )
                }
              ]
              redirects: [
                (redir
                  op: <Id.Redir_DGreat '>>'>
                  loc: (redir_loc.Fd fd:1)
                  arg: {(DQ ($ Id.VSub_DollarName '$WORKDIR') <'/check.log'>)}
                )
              ]
              do_fork: T
            )
            (command.Simple
              words: [{<echo>} {(DQ ($ Id.VSub_DollarName '$file'))}]
              redirects: [
                (redir
                  op: <Id.Redir_DGreat '>>'>
                  loc: (redir_loc.Fd fd:1)
                  arg: {(DQ ($ Id.VSub_DollarName '$WORKDIR') <'/list.expected'>)}
                )
              ]
              do_fork: T
            )
            (command.ControlFlow
              token: <Id.ControlFlow_Return return>
              arg_word: {($ Id.VSub_DollarName '$stat')}
            )
          ]
        )
    )
    (command.ShFunction
      name: check_end_tree
      body: 
        (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:sandbox)
                      op: assign_op.Equal
                      rhs: {(DQ ($ Id.VSub_Number '$1'))}
                      spids: [179]
                    )
                  ]
                )
                (command.Simple
                  words: [
                    {<find>}
                    {(DQ ($ Id.VSub_DollarName '$sandbox'))}
                    {<-name>}
                    {<CVS>}
                    {<-prune>}
                    {<-o>}
                    {<-type>}
                    {<f>}
                    {<-print>}
                  ]
                  redirects: [
                    (redir
                      op: <Id.Redir_Great '>'>
                      loc: (redir_loc.Fd fd:1)
                      arg: {(DQ ($ Id.VSub_DollarName '$WORKDIR') <'/list.actual'>)}
                    )
                  ]
                  do_fork: T
                )
                (command.Simple
                  words: [{<sort>}]
                  redirects: [
                    (redir
                      op: <Id.Redir_Less '<'>
                      loc: (redir_loc.Fd fd:0)
                      arg: {(DQ ($ Id.VSub_DollarName '$WORKDIR') <'/list.expected'>)}
                    )
                    (redir
                      op: <Id.Redir_Great '>'>
                      loc: (redir_loc.Fd fd:1)
                      arg: {<expected>}
                    )
                  ]
                  do_fork: T
                )
                (command.Pipeline
                  children: [
                    (command.Simple
                      words: [{<sort>}]
                      redirects: [
                        (redir
                          op: <Id.Redir_Less '<'>
                          loc: (redir_loc.Fd fd:0)
                          arg: {(DQ ($ Id.VSub_DollarName '$WORKDIR') <'/list.actual'>)}
                        )
                      ]
                      do_fork: T
                    )
                    (command.Simple
                      words: [{<sed>} {<-e>} {(DQ <'s%cvswork/%%'>)}]
                      redirects: [
                        (redir
                          op: <Id.Redir_Great '>'>
                          loc: (redir_loc.Fd fd:1)
                          arg: {<actual>}
                        )
                      ]
                      do_fork: T
                    )
                  ]
                  negated: F
                )
                (C {<test_cmp>} {<expected>} {<actual>})
                (C {<rm>} {<expected>} {<actual>})
              ]
            )
          ]
        )
    )
    (command.ShFunction
      name: check_end_full_tree
      body: 
        (BraceGroup
          children: [
            (command.AndOr
              ops: [Id.Op_DAmp 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:sandbox)
                      op: assign_op.Equal
                      rhs: {(DQ ($ Id.VSub_Number '$1'))}
                      spids: [279]
                    )
                  ]
                )
                (command.Simple
                  words: [{<sort>}]
                  redirects: [
                    (redir
                      op: <Id.Redir_Less '<'>
                      loc: (redir_loc.Fd fd:0)
                      arg: {(DQ ($ Id.VSub_DollarName '$WORKDIR') <'/list.expected'>)}
                    )
                    (redir
                      op: <Id.Redir_Great '>'>
                      loc: (redir_loc.Fd fd:1)
                      arg: {<expected>}
                    )
                  ]
                  do_fork: T
                )
                (command.Pipeline
                  children: [
                    (C {<find>} {(DQ ($ Id.VSub_DollarName '$sandbox'))} {<-name>} {<CVS>} {<-prune>} 
                      {<-o>} {<-type>} {<f>} {<-print>}
                    )
                    (C {<sed>} {<-e>} {(DQ <'s%'> ($ Id.VSub_DollarName '$sandbox') <'/%%'>)})
                    (command.Simple
                      words: [{<sort>}]
                      redirects: [(redir op:<Id.Redir_Great '>'> loc:(redir_loc.Fd fd:1) arg:{<act1>})]
                      do_fork: T
                    )
                  ]
                  negated: F
                )
                (C {<test_cmp>} {<expected>} {<act1>})
                (command.Pipeline
                  children: [
                    (C {<git>} {<ls-tree>} {<--name-only>} {<-r>} {(DQ ($ Id.VSub_Number '$2'))})
                    (command.Simple
                      words: [{<sort>}]
                      redirects: [(redir op:<Id.Redir_Great '>'> loc:(redir_loc.Fd fd:1) arg:{<act2>})]
                      do_fork: T
                    )
                  ]
                  negated: F
                )
                (C {<test_cmp>} {<expected>} {<act2>})
                (C {<rm>} {<expected>} {<act1>} {<act2>})
              ]
            )
          ]
        )
    )
    (command.ShFunction
      name: check_diff
      body: 
        (BraceGroup
          children: [
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:diffFile)
                  op: assign_op.Equal
                  rhs: {(DQ ($ Id.VSub_Number '$1'))}
                  spids: [406]
                )
              ]
            )
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:vOld)
                  op: assign_op.Equal
                  rhs: {(DQ ($ Id.VSub_Number '$2'))}
                  spids: [412]
                )
              ]
            )
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:vNew)
                  op: assign_op.Equal
                  rhs: {(DQ ($ Id.VSub_Number '$3'))}
                  spids: [418]
                )
              ]
            )
            (C {<rm>} {<-rf>} {<diffSandbox>})
            (command.AndOr
              ops: [Id.Op_DAmp]
              children: [
                (C {<git>} {<clone>} {<-q>} {<-n>} {<.>} {<diffSandbox>})
                (command.Subshell
                  child: 
                    (command.AndOr
                      ops: [Id.Op_DAmp Id.Op_DAmp Id.Op_DAmp]
                      children: [
                        (C {<cd>} {<diffSandbox>})
                        (C {<git>} {<checkout>} {(DQ ($ Id.VSub_DollarName '$vOld'))})
                        (command.Simple
                          words: [{<git>} {<apply>} {<-p0>} {<--index>}]
                          redirects: [
                            (redir
                              op: <Id.Redir_Less '<'>
                              loc: (redir_loc.Fd fd:0)
                              arg: {(DQ <'../'> ($ Id.VSub_DollarName '$diffFile'))}
                            )
                          ]
                          do_fork: T
                        )
                        (C {<git>} {<diff>} {<--exit-code>} {(DQ ($ Id.VSub_DollarName '$vNew'))})
                      ]
                    )
                  redirects: [
                    (redir
                      op: <Id.Redir_Great '>'>
                      loc: (redir_loc.Fd fd:1)
                      arg: {<check_diff_apply.out>}
                    )
                    (redir
                      op: <Id.Redir_GreatAnd '2>&'>
                      loc: (redir_loc.Fd fd:2)
                      arg: {<1>}
                    )
                  ]
                )
              ]
            )
          ]
        )
    )
    (command.Simple
      words: [{<cvs>}]
      redirects: [
        (redir op:<Id.Redir_Great '>'> loc:(redir_loc.Fd fd:1) arg:{<'/dev/null'>})
        (redir op:<Id.Redir_GreatAnd '2>&'> loc:(redir_loc.Fd fd:2) arg:{<1>})
      ]
      do_fork: T
    )
    (command.If
      arms: [
        (if_arm
          cond: (condition.Shell commands:[(C {<test>} {($ Id.VSub_QMark '$?')} {<-ne>} {<1>})])
          action: [
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:skip_all)
                  op: assign_op.Equal
                  rhs: {(SQ <'skipping git-cvsserver tests, cvs not found'>)}
                  spids: [531]
                )
              ]
            )
            (C {<test_done>})
          ]
          spids: [518 528]
        )
      ]
    )
    (command.If
      arms: [
        (if_arm
          cond: 
            (condition.Shell
              commands: [(command.Pipeline children:[(C {<test_have_prereq>} {<PERL>})] negated:T)]
            )
          action: [
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:skip_all)
                  op: assign_op.Equal
                  rhs: {(SQ <'skipping git-cvsserver tests, perl not available'>)}
                  spids: [552]
                )
              ]
            )
            (C {<test_done>})
          ]
          spids: [541 549]
        )
      ]
    )
    (command.AndOr
      ops: [Id.Op_DPipe]
      children: [
        (command.Simple
          words: [{<perl>} {<-e>} {(SQ <'use DBI; use DBD::SQLite'>)}]
          redirects: [
            (redir op:<Id.Redir_Great '>'> loc:(redir_loc.Fd fd:1) arg:{<'/dev/null'>})
            (redir op:<Id.Redir_GreatAnd '2>&'> loc:(redir_loc.Fd fd:2) arg:{<1>})
          ]
          do_fork: T
        )
        (BraceGroup
          children: [
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:skip_all)
                  op: assign_op.Equal
                  rhs: {(SQ <'skipping git-cvsserver tests, Perl SQLite interface unavailable'>)}
                  spids: [581]
                )
              ]
            )
            (C {<test_done>})
          ]
        )
      ]
    )
    (C {<unset>} {<GIT_DIR>} {<GIT_CONFIG>})
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:WORKDIR)
          op: assign_op.Equal
          rhs: {($ Id.VSub_DollarName '$PWD')}
          spids: [598]
        )
      ]
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:SERVERDIR)
          op: assign_op.Equal
          rhs: {($ Id.VSub_DollarName '$PWD') <'/gitcvs.git'>}
          spids: [601]
        )
      ]
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:git_config)
          op: assign_op.Equal
          rhs: {(DQ ($ Id.VSub_DollarName '$SERVERDIR') <'/config'>)}
          spids: [605]
        )
      ]
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:CVSROOT)
          op: assign_op.Equal
          rhs: {(DQ <':fork:'> ($ Id.VSub_DollarName '$SERVERDIR'))}
          spids: [611]
        )
      ]
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:CVSWORK)
          op: assign_op.Equal
          rhs: {(DQ ($ Id.VSub_DollarName '$PWD') <'/cvswork'>)}
          spids: [617]
        )
      ]
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:CVS_SERVER)
          op: assign_op.Equal
          rhs: {<git-cvsserver>}
          spids: [623]
        )
      ]
    )
    (C {<export>} {<CVSROOT>} {<CVS_SERVER>})
    (C {<rm>} {<-rf>} {(DQ ($ Id.VSub_DollarName '$CVSWORK'))} {(DQ ($ Id.VSub_DollarName '$SERVERDIR'))})
    (C {<test_expect_success>} {(SQ <'setup v1, b1'>)} 
      {
        (SQ <'\n'> <'\techo "Simple text file" >textfile.c &&\n'> <'\techo "t2" >t2 &&\n'> 
          <'\tmkdir adir &&\n'> <'\techo "adir/afile line1" >adir/afile &&\n'> <'\techo "adir/afile line2" >>adir/afile &&\n'> 
          <'\techo "adir/afile line3" >>adir/afile &&\n'> <'\techo "adir/afile line4" >>adir/afile &&\n'> <'\techo "adir/a2file" >>adir/a2file &&\n'> 
          <'\tmkdir adir/bdir &&\n'> <'\techo "adir/bdir/bfile line 1" >adir/bdir/bfile &&\n'> 
          <'\techo "adir/bdir/bfile line 2" >>adir/bdir/bfile &&\n'> <'\techo "adir/bdir/b2file" >adir/bdir/b2file &&\n'> <'\tgit add textfile.c t2 adir &&\n'> 
          <'\tgit commit -q -m "First Commit (v1)" &&\n'> <'\tgit tag v1 &&\n'> <'\tgit branch b1 &&\n'> 
          <'\tgit clone -q --bare "$WORKDIR/.git" "$SERVERDIR" >/dev/null 2>&1 &&\n'> <'\tGIT_DIR="$SERVERDIR" git config --bool gitcvs.enabled true &&\n'> 
          <'\tGIT_DIR="$SERVERDIR" git config gitcvs.logfile "$SERVERDIR/gitcvs.log"\n'>
        )
      }
    )
    (C {<rm>} {<-rf>} {<cvswork>})
    (C {<test_expect_success>} {(SQ <'cvs co v1'>)} 
      {
        (SQ <'\n'> <'\tcvs -f -Q co -r v1 -d cvswork master >cvs.log 2>&1 &&\n'> 
          <'\tcheck_start_tree cvswork &&\n'> <'\tcheck_file cvswork textfile.c v1 &&\n'> <'\tcheck_file cvswork t2 v1 &&\n'> 
          <'\tcheck_file cvswork adir/afile v1 &&\n'> <'\tcheck_file cvswork adir/a2file v1 &&\n'> <'\tcheck_file cvswork adir/bdir/bfile v1 &&\n'> 
          <'\tcheck_file cvswork adir/bdir/b2file v1 &&\n'> <'\tcheck_end_tree cvswork\n'>
        )
      }
    )
    (C {<rm>} {<-rf>} {<cvswork>})
    (C {<test_expect_success>} {(SQ <'cvs co b1'>)} 
      {
        (SQ <'\n'> <'\tcvs -f co -r b1 -d cvswork master >cvs.log 2>&1 &&\n'> 
          <'\tcheck_start_tree cvswork &&\n'> <'\tcheck_file cvswork textfile.c v1 &&\n'> <'\tcheck_file cvswork t2 v1 &&\n'> 
          <'\tcheck_file cvswork adir/afile v1 &&\n'> <'\tcheck_file cvswork adir/a2file v1 &&\n'> <'\tcheck_file cvswork adir/bdir/bfile v1 &&\n'> 
          <'\tcheck_file cvswork adir/bdir/b2file v1 &&\n'> <'\tcheck_end_tree cvswork\n'>
        )
      }
    )
    (C {<test_expect_success>} {(SQ <'cvs co b1 [cvswork3]'>)} 
      {
        (SQ <'\n'> <'\tcvs -f co -r b1 -d cvswork3 master >cvs.log 2>&1 &&\n'> 
          <'\tcheck_start_tree cvswork3 &&\n'> <'\tcheck_file cvswork3 textfile.c v1 &&\n'> <'\tcheck_file cvswork3 t2 v1 &&\n'> 
          <'\tcheck_file cvswork3 adir/afile v1 &&\n'> <'\tcheck_file cvswork3 adir/a2file v1 &&\n'> <'\tcheck_file cvswork3 adir/bdir/bfile v1 &&\n'> 
          <'\tcheck_file cvswork3 adir/bdir/b2file v1 &&\n'> <'\tcheck_end_full_tree cvswork3 v1\n'>
        )
      }
    )
    (C {<test_expect_success>} {(SQ <'edit cvswork3 and save diff'>)} 
      {
        (SQ <'\n'> <'\t(\n'> <'\t\tcd cvswork3 &&\n'> 
          <'\t\tsed -e "s/line1/line1 - data/" adir/afile >adir/afileNEW &&\n'> <'\t\tmv -f adir/afileNEW adir/afile &&\n'> <'\t\techo "afile5" >adir/afile5 &&\n'> <'\t\trm t2 &&\n'> 
          <'\t\tcvs -f add adir/afile5 &&\n'> <'\t\tcvs -f rm t2 &&\n'> <'\t\t! cvs -f diff -N -u >"$WORKDIR/cvswork3edit.diff"\n'> <'\t)\n'>
        )
      }
    )
    (C {<test_expect_success>} {(SQ <'setup v1.2 on b1'>)} 
      {
        (SQ <'\n'> <'\tgit checkout b1 &&\n'> <'\techo "new v1.2" >t3 &&\n'> <'\trm t2 &&\n'> 
          <'\tsed -e "s/line3/line3 - more data/" adir/afile >adir/afileNEW &&\n'> <'\tmv -f adir/afileNEW adir/afile &&\n'> <'\trm adir/a2file &&\n'> 
          <'\techo "a3file" >>adir/a3file &&\n'> <'\techo "bfile line 3" >>adir/bdir/bfile &&\n'> <'\trm adir/bdir/b2file &&\n'> 
          <'\techo "b3file" >adir/bdir/b3file &&\n'> <'\tmkdir cdir &&\n'> <'\techo "cdir/cfile" >cdir/cfile &&\n'> <'\tgit add -A cdir adir t3 t2 &&\n'> 
          <'\tgit commit -q -m '>
        ) <v1.2> (SQ <' &&\n'> <'\tgit tag v1.2 &&\n'> <'\tgit push --tags gitcvs.git b1:b1\n'>)
      }
    )
    (C {<test_expect_success>} {(SQ <'cvs -f up (on b1 adir)'>)} 
      {
        (SQ <'\n'> <'\t( cd cvswork/adir && cvs -f up -d ) >cvs.log 2>&1 &&\n'> 
          <'\tcheck_start_tree cvswork &&\n'> <'\tcheck_file cvswork textfile.c v1 &&\n'> <'\tcheck_file cvswork t2 v1 &&\n'> 
          <'\tcheck_file cvswork adir/afile v1.2 &&\n'> <'\tcheck_file cvswork adir/a3file v1.2 &&\n'> <'\tcheck_file cvswork adir/bdir/bfile v1.2 &&\n'> 
          <'\tcheck_file cvswork adir/bdir/b3file v1.2 &&\n'> <'\tcheck_end_tree cvswork\n'>
        )
      }
    )
    (C {<test_expect_success>} {(SQ <'cvs up (on b1 /)'>)} 
      {
        (SQ <'\n'> <'\t( cd cvswork && cvs -f up -d ) >cvs.log 2>&1 &&\n'> 
          <'\tcheck_start_tree cvswork &&\n'> <'\tcheck_file cvswork textfile.c v1.2 &&\n'> <'\tcheck_file cvswork t3 v1.2 &&\n'> 
          <'\tcheck_file cvswork adir/afile v1.2 &&\n'> <'\tcheck_file cvswork adir/a3file v1.2 &&\n'> <'\tcheck_file cvswork adir/bdir/bfile v1.2 &&\n'> 
          <'\tcheck_file cvswork adir/bdir/b3file v1.2 &&\n'> <'\tcheck_file cvswork cdir/cfile v1.2 &&\n'> <'\tcheck_end_tree cvswork\n'>
        )
      }
    )
    (C {<test_expect_success>} {(SQ <'cvs up (on b1 /) (again; check CVS/Tag files)'>)} 
      {
        (SQ <'\n'> <'\t( cd cvswork && cvs -f up -d ) >cvs.log 2>&1 &&\n'> 
          <'\tcheck_start_tree cvswork &&\n'> <'\tcheck_file cvswork textfile.c v1.2 &&\n'> <'\tcheck_file cvswork t3 v1.2 &&\n'> 
          <'\tcheck_file cvswork adir/afile v1.2 &&\n'> <'\tcheck_file cvswork adir/a3file v1.2 &&\n'> <'\tcheck_file cvswork adir/bdir/bfile v1.2 &&\n'> 
          <'\tcheck_file cvswork adir/bdir/b3file v1.2 &&\n'> <'\tcheck_file cvswork cdir/cfile v1.2 &&\n'> <'\tcheck_end_tree cvswork\n'>
        )
      }
    )
    (C {<test_expect_success>} {(SQ <'cvs up -r v1'>)} 
      {
        (SQ <'\n'> <'\t( cd cvswork && cvs -f up -r v1 ) >cvs.log 2>&1 &&\n'> 
          <'\tcheck_start_tree cvswork &&\n'> <'\tcheck_file cvswork textfile.c v1 &&\n'> <'\tcheck_file cvswork t2 v1 &&\n'> 
          <'\tcheck_file cvswork adir/afile v1 &&\n'> <'\tcheck_file cvswork adir/a2file v1 &&\n'> <'\tcheck_file cvswork adir/bdir/bfile v1 &&\n'> 
          <'\tcheck_file cvswork adir/bdir/b2file v1 &&\n'> <'\tcheck_end_tree cvswork\n'>
        )
      }
    )
    (C {<test_expect_success>} {(SQ <'cvs up'>)} 
      {
        (SQ <'\n'> <'\t( cd cvswork && cvs -f up ) >cvs.log 2>&1 &&\n'> 
          <'\tcheck_start_tree cvswork &&\n'> <'\tcheck_file cvswork textfile.c v1 &&\n'> <'\tcheck_file cvswork t2 v1 &&\n'> 
          <'\tcheck_file cvswork adir/afile v1 &&\n'> <'\tcheck_file cvswork adir/a2file v1 &&\n'> <'\tcheck_file cvswork adir/bdir/bfile v1 &&\n'> 
          <'\tcheck_file cvswork adir/bdir/b2file v1 &&\n'> <'\tcheck_end_tree cvswork\n'>
        )
      }
    )
    (C {<test_expect_success>} {(SQ <'cvs up (again; check CVS/Tag files)'>)} 
      {
        (SQ <'\n'> <'\t( cd cvswork && cvs -f up -d ) >cvs.log 2>&1 &&\n'> 
          <'\tcheck_start_tree cvswork &&\n'> <'\tcheck_file cvswork textfile.c v1 &&\n'> <'\tcheck_file cvswork t2 v1 &&\n'> 
          <'\tcheck_file cvswork adir/afile v1 &&\n'> <'\tcheck_file cvswork adir/a2file v1 &&\n'> <'\tcheck_file cvswork adir/bdir/bfile v1 &&\n'> 
          <'\tcheck_file cvswork adir/bdir/b2file v1 &&\n'> <'\tcheck_end_tree cvswork\n'>
        )
      }
    )
    (C {<test_expect_success>} {(SQ <'setup simple b2'>)} 
      {(SQ <'\n'> <'\tgit branch b2 v1 &&\n'> <'\tgit push --tags gitcvs.git b2:b2\n'>)}
    )
    (C {<test_expect_success>} {(SQ <'cvs co b2 [into cvswork2]'>)} 
      {
        (SQ <'\n'> <'\tcvs -f co -r b2 -d cvswork2 master >cvs.log 2>&1 &&\n'> 
          <'\tcheck_start_tree cvswork &&\n'> <'\tcheck_file cvswork textfile.c v1 &&\n'> <'\tcheck_file cvswork t2 v1 &&\n'> 
          <'\tcheck_file cvswork adir/afile v1 &&\n'> <'\tcheck_file cvswork adir/a2file v1 &&\n'> <'\tcheck_file cvswork adir/bdir/bfile v1 &&\n'> 
          <'\tcheck_file cvswork adir/bdir/b2file v1 &&\n'> <'\tcheck_end_tree cvswork\n'>
        )
      }
    )
    (C {<test_expect_success>} {(SQ <'root dir edit [cvswork2]'>)} 
      {
        (SQ <'\n'> <'\t(\n'> <'\t\tcd cvswork2 && echo "Line 2" >>textfile.c &&\n'> 
          <'\t\t! cvs -f diff -u >"$WORKDIR/cvsEdit1.diff" &&\n'> <'\t\tcvs -f commit -m "edit textfile.c" textfile.c\n'> <'\t) >cvsEdit1.log 2>&1\n'>
        )
      }
    )
    (C {<test_expect_success>} {(SQ <'root dir rm file [cvswork2]'>)} 
      {
        (SQ <'\n'> <'\t(\n'> <'\t\tcd cvswork2 &&\n'> <'\t\tcvs -f rm -f t2 &&\n'> 
          <'\t\tcvs -f diff -u >../cvsEdit2-empty.diff &&\n'> <'\t\t! cvs -f diff -N -u >"$WORKDIR/cvsEdit2-N.diff" &&\n'> <'\t\tcvs -f commit -m "rm t2"\n'> 
          <'\t) >cvsEdit2.log 2>&1\n'>
        )
      }
    )
    (C {<test_expect_success>} {(SQ <'subdir edit/add/rm files [cvswork2]'>)} 
      {
        (SQ <'\n'> <'\t(\n'> <'\t\tcd cvswork2 &&\n'> 
          <'\t\tsed -e "s/line 1/line 1 (v2)/" adir/bdir/bfile >adir/bdir/bfileNEW &&\n'> <'\t\tmv -f adir/bdir/bfileNEW adir/bdir/bfile &&\n'> <'\t\trm adir/bdir/b2file &&\n'> 
          <'\t\tcd adir &&\n'> <'\t\tcvs -f rm bdir/b2file &&\n'> <'\t\techo "4th file" >bdir/b4file &&\n'> 
          <'\t\tcvs -f add bdir/b4file &&\n'> <'\t\t! cvs -f diff -N -u >"$WORKDIR/cvsEdit3.diff" &&\n'> <'\t\tgit fetch gitcvs.git b2:b2 &&\n'> 
          <'\t\t(\n'> <'\t\t  cd .. &&\n'> <'\t\t  ! cvs -f diff -u -N -r v1.2 >"$WORKDIR/cvsEdit3-v1.2.diff" &&\n'> 
          <'\t\t  ! cvs -f diff -u -N -r v1.2 -r v1 >"$WORKDIR/cvsEdit3-v1.2-v1.diff"\n'> <'\t\t) &&\n'> <'\t\tcvs -f commit -m "various add/rm/edit"\n'> <'\t) >cvs.log 2>&1\n'>
        )
      }
    )
    (C {<test_expect_success>} {(SQ <'validate result of edits [cvswork2]'>)} 
      {
        (SQ <'\n'> <'\tgit fetch gitcvs.git b2:b2 &&\n'> <'\tgit tag v2 b2 &&\n'> 
          <'\tgit push --tags gitcvs.git b2:b2 &&\n'> <'\tcheck_start_tree cvswork2 &&\n'> <'\tcheck_file cvswork2 textfile.c v2 &&\n'> 
          <'\tcheck_file cvswork2 adir/afile v2 &&\n'> <'\tcheck_file cvswork2 adir/a2file v2 &&\n'> <'\tcheck_file cvswork2 adir/bdir/bfile v2 &&\n'> 
          <'\tcheck_file cvswork2 adir/bdir/b4file v2 &&\n'> <'\tcheck_end_full_tree cvswork2 v2\n'>
        )
      }
    )
    (C {<test_expect_success>} {(SQ <'validate basic diffs saved during above cvswork2 edits'>)} 
      {
        (SQ <'\n'> <'\ttest $(grep Index: cvsEdit1.diff | wc -l) = 1 &&\n'> 
          <'\ttest_must_be_empty cvsEdit2-empty.diff &&\n'> <'\ttest $(grep Index: cvsEdit2-N.diff | wc -l) = 1 &&\n'> 
          <'\ttest $(grep Index: cvsEdit3.diff | wc -l) = 3 &&\n'> <'\trm -rf diffSandbox &&\n'> <'\tgit clone -q -n . diffSandbox &&\n'> <'\t(\n'> 
          <'\t\tcd diffSandbox &&\n'> <'\t\tgit checkout v1 &&\n'> <'\t\tgit apply -p0 --index <"$WORKDIR/cvsEdit1.diff" &&\n'> 
          <'\t\tgit apply -p0 --index <"$WORKDIR/cvsEdit2-N.diff" &&\n'> <'\t\tgit apply -p0 --directory=adir --index <"$WORKDIR/cvsEdit3.diff" &&\n'> 
          <'\t\tgit diff --exit-code v2\n'> <'\t) >"check_diff_apply.out" 2>&1\n'>
        )
      }
    )
    (C {<test_expect_success>} {(SQ <'validate v1.2 diff saved during last cvswork2 edit'>)} 
      {
        (SQ <'\n'> <'\ttest $(grep Index: cvsEdit3-v1.2.diff | wc -l) = 9 &&\n'> 
          <'\tcheck_diff cvsEdit3-v1.2.diff v1.2 v2\n'>
        )
      }
    )
    (C {<test_expect_success>} {(SQ <'validate v1.2 v1 diff saved during last cvswork2 edit'>)} 
      {
        (SQ <'\n'> <'\ttest $(grep Index: cvsEdit3-v1.2-v1.diff | wc -l) = 9 &&\n'> 
          <'\tcheck_diff cvsEdit3-v1.2-v1.diff v1.2 v1\n'>
        )
      }
    )
    (C {<test_expect_success>} {(SQ <'cvs up [cvswork2]'>)} 
      {
        (SQ <'\n'> <'\t( cd cvswork2 && cvs -f up ) >cvs.log 2>&1 &&\n'> 
          <'\tcheck_start_tree cvswork2 &&\n'> <'\tcheck_file cvswork2 textfile.c v2 &&\n'> <'\tcheck_file cvswork2 adir/afile v2 &&\n'> 
          <'\tcheck_file cvswork2 adir/a2file v2 &&\n'> <'\tcheck_file cvswork2 adir/bdir/bfile v2 &&\n'> <'\tcheck_file cvswork2 adir/bdir/b4file v2 &&\n'> 
          <'\tcheck_end_full_tree cvswork2 v2\n'>
        )
      }
    )
    (C {<test_expect_success>} {(SQ <'cvs up -r b2 [back to cvswork]'>)} 
      {
        (SQ <'\n'> <'\t( cd cvswork && cvs -f up -r b2 ) >cvs.log 2>&1 &&\n'> 
          <'\tcheck_start_tree cvswork &&\n'> <'\tcheck_file cvswork textfile.c v2 &&\n'> <'\tcheck_file cvswork adir/afile v2 &&\n'> 
          <'\tcheck_file cvswork adir/a2file v2 &&\n'> <'\tcheck_file cvswork adir/bdir/bfile v2 &&\n'> <'\tcheck_file cvswork adir/bdir/b4file v2 &&\n'> 
          <'\tcheck_end_full_tree cvswork v2\n'>
        )
      }
    )
    (C {<test_expect_success>} {(SQ <'cvs up -r b1'>)} 
      {
        (SQ <'\n'> <'\t( cd cvswork && cvs -f up -r b1 ) >cvs.log 2>&1 &&\n'> 
          <'\tcheck_start_tree cvswork &&\n'> <'\tcheck_file cvswork textfile.c v1.2 &&\n'> <'\tcheck_file cvswork t3 v1.2 &&\n'> 
          <'\tcheck_file cvswork adir/afile v1.2 &&\n'> <'\tcheck_file cvswork adir/a3file v1.2 &&\n'> <'\tcheck_file cvswork adir/bdir/bfile v1.2 &&\n'> 
          <'\tcheck_file cvswork adir/bdir/b3file v1.2 &&\n'> <'\tcheck_file cvswork cdir/cfile v1.2 &&\n'> <'\tcheck_end_full_tree cvswork v1.2\n'>
        )
      }
    )
    (C {<test_expect_success>} {(SQ <'cvs up -A'>)} 
      {
        (SQ <'\n'> <'\t( cd cvswork && cvs -f up -A ) >cvs.log 2>&1 &&\n'> 
          <'\tcheck_start_tree cvswork &&\n'> <'\tcheck_file cvswork textfile.c v1 &&\n'> <'\tcheck_file cvswork t2 v1 &&\n'> 
          <'\tcheck_file cvswork adir/afile v1 &&\n'> <'\tcheck_file cvswork adir/a2file v1 &&\n'> <'\tcheck_file cvswork adir/bdir/bfile v1 &&\n'> 
          <'\tcheck_file cvswork adir/bdir/b2file v1 &&\n'> <'\tcheck_end_full_tree cvswork v1\n'>
        )
      }
    )
    (C {<test_expect_success>} {(SQ <'cvs up (check CVS/Tag files)'>)} 
      {
        (SQ <'\n'> <'\t( cd cvswork && cvs -f up ) >cvs.log 2>&1 &&\n'> 
          <'\tcheck_start_tree cvswork &&\n'> <'\tcheck_file cvswork textfile.c v1 &&\n'> <'\tcheck_file cvswork t2 v1 &&\n'> 
          <'\tcheck_file cvswork adir/afile v1 &&\n'> <'\tcheck_file cvswork adir/a2file v1 &&\n'> <'\tcheck_file cvswork adir/bdir/bfile v1 &&\n'> 
          <'\tcheck_file cvswork adir/bdir/b2file v1 &&\n'> <'\tcheck_end_full_tree cvswork v1\n'>
        )
      }
    )
    (C {<test_expect_success>} {(SQ <'cvs up -r heads/b1'>)} 
      {
        (SQ <'\n'> <'\t( cd cvswork && cvs -f up -r heads/b1 ) >cvs.log 2>&1 &&\n'> 
          <'\tcheck_start_tree cvswork &&\n'> <'\tcheck_file cvswork textfile.c v1.2 &&\n'> <'\tcheck_file cvswork t3 v1.2 &&\n'> 
          <'\tcheck_file cvswork adir/afile v1.2 &&\n'> <'\tcheck_file cvswork adir/a3file v1.2 &&\n'> <'\tcheck_file cvswork adir/bdir/bfile v1.2 &&\n'> 
          <'\tcheck_file cvswork adir/bdir/b3file v1.2 &&\n'> <'\tcheck_file cvswork cdir/cfile v1.2 &&\n'> <'\tcheck_end_full_tree cvswork v1.2\n'>
        )
      }
    )
    (C {<test_expect_success>} {(SQ <'cvs up -r heads_-s-b2 (cvsserver escape mechanism)'>)} 
      {
        (SQ <'\n'> <'\t( cd cvswork && cvs -f up -r heads_-s-b2 ) >cvs.log 2>&1 &&\n'> 
          <'\tcheck_start_tree cvswork &&\n'> <'\tcheck_file cvswork textfile.c v2 &&\n'> <'\tcheck_file cvswork adir/afile v2 &&\n'> 
          <'\tcheck_file cvswork adir/a2file v2 &&\n'> <'\tcheck_file cvswork adir/bdir/bfile v2 &&\n'> <'\tcheck_file cvswork adir/bdir/b4file v2 &&\n'> 
          <'\tcheck_end_full_tree cvswork v2\n'>
        )
      }
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:v1hash)
          op: assign_op.Equal
          rhs: 
            {(command_sub left_token:<Id.Left_DollarParen '$('> child:(C {<git>} {<rev-parse>} {<v1>}))}
          spids: [1240]
        )
      ]
    )
    (C {<test_expect_success>} {(SQ <'cvs up -r $(git rev-parse v1)'>)} 
      {
        (SQ <'\n'> <'\ttest -n "$v1hash" &&\n'> 
          <'\t( cd cvswork && cvs -f up -r "$v1hash" ) >cvs.log 2>&1 &&\n'> <'\tcheck_start_tree cvswork &&\n'> <'\tcheck_file cvswork textfile.c v1 &&\n'> 
          <'\tcheck_file cvswork t2 v1 &&\n'> <'\tcheck_file cvswork adir/afile v1 &&\n'> <'\tcheck_file cvswork adir/a2file v1 &&\n'> 
          <'\tcheck_file cvswork adir/bdir/bfile v1 &&\n'> <'\tcheck_file cvswork adir/bdir/b2file v1 &&\n'> <'\tcheck_end_full_tree cvswork v1\n'>
        )
      }
    )
    (C {<test_expect_success>} {(SQ <'cvs diff -r v1 -u'>)} 
      {
        (SQ <'\n'> <'\t( cd cvswork && cvs -f diff -r v1 -u ) >cvsDiff.out 2>cvs.log &&\n'> 
          <'\ttest_must_be_empty cvsDiff.out &&\n'> <'\ttest_must_be_empty cvs.log\n'>
        )
      }
    )
    (C {<test_expect_success>} {(SQ <'cvs diff -N -r v2 -u'>)} 
      {
        (SQ <'\n'> <'\t( cd cvswork && ! cvs -f diff -N -r v2 -u ) >cvsDiff.out 2>cvs.log &&\n'> 
          <'\ttest_must_be_empty cvs.log &&\n'> <'\ttest -s cvsDiff.out &&\n'> <'\tcheck_diff cvsDiff.out v2 v1 >check_diff.out 2>&1\n'>
        )
      }
    )
    (C {<test_expect_success>} {(SQ <'cvs diff -N -r v2 -r v1.2'>)} 
      {
        (SQ <'\n'> 
          <'\t( cd cvswork && ! cvs -f diff -N -r v2 -r v1.2 -u ) >cvsDiff.out 2>cvs.log &&\n'> <'\ttest_must_be_empty cvs.log &&\n'> <'\ttest -s cvsDiff.out &&\n'> 
          <'\tcheck_diff cvsDiff.out v2 v1.2 >check_diff.out 2>&1\n'>
        )
      }
    )
    (C {<test_expect_success>} {(SQ <'apply early [cvswork3] diff to b3'>)} 
      {
        (SQ <'\n'> <'\tgit clone -q . gitwork3 &&\n'> <'\t(\n'> <'\t\tcd gitwork3 &&\n'> 
          <'\t\tgit checkout -b b3 v1 &&\n'> <'\t\tgit apply -p0 --index <"$WORKDIR/cvswork3edit.diff" &&\n'> 
          <'\t\tgit commit -m "cvswork3 edits applied"\n'> <'\t) &&\n'> <'\tgit fetch gitwork3 b3:b3 &&\n'> <'\tgit tag v3 b3\n'>
        )
      }
    )
    (C {<test_expect_success>} {(SQ <'check [cvswork3] diff'>)} 
      {
        (SQ <'\n'> <'\t( cd cvswork3 && ! cvs -f diff -N -u ) >"$WORKDIR/cvsDiff.out" 2>cvs.log &&\n'> 
          <'\ttest_must_be_empty cvs.log &&\n'> <'\ttest -s cvsDiff.out &&\n'> <'\ttest $(grep Index: cvsDiff.out | wc -l) = 3 &&\n'> 
          <'\ttest_cmp cvsDiff.out cvswork3edit.diff &&\n'> <'\tcheck_diff cvsDiff.out v1 v3 >check_diff.out 2>&1\n'>
        )
      }
    )
    (C {<test_expect_success>} {(SQ <'merge early [cvswork3] b3 with b1'>)} 
      {
        (SQ <'\n'> <'\t( cd gitwork3 && git merge -m "message" b1 ) &&\n'> 
          <'\tgit fetch gitwork3 b3:b3 &&\n'> <'\tgit tag v3merged b3 &&\n'> <'\tgit push --tags gitcvs.git b3:b3\n'>
        )
      }
    )
    (C {<test_expect_success>} {(SQ <'cvs up dirty [cvswork3]'>)} 
      {
        (SQ <'\n'> <'\t(\n'> <'\t\tcd cvswork3 &&\n'> <'\t\tcvs -f up &&\n'> 
          <'\t\t! cvs -f diff -N -u >"$WORKDIR/cvsDiff.out"\n'> <'\t) >cvs.log 2>&1 &&\n'> <'\ttest -s cvsDiff.out &&\n'> 
          <'\ttest $(grep Index: cvsDiff.out | wc -l) = 2 &&\n'> <'\tcheck_start_tree cvswork3 &&\n'> <'\tcheck_file cvswork3 textfile.c v3merged &&\n'> 
          <'\tcheck_file cvswork3 t3 v3merged &&\n'> <'\tcheck_file cvswork3 adir/afile v3merged &&\n'> <'\tcheck_file cvswork3 adir/a3file v3merged &&\n'> 
          <'\tcheck_file cvswork3 adir/afile5 v3merged &&\n'> <'\tcheck_file cvswork3 adir/bdir/bfile v3merged &&\n'> 
          <'\tcheck_file cvswork3 adir/bdir/b3file v3merged &&\n'> <'\tcheck_file cvswork3 cdir/cfile v3merged &&\n'> <'\tcheck_end_full_tree cvswork3 v3merged\n'>
        )
      }
    )
    (C {<test_expect_success>} {(SQ <'cvs commit [cvswork3]'>)} 
      {
        (SQ <'\n'> <'\t(\n'> <'\t\tcd cvswork3 &&\n'> 
          <'\t\tcvs -f commit -m "dirty sandbox after auto-merge"\n'> <'\t) >cvs.log 2>&1 &&\n'> <'\tcheck_start_tree cvswork3 &&\n'> 
          <'\tcheck_file cvswork3 textfile.c v3merged &&\n'> <'\tcheck_file cvswork3 t3 v3merged &&\n'> <'\tcheck_file cvswork3 adir/afile v3merged &&\n'> 
          <'\tcheck_file cvswork3 adir/a3file v3merged &&\n'> <'\tcheck_file cvswork3 adir/afile5 v3merged &&\n'> 
          <'\tcheck_file cvswork3 adir/bdir/bfile v3merged &&\n'> <'\tcheck_file cvswork3 adir/bdir/b3file v3merged &&\n'> 
          <'\tcheck_file cvswork3 cdir/cfile v3merged &&\n'> <'\tcheck_end_full_tree cvswork3 v3merged &&\n'> <'\tgit fetch gitcvs.git b3:b4 &&\n'> 
          <'\tgit tag v4.1 b4 &&\n'> <'\tgit diff --exit-code v4.1 v3merged >check_diff_apply.out 2>&1\n'>
        )
      }
    )
    (C {<test_done>})
  ]
)