(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:'Test of the various options to git rm.' span_id:15))}
          spids: [13]
        )
      ]
    )
    (C {(.)} {(./test-lib.sh)})
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'Initialize test directory' span_id:32))} 
      {
        (DQ ("touch -- foo bar baz 'space embedded' -q &&\n") 
          ("     git add -- foo bar baz 'space embedded' -q &&\n") ("     git commit -m 'add normal files'")
        )
      }
    )
    (command.If
      arms: [
        (if_arm
          cond: [
            (command.AndOr
              ops: [Id.Op_DAmp]
              children: [
                (C {(test_have_prereq)} {(Id.KW_Bang '!') (MINGW)})
                (command.Simple
                  words: [
                    {(touch)}
                    {(--)}
                    {(SQ (Token id:Id.Lit_Chars val:'tab\tembedded' span_id:58))}
                    {
                      (SQ (Token id:Id.Lit_Chars val:'newline\n' span_id:62) 
                        (Token id:Id.Lit_Chars val:embedded span_id:63)
                      )
                    }
                  ]
                  redirects: [
                    (redir.Redir
                      op: (Token id:Id.Redir_Great val:'2>' span_id:66)
                      fd: 2
                      arg_word: {(/dev/null)}
                    )
                  ]
                )
              ]
            )
          ]
          action: [(C {(test_set_prereq)} {(FUNNYNAMES)})]
          spids: [44 69]
        )
      ]
      else_action: [
        (C {(say)} 
          {
            (SQ 
              (Token
                id: Id.Lit_Chars
                val: 'Your filesystem does not allow tabs in filenames.'
                span_id: 82
              )
            )
          }
        )
      ]
    )
    (C {(test_expect_success)} {(FUNNYNAMES)} 
      {(SQ (Token id:Id.Lit_Chars val:'add files with funny names' span_id:93))} 
      {
        (DQ ('\n') ("     git add -- 'tab\tembedded' 'newline\n") ("embedded' &&\n") 
          ("     git commit -m 'add files with tabs and newlines'\n")
        )
      }
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'Pre-check that foo exists and is in index before git rm foo'
            span_id: 109
          )
        )
      } {(SQ (Token id:Id.Lit_Chars val:'[ -f foo ] && git ls-files --error-unmatch foo' span_id:115))}
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'Test that git rm foo succeeds' span_id:124))} {(SQ (Token id:Id.Lit_Chars val:'git rm --cached foo' span_id:130))}
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'Test that git rm --cached foo succeeds if the index matches the file'
            span_id: 139
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'echo content >foo &&\n' span_id:145) 
          (Token id:Id.Lit_Chars val:'     git add foo &&\n' span_id:146) (Token id:Id.Lit_Chars val:'     git rm --cached foo' span_id:147)
        )
      }
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'Test that git rm --cached foo succeeds if the index matches the file'
            span_id: 156
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'echo content >foo &&\n' span_id:162) 
          (Token id:Id.Lit_Chars val:'     git add foo &&\n' span_id:163) (Token id:Id.Lit_Chars val:'     git commit -m foo &&\n' span_id:164) 
          (Token id:Id.Lit_Chars val:'     echo "other content" >foo &&\n' span_id:165) (Token id:Id.Lit_Chars val:'     git rm --cached foo' span_id:166)
        )
      }
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 
'Test that git rm --cached foo fails if the index matches neither the file nor HEAD'
            span_id: 175
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:179) 
          (Token id:Id.Lit_Chars val:'     echo content >foo &&\n' span_id:180) (Token id:Id.Lit_Chars val:'     git add foo &&\n' span_id:181) 
          (Token
            id: Id.Lit_Chars
            val: '     git commit -m foo --allow-empty &&\n'
            span_id: 182
          ) (Token id:Id.Lit_Chars val:'     echo "other content" >foo &&\n' span_id:183) 
          (Token id:Id.Lit_Chars val:'     git add foo &&\n' span_id:184) (Token id:Id.Lit_Chars val:'     echo "yet another content" >foo &&\n' span_id:185) 
          (Token
            id: Id.Lit_Chars
            val: '     test_must_fail git rm --cached foo\n'
            span_id: 186
          )
        )
      }
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'Test that git rm --cached -f foo works in case where --cached only did not'
            span_id: 195
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'echo content >foo &&\n' span_id:201) 
          (Token id:Id.Lit_Chars val:'     git add foo &&\n' span_id:202) (Token id:Id.Lit_Chars val:'     git commit -m foo --allow-empty &&\n' span_id:203) 
          (Token id:Id.Lit_Chars val:'     echo "other content" >foo &&\n' span_id:204) (Token id:Id.Lit_Chars val:'     git add foo &&\n' span_id:205) 
          (Token
            id: Id.Lit_Chars
            val: '     echo "yet another content" >foo &&\n'
            span_id: 206
          ) (Token id:Id.Lit_Chars val:'     git rm --cached -f foo' span_id:207)
        )
      }
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'Post-check that foo exists but is not in index after git rm foo'
            span_id: 216
          )
        )
      } 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: '[ -f foo ] && test_must_fail git ls-files --error-unmatch foo'
            span_id: 222
          )
        )
      }
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'Pre-check that bar exists and is in index before "git rm bar"'
            span_id: 231
          )
        )
      } {(SQ (Token id:Id.Lit_Chars val:'[ -f bar ] && git ls-files --error-unmatch bar' span_id:237))}
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'Test that "git rm bar" succeeds' span_id:246))} {(SQ (Token id:Id.Lit_Chars val:'git rm bar' span_id:252))}
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'Post-check that bar does not exist and is not in index after "git rm -f bar"'
            span_id: 261
          )
        )
      } 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: '! [ -f bar ] && test_must_fail git ls-files --error-unmatch bar'
            span_id: 267
          )
        )
      }
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'Test that "git rm -- -q" succeeds (remove a file that looks like an option)'
            span_id: 276
          )
        )
      } {(SQ (Token id:Id.Lit_Chars val:'git rm -- -q' span_id:282))}
    )
    (C {(test_expect_success)} {(FUNNYNAMES)} 
      {
        (DQ ('Test that ') 
          (word_part.EscapedLiteral
            token: (Token id:Id.Lit_EscapedChar val:'\\"' span_id:294)
          ) ('git rm -f') (word_part.EscapedLiteral token:(Token id:Id.Lit_EscapedChar val:'\\"' span_id:296)) 
          (' succeeds with embedded space, tab, or newline characters.')
        )
      } {(DQ ("git rm -f 'space embedded' 'tab\tembedded' 'newline\n") ("embedded'"))}
    )
    (C {(test_expect_success)} {(SANITY)} 
      {(SQ (Token id:Id.Lit_Chars val:'Test that "git rm -f" fails if its rm fails' span_id:313))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:317) 
          (Token id:Id.Lit_Chars val:'\tchmod a-w . &&\n' span_id:318) (Token id:Id.Lit_Chars val:'\ttest_must_fail git rm -f baz &&\n' span_id:319) 
          (Token id:Id.Lit_Chars val:'\tchmod 775 .\n' span_id:320)
        )
      }
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'When the rm in "git rm -f" fails, it should not remove the file from the index'
            span_id: 329
          )
        )
      } {(SQ (Token id:Id.Lit_Chars val:'git ls-files --error-unmatch baz' span_id:335))}
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'Remove nonexistent file with --ignore-unmatch' span_id:342))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:346) 
          (Token id:Id.Lit_Chars val:'\tgit rm --ignore-unmatch nonexistent\n' span_id:347)
        )
      }
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'"rm" command printed' span_id:354))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:358) 
          (Token id:Id.Lit_Chars val:'\techo frotz > test-file &&\n' span_id:359) (Token id:Id.Lit_Chars val:'\tgit add test-file &&\n' span_id:360) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit commit -m "add file for rm test" &&\n'
            span_id: 361
          ) (Token id:Id.Lit_Chars val:'\tgit rm test-file > rm-output &&\n' span_id:362) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest $(grep "^rm " rm-output | wc -l) = 1 &&\n'
            span_id: 363
          ) (Token id:Id.Lit_Chars val:'\trm -f test-file rm-output &&\n' span_id:364) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit commit -m "remove file from rm test"\n'
            span_id: 365
          )
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'"rm" command suppressed with --quiet' span_id:372))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:376) 
          (Token id:Id.Lit_Chars val:'\techo frotz > test-file &&\n' span_id:377) (Token id:Id.Lit_Chars val:'\tgit add test-file &&\n' span_id:378) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit commit -m "add file for rm --quiet test" &&\n'
            span_id: 379
          ) (Token id:Id.Lit_Chars val:'\tgit rm --quiet test-file > rm-output &&\n' span_id:380) 
          (Token id:Id.Lit_Chars val:'\ttest $(wc -l < rm-output) = 0 &&\n' span_id:381) (Token id:Id.Lit_Chars val:'\trm -f test-file rm-output &&\n' span_id:382) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit commit -m "remove file from rm --quiet test"\n'
            span_id: 383
          )
        )
      }
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'Re-add foo and baz' span_id:393))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:397) 
          (Token id:Id.Lit_Chars val:'\tgit add foo baz &&\n' span_id:398) (Token id:Id.Lit_Chars val:'\tgit ls-files --error-unmatch foo baz\n' span_id:399)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'Modify foo -- rm should refuse' span_id:406))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:410) 
          (Token id:Id.Lit_Chars val:'\techo >>foo &&\n' span_id:411) (Token id:Id.Lit_Chars val:'\ttest_must_fail git rm foo baz &&\n' span_id:412) 
          (Token id:Id.Lit_Chars val:'\ttest -f foo &&\n' span_id:413) (Token id:Id.Lit_Chars val:'\ttest -f baz &&\n' span_id:414) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit ls-files --error-unmatch foo baz\n'
            span_id: 415
          )
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'Modified foo -- rm -f should work' span_id:422))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:426) 
          (Token id:Id.Lit_Chars val:'\tgit rm -f foo baz &&\n' span_id:427) (Token id:Id.Lit_Chars val:'\ttest ! -f foo &&\n' span_id:428) 
          (Token id:Id.Lit_Chars val:'\ttest ! -f baz &&\n' span_id:429) (Token id:Id.Lit_Chars val:'\ttest_must_fail git ls-files --error-unmatch foo &&\n' span_id:430) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest_must_fail git ls-files --error-unmatch bar\n'
            span_id: 431
          )
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'Re-add foo and baz for HEAD tests' span_id:438))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:442) 
          (Token id:Id.Lit_Chars val:'\techo frotz >foo &&\n' span_id:443) (Token id:Id.Lit_Chars val:'\tgit checkout HEAD -- baz &&\n' span_id:444) 
          (Token id:Id.Lit_Chars val:'\tgit add foo baz &&\n' span_id:445) (Token id:Id.Lit_Chars val:'\tgit ls-files --error-unmatch foo baz\n' span_id:446)
        )
      }
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'foo is different in index from HEAD -- rm should refuse'
            span_id: 453
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:457) 
          (Token id:Id.Lit_Chars val:'\ttest_must_fail git rm foo baz &&\n' span_id:458) (Token id:Id.Lit_Chars val:'\ttest -f foo &&\n' span_id:459) 
          (Token id:Id.Lit_Chars val:'\ttest -f baz &&\n' span_id:460) (Token id:Id.Lit_Chars val:'\tgit ls-files --error-unmatch foo baz\n' span_id:461)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'but with -f it should work.' span_id:468))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:472) 
          (Token id:Id.Lit_Chars val:'\tgit rm -f foo baz &&\n' span_id:473) (Token id:Id.Lit_Chars val:'\ttest ! -f foo &&\n' span_id:474) 
          (Token id:Id.Lit_Chars val:'\ttest ! -f baz &&\n' span_id:475) (Token id:Id.Lit_Chars val:'\ttest_must_fail git ls-files --error-unmatch foo &&\n' span_id:476) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest_must_fail git ls-files --error-unmatch baz\n'
            span_id: 477
          )
        )
      }
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'refuse to remove cached empty file with modifications'
            span_id: 484
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:488) 
          (Token id:Id.Lit_Chars val:'\t>empty &&\n' span_id:489) (Token id:Id.Lit_Chars val:'\tgit add empty &&\n' span_id:490) 
          (Token id:Id.Lit_Chars val:'\techo content >empty &&\n' span_id:491) (Token id:Id.Lit_Chars val:'\ttest_must_fail git rm --cached empty\n' span_id:492)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'remove intent-to-add file without --force' span_id:499))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:503) 
          (Token id:Id.Lit_Chars val:'\techo content >intent-to-add &&\n' span_id:504) (Token id:Id.Lit_Chars val:'\tgit add -N intent-to-add &&\n' span_id:505) 
          (Token id:Id.Lit_Chars val:'\tgit rm --cached intent-to-add\n' span_id:506)
        )
      }
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'Recursive test setup' span_id:513))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:517) 
          (Token id:Id.Lit_Chars val:'\tmkdir -p frotz &&\n' span_id:518) (Token id:Id.Lit_Chars val:'\techo qfwfq >frotz/nitfol &&\n' span_id:519) 
          (Token id:Id.Lit_Chars val:'\tgit add frotz &&\n' span_id:520) (Token id:Id.Lit_Chars val:'\tgit commit -m "subdir test"\n' span_id:521)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'Recursive without -r fails' span_id:528))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:532) 
          (Token id:Id.Lit_Chars val:'\ttest_must_fail git rm frotz &&\n' span_id:533) (Token id:Id.Lit_Chars val:'\ttest -d frotz &&\n' span_id:534) 
          (Token id:Id.Lit_Chars val:'\ttest -f frotz/nitfol\n' span_id:535)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'Recursive with -r but dirty' span_id:542))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:546) 
          (Token id:Id.Lit_Chars val:'\techo qfwfq >>frotz/nitfol &&\n' span_id:547) (Token id:Id.Lit_Chars val:'\ttest_must_fail git rm -r frotz &&\n' span_id:548) 
          (Token id:Id.Lit_Chars val:'\ttest -d frotz &&\n' span_id:549) (Token id:Id.Lit_Chars val:'\ttest -f frotz/nitfol\n' span_id:550)
        )
      }
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'Recursive with -r -f' span_id:557))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:561) 
          (Token id:Id.Lit_Chars val:'\tgit rm -f -r frotz &&\n' span_id:562) (Token id:Id.Lit_Chars val:'\t! test -f frotz/nitfol &&\n' span_id:563) 
          (Token id:Id.Lit_Chars val:'\t! test -d frotz\n' span_id:564)
        )
      }
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'Remove nonexistent file returns nonzero exit status'
            span_id: 571
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:575) 
          (Token id:Id.Lit_Chars val:'\ttest_must_fail git rm nonexistent\n' span_id:576)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'Call "rm" from outside the work tree' span_id:583))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:587) 
          (Token id:Id.Lit_Chars val:'\tmkdir repo &&\n' span_id:588) (Token id:Id.Lit_Chars val:'\t(cd repo &&\n' span_id:589) 
          (Token id:Id.Lit_Chars val:'\t git init &&\n' span_id:590) (Token id:Id.Lit_Chars val:'\t echo something > somefile &&\n' span_id:591) 
          (Token id:Id.Lit_Chars val:'\t git add somefile &&\n' span_id:592) (Token id:Id.Lit_Chars val:'\t git commit -m "add a file" &&\n' span_id:593) 
          (Token id:Id.Lit_Chars val:'\t (cd .. &&\n' span_id:594) 
          (Token
            id: Id.Lit_Chars
            val: '\t  git --git-dir=repo/.git --work-tree=repo rm somefile) &&\n'
            span_id: 595
          ) (Token id:Id.Lit_Chars val:'\ttest_must_fail git ls-files --error-unmatch somefile)\n' span_id:596)
        )
      }
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'refresh index before checking if it is up-to-date'
            span_id: 603
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:607) (Token id:Id.Lit_Chars val:'\n' span_id:608) 
          (Token id:Id.Lit_Chars val:'\tgit reset --hard &&\n' span_id:609) (Token id:Id.Lit_Chars val:'\ttest-chmtime -86400 frotz/nitfol &&\n' span_id:610) 
          (Token id:Id.Lit_Chars val:'\tgit rm frotz/nitfol &&\n' span_id:611) (Token id:Id.Lit_Chars val:'\ttest ! -f frotz/nitfol\n' span_id:612) 
          (Token id:Id.Lit_Chars val:'\n' span_id:613)
        )
      }
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'choking "git rm" should not let it die with cruft'
            span_id: 620
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:624) 
          (Token id:Id.Lit_Chars val:'\tgit reset -q --hard &&\n' span_id:625) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest_when_finished "rm -f .git/index.lock && git reset -q --hard" &&\n'
            span_id: 626
          ) (Token id:Id.Lit_Chars val:'\ti=0 &&\n' span_id:627) 
          (Token id:Id.Lit_Chars val:'\twhile test $i -lt 12000\n' span_id:628) (Token id:Id.Lit_Chars val:'\tdo\n' span_id:629) 
          (Token
            id: Id.Lit_Chars
            val: '\t    echo "100644 1234567890123456789012345678901234567890 0\tsome-file-$i"\n'
            span_id: 630
          ) (Token id:Id.Lit_Chars val:'\t    i=$(( $i + 1 ))\n' span_id:631) 
          (Token
            id: Id.Lit_Chars
            val: '\tdone | git update-index --index-info &&\n'
            span_id: 632
          ) (Token id:Id.Lit_Chars val:'\tgit rm -n "some-file-*" | : &&\n' span_id:633) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest_path_is_missing .git/index.lock\n'
            span_id: 634
          )
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'rm removes subdirectories recursively' span_id:641))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:645) 
          (Token id:Id.Lit_Chars val:'\tmkdir -p dir/subdir/subsubdir &&\n' span_id:646) (Token id:Id.Lit_Chars val:'\techo content >dir/subdir/subsubdir/file &&\n' span_id:647) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit add dir/subdir/subsubdir/file &&\n'
            span_id: 648
          ) (Token id:Id.Lit_Chars val:'\tgit rm -f dir/subdir/subsubdir/file &&\n' span_id:649) 
          (Token id:Id.Lit_Chars val:'\t! test -d dir\n' span_id:650)
        )
      }
    )
    (command.Simple
      words: [{(cat)}]
      redirects: [
        (redir.Redir
          op: (Token id:Id.Redir_Great val:'>' span_id:656)
          fd: -1
          arg_word: {(expect)}
        )
        (redir.HereDoc
          op: (Token id:Id.Redir_DLess val:'<<' span_id:659)
          fd: -1
          here_begin: {(EOF)}
          here_end_span_id: 665
          stdin_parts: [('M  .gitmodules\n') ('D  submod\n')]
        )
      ]
    )
    (command.Simple
      words: [{(cat)}]
      redirects: [
        (redir.Redir
          op: (Token id:Id.Redir_Great val:'>' span_id:669)
          fd: -1
          arg_word: {(expect.modified)}
        )
        (redir.HereDoc
          op: (Token id:Id.Redir_DLess val:'<<' span_id:672)
          fd: -1
          here_begin: {(EOF)}
          here_end_span_id: 677
          stdin_parts: [(' M submod\n')]
        )
      ]
    )
    (command.Simple
      words: [{(cat)}]
      redirects: [
        (redir.Redir
          op: (Token id:Id.Redir_Great val:'>' span_id:681)
          fd: -1
          arg_word: {(expect.cached)}
        )
        (redir.HereDoc
          op: (Token id:Id.Redir_DLess val:'<<' span_id:684)
          fd: -1
          here_begin: {(EOF)}
          here_end_span_id: 689
          stdin_parts: [('D  submod\n')]
        )
      ]
    )
    (command.Simple
      words: [{(cat)}]
      redirects: [
        (redir.Redir
          op: (Token id:Id.Redir_Great val:'>' span_id:693)
          fd: -1
          arg_word: {(expect.both_deleted)}
        )
        (redir.HereDoc
          op: (Token id:Id.Redir_DLess val:'<<' span_id:695)
          fd: -1
          here_begin: {(EOF)}
          here_end_span_id: 701
          stdin_parts: [('D  .gitmodules\n') ('D  submod\n')]
        )
      ]
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'rm removes empty submodules from work tree' span_id:706))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:710) 
          (Token id:Id.Lit_Chars val:'\tmkdir submod &&\n' span_id:711) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit update-index --add --cacheinfo 160000 $(git rev-parse HEAD) submod &&\n'
            span_id: 712
          ) (Token id:Id.Lit_Chars val:'\tgit config -f .gitmodules submodule.sub.url ./. &&\n' span_id:713) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit config -f .gitmodules submodule.sub.path submod &&\n'
            span_id: 714
          ) (Token id:Id.Lit_Chars val:'\tgit submodule init &&\n' span_id:715) 
          (Token id:Id.Lit_Chars val:'\tgit add .gitmodules &&\n' span_id:716) (Token id:Id.Lit_Chars val:'\tgit commit -m "add submodule" &&\n' span_id:717) 
          (Token id:Id.Lit_Chars val:'\tgit rm submod &&\n' span_id:718) (Token id:Id.Lit_Chars val:'\ttest ! -e submod &&\n' span_id:719) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit status -s -uno --ignore-submodules=none > actual &&\n'
            span_id: 720
          ) (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual &&\n' span_id:721) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest_must_fail git config -f .gitmodules submodule.sub.url &&\n'
            span_id: 722
          ) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest_must_fail git config -f .gitmodules submodule.sub.path\n'
            span_id: 723
          )
        )
      }
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'rm removes removed submodule from index and .gitmodules'
            span_id: 730
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:734) 
          (Token id:Id.Lit_Chars val:'\tgit reset --hard &&\n' span_id:735) (Token id:Id.Lit_Chars val:'\tgit submodule update &&\n' span_id:736) 
          (Token id:Id.Lit_Chars val:'\trm -rf submod &&\n' span_id:737) (Token id:Id.Lit_Chars val:'\tgit rm submod &&\n' span_id:738) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit status -s -uno --ignore-submodules=none > actual &&\n'
            span_id: 739
          ) (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual &&\n' span_id:740) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest_must_fail git config -f .gitmodules submodule.sub.url &&\n'
            span_id: 741
          ) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest_must_fail git config -f .gitmodules submodule.sub.path\n'
            span_id: 742
          )
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'rm removes work tree of unmodified submodules' span_id:749))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:753) 
          (Token id:Id.Lit_Chars val:'\tgit reset --hard &&\n' span_id:754) (Token id:Id.Lit_Chars val:'\tgit submodule update &&\n' span_id:755) 
          (Token id:Id.Lit_Chars val:'\tgit rm submod &&\n' span_id:756) (Token id:Id.Lit_Chars val:'\ttest ! -d submod &&\n' span_id:757) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit status -s -uno --ignore-submodules=none > actual &&\n'
            span_id: 758
          ) (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual &&\n' span_id:759) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest_must_fail git config -f .gitmodules submodule.sub.url &&\n'
            span_id: 760
          ) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest_must_fail git config -f .gitmodules submodule.sub.path\n'
            span_id: 761
          )
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'rm removes a submodule with a trailing /' span_id:768))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:772) 
          (Token id:Id.Lit_Chars val:'\tgit reset --hard &&\n' span_id:773) (Token id:Id.Lit_Chars val:'\tgit submodule update &&\n' span_id:774) 
          (Token id:Id.Lit_Chars val:'\tgit rm submod/ &&\n' span_id:775) (Token id:Id.Lit_Chars val:'\ttest ! -d submod &&\n' span_id:776) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit status -s -uno --ignore-submodules=none > actual &&\n'
            span_id: 777
          ) (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual\n' span_id:778)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'rm fails when given a file with a trailing /' span_id:785))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:789) 
          (Token id:Id.Lit_Chars val:'\ttest_must_fail git rm empty/\n' span_id:790)
        )
      }
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'rm succeeds when given a directory with a trailing /'
            span_id: 797
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:801) 
          (Token id:Id.Lit_Chars val:'\tgit rm -r frotz/\n' span_id:802)
        )
      }
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'rm of a populated submodule with different HEAD fails unless forced'
            span_id: 809
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:813) 
          (Token id:Id.Lit_Chars val:'\tgit reset --hard &&\n' span_id:814) (Token id:Id.Lit_Chars val:'\tgit submodule update &&\n' span_id:815) 
          (Token id:Id.Lit_Chars val:'\t(cd submod &&\n' span_id:816) (Token id:Id.Lit_Chars val:'\t\tgit checkout HEAD^\n' span_id:817) 
          (Token id:Id.Lit_Chars val:'\t) &&\n' span_id:818) (Token id:Id.Lit_Chars val:'\ttest_must_fail git rm submod &&\n' span_id:819) 
          (Token id:Id.Lit_Chars val:'\ttest -d submod &&\n' span_id:820) (Token id:Id.Lit_Chars val:'\ttest -f submod/.git &&\n' span_id:821) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit status -s -uno --ignore-submodules=none > actual &&\n'
            span_id: 822
          ) (Token id:Id.Lit_Chars val:'\ttest_cmp expect.modified actual &&\n' span_id:823) 
          (Token id:Id.Lit_Chars val:'\tgit rm -f submod &&\n' span_id:824) (Token id:Id.Lit_Chars val:'\ttest ! -d submod &&\n' span_id:825) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit status -s -uno --ignore-submodules=none > actual &&\n'
            span_id: 826
          ) (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual &&\n' span_id:827) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest_must_fail git config -f .gitmodules submodule.sub.url &&\n'
            span_id: 828
          ) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest_must_fail git config -f .gitmodules submodule.sub.path\n'
            span_id: 829
          )
        )
      }
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'rm --cached leaves work tree of populated submodules and .gitmodules alone'
            span_id: 836
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:840) 
          (Token id:Id.Lit_Chars val:'\tgit reset --hard &&\n' span_id:841) (Token id:Id.Lit_Chars val:'\tgit submodule update &&\n' span_id:842) 
          (Token id:Id.Lit_Chars val:'\tgit rm --cached submod &&\n' span_id:843) (Token id:Id.Lit_Chars val:'\ttest -d submod &&\n' span_id:844) 
          (Token id:Id.Lit_Chars val:'\ttest -f submod/.git &&\n' span_id:845) (Token id:Id.Lit_Chars val:'\tgit status -s -uno >actual &&\n' span_id:846) 
          (Token id:Id.Lit_Chars val:'\ttest_cmp expect.cached actual &&\n' span_id:847) (Token id:Id.Lit_Chars val:'\tgit config -f .gitmodules submodule.sub.url &&\n' span_id:848) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit config -f .gitmodules submodule.sub.path\n'
            span_id: 849
          )
        )
      }
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'rm --dry-run does not touch the submodule or .gitmodules'
            span_id: 856
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:860) 
          (Token id:Id.Lit_Chars val:'\tgit reset --hard &&\n' span_id:861) (Token id:Id.Lit_Chars val:'\tgit submodule update &&\n' span_id:862) 
          (Token id:Id.Lit_Chars val:'\tgit rm -n submod &&\n' span_id:863) (Token id:Id.Lit_Chars val:'\ttest -f submod/.git &&\n' span_id:864) 
          (Token id:Id.Lit_Chars val:'\tgit diff-index --exit-code HEAD\n' span_id:865)
        )
      }
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'rm does not complain when no .gitmodules file is found'
            span_id: 872
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:876) 
          (Token id:Id.Lit_Chars val:'\tgit reset --hard &&\n' span_id:877) (Token id:Id.Lit_Chars val:'\tgit submodule update &&\n' span_id:878) 
          (Token id:Id.Lit_Chars val:'\tgit rm .gitmodules &&\n' span_id:879) (Token id:Id.Lit_Chars val:'\tgit rm submod >actual 2>actual.err &&\n' span_id:880) 
          (Token id:Id.Lit_Chars val:'\t! test -s actual.err &&\n' span_id:881) (Token id:Id.Lit_Chars val:'\t! test -d submod &&\n' span_id:882) 
          (Token id:Id.Lit_Chars val:'\t! test -f submod/.git &&\n' span_id:883) (Token id:Id.Lit_Chars val:'\tgit status -s -uno >actual &&\n' span_id:884) 
          (Token id:Id.Lit_Chars val:'\ttest_cmp expect.both_deleted actual\n' span_id:885)
        )
      }
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'rm will error out on a modified .gitmodules file unless staged'
            span_id: 892
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:896) 
          (Token id:Id.Lit_Chars val:'\tgit reset --hard &&\n' span_id:897) (Token id:Id.Lit_Chars val:'\tgit submodule update &&\n' span_id:898) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit config -f .gitmodules foo.bar true &&\n'
            span_id: 899
          ) (Token id:Id.Lit_Chars val:'\ttest_must_fail git rm submod >actual 2>actual.err &&\n' span_id:900) 
          (Token id:Id.Lit_Chars val:'\ttest -s actual.err &&\n' span_id:901) (Token id:Id.Lit_Chars val:'\ttest -d submod &&\n' span_id:902) 
          (Token id:Id.Lit_Chars val:'\ttest -f submod/.git &&\n' span_id:903) (Token id:Id.Lit_Chars val:'\tgit diff-files --quiet -- submod &&\n' span_id:904) 
          (Token id:Id.Lit_Chars val:'\tgit add .gitmodules &&\n' span_id:905) (Token id:Id.Lit_Chars val:'\tgit rm submod >actual 2>actual.err &&\n' span_id:906) 
          (Token id:Id.Lit_Chars val:'\t! test -s actual.err &&\n' span_id:907) (Token id:Id.Lit_Chars val:'\t! test -d submod &&\n' span_id:908) 
          (Token id:Id.Lit_Chars val:'\t! test -f submod/.git &&\n' span_id:909) (Token id:Id.Lit_Chars val:'\tgit status -s -uno >actual &&\n' span_id:910) 
          (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual\n' span_id:911)
        )
      }
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'rm issues a warning when section is not found in .gitmodules'
            span_id: 918
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:922) 
          (Token id:Id.Lit_Chars val:'\tgit reset --hard &&\n' span_id:923) (Token id:Id.Lit_Chars val:'\tgit submodule update &&\n' span_id:924) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit config -f .gitmodules --remove-section submodule.sub &&\n'
            span_id: 925
          ) (Token id:Id.Lit_Chars val:'\tgit add .gitmodules &&\n' span_id:926) 
          (Token
            id: Id.Lit_Chars
            val: 
'\techo "warning: Could not find section in .gitmodules where path=submod" >expect.err &&\n'
            span_id: 927
          ) (Token id:Id.Lit_Chars val:'\tgit rm submod >actual 2>actual.err &&\n' span_id:928) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest_i18ncmp expect.err actual.err &&\n'
            span_id: 929
          ) (Token id:Id.Lit_Chars val:'\t! test -d submod &&\n' span_id:930) 
          (Token id:Id.Lit_Chars val:'\t! test -f submod/.git &&\n' span_id:931) (Token id:Id.Lit_Chars val:'\tgit status -s -uno >actual &&\n' span_id:932) 
          (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual\n' span_id:933)
        )
      }
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'rm of a populated submodule with modifications fails unless forced'
            span_id: 940
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:944) 
          (Token id:Id.Lit_Chars val:'\tgit reset --hard &&\n' span_id:945) (Token id:Id.Lit_Chars val:'\tgit submodule update &&\n' span_id:946) 
          (Token id:Id.Lit_Chars val:'\t(cd submod &&\n' span_id:947) (Token id:Id.Lit_Chars val:'\t\techo X >empty\n' span_id:948) 
          (Token id:Id.Lit_Chars val:'\t) &&\n' span_id:949) (Token id:Id.Lit_Chars val:'\ttest_must_fail git rm submod &&\n' span_id:950) 
          (Token id:Id.Lit_Chars val:'\ttest -d submod &&\n' span_id:951) (Token id:Id.Lit_Chars val:'\ttest -f submod/.git &&\n' span_id:952) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit status -s -uno --ignore-submodules=none > actual &&\n'
            span_id: 953
          ) (Token id:Id.Lit_Chars val:'\ttest_cmp expect.modified actual &&\n' span_id:954) 
          (Token id:Id.Lit_Chars val:'\tgit rm -f submod &&\n' span_id:955) (Token id:Id.Lit_Chars val:'\ttest ! -d submod &&\n' span_id:956) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit status -s -uno --ignore-submodules=none > actual &&\n'
            span_id: 957
          ) (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual\n' span_id:958)
        )
      }
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'rm of a populated submodule with untracked files fails unless forced'
            span_id: 965
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:969) 
          (Token id:Id.Lit_Chars val:'\tgit reset --hard &&\n' span_id:970) (Token id:Id.Lit_Chars val:'\tgit submodule update &&\n' span_id:971) 
          (Token id:Id.Lit_Chars val:'\t(cd submod &&\n' span_id:972) (Token id:Id.Lit_Chars val:'\t\techo X >untracked\n' span_id:973) 
          (Token id:Id.Lit_Chars val:'\t) &&\n' span_id:974) (Token id:Id.Lit_Chars val:'\ttest_must_fail git rm submod &&\n' span_id:975) 
          (Token id:Id.Lit_Chars val:'\ttest -d submod &&\n' span_id:976) (Token id:Id.Lit_Chars val:'\ttest -f submod/.git &&\n' span_id:977) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit status -s -uno --ignore-submodules=none > actual &&\n'
            span_id: 978
          ) (Token id:Id.Lit_Chars val:'\ttest_cmp expect.modified actual &&\n' span_id:979) 
          (Token id:Id.Lit_Chars val:'\tgit rm -f submod &&\n' span_id:980) (Token id:Id.Lit_Chars val:'\ttest ! -d submod &&\n' span_id:981) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit status -s -uno --ignore-submodules=none > actual &&\n'
            span_id: 982
          ) (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual\n' span_id:983)
        )
      }
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'setup submodule conflict' span_id:990))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:994) 
          (Token id:Id.Lit_Chars val:'\tgit reset --hard &&\n' span_id:995) (Token id:Id.Lit_Chars val:'\tgit submodule update &&\n' span_id:996) 
          (Token id:Id.Lit_Chars val:'\tgit checkout -b branch1 &&\n' span_id:997) (Token id:Id.Lit_Chars val:'\techo 1 >nitfol &&\n' span_id:998) 
          (Token id:Id.Lit_Chars val:'\tgit add nitfol &&\n' span_id:999) (Token id:Id.Lit_Chars val:'\tgit commit -m "added nitfol 1" &&\n' span_id:1000) 
          (Token id:Id.Lit_Chars val:'\tgit checkout -b branch2 master &&\n' span_id:1001) (Token id:Id.Lit_Chars val:'\techo 2 >nitfol &&\n' span_id:1002) 
          (Token id:Id.Lit_Chars val:'\tgit add nitfol &&\n' span_id:1003) (Token id:Id.Lit_Chars val:'\tgit commit -m "added nitfol 2" &&\n' span_id:1004) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit checkout -b conflict1 master &&\n'
            span_id: 1005
          ) (Token id:Id.Lit_Chars val:'\t(cd submod &&\n' span_id:1006) 
          (Token id:Id.Lit_Chars val:'\t\tgit fetch &&\n' span_id:1007) (Token id:Id.Lit_Chars val:'\t\tgit checkout branch1\n' span_id:1008) 
          (Token id:Id.Lit_Chars val:'\t) &&\n' span_id:1009) (Token id:Id.Lit_Chars val:'\tgit add submod &&\n' span_id:1010) 
          (Token id:Id.Lit_Chars val:'\tgit commit -m "submod 1" &&\n' span_id:1011) (Token id:Id.Lit_Chars val:'\tgit checkout -b conflict2 master &&\n' span_id:1012) 
          (Token id:Id.Lit_Chars val:'\t(cd submod &&\n' span_id:1013) (Token id:Id.Lit_Chars val:'\t\tgit checkout branch2\n' span_id:1014) 
          (Token id:Id.Lit_Chars val:'\t) &&\n' span_id:1015) (Token id:Id.Lit_Chars val:'\tgit add submod &&\n' span_id:1016) 
          (Token id:Id.Lit_Chars val:'\tgit commit -m "submod 2"\n' span_id:1017)
        )
      }
    )
    (command.Simple
      words: [{(cat)}]
      redirects: [
        (redir.Redir
          op: (Token id:Id.Redir_Great val:'>' span_id:1023)
          fd: -1
          arg_word: {(expect.conflict)}
        )
        (redir.HereDoc
          op: (Token id:Id.Redir_DLess val:'<<' span_id:1026)
          fd: -1
          here_begin: {(EOF)}
          here_end_span_id: 1031
          stdin_parts: [('UU submod\n')]
        )
      ]
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'rm removes work tree of unmodified conflicted submodule'
            span_id: 1036
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:1040) 
          (Token id:Id.Lit_Chars val:'\tgit checkout conflict1 &&\n' span_id:1041) (Token id:Id.Lit_Chars val:'\tgit reset --hard &&\n' span_id:1042) 
          (Token id:Id.Lit_Chars val:'\tgit submodule update &&\n' span_id:1043) (Token id:Id.Lit_Chars val:'\ttest_must_fail git merge conflict2 &&\n' span_id:1044) 
          (Token id:Id.Lit_Chars val:'\tgit rm submod &&\n' span_id:1045) (Token id:Id.Lit_Chars val:'\ttest ! -d submod &&\n' span_id:1046) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit status -s -uno --ignore-submodules=none > actual &&\n'
            span_id: 1047
          ) (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual\n' span_id:1048)
        )
      }
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'rm of a conflicted populated submodule with different HEAD fails unless forced'
            span_id: 1055
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:1059) 
          (Token id:Id.Lit_Chars val:'\tgit checkout conflict1 &&\n' span_id:1060) (Token id:Id.Lit_Chars val:'\tgit reset --hard &&\n' span_id:1061) 
          (Token id:Id.Lit_Chars val:'\tgit submodule update &&\n' span_id:1062) (Token id:Id.Lit_Chars val:'\t(cd submod &&\n' span_id:1063) 
          (Token id:Id.Lit_Chars val:'\t\tgit checkout HEAD^\n' span_id:1064) (Token id:Id.Lit_Chars val:'\t) &&\n' span_id:1065) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest_must_fail git merge conflict2 &&\n'
            span_id: 1066
          ) (Token id:Id.Lit_Chars val:'\ttest_must_fail git rm submod &&\n' span_id:1067) 
          (Token id:Id.Lit_Chars val:'\ttest -d submod &&\n' span_id:1068) (Token id:Id.Lit_Chars val:'\ttest -f submod/.git &&\n' span_id:1069) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit status -s -uno --ignore-submodules=none > actual &&\n'
            span_id: 1070
          ) (Token id:Id.Lit_Chars val:'\ttest_cmp expect.conflict actual &&\n' span_id:1071) 
          (Token id:Id.Lit_Chars val:'\tgit rm -f submod &&\n' span_id:1072) (Token id:Id.Lit_Chars val:'\ttest ! -d submod &&\n' span_id:1073) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit status -s -uno --ignore-submodules=none > actual &&\n'
            span_id: 1074
          ) (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual &&\n' span_id:1075) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest_must_fail git config -f .gitmodules submodule.sub.url &&\n'
            span_id: 1076
          ) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest_must_fail git config -f .gitmodules submodule.sub.path\n'
            span_id: 1077
          )
        )
      }
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'rm of a conflicted populated submodule with modifications fails unless forced'
            span_id: 1084
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:1088) 
          (Token id:Id.Lit_Chars val:'\tgit checkout conflict1 &&\n' span_id:1089) (Token id:Id.Lit_Chars val:'\tgit reset --hard &&\n' span_id:1090) 
          (Token id:Id.Lit_Chars val:'\tgit submodule update &&\n' span_id:1091) (Token id:Id.Lit_Chars val:'\t(cd submod &&\n' span_id:1092) 
          (Token id:Id.Lit_Chars val:'\t\techo X >empty\n' span_id:1093) (Token id:Id.Lit_Chars val:'\t) &&\n' span_id:1094) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest_must_fail git merge conflict2 &&\n'
            span_id: 1095
          ) (Token id:Id.Lit_Chars val:'\ttest_must_fail git rm submod &&\n' span_id:1096) 
          (Token id:Id.Lit_Chars val:'\ttest -d submod &&\n' span_id:1097) (Token id:Id.Lit_Chars val:'\ttest -f submod/.git &&\n' span_id:1098) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit status -s -uno --ignore-submodules=none > actual &&\n'
            span_id: 1099
          ) (Token id:Id.Lit_Chars val:'\ttest_cmp expect.conflict actual &&\n' span_id:1100) 
          (Token id:Id.Lit_Chars val:'\tgit rm -f submod &&\n' span_id:1101) (Token id:Id.Lit_Chars val:'\ttest ! -d submod &&\n' span_id:1102) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit status -s -uno --ignore-submodules=none > actual &&\n'
            span_id: 1103
          ) (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual &&\n' span_id:1104) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest_must_fail git config -f .gitmodules submodule.sub.url &&\n'
            span_id: 1105
          ) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest_must_fail git config -f .gitmodules submodule.sub.path\n'
            span_id: 1106
          )
        )
      }
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'rm of a conflicted populated submodule with untracked files fails unless forced'
            span_id: 1113
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:1117) 
          (Token id:Id.Lit_Chars val:'\tgit checkout conflict1 &&\n' span_id:1118) (Token id:Id.Lit_Chars val:'\tgit reset --hard &&\n' span_id:1119) 
          (Token id:Id.Lit_Chars val:'\tgit submodule update &&\n' span_id:1120) (Token id:Id.Lit_Chars val:'\t(cd submod &&\n' span_id:1121) 
          (Token id:Id.Lit_Chars val:'\t\techo X >untracked\n' span_id:1122) (Token id:Id.Lit_Chars val:'\t) &&\n' span_id:1123) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest_must_fail git merge conflict2 &&\n'
            span_id: 1124
          ) (Token id:Id.Lit_Chars val:'\ttest_must_fail git rm submod &&\n' span_id:1125) 
          (Token id:Id.Lit_Chars val:'\ttest -d submod &&\n' span_id:1126) (Token id:Id.Lit_Chars val:'\ttest -f submod/.git &&\n' span_id:1127) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit status -s -uno --ignore-submodules=none > actual &&\n'
            span_id: 1128
          ) (Token id:Id.Lit_Chars val:'\ttest_cmp expect.conflict actual &&\n' span_id:1129) 
          (Token id:Id.Lit_Chars val:'\tgit rm -f submod &&\n' span_id:1130) (Token id:Id.Lit_Chars val:'\ttest ! -d submod &&\n' span_id:1131) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit status -s -uno --ignore-submodules=none > actual &&\n'
            span_id: 1132
          ) (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual\n' span_id:1133)
        )
      }
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 
'rm of a conflicted populated submodule with a .git directory fails even when forced'
            span_id: 1140
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:1144) 
          (Token id:Id.Lit_Chars val:'\tgit checkout conflict1 &&\n' span_id:1145) (Token id:Id.Lit_Chars val:'\tgit reset --hard &&\n' span_id:1146) 
          (Token id:Id.Lit_Chars val:'\tgit submodule update &&\n' span_id:1147) (Token id:Id.Lit_Chars val:'\t(cd submod &&\n' span_id:1148) 
          (Token id:Id.Lit_Chars val:'\t\trm .git &&\n' span_id:1149) (Token id:Id.Lit_Chars val:'\t\tcp -R ../.git/modules/sub .git &&\n' span_id:1150) 
          (Token
            id: Id.Lit_Chars
            val: '\t\tGIT_WORK_TREE=. git config --unset core.worktree\n'
            span_id: 1151
          ) (Token id:Id.Lit_Chars val:'\t) &&\n' span_id:1152) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest_must_fail git merge conflict2 &&\n'
            span_id: 1153
          ) (Token id:Id.Lit_Chars val:'\ttest_must_fail git rm submod &&\n' span_id:1154) 
          (Token id:Id.Lit_Chars val:'\ttest -d submod &&\n' span_id:1155) (Token id:Id.Lit_Chars val:'\ttest -d submod/.git &&\n' span_id:1156) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit status -s -uno --ignore-submodules=none > actual &&\n'
            span_id: 1157
          ) (Token id:Id.Lit_Chars val:'\ttest_cmp expect.conflict actual &&\n' span_id:1158) 
          (Token id:Id.Lit_Chars val:'\ttest_must_fail git rm -f submod &&\n' span_id:1159) (Token id:Id.Lit_Chars val:'\ttest -d submod &&\n' span_id:1160) 
          (Token id:Id.Lit_Chars val:'\ttest -d submod/.git &&\n' span_id:1161) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit status -s -uno --ignore-submodules=none > actual &&\n'
            span_id: 1162
          ) (Token id:Id.Lit_Chars val:'\ttest_cmp expect.conflict actual &&\n' span_id:1163) 
          (Token id:Id.Lit_Chars val:'\tgit merge --abort &&\n' span_id:1164) (Token id:Id.Lit_Chars val:'\trm -rf submod\n' span_id:1165)
        )
      }
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'rm of a conflicted unpopulated submodule succeeds'
            span_id: 1172
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:1176) 
          (Token id:Id.Lit_Chars val:'\tgit checkout conflict1 &&\n' span_id:1177) (Token id:Id.Lit_Chars val:'\tgit reset --hard &&\n' span_id:1178) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest_must_fail git merge conflict2 &&\n'
            span_id: 1179
          ) (Token id:Id.Lit_Chars val:'\tgit rm submod &&\n' span_id:1180) 
          (Token id:Id.Lit_Chars val:'\ttest ! -d submod &&\n' span_id:1181) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit status -s -uno --ignore-submodules=none > actual &&\n'
            span_id: 1182
          ) (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual\n' span_id:1183)
        )
      }
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'rm of a populated submodule with a .git directory fails even when forced'
            span_id: 1190
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:1194) 
          (Token id:Id.Lit_Chars val:'\tgit checkout -f master &&\n' span_id:1195) (Token id:Id.Lit_Chars val:'\tgit reset --hard &&\n' span_id:1196) 
          (Token id:Id.Lit_Chars val:'\tgit submodule update &&\n' span_id:1197) (Token id:Id.Lit_Chars val:'\t(cd submod &&\n' span_id:1198) 
          (Token id:Id.Lit_Chars val:'\t\trm .git &&\n' span_id:1199) (Token id:Id.Lit_Chars val:'\t\tcp -R ../.git/modules/sub .git &&\n' span_id:1200) 
          (Token
            id: Id.Lit_Chars
            val: '\t\tGIT_WORK_TREE=. git config --unset core.worktree\n'
            span_id: 1201
          ) (Token id:Id.Lit_Chars val:'\t) &&\n' span_id:1202) 
          (Token id:Id.Lit_Chars val:'\ttest_must_fail git rm submod &&\n' span_id:1203) (Token id:Id.Lit_Chars val:'\ttest -d submod &&\n' span_id:1204) 
          (Token id:Id.Lit_Chars val:'\ttest -d submod/.git &&\n' span_id:1205) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit status -s -uno --ignore-submodules=none > actual &&\n'
            span_id: 1206
          ) (Token id:Id.Lit_Chars val:'\t! test -s actual &&\n' span_id:1207) 
          (Token id:Id.Lit_Chars val:'\ttest_must_fail git rm -f submod &&\n' span_id:1208) (Token id:Id.Lit_Chars val:'\ttest -d submod &&\n' span_id:1209) 
          (Token id:Id.Lit_Chars val:'\ttest -d submod/.git &&\n' span_id:1210) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit status -s -uno --ignore-submodules=none > actual &&\n'
            span_id: 1211
          ) (Token id:Id.Lit_Chars val:'\t! test -s actual &&\n' span_id:1212) 
          (Token id:Id.Lit_Chars val:'\trm -rf submod\n' span_id:1213)
        )
      }
    )
    (command.Simple
      words: [{(cat)}]
      redirects: [
        (redir.Redir
          op: (Token id:Id.Redir_Great val:'>' span_id:1219)
          fd: -1
          arg_word: {(expect.deepmodified)}
        )
        (redir.HereDoc
          op: (Token id:Id.Redir_DLess val:'<<' span_id:1222)
          fd: -1
          here_begin: {(EOF)}
          here_end_span_id: 1227
          stdin_parts: [(' M submod/subsubmod\n')]
        )
      ]
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'setup subsubmodule' span_id:1232))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:1236) 
          (Token id:Id.Lit_Chars val:'\tgit reset --hard &&\n' span_id:1237) (Token id:Id.Lit_Chars val:'\tgit submodule update &&\n' span_id:1238) 
          (Token id:Id.Lit_Chars val:'\t(cd submod &&\n' span_id:1239) 
          (Token
            id: Id.Lit_Chars
            val: 
'\t\tgit update-index --add --cacheinfo 160000 $(git rev-parse HEAD) subsubmod &&\n'
            span_id: 1240
          ) (Token id:Id.Lit_Chars val:'\t\tgit config -f .gitmodules submodule.sub.url ../. &&\n' span_id:1241) 
          (Token
            id: Id.Lit_Chars
            val: '\t\tgit config -f .gitmodules submodule.sub.path subsubmod &&\n'
            span_id: 1242
          ) (Token id:Id.Lit_Chars val:'\t\tgit submodule init &&\n' span_id:1243) 
          (Token id:Id.Lit_Chars val:'\t\tgit add .gitmodules &&\n' span_id:1244) (Token id:Id.Lit_Chars val:'\t\tgit commit -m "add subsubmodule" &&\n' span_id:1245) 
          (Token id:Id.Lit_Chars val:'\t\tgit submodule update subsubmod\n' span_id:1246) (Token id:Id.Lit_Chars val:'\t) &&\n' span_id:1247) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit commit -a -m "added deep submodule"\n'
            span_id: 1248
          )
        )
      }
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'rm recursively removes work tree of unmodified submodules'
            span_id: 1255
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:1259) 
          (Token id:Id.Lit_Chars val:'\tgit rm submod &&\n' span_id:1260) (Token id:Id.Lit_Chars val:'\ttest ! -d submod &&\n' span_id:1261) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit status -s -uno --ignore-submodules=none > actual &&\n'
            span_id: 1262
          ) (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual\n' span_id:1263)
        )
      }
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'rm of a populated nested submodule with different nested HEAD fails unless forced'
            span_id: 1270
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:1274) 
          (Token id:Id.Lit_Chars val:'\tgit reset --hard &&\n' span_id:1275) (Token id:Id.Lit_Chars val:'\tgit submodule update --recursive &&\n' span_id:1276) 
          (Token id:Id.Lit_Chars val:'\t(cd submod/subsubmod &&\n' span_id:1277) (Token id:Id.Lit_Chars val:'\t\tgit checkout HEAD^\n' span_id:1278) 
          (Token id:Id.Lit_Chars val:'\t) &&\n' span_id:1279) (Token id:Id.Lit_Chars val:'\ttest_must_fail git rm submod &&\n' span_id:1280) 
          (Token id:Id.Lit_Chars val:'\ttest -d submod &&\n' span_id:1281) (Token id:Id.Lit_Chars val:'\ttest -f submod/.git &&\n' span_id:1282) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit status -s -uno --ignore-submodules=none > actual &&\n'
            span_id: 1283
          ) (Token id:Id.Lit_Chars val:'\ttest_cmp expect.modified actual &&\n' span_id:1284) 
          (Token id:Id.Lit_Chars val:'\tgit rm -f submod &&\n' span_id:1285) (Token id:Id.Lit_Chars val:'\ttest ! -d submod &&\n' span_id:1286) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit status -s -uno --ignore-submodules=none > actual &&\n'
            span_id: 1287
          ) (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual\n' span_id:1288)
        )
      }
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'rm of a populated nested submodule with nested modifications fails unless forced'
            span_id: 1295
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:1299) 
          (Token id:Id.Lit_Chars val:'\tgit reset --hard &&\n' span_id:1300) (Token id:Id.Lit_Chars val:'\tgit submodule update --recursive &&\n' span_id:1301) 
          (Token id:Id.Lit_Chars val:'\t(cd submod/subsubmod &&\n' span_id:1302) (Token id:Id.Lit_Chars val:'\t\techo X >empty\n' span_id:1303) 
          (Token id:Id.Lit_Chars val:'\t) &&\n' span_id:1304) (Token id:Id.Lit_Chars val:'\ttest_must_fail git rm submod &&\n' span_id:1305) 
          (Token id:Id.Lit_Chars val:'\ttest -d submod &&\n' span_id:1306) (Token id:Id.Lit_Chars val:'\ttest -f submod/.git &&\n' span_id:1307) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit status -s -uno --ignore-submodules=none > actual &&\n'
            span_id: 1308
          ) (Token id:Id.Lit_Chars val:'\ttest_cmp expect.modified actual &&\n' span_id:1309) 
          (Token id:Id.Lit_Chars val:'\tgit rm -f submod &&\n' span_id:1310) (Token id:Id.Lit_Chars val:'\ttest ! -d submod &&\n' span_id:1311) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit status -s -uno --ignore-submodules=none > actual &&\n'
            span_id: 1312
          ) (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual\n' span_id:1313)
        )
      }
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 
'rm of a populated nested submodule with nested untracked files fails unless forced'
            span_id: 1320
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:1324) 
          (Token id:Id.Lit_Chars val:'\tgit reset --hard &&\n' span_id:1325) (Token id:Id.Lit_Chars val:'\tgit submodule update --recursive &&\n' span_id:1326) 
          (Token id:Id.Lit_Chars val:'\t(cd submod/subsubmod &&\n' span_id:1327) (Token id:Id.Lit_Chars val:'\t\techo X >untracked\n' span_id:1328) 
          (Token id:Id.Lit_Chars val:'\t) &&\n' span_id:1329) (Token id:Id.Lit_Chars val:'\ttest_must_fail git rm submod &&\n' span_id:1330) 
          (Token id:Id.Lit_Chars val:'\ttest -d submod &&\n' span_id:1331) (Token id:Id.Lit_Chars val:'\ttest -f submod/.git &&\n' span_id:1332) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit status -s -uno --ignore-submodules=none > actual &&\n'
            span_id: 1333
          ) (Token id:Id.Lit_Chars val:'\ttest_cmp expect.modified actual &&\n' span_id:1334) 
          (Token id:Id.Lit_Chars val:'\tgit rm -f submod &&\n' span_id:1335) (Token id:Id.Lit_Chars val:'\ttest ! -d submod &&\n' span_id:1336) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit status -s -uno --ignore-submodules=none > actual &&\n'
            span_id: 1337
          ) (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual\n' span_id:1338)
        )
      }
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 
'rm of a populated nested submodule with a nested .git directory fails even when forced'
            span_id: 1345
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:1349) 
          (Token id:Id.Lit_Chars val:'\tgit reset --hard &&\n' span_id:1350) (Token id:Id.Lit_Chars val:'\tgit submodule update --recursive &&\n' span_id:1351) 
          (Token id:Id.Lit_Chars val:'\t(cd submod/subsubmod &&\n' span_id:1352) (Token id:Id.Lit_Chars val:'\t\trm .git &&\n' span_id:1353) 
          (Token
            id: Id.Lit_Chars
            val: '\t\tcp -R ../../.git/modules/sub/modules/sub .git &&\n'
            span_id: 1354
          ) (Token id:Id.Lit_Chars val:'\t\tGIT_WORK_TREE=. git config --unset core.worktree\n' span_id:1355) 
          (Token id:Id.Lit_Chars val:'\t) &&\n' span_id:1356) (Token id:Id.Lit_Chars val:'\ttest_must_fail git rm submod &&\n' span_id:1357) 
          (Token id:Id.Lit_Chars val:'\ttest -d submod &&\n' span_id:1358) (Token id:Id.Lit_Chars val:'\ttest -d submod/subsubmod/.git &&\n' span_id:1359) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit status -s -uno --ignore-submodules=none > actual &&\n'
            span_id: 1360
          ) (Token id:Id.Lit_Chars val:'\t! test -s actual &&\n' span_id:1361) 
          (Token id:Id.Lit_Chars val:'\ttest_must_fail git rm -f submod &&\n' span_id:1362) (Token id:Id.Lit_Chars val:'\ttest -d submod &&\n' span_id:1363) 
          (Token id:Id.Lit_Chars val:'\ttest -d submod/subsubmod/.git &&\n' span_id:1364) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit status -s -uno --ignore-submodules=none > actual &&\n'
            span_id: 1365
          ) (Token id:Id.Lit_Chars val:'\t! test -s actual &&\n' span_id:1366) 
          (Token id:Id.Lit_Chars val:'\trm -rf submod\n' span_id:1367)
        )
      }
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'checking out a commit after submodule removal needs manual updates'
            span_id: 1374
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:1378) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit commit -m "submodule removal" submod &&\n'
            span_id: 1379
          ) (Token id:Id.Lit_Chars val:'\tgit checkout HEAD^ &&\n' span_id:1380) 
          (Token id:Id.Lit_Chars val:'\tgit submodule update &&\n' span_id:1381) (Token id:Id.Lit_Chars val:'\tgit checkout -q HEAD^ 2>actual &&\n' span_id:1382) 
          (Token id:Id.Lit_Chars val:'\tgit checkout -q master 2>actual &&\n' span_id:1383) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest_i18ngrep "^warning: unable to rmdir submod:" actual &&\n'
            span_id: 1384
          ) (Token id:Id.Lit_Chars val:'\tgit status -s submod >actual &&\n' span_id:1385) 
          (Token id:Id.Lit_Chars val:'\techo "?? submod/" >expected &&\n' span_id:1386) (Token id:Id.Lit_Chars val:'\ttest_cmp expected actual &&\n' span_id:1387) 
          (Token id:Id.Lit_Chars val:'\trm -rf submod &&\n' span_id:1388) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit status -s -uno --ignore-submodules=none > actual &&\n'
            span_id: 1389
          ) (Token id:Id.Lit_Chars val:'\t! test -s actual\n' span_id:1390)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'rm of d/f when d has become a non-directory' span_id:1397))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:1401) 
          (Token id:Id.Lit_Chars val:'\trm -rf d &&\n' span_id:1402) (Token id:Id.Lit_Chars val:'\tmkdir d &&\n' span_id:1403) 
          (Token id:Id.Lit_Chars val:'\t>d/f &&\n' span_id:1404) (Token id:Id.Lit_Chars val:'\tgit add d &&\n' span_id:1405) 
          (Token id:Id.Lit_Chars val:'\trm -rf d &&\n' span_id:1406) (Token id:Id.Lit_Chars val:'\t>d &&\n' span_id:1407) 
          (Token id:Id.Lit_Chars val:'\tgit rm d/f &&\n' span_id:1408) (Token id:Id.Lit_Chars val:'\ttest_must_fail git rev-parse --verify :d/f &&\n' span_id:1409) 
          (Token id:Id.Lit_Chars val:'\ttest_path_is_file d\n' span_id:1410)
        )
      }
    )
    (C {(test_expect_success)} {(SYMLINKS)} 
      {(SQ (Token id:Id.Lit_Chars val:'rm of d/f when d has become a dangling symlink' span_id:1419))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:1423) 
          (Token id:Id.Lit_Chars val:'\trm -rf d &&\n' span_id:1424) (Token id:Id.Lit_Chars val:'\tmkdir d &&\n' span_id:1425) 
          (Token id:Id.Lit_Chars val:'\t>d/f &&\n' span_id:1426) (Token id:Id.Lit_Chars val:'\tgit add d &&\n' span_id:1427) 
          (Token id:Id.Lit_Chars val:'\trm -rf d &&\n' span_id:1428) (Token id:Id.Lit_Chars val:'\tln -s nonexistent d &&\n' span_id:1429) 
          (Token id:Id.Lit_Chars val:'\tgit rm d/f &&\n' span_id:1430) (Token id:Id.Lit_Chars val:'\ttest_must_fail git rev-parse --verify :d/f &&\n' span_id:1431) 
          (Token id:Id.Lit_Chars val:'\ttest -h d &&\n' span_id:1432) (Token id:Id.Lit_Chars val:'\ttest_path_is_missing d\n' span_id:1433)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'rm of file when it has become a directory' span_id:1440))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:1444) 
          (Token id:Id.Lit_Chars val:'\trm -rf d &&\n' span_id:1445) (Token id:Id.Lit_Chars val:'\t>d &&\n' span_id:1446) 
          (Token id:Id.Lit_Chars val:'\tgit add d &&\n' span_id:1447) (Token id:Id.Lit_Chars val:'\trm -f d &&\n' span_id:1448) 
          (Token id:Id.Lit_Chars val:'\tmkdir d &&\n' span_id:1449) (Token id:Id.Lit_Chars val:'\t>d/f &&\n' span_id:1450) 
          (Token id:Id.Lit_Chars val:'\ttest_must_fail git rm d &&\n' span_id:1451) (Token id:Id.Lit_Chars val:'\tgit rev-parse --verify :d &&\n' span_id:1452) 
          (Token id:Id.Lit_Chars val:'\ttest_path_is_file d/f\n' span_id:1453)
        )
      }
    )
    (C {(test_expect_success)} {(SYMLINKS)} 
      {(SQ (Token id:Id.Lit_Chars val:'rm across a symlinked leading path (no index)' span_id:1462))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:1466) 
          (Token id:Id.Lit_Chars val:'\trm -rf d e &&\n' span_id:1467) (Token id:Id.Lit_Chars val:'\tmkdir e &&\n' span_id:1468) 
          (Token id:Id.Lit_Chars val:'\techo content >e/f &&\n' span_id:1469) (Token id:Id.Lit_Chars val:'\tln -s e d &&\n' span_id:1470) 
          (Token id:Id.Lit_Chars val:'\tgit add -A e d &&\n' span_id:1471) (Token id:Id.Lit_Chars val:'\tgit commit -m "symlink d to e, e/f exists" &&\n' span_id:1472) 
          (Token id:Id.Lit_Chars val:'\ttest_must_fail git rm d/f &&\n' span_id:1473) (Token id:Id.Lit_Chars val:'\tgit rev-parse --verify :d &&\n' span_id:1474) 
          (Token id:Id.Lit_Chars val:'\tgit rev-parse --verify :e/f &&\n' span_id:1475) (Token id:Id.Lit_Chars val:'\ttest -h d &&\n' span_id:1476) 
          (Token id:Id.Lit_Chars val:'\ttest_path_is_file e/f\n' span_id:1477)
        )
      }
    )
    (C {(test_expect_failure)} {(SYMLINKS)} 
      {(SQ (Token id:Id.Lit_Chars val:'rm across a symlinked leading path (w/ index)' span_id:1486))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:1490) 
          (Token id:Id.Lit_Chars val:'\trm -rf d e &&\n' span_id:1491) (Token id:Id.Lit_Chars val:'\tmkdir d &&\n' span_id:1492) 
          (Token id:Id.Lit_Chars val:'\techo content >d/f &&\n' span_id:1493) (Token id:Id.Lit_Chars val:'\tgit add -A e d &&\n' span_id:1494) 
          (Token id:Id.Lit_Chars val:'\tgit commit -m "d/f exists" &&\n' span_id:1495) (Token id:Id.Lit_Chars val:'\tmv d e &&\n' span_id:1496) 
          (Token id:Id.Lit_Chars val:'\tln -s e d &&\n' span_id:1497) (Token id:Id.Lit_Chars val:'\ttest_must_fail git rm d/f &&\n' span_id:1498) 
          (Token id:Id.Lit_Chars val:'\tgit rev-parse --verify :d/f &&\n' span_id:1499) (Token id:Id.Lit_Chars val:'\ttest -h d &&\n' span_id:1500) 
          (Token id:Id.Lit_Chars val:'\ttest_path_is_file e/f\n' span_id:1501)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'setup for testing rm messages' span_id:1508))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:1512) 
          (Token id:Id.Lit_Chars val:'\t>bar.txt &&\n' span_id:1513) (Token id:Id.Lit_Chars val:'\t>foo.txt &&\n' span_id:1514) 
          (Token id:Id.Lit_Chars val:'\tgit add bar.txt foo.txt\n' span_id:1515)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'rm files with different staged content' span_id:1522))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:1526) 
          (Token id:Id.Lit_Chars val:'\tcat >expect <<-\\EOF &&\n' span_id:1527) 
          (Token
            id: Id.Lit_Chars
            val: '\terror: the following files have staged content different from both the\n'
            span_id: 1528
          ) (Token id:Id.Lit_Chars val:'\tfile and the HEAD:\n' span_id:1529) 
          (Token id:Id.Lit_Chars val:'\t    bar.txt\n' span_id:1530) (Token id:Id.Lit_Chars val:'\t    foo.txt\n' span_id:1531) 
          (Token id:Id.Lit_Chars val:'\t(use -f to force removal)\n' span_id:1532) (Token id:Id.Lit_Chars val:'\tEOF\n' span_id:1533) 
          (Token id:Id.Lit_Chars val:'\techo content1 >foo.txt &&\n' span_id:1534) (Token id:Id.Lit_Chars val:'\techo content1 >bar.txt &&\n' span_id:1535) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest_must_fail git rm foo.txt bar.txt 2>actual &&\n'
            span_id: 1536
          ) (Token id:Id.Lit_Chars val:'\ttest_i18ncmp expect actual\n' span_id:1537)
        )
      }
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'rm files with different staged content without hints'
            span_id: 1544
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:1548) 
          (Token id:Id.Lit_Chars val:'\tcat >expect <<-\\EOF &&\n' span_id:1549) 
          (Token
            id: Id.Lit_Chars
            val: '\terror: the following files have staged content different from both the\n'
            span_id: 1550
          ) (Token id:Id.Lit_Chars val:'\tfile and the HEAD:\n' span_id:1551) 
          (Token id:Id.Lit_Chars val:'\t    bar.txt\n' span_id:1552) (Token id:Id.Lit_Chars val:'\t    foo.txt\n' span_id:1553) 
          (Token id:Id.Lit_Chars val:'\tEOF\n' span_id:1554) (Token id:Id.Lit_Chars val:'\techo content2 >foo.txt &&\n' span_id:1555) 
          (Token id:Id.Lit_Chars val:'\techo content2 >bar.txt &&\n' span_id:1556) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest_must_fail git -c advice.rmhints=false rm foo.txt bar.txt 2>actual &&\n'
            span_id: 1557
          ) (Token id:Id.Lit_Chars val:'\ttest_i18ncmp expect actual\n' span_id:1558)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'rm file with local modification' span_id:1565))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:1569) 
          (Token id:Id.Lit_Chars val:'\tcat >expect <<-\\EOF &&\n' span_id:1570) (Token id:Id.Lit_Chars val:'\terror: the following file has local modifications:\n' span_id:1571) 
          (Token id:Id.Lit_Chars val:'\t    foo.txt\n' span_id:1572) 
          (Token
            id: Id.Lit_Chars
            val: '\t(use --cached to keep the file, or -f to force removal)\n'
            span_id: 1573
          ) (Token id:Id.Lit_Chars val:'\tEOF\n' span_id:1574) 
          (Token id:Id.Lit_Chars val:'\tgit commit -m "testing rm 3" &&\n' span_id:1575) (Token id:Id.Lit_Chars val:'\techo content3 >foo.txt &&\n' span_id:1576) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest_must_fail git rm foo.txt 2>actual &&\n'
            span_id: 1577
          ) (Token id:Id.Lit_Chars val:'\ttest_i18ncmp expect actual\n' span_id:1578)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'rm file with local modification without hints' span_id:1585))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:1589) 
          (Token id:Id.Lit_Chars val:'\tcat >expect <<-\\EOF &&\n' span_id:1590) (Token id:Id.Lit_Chars val:'\terror: the following file has local modifications:\n' span_id:1591) 
          (Token id:Id.Lit_Chars val:'\t    bar.txt\n' span_id:1592) (Token id:Id.Lit_Chars val:'\tEOF\n' span_id:1593) 
          (Token id:Id.Lit_Chars val:'\techo content4 >bar.txt &&\n' span_id:1594) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest_must_fail git -c advice.rmhints=false rm bar.txt 2>actual &&\n'
            span_id: 1595
          ) (Token id:Id.Lit_Chars val:'\ttest_i18ncmp expect actual\n' span_id:1596)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'rm file with changes in the index' span_id:1603))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:1607) 
          (Token id:Id.Lit_Chars val:'\tcat >expect <<-\\EOF &&\n' span_id:1608) 
          (Token
            id: Id.Lit_Chars
            val: '\terror: the following file has changes staged in the index:\n'
            span_id: 1609
          ) (Token id:Id.Lit_Chars val:'\t    foo.txt\n' span_id:1610) 
          (Token
            id: Id.Lit_Chars
            val: '\t(use --cached to keep the file, or -f to force removal)\n'
            span_id: 1611
          ) (Token id:Id.Lit_Chars val:'\tEOF\n' span_id:1612) 
          (Token id:Id.Lit_Chars val:'\tgit reset --hard &&\n' span_id:1613) (Token id:Id.Lit_Chars val:'\techo content5 >foo.txt &&\n' span_id:1614) 
          (Token id:Id.Lit_Chars val:'\tgit add foo.txt &&\n' span_id:1615) (Token id:Id.Lit_Chars val:'\ttest_must_fail git rm foo.txt 2>actual &&\n' span_id:1616) 
          (Token id:Id.Lit_Chars val:'\ttest_i18ncmp expect actual\n' span_id:1617)
        )
      }
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'rm file with changes in the index without hints'
            span_id: 1624
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:1628) 
          (Token id:Id.Lit_Chars val:'\tcat >expect <<-\\EOF &&\n' span_id:1629) 
          (Token
            id: Id.Lit_Chars
            val: '\terror: the following file has changes staged in the index:\n'
            span_id: 1630
          ) (Token id:Id.Lit_Chars val:'\t    foo.txt\n' span_id:1631) 
          (Token id:Id.Lit_Chars val:'\tEOF\n' span_id:1632) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest_must_fail git -c advice.rmhints=false rm foo.txt 2>actual &&\n'
            span_id: 1633
          ) (Token id:Id.Lit_Chars val:'\ttest_i18ncmp expect actual\n' span_id:1634)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'rm files with two different errors' span_id:1641))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:1645) 
          (Token id:Id.Lit_Chars val:'\tcat >expect <<-\\EOF &&\n' span_id:1646) 
          (Token
            id: Id.Lit_Chars
            val: '\terror: the following file has staged content different from both the\n'
            span_id: 1647
          ) (Token id:Id.Lit_Chars val:'\tfile and the HEAD:\n' span_id:1648) 
          (Token id:Id.Lit_Chars val:'\t    foo1.txt\n' span_id:1649) (Token id:Id.Lit_Chars val:'\t(use -f to force removal)\n' span_id:1650) 
          (Token
            id: Id.Lit_Chars
            val: '\terror: the following file has changes staged in the index:\n'
            span_id: 1651
          ) (Token id:Id.Lit_Chars val:'\t    bar1.txt\n' span_id:1652) 
          (Token
            id: Id.Lit_Chars
            val: '\t(use --cached to keep the file, or -f to force removal)\n'
            span_id: 1653
          ) (Token id:Id.Lit_Chars val:'\tEOF\n' span_id:1654) 
          (Token id:Id.Lit_Chars val:'\techo content >foo1.txt &&\n' span_id:1655) (Token id:Id.Lit_Chars val:'\tgit add foo1.txt &&\n' span_id:1656) 
          (Token id:Id.Lit_Chars val:'\techo content6 >foo1.txt &&\n' span_id:1657) (Token id:Id.Lit_Chars val:'\techo content6 >bar1.txt &&\n' span_id:1658) 
          (Token id:Id.Lit_Chars val:'\tgit add bar1.txt &&\n' span_id:1659) (Token id:Id.Lit_Chars val:'\ttest_must_fail git rm bar1.txt foo1.txt 2>actual &&\n' span_id:1660) 
          (Token id:Id.Lit_Chars val:'\ttest_i18ncmp expect actual\n' span_id:1661)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'rm empty string should invoke warning' span_id:1668))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:1672) 
          (Token id:Id.Lit_Chars val:'\tgit rm -rf "" 2>output &&\n' span_id:1673) (Token id:Id.Lit_Chars val:'\ttest_i18ngrep "warning: empty strings" output\n' span_id:1674)
        )
      }
    )
    (C {(test_done)})
  ]
)