(CommandList
  children: [
    (Assignment
      keyword: Assign_None
      pairs: [
        (assign_pair
          lhs: (LhsName name:test_description)
          op: Equal
          rhs: 
            {
              (SQ <'git-cvsserver access\n'> <'\n'> 
                <'tests read access to a git repository with the\n'> <'cvs CLI client via git-cvsserver server'>
              )
            }
          spids: [13]
        )
      ]
      spids: [13]
    )
    (C {(.)} {(./test-lib.sh)})
    (If
      arms: [
        (if_arm
          cond: [
            (Sentence
              child: (Pipeline children:[(C {(test_have_prereq)} {(PERL)})] negated:True)
              terminator: <Op_Semi ';'>
            )
          ]
          action: [
            (Assignment
              keyword: Assign_None
              pairs: [
                (assign_pair
                  lhs: (LhsName name:skip_all)
                  op: Equal
                  rhs: {(SQ <'skipping git cvsserver tests, perl not available'>)}
                  spids: [39]
                )
              ]
              spids: [39]
            )
            (C {(test_done)})
          ]
          spids: [-1 36]
        )
      ]
      spids: [-1 47]
    )
    (SimpleCommand
      words: [{(cvs)}]
      redirects: [
        (Redir op_id:Redir_Great fd:-1 arg_word:{(/dev/null)} spids:[51])
        (Redir op_id:Redir_GreatAnd fd:2 arg_word:{(1)} spids:[54])
      ]
    )
    (If
      arms: [
        (if_arm
          cond: [(C {(test)} {($ VSub_QMark '$?')} {(-ne)} {(1)})]
          action: [
            (Assignment
              keyword: Assign_None
              pairs: [
                (assign_pair
                  lhs: (LhsName name:skip_all)
                  op: Equal
                  rhs: {(SQ <'skipping git-cvsserver tests, cvs not found'>)}
                  spids: [70]
                )
              ]
              spids: [70]
            )
            (C {(test_done)})
          ]
          spids: [-1 67]
        )
      ]
      spids: [-1 78]
    )
    (AndOr
      children: [
        (SimpleCommand
          words: [{(perl)} {(-e)} {(SQ <'use DBI; use DBD::SQLite'>)}]
          redirects: [
            (Redir op_id:Redir_Great fd:-1 arg_word:{(/dev/null)} spids:[88])
            (Redir op_id:Redir_GreatAnd fd:2 arg_word:{(1)} spids:[91])
          ]
        )
        (BraceGroup
          children: [
            (Assignment
              keyword: Assign_None
              pairs: [
                (assign_pair
                  lhs: (LhsName name:skip_all)
                  op: Equal
                  rhs: {(SQ <'skipping git-cvsserver tests, Perl SQLite interface unavailable'>)}
                  spids: [99]
                )
              ]
              spids: [99]
            )
            (C {(test_done)})
          ]
          spids: [96]
        )
      ]
      op_id: Op_DPipe
    )
    (Assignment
      keyword: Assign_None
      pairs: [
        (assign_pair
          lhs: (LhsName name:WORKDIR)
          op: Equal
          rhs: {($ VSub_Name '$PWD')}
          spids: [110]
        )
      ]
      spids: [110]
    )
    (Assignment
      keyword: Assign_None
      pairs: [
        (assign_pair
          lhs: (LhsName name:SERVERDIR)
          op: Equal
          rhs: {($ VSub_Name '$PWD') (/gitcvs.git)}
          spids: [113]
        )
      ]
      spids: [113]
    )
    (Assignment
      keyword: Assign_None
      pairs: [
        (assign_pair
          lhs: (LhsName name:git_config)
          op: Equal
          rhs: {(DQ ($ VSub_Name '$SERVERDIR') (/config))}
          spids: [117]
        )
      ]
      spids: [117]
    )
    (Assignment
      keyword: Assign_None
      pairs: [
        (assign_pair
          lhs: (LhsName name:CVSROOT)
          op: Equal
          rhs: {(DQ (':fork:') ($ VSub_Name '$SERVERDIR'))}
          spids: [123]
        )
      ]
      spids: [123]
    )
    (Assignment
      keyword: Assign_None
      pairs: [
        (assign_pair
          lhs: (LhsName name:CVSWORK)
          op: Equal
          rhs: {(DQ ($ VSub_Name '$PWD') (/cvswork))}
          spids: [129]
        )
      ]
      spids: [129]
    )
    (Assignment
      keyword: Assign_None
      pairs: [(assign_pair lhs:(LhsName name:CVS_SERVER) op:Equal rhs:{(git-cvsserver)} spids:[135])]
      spids: [135]
    )
    (C {(export)} {(CVSROOT)} {(CVS_SERVER)})
    (C {(rm)} {(-rf)} {(DQ ($ VSub_Name '$CVSWORK'))} {(DQ ($ VSub_Name '$SERVERDIR'))})
    (C {(test_expect_success)} {(SQ <setup>)} 
      {
        (SQ <'\n'> <'  git config push.default matching &&\n'> <'  echo >empty &&\n'> 
          <'  git add empty &&\n'> <'  git commit -q -m "First Commit" &&\n'> <'  mkdir secondroot &&\n'> <'  ( cd secondroot &&\n'> 
          <'  git init &&\n'> <'  touch secondrootfile &&\n'> <'  git add secondrootfile &&\n'> 
          <'  git commit -m "second root") &&\n'> <'  git fetch secondroot master &&\n'> <'  git merge --allow-unrelated-histories FETCH_HEAD &&\n'> 
          <'  git clone -q --bare "$WORKDIR/.git" "$SERVERDIR" >/dev/null 2>&1 &&\n'> <'  GIT_DIR="$SERVERDIR" git config --bool gitcvs.enabled true &&\n'> 
          <'  GIT_DIR="$SERVERDIR" git config gitcvs.logfile "$SERVERDIR/gitcvs.log" &&\n'> <'  GIT_DIR="$SERVERDIR" git config gitcvs.authdb "$SERVERDIR/auth.db" &&\n'> 
          <'  echo cvsuser:cvGVEarMLnhlA > "$SERVERDIR/auth.db"\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'basic checkout'>)} 
      {
        (SQ <'GIT_CONFIG="$git_config" cvs -Q co -d cvswork master &&\n'> 
          <
'   test "$(echo $(grep -v ^D cvswork/CVS/Entries|cut -d/ -f2,3,5 | head -n 1))" = "empty/1.1/" &&\n'
          > 
          <
'   test "$(echo $(grep -v ^D cvswork/CVS/Entries|cut -d/ -f2,3,5 | sed -ne \\$p))" = "secondrootfile/1.1/"'
          >
        )
      }
    )
    (SimpleCommand
      words: [{(cat)}]
      redirects: [
        (Redir op_id:Redir_Great fd:-1 arg_word:{(request-anonymous)} spids:[218])
        (HereDoc
          op_id: Redir_DLess
          fd: -1
          body: 
            {
              (DQ ('BEGIN AUTH REQUEST\n') ($ VSub_Name '$SERVERDIR') ('\n') ('anonymous\n') ('\n') 
                ('END AUTH REQUEST\n')
              )
            }
          do_expansion: True
          here_end: EOF
          was_filled: True
          spids: [221]
        )
      ]
    )
    (SimpleCommand
      words: [{(cat)}]
      redirects: [
        (Redir op_id:Redir_Great fd:-1 arg_word:{(request-git)} spids:[234])
        (HereDoc
          op_id: Redir_DLess
          fd: -1
          body: 
            {
              (DQ ('BEGIN AUTH REQUEST\n') ($ VSub_Name '$SERVERDIR') ('\n') ('git\n') ('\n') 
                ('END AUTH REQUEST\n')
              )
            }
          do_expansion: True
          here_end: EOF
          was_filled: True
          spids: [237]
        )
      ]
    )
    (SimpleCommand
      words: [{(cat)}]
      redirects: [
        (Redir op_id:Redir_Great fd:-1 arg_word:{(login-anonymous)} spids:[250])
        (HereDoc
          op_id: Redir_DLess
          fd: -1
          body: 
            {
              (DQ ('BEGIN VERIFICATION REQUEST\n') ($ VSub_Name '$SERVERDIR') ('\n') ('anonymous\n') 
                ('\n') ('END VERIFICATION REQUEST\n')
              )
            }
          do_expansion: True
          here_end: EOF
          was_filled: True
          spids: [253]
        )
      ]
    )
    (SimpleCommand
      words: [{(cat)}]
      redirects: [
        (Redir op_id:Redir_Great fd:-1 arg_word:{(login-git)} spids:[266])
        (HereDoc
          op_id: Redir_DLess
          fd: -1
          body: 
            {
              (DQ ('BEGIN VERIFICATION REQUEST\n') ($ VSub_Name '$SERVERDIR') ('\n') ('git\n') ('\n') 
                ('END VERIFICATION REQUEST\n')
              )
            }
          do_expansion: True
          here_end: EOF
          was_filled: True
          spids: [269]
        )
      ]
    )
    (SimpleCommand
      words: [{(cat)}]
      redirects: [
        (Redir op_id:Redir_Great fd:-1 arg_word:{(login-git-ok)} spids:[282])
        (HereDoc
          op_id: Redir_DLess
          fd: -1
          body: 
            {
              (DQ ('BEGIN VERIFICATION REQUEST\n') ($ VSub_Name '$SERVERDIR') ('\n') ('cvsuser\n') 
                ('Ah<Z:yZZ30 e\n') ('END VERIFICATION REQUEST\n')
              )
            }
          do_expansion: True
          here_end: EOF
          was_filled: True
          spids: [285]
        )
      ]
    )
    (C {(test_expect_success)} {(SQ <'pserver authentication'>)} 
      {
        (SQ <'cat request-anonymous | git-cvsserver pserver >log 2>&1 &&\n'> 
          <'   sed -ne \\$p log | grep "^I LOVE YOU\\$"'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'pserver authentication failure (non-anonymous user)'>)} 
      {
        (SQ <'if cat request-git | git-cvsserver pserver >log 2>&1\n'> <'   then\n'> <'       false\n'> 
          <'   else\n'> <'       true\n'> <'   fi &&\n'> <'   sed -ne \\$p log | grep "^I HATE YOU\\$"'>
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ <'pserver authentication success (non-anonymous user with password)'>)} 
      {
        (SQ <'cat login-git-ok | git-cvsserver pserver >log 2>&1 &&\n'> 
          <'   sed -ne \\$p log | grep "^I LOVE YOU\\$"'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'pserver authentication (login)'>)} 
      {
        (SQ <'cat login-anonymous | git-cvsserver pserver >log 2>&1 &&\n'> 
          <'   sed -ne \\$p log | grep "^I LOVE YOU\\$"'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'pserver authentication failure (login/non-anonymous user)'>)} 
      {
        (SQ <'if cat login-git | git-cvsserver pserver >log 2>&1\n'> <'   then\n'> <'       false\n'> 
          <'   else\n'> <'       true\n'> <'   fi &&\n'> <'   sed -ne \\$p log | grep "^I HATE YOU\\$"'>
        )
      }
    )
    (SimpleCommand
      words: [{(cat)}]
      redirects: [
        (Redir op_id:Redir_Great fd:-1 arg_word:{(request-relative)} spids:[383])
        (HereDoc
          op_id: Redir_DLess
          fd: -1
          body: 
            {
              (DQ ('BEGIN AUTH REQUEST\n') ('gitcvs.git\n') ('anonymous\n') ('\n') ('END AUTH REQUEST\n'))
            }
          do_expansion: True
          here_end: EOF
          was_filled: True
          spids: [386]
        )
      ]
    )
    (SimpleCommand
      words: [{(cat)}]
      redirects: [
        (Redir op_id:Redir_Great fd:-1 arg_word:{(request-conflict)} spids:[398])
        (HereDoc
          op_id: Redir_DLess
          fd: -1
          body: 
            {
              (DQ ('BEGIN AUTH REQUEST\n') ($ VSub_Name '$SERVERDIR') ('\n') ('anonymous\n') ('\n') 
                ('END AUTH REQUEST\n') ('Root ') ($ VSub_Name '$WORKDIR') ('\n')
              )
            }
          do_expansion: True
          here_end: EOF
          was_filled: True
          spids: [401]
        )
      ]
    )
    (C {(test_expect_success)} {(SQ <'req_Root failure (relative pathname)'>)} 
      {
        (SQ <'if cat request-relative | git-cvsserver pserver >log 2>&1\n'> <'   then\n'> 
          <'       echo unexpected success\n'> <'       false\n'> <'   else\n'> <'       true\n'> <'   fi &&\n'> 
          <'   tail log | grep "^error 1 Root must be an absolute pathname$"'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'req_Root failure (conflicting roots)'>)} 
      {
        (SQ <'cat request-conflict | git-cvsserver pserver >log 2>&1 &&\n'> 
          <'   tail log | grep "^error 1 Conflicting roots specified$"'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'req_Root (strict paths)'>)} 
      {
        (SQ 
          <
'cat request-anonymous | git-cvsserver --strict-paths pserver "$SERVERDIR" >log 2>&1 &&\n'
          > <'   sed -ne \\$p log | grep "^I LOVE YOU\\$"'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'req_Root failure (strict-paths)'>)} 
      {
        (SQ <'\n'> <'    ! cat request-anonymous |\n'> 
          <'    git-cvsserver --strict-paths pserver "$WORKDIR" >log 2>&1\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'req_Root (w/o strict-paths)'>)} 
      {
        (SQ <'cat request-anonymous | git-cvsserver pserver "$WORKDIR/" >log 2>&1 &&\n'> 
          <'   sed -ne \\$p log | grep "^I LOVE YOU\\$"'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'req_Root failure (w/o strict-paths)'>)} 
      {
        (SQ <'\n'> <'    ! cat request-anonymous |\n'> 
          <'    git-cvsserver pserver "$WORKDIR/gitcvs" >log 2>&1\n'>
        )
      }
    )
    (SimpleCommand
      words: [{(cat)}]
      redirects: [
        (Redir op_id:Redir_Great fd:-1 arg_word:{(request-base)} spids:[505])
        (HereDoc
          op_id: Redir_DLess
          fd: -1
          body: 
            {
              (DQ ('BEGIN AUTH REQUEST\n') ('/gitcvs.git\n') ('anonymous\n') ('\n') 
                ('END AUTH REQUEST\n') ('Root /gitcvs.git\n')
              )
            }
          do_expansion: True
          here_end: EOF
          was_filled: True
          spids: [508]
        )
      ]
    )
    (C {(test_expect_success)} {(SQ <'req_Root (base-path)'>)} 
      {
        (SQ 
          <
'cat request-base | git-cvsserver --strict-paths --base-path "$WORKDIR/" pserver "$SERVERDIR" >log 2>&1 &&\n'
          > <'   sed -ne \\$p log | grep "^I LOVE YOU\\$"'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'req_Root failure (base-path)'>)} 
      {
        (SQ <'\n'> <'    ! cat request-anonymous |\n'> 
          <
'    git-cvsserver --strict-paths --base-path "$WORKDIR" pserver "$SERVERDIR" >log 2>&1\n'
          >
        )
      }
    )
    (AndOr
      children: [
        (SimpleCommand
          words: [{(git)} {(config)} {(--bool)} {(gitcvs.enabled)} {(false)}]
          more_env: [(env_pair name:GIT_DIR val:{(DQ ($ VSub_Name '$SERVERDIR'))} spids:[546])]
        )
        (C {(exit)} {(1)})
      ]
      op_id: Op_DPipe
    )
    (C {(test_expect_success)} {(SQ <'req_Root (export-all)'>)} 
      {
        (SQ <'cat request-anonymous | git-cvsserver --export-all pserver "$WORKDIR" >log 2>&1 &&\n'> 
          <'   sed -ne \\$p log | grep "^I LOVE YOU\\$"'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'req_Root failure (export-all w/o whitelist)'>)} 
      {(SQ <'! (cat request-anonymous | git-cvsserver --export-all pserver >log 2>&1 || false)'>)}
    )
    (C {(test_expect_success)} {(SQ <'req_Root (everything together)'>)} 
      {
        (SQ 
          <
'cat request-base | git-cvsserver --export-all --strict-paths --base-path "$WORKDIR/" pserver "$SERVERDIR" >log 2>&1 &&\n'
          > <'   sed -ne \\$p log | grep "^I LOVE YOU\\$"'>
        )
      }
    )
    (AndOr
      children: [
        (SimpleCommand
          words: [{(git)} {(config)} {(--bool)} {(gitcvs.enabled)} {(true)}]
          more_env: [(env_pair name:GIT_DIR val:{(DQ ($ VSub_Name '$SERVERDIR'))} spids:[609])]
        )
        (C {(exit)} {(1)})
      ]
      op_id: Op_DPipe
    )
    (C {(test_expect_success)} {(SQ <'gitcvs.enabled = false'>)} 
      {
        (SQ <'GIT_DIR="$SERVERDIR" git config --bool gitcvs.enabled false &&\n'> 
          <'   if GIT_CONFIG="$git_config" cvs -Q co -d cvswork2 master >cvs.log 2>&1\n'> <'   then\n'> <'     echo unexpected cvs success\n'> <'     false\n'> <'   else\n'> <'     true\n'> 
          <'   fi &&\n'> <'   grep "GITCVS emulation disabled" cvs.log &&\n'> <'   test ! -d cvswork2'>
        )
      }
    )
    (C {(rm)} {(-fr)} {(cvswork2)})
    (C {(test_expect_success)} {(SQ <'gitcvs.ext.enabled = true'>)} 
      {
        (SQ <'GIT_DIR="$SERVERDIR" git config --bool gitcvs.ext.enabled true &&\n'> 
          <'   GIT_DIR="$SERVERDIR" git config --bool gitcvs.enabled false &&\n'> <'   GIT_CONFIG="$git_config" cvs -Q co -d cvswork2 master >cvs.log 2>&1 &&\n'> 
          <'   test_cmp cvswork cvswork2'>
        )
      }
    )
    (C {(rm)} {(-fr)} {(cvswork2)})
    (C {(test_expect_success)} {(SQ <'gitcvs.ext.enabled = false'>)} 
      {
        (SQ <'GIT_DIR="$SERVERDIR" git config --bool gitcvs.ext.enabled false &&\n'> 
          <'   GIT_DIR="$SERVERDIR" git config --bool gitcvs.enabled true &&\n'> <'   if GIT_CONFIG="$git_config" cvs -Q co -d cvswork2 master >cvs.log 2>&1\n'> <'   then\n'> 
          <'     echo unexpected cvs success\n'> <'     false\n'> <'   else\n'> <'     true\n'> <'   fi &&\n'> 
          <'   grep "GITCVS emulation disabled" cvs.log &&\n'> <'   test ! -d cvswork2'>
        )
      }
    )
    (C {(rm)} {(-fr)} {(cvswork2)})
    (C {(test_expect_success)} {(SQ <gitcvs.dbname>)} 
      {
        (SQ <'GIT_DIR="$SERVERDIR" git config --bool gitcvs.ext.enabled true &&\n'> 
          <'   GIT_DIR="$SERVERDIR" git config gitcvs.dbname %Ggitcvs.%a.%m.sqlite &&\n'> <'   GIT_CONFIG="$git_config" cvs -Q co -d cvswork2 master >cvs.log 2>&1 &&\n'> 
          <'   test_cmp cvswork cvswork2 &&\n'> <'   test -f "$SERVERDIR/gitcvs.ext.master.sqlite" &&\n'> 
          <'   cmp "$SERVERDIR/gitcvs.master.sqlite" "$SERVERDIR/gitcvs.ext.master.sqlite"'>
        )
      }
    )
    (C {(rm)} {(-fr)} {(cvswork2)})
    (C {(test_expect_success)} {(SQ <gitcvs.ext.dbname>)} 
      {
        (SQ <'GIT_DIR="$SERVERDIR" git config --bool gitcvs.ext.enabled true &&\n'> 
          <'   GIT_DIR="$SERVERDIR" git config gitcvs.ext.dbname %Ggitcvs1.%a.%m.sqlite &&\n'> <'   GIT_DIR="$SERVERDIR" git config gitcvs.dbname %Ggitcvs2.%a.%m.sqlite &&\n'> 
          <'   GIT_CONFIG="$git_config" cvs -Q co -d cvswork2 master >cvs.log 2>&1 &&\n'> <'   test_cmp cvswork cvswork2 &&\n'> <'   test -f "$SERVERDIR/gitcvs1.ext.master.sqlite" &&\n'> 
          <'   test ! -f "$SERVERDIR/gitcvs2.ext.master.sqlite" &&\n'> <'   cmp "$SERVERDIR/gitcvs.master.sqlite" "$SERVERDIR/gitcvs1.ext.master.sqlite"'>
        )
      }
    )
    (C {(rm)} {(-fr)} {(DQ ($ VSub_Name '$SERVERDIR'))})
    (AndOr
      children: [
        (C {(cd)} {(DQ ($ VSub_Name '$WORKDIR'))})
        (AndOr
          children: [
            (SimpleCommand
              words: [
                {(git)}
                {(clone)}
                {(-q)}
                {(--bare)}
                {(DQ ($ VSub_Name '$WORKDIR') (/.git))}
                {(DQ ($ VSub_Name '$SERVERDIR'))}
              ]
              redirects: [
                (Redir op_id:Redir_Great fd:-1 arg_word:{(/dev/null)} spids:[808])
                (Redir op_id:Redir_GreatAnd fd:2 arg_word:{(1)} spids:[811])
              ]
            )
            (AndOr
              children: [
                (SimpleCommand
                  words: [{(git)} {(config)} {(--bool)} {(gitcvs.enabled)} {(true)}]
                  more_env: [
                    (env_pair
                      name: GIT_DIR
                      val: {(DQ ($ VSub_Name '$SERVERDIR'))}
                      spids: [816]
                    )
                  ]
                )
                (AndOr
                  children: [
                    (SimpleCommand
                      words: [
                        {(git)}
                        {(config)}
                        {(gitcvs.logfile)}
                        {(DQ ($ VSub_Name '$SERVERDIR') (/gitcvs.log))}
                      ]
                      more_env: [
                        (env_pair
                          name: GIT_DIR
                          val: {(DQ ($ VSub_Name '$SERVERDIR'))}
                          spids: [833]
                        )
                      ]
                    )
                    (C {(exit)} {(1)})
                  ]
                  op_id: Op_DPipe
                )
              ]
              op_id: Op_DAmp
            )
          ]
          op_id: Op_DAmp
        )
      ]
      op_id: Op_DAmp
    )
    (C {(test_expect_success)} {(SQ <'cvs update (create new file)'>)} 
      {
        (SQ <'echo testfile1 >testfile1 &&\n'> <'   git add testfile1 &&\n'> 
          <'   git commit -q -m "Add testfile1" &&\n'> <'   git push gitcvs.git >/dev/null &&\n'> <'   cd cvswork &&\n'> 
          <'   GIT_CONFIG="$git_config" cvs -Q update &&\n'> <'   test "$(echo $(grep testfile1 CVS/Entries|cut -d/ -f2,3,5))" = "testfile1/1.1/" &&\n'> 
          <'   test_cmp testfile1 ../testfile1'>
        )
      }
    )
    (C {(cd)} {(DQ ($ VSub_Name '$WORKDIR'))})
    (C {(test_expect_success)} {(SQ <'cvs update (update existing file)'>)} 
      {
        (SQ <'echo line 2 >>testfile1 &&\n'> <'   git add testfile1 &&\n'> 
          <'   git commit -q -m "Append to testfile1" &&\n'> <'   git push gitcvs.git >/dev/null &&\n'> <'   cd cvswork &&\n'> 
          <'   GIT_CONFIG="$git_config" cvs -Q update &&\n'> <'   test "$(echo $(grep testfile1 CVS/Entries|cut -d/ -f2,3,5))" = "testfile1/1.2/" &&\n'> 
          <'   test_cmp testfile1 ../testfile1'>
        )
      }
    )
    (C {(cd)} {(DQ ($ VSub_Name '$WORKDIR'))})
    (C {(test_expect_failure)} {(DQ ("cvs update w/o -d doesn't create subdir (TODO)"))} 
      {
        (SQ <'\n'> <'   mkdir test &&\n'> <'   echo >test/empty &&\n'> <'   git add test &&\n'> 
          <'   git commit -q -m "Single Subdirectory" &&\n'> <'   git push gitcvs.git >/dev/null &&\n'> <'   cd cvswork &&\n'> 
          <'   GIT_CONFIG="$git_config" cvs -Q update &&\n'> <'   test ! -d test\n'>
        )
      }
    )
    (C {(cd)} {(DQ ($ VSub_Name '$WORKDIR'))})
    (C {(test_expect_success)} {(SQ <'cvs update (subdirectories)'>)} 
      {
        (SQ <'(for dir in A A/B A/B/C A/D E; do\n'> <'      mkdir $dir &&\n'> 
          <'      echo "test file in $dir" >"$dir/file_in_$(echo $dir|sed -e "s#/# #g")"  &&\n'> <'      git add $dir;\n'> <'   done) &&\n'> <'   git commit -q -m "deep sub directory structure" &&\n'> 
          <'   git push gitcvs.git >/dev/null &&\n'> <'   cd cvswork &&\n'> <'   GIT_CONFIG="$git_config" cvs -Q update -d &&\n'> 
          <'   (for dir in A A/B A/B/C A/D E; do\n'> <'      filename="file_in_$(echo $dir|sed -e "s#/# #g")" &&\n'> 
          <
'      if test "$(echo $(grep -v ^D $dir/CVS/Entries|cut -d/ -f2,3,5))" = "$filename/1.1/" &&\n'
          > <'\ttest_cmp "$dir/$filename" "../$dir/$filename"; then\n'> <'        :\n'> <'      else\n'> 
          <'        echo >failure\n'> <'      fi\n'> <'    done) &&\n'> <'   test ! -f failure'>
        )
      }
    )
    (C {(cd)} {(DQ ($ VSub_Name '$WORKDIR'))})
    (C {(test_expect_success)} {(SQ <'cvs update (delete file)'>)} 
      {
        (SQ <'git rm testfile1 &&\n'> <'   git commit -q -m "Remove testfile1" &&\n'> 
          <'   git push gitcvs.git >/dev/null &&\n'> <'   cd cvswork &&\n'> <'   GIT_CONFIG="$git_config" cvs -Q update &&\n'> 
          <'   test -z "$(grep testfile1 CVS/Entries)" &&\n'> <'   test ! -f testfile1'>
        )
      }
    )
    (C {(cd)} {(DQ ($ VSub_Name '$WORKDIR'))})
    (C {(test_expect_success)} {(SQ <'cvs update (re-add deleted file)'>)} 
      {
        (SQ <'echo readded testfile >testfile1 &&\n'> <'   git add testfile1 &&\n'> 
          <'   git commit -q -m "Re-Add testfile1" &&\n'> <'   git push gitcvs.git >/dev/null &&\n'> <'   cd cvswork &&\n'> 
          <'   GIT_CONFIG="$git_config" cvs -Q update &&\n'> <'   test "$(echo $(grep testfile1 CVS/Entries|cut -d/ -f2,3,5))" = "testfile1/1.4/" &&\n'> 
          <'   test_cmp testfile1 ../testfile1'>
        )
      }
    )
    (C {(cd)} {(DQ ($ VSub_Name '$WORKDIR'))})
    (C {(test_expect_success)} {(SQ <'cvs update (merge)'>)} 
      {
        (SQ <'echo Line 0 >expected &&\n'> <'   for i in 1 2 3 4 5 6 7\n'> <'   do\n'> 
          <'     echo Line $i >>merge\n'> <'     echo Line $i >>expected\n'> <'   done &&\n'> <'   echo Line 8 >>expected &&\n'> 
          <'   git add merge &&\n'> <'   git commit -q -m "Merge test (pre-merge)" &&\n'> <'   git push gitcvs.git >/dev/null &&\n'> 
          <'   cd cvswork &&\n'> <'   GIT_CONFIG="$git_config" cvs -Q update &&\n'> 
          <'   test "$(echo $(grep merge CVS/Entries|cut -d/ -f2,3,5))" = "merge/1.1/" &&\n'> <'   test_cmp merge ../merge &&\n'> <'   ( echo Line 0; cat merge ) >merge.tmp &&\n'> 
          <'   mv merge.tmp merge &&\n'> <'   cd "$WORKDIR" &&\n'> <'   echo Line 8 >>merge &&\n'> <'   git add merge &&\n'> 
          <'   git commit -q -m "Merge test (merge)" &&\n'> <'   git push gitcvs.git >/dev/null &&\n'> <'   cd cvswork &&\n'> <'   sleep 1 && touch merge &&\n'> 
          <'   GIT_CONFIG="$git_config" cvs -Q update &&\n'> <'   test_cmp merge ../expected'>
        )
      }
    )
    (C {(cd)} {(DQ ($ VSub_Name '$WORKDIR'))})
    (SimpleCommand
      words: [{(cat)}]
      redirects: [
        (Redir op_id:Redir_Great fd:-1 arg_word:{(expected.C)} spids:[1070])
        (HereDoc
          op_id: Redir_DLess
          fd: -1
          body: 
            {
              (DQ ('<<<<<<< merge.mine\n') ('Line 0\n') ('=======\n') ('LINE 0\n') 
                ('>>>>>>> merge.1.3\n')
              )
            }
          do_expansion: True
          here_end: EOF
          was_filled: True
          spids: [1073]
        )
      ]
    )
    (ForEach
      iter_name: i
      iter_words: [{(1)} {(2)} {(3)} {(4)} {(5)} {(6)} {(7)} {(8)}]
      do_arg_iter: False
      body: 
        (DoGroup
          children: [
            (SimpleCommand
              words: [{(echo)} {(Line)} {($ VSub_Name '$i')}]
              redirects: [(Redir op_id:Redir_DGreat fd:-1 arg_word:{(expected.C)} spids:[1114])]
            )
          ]
          spids: [1105 1117]
        )
      spids: [1088 -1]
    )
    (C {(test_expect_success)} {(SQ <'cvs update (conflict merge)'>)} 
      {
        (SQ <'( echo LINE 0; cat merge ) >merge.tmp &&\n'> <'   mv merge.tmp merge &&\n'> 
          <'   git add merge &&\n'> <'   git commit -q -m "Merge test (conflict)" &&\n'> <'   git push gitcvs.git >/dev/null &&\n'> 
          <'   cd cvswork &&\n'> <'   GIT_CONFIG="$git_config" cvs -Q update &&\n'> <'   test_cmp merge ../expected.C'>
        )
      }
    )
    (C {(cd)} {(DQ ($ VSub_Name '$WORKDIR'))})
    (C {(test_expect_success)} {(SQ <'cvs update (-C)'>)} 
      {
        (SQ <'cd cvswork &&\n'> <'   GIT_CONFIG="$git_config" cvs -Q update -C &&\n'> 
          <'   test_cmp merge ../merge'>
        )
      }
    )
    (C {(cd)} {(DQ ($ VSub_Name '$WORKDIR'))})
    (C {(test_expect_success)} {(SQ <'cvs update (merge no-op)'>)} 
      {
        (SQ <'echo Line 9 >>merge &&\n'> <'    cp merge cvswork/merge &&\n'> <'    git add merge &&\n'> 
          <'    git commit -q -m "Merge test (no-op)" &&\n'> <'    git push gitcvs.git >/dev/null &&\n'> <'    cd cvswork &&\n'> <'    sleep 1 && touch merge &&\n'> 
          <'    GIT_CONFIG="$git_config" cvs -Q update &&\n'> <'    test_cmp merge ../merge'>
        )
      }
    )
    (C {(cd)} {(DQ ($ VSub_Name '$WORKDIR'))})
    (C {(test_expect_success)} {(SQ <'cvs update (-p)'>)} 
      {
        (SQ <'\n'> <'    touch really-empty &&\n'> <'    echo Line 1 > no-lf &&\n'> 
          <'    printf "Line 2" >> no-lf &&\n'> <'    git add really-empty no-lf &&\n'> <'    git commit -q -m "Update -p test" &&\n'> 
          <'    git push gitcvs.git >/dev/null &&\n'> <'    cd cvswork &&\n'> <'    GIT_CONFIG="$git_config" cvs update &&\n'> <'    rm -f failures &&\n'> 
          <'    for i in merge no-lf empty really-empty; do\n'> <'        GIT_CONFIG="$git_config" cvs update -p "$i" >$i.out\n'> 
          <'\ttest_cmp $i.out ../$i >>failures 2>&1\n'> <'    done &&\n'> <'    test -z "$(cat failures)"\n'>
        )
      }
    )
    (C {(cd)} {(DQ ($ VSub_Name '$WORKDIR'))})
    (C {(test_expect_success)} {(SQ <'cvs update (module list supports packed refs)'>)} 
      {
        (SQ <'\n'> <'    GIT_DIR="$SERVERDIR" git pack-refs --all &&\n'> 
          <'    GIT_CONFIG="$git_config" cvs -n up -d 2> out &&\n'> <'    grep "cvs update: New directory \\`master'>
        ) (EscapedLiteralPart token:<Lit_EscapedChar "\\'">) (SQ <'" < out\n'>)
      }
    )
    (C {(cd)} {(DQ ($ VSub_Name '$WORKDIR'))})
    (C {(test_expect_success)} {(SQ <'cvs status'>)} 
      {
        (SQ <'\n'> <'    mkdir status.dir &&\n'> <'    echo Line > status.dir/status.file &&\n'> 
          <'    echo Line > status.file &&\n'> <'    git add status.dir status.file &&\n'> <'    git commit -q -m "Status test" &&\n'> 
          <'    git push gitcvs.git >/dev/null &&\n'> <'    cd cvswork &&\n'> <'    GIT_CONFIG="$git_config" cvs update &&\n'> 
          <'    GIT_CONFIG="$git_config" cvs status | grep "^File: status.file" >../out &&\n'> <'    test_line_count = 2 ../out\n'>
        )
      }
    )
    (C {(cd)} {(DQ ($ VSub_Name '$WORKDIR'))})
    (C {(test_expect_success)} {(SQ <'cvs status (nonrecursive)'>)} 
      {
        (SQ <'\n'> <'    cd cvswork &&\n'> 
          <'    GIT_CONFIG="$git_config" cvs status -l | grep "^File: status.file" >../out &&\n'> <'    test_line_count = 1 ../out\n'>
        )
      }
    )
    (C {(cd)} {(DQ ($ VSub_Name '$WORKDIR'))})
    (C {(test_expect_success)} {(SQ <'cvs status (no subdirs in header)'>)} 
      {
        (SQ <'\n'> <'    cd cvswork &&\n'> 
          <'    GIT_CONFIG="$git_config" cvs status | grep ^File: >../out &&\n'> <'    ! grep / <../out\n'>
        )
      }
    )
    (C {(cd)} {(DQ ($ VSub_Name '$WORKDIR'))})
    (C {(test_expect_success)} {(SQ <'cvs co -c (shows module database)'>)} 
      {
        (SQ <'\n'> <'    GIT_CONFIG="$git_config" cvs co -c > out &&\n'> 
          <'    grep "^master[\t ][ \t]*master$" <out &&\n'> <'    ! grep -v "^master[\t ][ \t]*master$" <out\n'>
        )
      }
    )
    (SimpleCommand
      words: [{(sed)} {(-e)} {(SQ <'s/^x//'>)} {(-e)} {(SQ <'s/SP$/ /'>)}]
      redirects: [
        (Redir
          op_id: Redir_Great
          fd: -1
          arg_word: {(DQ ($ VSub_Name '$WORKDIR') (/expect))}
          spids: [1423]
        )
        (HereDoc
          op_id: Redir_DLess
          fd: -1
          body: 
            {
              (DQ ('x\n') ('xRCS file: ') ($ VSub_Name '$WORKDIR') ('/gitcvs.git/master/merge,v\n') 
                ('xWorking file: merge\n') ('xhead: 1.4\n') ('xbranch:\n') ('xlocks: strict\n') ('xaccess list:\n') ('xsymbolic names:\n') 
                ('xkeyword substitution: kv\n') ('xtotal revisions: 4;\tselected revisions: 4\n') ('xdescription:\n') 
                ('x----------------------------\n') ('xrevision 1.4\n') ('xdate: __DATE__;  author: author;  state: Exp;  lines: +2 -3\n') ('x\n') 
                ('xMerge test (no-op)\n') ('xSP\n') ('x----------------------------\n') ('xrevision 1.3\n') 
                ('xdate: __DATE__;  author: author;  state: Exp;  lines: +2 -3\n') ('x\n') ('xMerge test (conflict)\n') ('xSP\n') ('x----------------------------\n') ('xrevision 1.2\n') 
                ('xdate: __DATE__;  author: author;  state: Exp;  lines: +2 -3\n') ('x\n') ('xMerge test (merge)\n') ('xSP\n') ('x----------------------------\n') ('xrevision 1.1\n') 
                ('xdate: __DATE__;  author: author;  state: Exp;  lines: +2 -3\n') ('x\n') ('xMerge test (pre-merge)\n') ('xSP\n') 
                (
'x=============================================================================\n'
                )
              )
            }
          do_expansion: True
          here_end: EOF
          was_filled: True
          spids: [1430]
        )
      ]
    )
    (Assignment
      keyword: Assign_None
      pairs: [
        (assign_pair
          lhs: (LhsName name:expectStat)
          op: Equal
          rhs: {(DQ ($ VSub_QMark '$?'))}
          spids: [1472]
        )
      ]
      spids: [1472]
    )
    (C {(cd)} {(DQ ($ VSub_Name '$WORKDIR'))})
    (C {(test_expect_success)} {(SQ <'cvs log'>)} 
      {
        (SQ <'\n'> <'    cd cvswork &&\n'> <'    test x"$expectStat" = x"0" &&\n'> 
          <'    GIT_CONFIG="$git_config" cvs log merge >../out &&\n'> 
          <
'    sed -e "s%2[0-9][0-9][0-9]/[01][0-9]/[0-3][0-9] [0-2][0-9]:[0-5][0-9]:[0-5][0-9]%__DATE__%" ../out > ../actual &&\n'
          > <'    test_cmp ../expect ../actual\n'>
        )
      }
    )
    (C {(cd)} {(DQ ($ VSub_Name '$WORKDIR'))})
    (C {(test_expect_success)} {(SQ <'cvs annotate'>)} 
      {
        (SQ <'\n'> <'    cd cvswork &&\n'> 
          <'    GIT_CONFIG="$git_config" cvs annotate merge >../out &&\n'> <'    sed -e "s/ .*//" ../out >../actual &&\n'> 
          <'    for i in 3 1 1 1 1 1 1 1 2 4; do echo 1.$i; done >../expect &&\n'> <'    test_cmp ../expect ../actual\n'>
        )
      }
    )
    (C {(test_done)})
  ]
)