(CommandList
  children: [
    (Assignment
      keyword: Assign_None
      pairs: [
        (assign_pair
          lhs: (LhsName name:test_description)
          op: Equal
          rhs: {(SQ <'Merge-recursive merging renames'>)}
          spids: [4]
        )
      ]
      spids: [4]
    )
    (C {(.)} {(./test-lib.sh)})
    (FuncDef
      name: modify
      body: 
        (BraceGroup
          children: [
            (AndOr
              ops: [Op_DAmp]
              children: [
                (SimpleCommand
                  words: [{(sed)} {(-e)} {(DQ ($ VSub_Number '$1'))}]
                  redirects: [
                    (Redir
                      op_id: Redir_Less
                      fd: 16777215
                      arg_word: {(DQ ($ VSub_Number '$2'))}
                      spids: [30]
                    )
                    (Redir
                      op_id: Redir_Great
                      fd: 16777215
                      arg_word: {(DQ ($ VSub_Number '$2') (.x))}
                      spids: [35]
                    )
                  ]
                )
                (C {(mv)} {(DQ ($ VSub_Number '$2') (.x))} {(DQ ($ VSub_Number '$2'))})
              ]
            )
          ]
          spids: [19]
        )
      spids: [14 18]
    )
    (C {(test_expect_success)} {(setup)} 
      {
        (SQ <'\n'> <'cat >A <<\\EOF &&\n'> <'a aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n'> 
          <'b bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n'> <'c cccccccccccccccccccccccccccccccccccccccccccccccc\n'> 
          <'d dddddddddddddddddddddddddddddddddddddddddddddddd\n'> <'e eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee\n'> 
          <'f ffffffffffffffffffffffffffffffffffffffffffffffff\n'> <'g gggggggggggggggggggggggggggggggggggggggggggggggg\n'> 
          <'h hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh\n'> <'i iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii\n'> 
          <'j jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj\n'> <'k kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk\n'> 
          <'l llllllllllllllllllllllllllllllllllllllllllllllll\n'> <'m mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm\n'> 
          <'n nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn\n'> <'o oooooooooooooooooooooooooooooooooooooooooooooooo\n'> <'EOF\n'> <'\n'> <'cat >M <<\\EOF &&\n'> 
          <'A AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n'> <'B BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB\n'> 
          <'C CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC\n'> <'D DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD\n'> 
          <'E EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE\n'> <'F FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF\n'> 
          <'G GGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG\n'> <'H HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH\n'> 
          <'I IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII\n'> <'J JJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJ\n'> 
          <'K KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK\n'> <'L LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL\n'> 
          <'M MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\n'> <'N NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN\n'> 
          <'O OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO\n'> <'EOF\n'> <'\n'> <'git add A M &&\n'> <'git commit -m "initial has A and M" &&\n'> 
          <'git branch white &&\n'> <'git branch red &&\n'> <'git branch blue &&\n'> <'git branch yellow &&\n'> <'git branch change &&\n'> 
          <'git branch change+rename &&\n'> <'\n'> <'sed -e "/^g /s/.*/g : master changes a line/" <A >A+ &&\n'> <'mv A+ A &&\n'> 
          <'git commit -a -m "master updates A" &&\n'> <'\n'> <'git checkout yellow &&\n'> <'rm -f M &&\n'> <'git commit -a -m "yellow removes M" &&\n'> <'\n'> 
          <'git checkout white &&\n'> <'sed -e "/^g /s/.*/g : white changes a line/" <A >B &&\n'> 
          <'sed -e "/^G /s/.*/G : colored branch changes a line/" <M >N &&\n'> <'rm -f A M &&\n'> <'git update-index --add --remove A B M N &&\n'> 
          <'git commit -m "white renames A->B, M->N" &&\n'> <'\n'> <'git checkout red &&\n'> <'sed -e "/^g /s/.*/g : red changes a line/" <A >B &&\n'> 
          <'sed -e "/^G /s/.*/G : colored branch changes a line/" <M >N &&\n'> <'rm -f A M &&\n'> <'git update-index --add --remove A B M N &&\n'> 
          <'git commit -m "red renames A->B, M->N" &&\n'> <'\n'> <'git checkout blue &&\n'> <'sed -e "/^g /s/.*/g : blue changes a line/" <A >C &&\n'> 
          <'sed -e "/^G /s/.*/G : colored branch changes a line/" <M >N &&\n'> <'rm -f A M &&\n'> <'git update-index --add --remove A C M N &&\n'> 
          <'git commit -m "blue renames A->C, M->N" &&\n'> <'\n'> <'git checkout change &&\n'> <'sed -e "/^g /s/.*/g : changed line/" <A >A+ &&\n'> 
          <'mv A+ A &&\n'> <'git commit -q -a -m "changed" &&\n'> <'\n'> <'git checkout change+rename &&\n'> 
          <'sed -e "/^g /s/.*/g : changed line/" <A >B &&\n'> <'rm A &&\n'> <'git update-index --add B &&\n'> <'git commit -q -a -m "changed and renamed" &&\n'> 
          <'\n'> <'git checkout master'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'pull renaming branch into unrenaming one'>)} 
      {
        (SQ <'\n'> <'\tgit show-branch &&\n'> <'\ttest_expect_code 1 git pull . white &&\n'> 
          <'\tgit ls-files -s &&\n'> <'\tgit ls-files -u B >b.stages &&\n'> <'\ttest_line_count = 3 b.stages &&\n'> 
          <'\tgit ls-files -s N >n.stages &&\n'> <'\ttest_line_count = 1 n.stages &&\n'> <'\tsed -ne "/^g/{\n'> <'\tp\n'> <'\tq\n'> 
          <'\t}" B | grep master &&\n'> <'\tgit diff --exit-code white N\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'pull renaming branch into another renaming one'>)} 
      {
        (SQ <'\n'> <'\trm -f B &&\n'> <'\tgit reset --hard &&\n'> <'\tgit checkout red &&\n'> 
          <'\ttest_expect_code 1 git pull . white &&\n'> <'\tgit ls-files -u B >b.stages &&\n'> <'\ttest_line_count = 3 b.stages &&\n'> 
          <'\tgit ls-files -s N >n.stages &&\n'> <'\ttest_line_count = 1 n.stages &&\n'> <'\tsed -ne "/^g/{\n'> <'\tp\n'> <'\tq\n'> 
          <'\t}" B | grep red &&\n'> <'\tgit diff --exit-code white N\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'pull unrenaming branch into renaming one'>)} 
      {
        (SQ <'\n'> <'\tgit reset --hard &&\n'> <'\tgit show-branch &&\n'> 
          <'\ttest_expect_code 1 git pull . master &&\n'> <'\tgit ls-files -u B >b.stages &&\n'> <'\ttest_line_count = 3 b.stages &&\n'> 
          <'\tgit ls-files -s N >n.stages &&\n'> <'\ttest_line_count = 1 n.stages &&\n'> <'\tsed -ne "/^g/{\n'> <'\tp\n'> <'\tq\n'> 
          <'\t}" B | grep red &&\n'> <'\tgit diff --exit-code white N\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'pull conflicting renames'>)} 
      {
        (SQ <'\n'> <'\tgit reset --hard &&\n'> <'\tgit show-branch &&\n'> 
          <'\ttest_expect_code 1 git pull . blue &&\n'> <'\tgit ls-files -u A >a.stages &&\n'> <'\ttest_line_count = 1 a.stages &&\n'> 
          <'\tgit ls-files -u B >b.stages &&\n'> <'\ttest_line_count = 1 b.stages &&\n'> <'\tgit ls-files -u C >c.stages &&\n'> 
          <'\ttest_line_count = 1 c.stages &&\n'> <'\tgit ls-files -s N >n.stages &&\n'> <'\ttest_line_count = 1 n.stages &&\n'> <'\tsed -ne "/^g/{\n'> 
          <'\tp\n'> <'\tq\n'> <'\t}" B | grep red &&\n'> <'\tgit diff --exit-code white N\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'interference with untracked working tree file'>)} 
      {
        (SQ <'\n'> <'\tgit reset --hard &&\n'> <'\tgit show-branch &&\n'> 
          <'\techo >A this file should not matter &&\n'> <'\ttest_expect_code 1 git pull . white &&\n'> <'\ttest_path_is_file A\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'interference with untracked working tree file'>)} 
      {
        (SQ <'\n'> <'\tgit reset --hard &&\n'> <'\tgit checkout white &&\n'> <'\tgit show-branch &&\n'> 
          <'\trm -f A &&\n'> <'\techo >A this file should not matter &&\n'> <'\ttest_expect_code 1 git pull . red &&\n'> 
          <'\ttest_path_is_file A\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'interference with untracked working tree file'>)} 
      {
        (SQ <'\n'> <'\tgit reset --hard &&\n'> <'\trm -f A M &&\n'> <'\tgit checkout -f master &&\n'> 
          <'\tgit tag -f anchor &&\n'> <'\tgit show-branch &&\n'> <'\tgit pull . yellow &&\n'> <'\ttest_path_is_missing M &&\n'> 
          <'\tgit reset --hard anchor\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'updated working tree file should prevent the merge'>)} 
      {
        (SQ <'\n'> <'\tgit reset --hard &&\n'> <'\trm -f A M &&\n'> <'\tgit checkout -f master &&\n'> 
          <'\tgit tag -f anchor &&\n'> <'\tgit show-branch &&\n'> <'\techo >>M one line addition &&\n'> <'\tcat M >M.saved &&\n'> 
          <'\ttest_expect_code 128 git pull . yellow &&\n'> <'\ttest_cmp M M.saved &&\n'> <'\trm -f M.saved\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'updated working tree file should prevent the merge'>)} 
      {
        (SQ <'\n'> <'\tgit reset --hard &&\n'> <'\trm -f A M &&\n'> <'\tgit checkout -f master &&\n'> 
          <'\tgit tag -f anchor &&\n'> <'\tgit show-branch &&\n'> <'\techo >>M one line addition &&\n'> <'\tcat M >M.saved &&\n'> 
          <'\tgit update-index M &&\n'> <'\ttest_expect_code 128 git pull . yellow &&\n'> <'\ttest_cmp M M.saved &&\n'> <'\trm -f M.saved\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'interference with untracked working tree file'>)} 
      {
        (SQ <'\n'> <'\tgit reset --hard &&\n'> <'\trm -f A M &&\n'> <'\tgit checkout -f yellow &&\n'> 
          <'\tgit tag -f anchor &&\n'> <'\tgit show-branch &&\n'> <'\techo >M this file should not matter &&\n'> <'\tgit pull . master &&\n'> 
          <'\ttest_path_is_file M &&\n'> <'\t! {\n'> <'\t\tgit ls-files -s |\n'> <'\t\tgrep M\n'> <'\t} &&\n'> <'\tgit reset --hard anchor\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'merge of identical changes in a renamed file'>)} 
      {
        (SQ <'\n'> <'\trm -f A M N &&\n'> <'\tgit reset --hard &&\n'> 
          <'\tgit checkout change+rename &&\n'> <'\tGIT_MERGE_VERBOSITY=3 git merge change | test_i18ngrep "^Skipped B" &&\n'> 
          <'\tgit reset --hard HEAD^ &&\n'> <'\tgit checkout change &&\n'> 
          <'\tGIT_MERGE_VERBOSITY=3 git merge change+rename | test_i18ngrep "^Skipped B"\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'setup for rename + d/f conflicts'>)} 
      {
        (SQ <'\n'> <'\tgit reset --hard &&\n'> <'\tgit checkout --orphan dir-in-way &&\n'> 
          <'\tgit rm -rf . &&\n'> <'\tgit clean -fdqx &&\n'> <'\n'> <'\tmkdir sub &&\n'> <'\tmkdir dir &&\n'> 
          <'\tprintf "1\\n2\\n3\\n4\\n5\\n6\\n7\\n8\\n9\\n10\\n" >sub/file &&\n'> <'\techo foo >dir/file-in-the-way &&\n'> <'\tgit add -A &&\n'> <'\tgit commit -m "Common commit" &&\n'> 
          <'\n'> <'\techo 11 >>sub/file &&\n'> <'\techo more >>dir/file-in-the-way &&\n'> <'\tgit add -u &&\n'> 
          <'\tgit commit -m "Commit to merge, with dir in the way" &&\n'> <'\n'> <'\tgit checkout -b dir-not-in-way &&\n'> <'\tgit reset --soft HEAD^ &&\n'> 
          <'\tgit rm -rf dir &&\n'> <'\tgit commit -m "Commit to merge, with dir removed" -- dir sub/file &&\n'> <'\n'> 
          <'\tgit checkout -b renamed-file-has-no-conflicts dir-in-way~1 &&\n'> <'\tgit rm -rf dir &&\n'> <'\tgit rm sub/file &&\n'> 
          <'\tprintf "1\\n2\\n3\\n4\\n5555\\n6\\n7\\n8\\n9\\n10\\n" >dir &&\n'> <'\tgit add dir &&\n'> <'\tgit commit -m "Independent change" &&\n'> <'\n'> 
          <'\tgit checkout -b renamed-file-has-conflicts dir-in-way~1 &&\n'> <'\tgit rm -rf dir &&\n'> <'\tgit mv sub/file dir &&\n'> <'\techo 12 >>dir &&\n'> <'\tgit add dir &&\n'> 
          <'\tgit commit -m "Conflicting change"\n'>
        )
      }
    )
    (SimpleCommand
      words: [
        {(printf)}
        {
          (DQ (1) (Lit_Other '\\') (n2) (Lit_Other '\\') (n3) (Lit_Other '\\') (n4) (Lit_Other '\\') (n5555) 
            (Lit_Other '\\') (n6) (Lit_Other '\\') (n7) (Lit_Other '\\') (n8) (Lit_Other '\\') (n9) (Lit_Other '\\') (n10) (Lit_Other '\\') 
            (n11) (Lit_Other '\\') (n)
          )
        }
      ]
      redirects: [(Redir op_id:Redir_Great fd:16777215 arg_word:{(expected)} spids:[467])]
    )
    (C {(test_expect_success)} {(SQ <'Rename+D/F conflict; renamed file merges + dir not in way'>)} 
      {
        (SQ <'\n'> <'\tgit reset --hard &&\n'> 
          <'\tgit checkout -q renamed-file-has-no-conflicts^0 &&\n'> <'\tgit merge --strategy=recursive dir-not-in-way &&\n'> <'\tgit diff --quiet &&\n'> 
          <'\ttest -f dir &&\n'> <'\ttest_cmp expected dir\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'Rename+D/F conflict; renamed file merges but dir in way'>)} 
      {
        (SQ <'\n'> <'\tgit reset --hard &&\n'> <'\trm -rf dir~* &&\n'> 
          <'\tgit checkout -q renamed-file-has-no-conflicts^0 &&\n'> <'\ttest_must_fail git merge --strategy=recursive dir-in-way >output &&\n'> <'\n'> 
          <'\ttest_i18ngrep "CONFLICT (modify/delete): dir/file-in-the-way" output &&\n'> <'\ttest_i18ngrep "Auto-merging dir" output &&\n'> 
          <'\ttest_i18ngrep "Adding as dir~HEAD instead" output &&\n'> <'\n'> <'\ttest 3 -eq "$(git ls-files -u | wc -l)" &&\n'> 
          <'\ttest 2 -eq "$(git ls-files -u dir/file-in-the-way | wc -l)" &&\n'> <'\n'> <'\ttest_must_fail git diff --quiet &&\n'> <'\ttest_must_fail git diff --cached --quiet &&\n'> 
          <'\n'> <'\ttest -f dir/file-in-the-way &&\n'> <'\ttest -f dir~HEAD &&\n'> <'\ttest_cmp expected dir~HEAD\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'Same as previous, but merged other way'>)} 
      {
        (SQ <'\n'> <'\tgit reset --hard &&\n'> <'\trm -rf dir~* &&\n'> 
          <'\tgit checkout -q dir-in-way^0 &&\n'> 
          <
'\ttest_must_fail git merge --strategy=recursive renamed-file-has-no-conflicts >output 2>errors &&\n'
          > <'\n'> <'\t! grep "error: refusing to lose untracked file at" errors &&\n'> 
          <'\ttest_i18ngrep "CONFLICT (modify/delete): dir/file-in-the-way" output &&\n'> <'\ttest_i18ngrep "Auto-merging dir" output &&\n'> 
          <'\ttest_i18ngrep "Adding as dir~renamed-file-has-no-conflicts instead" output &&\n'> <'\n'> <'\ttest 3 -eq "$(git ls-files -u | wc -l)" &&\n'> 
          <'\ttest 2 -eq "$(git ls-files -u dir/file-in-the-way | wc -l)" &&\n'> <'\n'> <'\ttest_must_fail git diff --quiet &&\n'> <'\ttest_must_fail git diff --cached --quiet &&\n'> 
          <'\n'> <'\ttest -f dir/file-in-the-way &&\n'> <'\ttest -f dir~renamed-file-has-no-conflicts &&\n'> 
          <'\ttest_cmp expected dir~renamed-file-has-no-conflicts\n'>
        )
      }
    )
    (AndOr
      ops: [Op_DAmp]
      children: [
        (SimpleCommand
          words: [{(cat)}]
          redirects: [
            (Redir op_id:Redir_Great fd:16777215 arg_word:{(expected)} spids:[549])
            (HereDoc
              op_id: Redir_DLess
              fd: 16777215
              body: 
                {('1\n') ('2\n') ('3\n') ('4\n') ('5\n') ('6\n') ('7\n') ('8\n') ('9\n') ('10\n') 
                  ('<<<<<<< HEAD:dir\n') ('12\n') ('=======\n') ('11\n') ('>>>>>>> dir-not-in-way:sub/file\n')
                }
              do_expansion: False
              here_end: EOF
              was_filled: T
              spids: [552]
            )
          ]
        )
        (C {(test_expect_success)} 
          {(SQ <'Rename+D/F conflict; renamed file cannot merge, dir not in way'>)} 
          {
            (SQ <'\n'> <'\tgit reset --hard &&\n'> <'\trm -rf dir~* &&\n'> 
              <'\tgit checkout -q renamed-file-has-conflicts^0 &&\n'> <'\ttest_must_fail git merge --strategy=recursive dir-not-in-way &&\n'> <'\n'> 
              <'\ttest 3 -eq "$(git ls-files -u | wc -l)" &&\n'> <'\ttest 3 -eq "$(git ls-files -u dir | wc -l)" &&\n'> <'\n'> 
              <'\ttest_must_fail git diff --quiet &&\n'> <'\ttest_must_fail git diff --cached --quiet &&\n'> <'\n'> <'\ttest -f dir &&\n'> 
              <'\ttest_cmp expected dir\n'>
            )
          }
        )
      ]
    )
    (C {(test_expect_success)} 
      {(SQ <'Rename+D/F conflict; renamed file cannot merge and dir in the way'>)} 
      {
        (SQ <'\n'> <'\tmodify s/dir-not-in-way/dir-in-way/ expected &&\n'> <'\n'> 
          <'\tgit reset --hard &&\n'> <'\trm -rf dir~* &&\n'> <'\tgit checkout -q renamed-file-has-conflicts^0 &&\n'> 
          <'\ttest_must_fail git merge --strategy=recursive dir-in-way &&\n'> <'\n'> <'\ttest 5 -eq "$(git ls-files -u | wc -l)" &&\n'> 
          <'\ttest 3 -eq "$(git ls-files -u dir | grep -v file-in-the-way | wc -l)" &&\n'> <'\ttest 2 -eq "$(git ls-files -u dir/file-in-the-way | wc -l)" &&\n'> <'\n'> 
          <'\ttest_must_fail git diff --quiet &&\n'> <'\ttest_must_fail git diff --cached --quiet &&\n'> <'\n'> <'\ttest -f dir/file-in-the-way &&\n'> 
          <'\ttest -f dir~HEAD &&\n'> <'\ttest_cmp expected dir~HEAD\n'>
        )
      }
    )
    (AndOr
      ops: [Op_DAmp]
      children: [
        (SimpleCommand
          words: [{(cat)}]
          redirects: [
            (Redir op_id:Redir_Great fd:16777215 arg_word:{(expected)} spids:[613])
            (HereDoc
              op_id: Redir_DLess
              fd: 16777215
              body: 
                {('1\n') ('2\n') ('3\n') ('4\n') ('5\n') ('6\n') ('7\n') ('8\n') ('9\n') ('10\n') 
                  ('<<<<<<< HEAD:sub/file\n') ('11\n') ('=======\n') ('12\n') ('>>>>>>> renamed-file-has-conflicts:dir\n')
                }
              do_expansion: False
              here_end: EOF
              was_filled: T
              spids: [616]
            )
          ]
        )
        (C {(test_expect_success)} {(SQ <'Same as previous, but merged other way'>)} 
          {
            (SQ <'\n'> <'\tgit reset --hard &&\n'> <'\trm -rf dir~* &&\n'> 
              <'\tgit checkout -q dir-in-way^0 &&\n'> <'\ttest_must_fail git merge --strategy=recursive renamed-file-has-conflicts &&\n'> <'\n'> 
              <'\ttest 5 -eq "$(git ls-files -u | wc -l)" &&\n'> <'\ttest 3 -eq "$(git ls-files -u dir | grep -v file-in-the-way | wc -l)" &&\n'> 
              <'\ttest 2 -eq "$(git ls-files -u dir/file-in-the-way | wc -l)" &&\n'> <'\n'> <'\ttest_must_fail git diff --quiet &&\n'> <'\ttest_must_fail git diff --cached --quiet &&\n'> 
              <'\n'> <'\ttest -f dir/file-in-the-way &&\n'> <'\ttest -f dir~renamed-file-has-conflicts &&\n'> 
              <'\ttest_cmp expected dir~renamed-file-has-conflicts\n'>
            )
          }
        )
      ]
    )
    (C {(test_expect_success)} 
      {(SQ <'setup both rename source and destination involved in D/F conflict'>)} 
      {
        (SQ <'\n'> <'\tgit reset --hard &&\n'> <'\tgit checkout --orphan rename-dest &&\n'> 
          <'\tgit rm -rf . &&\n'> <'\tgit clean -fdqx &&\n'> <'\n'> <'\tmkdir one &&\n'> <'\techo stuff >one/file &&\n'> 
          <'\tgit add -A &&\n'> <'\tgit commit -m "Common commit" &&\n'> <'\n'> <'\tgit mv one/file destdir &&\n'> 
          <'\tgit commit -m "Renamed to destdir" &&\n'> <'\n'> <'\tgit checkout -b source-conflict HEAD~1 &&\n'> <'\tgit rm -rf one &&\n'> 
          <'\tmkdir destdir &&\n'> <'\ttouch one destdir/foo &&\n'> <'\tgit add -A &&\n'> <'\tgit commit -m "Conflicts in the way"\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'both rename source and destination involved in D/F conflict'>)} 
      {
        (SQ <'\n'> <'\tgit reset --hard &&\n'> <'\trm -rf dir~* &&\n'> 
          <'\tgit checkout -q rename-dest^0 &&\n'> <'\ttest_must_fail git merge --strategy=recursive source-conflict &&\n'> <'\n'> 
          <'\ttest 1 -eq "$(git ls-files -u | wc -l)" &&\n'> <'\n'> <'\ttest_must_fail git diff --quiet &&\n'> <'\n'> <'\ttest -f destdir/foo &&\n'> 
          <'\ttest -f one &&\n'> <'\ttest -f destdir~HEAD &&\n'> <'\ttest "stuff" = "$(cat destdir~HEAD)"\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'setup pair rename to parent of other (D/F conflicts)'>)} 
      {
        (SQ <'\n'> <'\tgit reset --hard &&\n'> <'\tgit checkout --orphan rename-two &&\n'> 
          <'\tgit rm -rf . &&\n'> <'\tgit clean -fdqx &&\n'> <'\n'> <'\tmkdir one &&\n'> <'\tmkdir two &&\n'> 
          <'\techo stuff >one/file &&\n'> <'\techo other >two/file &&\n'> <'\tgit add -A &&\n'> <'\tgit commit -m "Common commit" &&\n'> <'\n'> 
          <'\tgit rm -rf one &&\n'> <'\tgit mv two/file one &&\n'> <'\tgit commit -m "Rename two/file -> one" &&\n'> <'\n'> 
          <'\tgit checkout -b rename-one HEAD~1 &&\n'> <'\tgit rm -rf two &&\n'> <'\tgit mv one/file two &&\n'> <'\trm -r one &&\n'> 
          <'\tgit commit -m "Rename one/file -> two"\n'>
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ <'pair rename to parent of other (D/F conflicts) w/ untracked dir'>)} 
      {
        (SQ <'\n'> <'\tgit checkout -q rename-one^0 &&\n'> <'\tmkdir one &&\n'> 
          <'\ttest_must_fail git merge --strategy=recursive rename-two &&\n'> <'\n'> <'\ttest 2 -eq "$(git ls-files -u | wc -l)" &&\n'> 
          <'\ttest 1 -eq "$(git ls-files -u one | wc -l)" &&\n'> <'\ttest 1 -eq "$(git ls-files -u two | wc -l)" &&\n'> <'\n'> 
          <'\ttest_must_fail git diff --quiet &&\n'> <'\n'> <'\ttest 4 -eq $(find . | grep -v .git | wc -l) &&\n'> <'\n'> <'\ttest -d one &&\n'> 
          <'\ttest -f one~rename-two &&\n'> <'\ttest -f two &&\n'> <'\ttest "other" = $(cat one~rename-two) &&\n'> 
          <'\ttest "stuff" = $(cat two)\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'pair rename to parent of other (D/F conflicts) w/ clean start'>)} 
      {
        (SQ <'\n'> <'\tgit reset --hard &&\n'> <'\tgit clean -fdqx &&\n'> 
          <'\ttest_must_fail git merge --strategy=recursive rename-two &&\n'> <'\n'> <'\ttest 2 -eq "$(git ls-files -u | wc -l)" &&\n'> 
          <'\ttest 1 -eq "$(git ls-files -u one | wc -l)" &&\n'> <'\ttest 1 -eq "$(git ls-files -u two | wc -l)" &&\n'> <'\n'> 
          <'\ttest_must_fail git diff --quiet &&\n'> <'\n'> <'\ttest 3 -eq $(find . | grep -v .git | wc -l) &&\n'> <'\n'> <'\ttest -f one &&\n'> 
          <'\ttest -f two &&\n'> <'\ttest "other" = $(cat one) &&\n'> <'\ttest "stuff" = $(cat two)\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'setup rename of one file to two, with directories in the way'>)} 
      {
        (SQ <'\n'> <'\tgit reset --hard &&\n'> <'\tgit checkout --orphan first-rename &&\n'> 
          <'\tgit rm -rf . &&\n'> <'\tgit clean -fdqx &&\n'> <'\n'> <'\techo stuff >original &&\n'> <'\tgit add -A &&\n'> 
          <'\tgit commit -m "Common commit" &&\n'> <'\n'> <'\tmkdir two &&\n'> <'\t>two/file &&\n'> <'\tgit add two/file &&\n'> 
          <'\tgit mv original one &&\n'> <'\tgit commit -m "Put two/file in the way, rename to one" &&\n'> <'\n'> 
          <'\tgit checkout -b second-rename HEAD~1 &&\n'> <'\tmkdir one &&\n'> <'\t>one/file &&\n'> <'\tgit add one/file &&\n'> <'\tgit mv original two &&\n'> 
          <'\tgit commit -m "Put one/file in the way, rename to two"\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'check handling of differently renamed file with D/F conflicts'>)} 
      {
        (SQ <'\n'> <'\tgit checkout -q first-rename^0 &&\n'> 
          <'\ttest_must_fail git merge --strategy=recursive second-rename &&\n'> <'\n'> <'\ttest 5 -eq "$(git ls-files -s | wc -l)" &&\n'> 
          <'\ttest 3 -eq "$(git ls-files -u | wc -l)" &&\n'> <'\ttest 1 -eq "$(git ls-files -u one | wc -l)" &&\n'> 
          <'\ttest 1 -eq "$(git ls-files -u two | wc -l)" &&\n'> <'\ttest 1 -eq "$(git ls-files -u original | wc -l)" &&\n'> 
          <'\ttest 2 -eq "$(git ls-files -o | wc -l)" &&\n'> <'\n'> <'\ttest -f one/file &&\n'> <'\ttest -f two/file &&\n'> <'\ttest -f one~HEAD &&\n'> 
          <'\ttest -f two~second-rename &&\n'> <'\t! test -f original\n'>
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ <'setup rename one file to two; directories moving out of the way'>)} 
      {
        (SQ <'\n'> <'\tgit reset --hard &&\n'> <'\tgit checkout --orphan first-rename-redo &&\n'> 
          <'\tgit rm -rf . &&\n'> <'\tgit clean -fdqx &&\n'> <'\n'> <'\techo stuff >original &&\n'> <'\tmkdir one two &&\n'> 
          <'\ttouch one/file two/file &&\n'> <'\tgit add -A &&\n'> <'\tgit commit -m "Common commit" &&\n'> <'\n'> <'\tgit rm -rf one &&\n'> 
          <'\tgit mv original one &&\n'> <'\tgit commit -m "Rename to one" &&\n'> <'\n'> <'\tgit checkout -b second-rename-redo HEAD~1 &&\n'> 
          <'\tgit rm -rf two &&\n'> <'\tgit mv original two &&\n'> <'\tgit commit -m "Rename to two"\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'check handling of differently renamed file with D/F conflicts'>)} 
      {
        (SQ <'\n'> <'\tgit checkout -q first-rename-redo^0 &&\n'> 
          <'\ttest_must_fail git merge --strategy=recursive second-rename-redo &&\n'> <'\n'> <'\ttest 3 -eq "$(git ls-files -u | wc -l)" &&\n'> 
          <'\ttest 1 -eq "$(git ls-files -u one | wc -l)" &&\n'> <'\ttest 1 -eq "$(git ls-files -u two | wc -l)" &&\n'> 
          <'\ttest 1 -eq "$(git ls-files -u original | wc -l)" &&\n'> <'\ttest 0 -eq "$(git ls-files -o | wc -l)" &&\n'> <'\n'> <'\ttest -f one &&\n'> <'\ttest -f two &&\n'> 
          <'\t! test -f original\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'setup avoid unnecessary update, normal rename'>)} 
      {
        (SQ <'\n'> <'\tgit reset --hard &&\n'> 
          <'\tgit checkout --orphan avoid-unnecessary-update-1 &&\n'> <'\tgit rm -rf . &&\n'> <'\tgit clean -fdqx &&\n'> <'\n'> 
          <'\tprintf "1\\n2\\n3\\n4\\n5\\n6\\n7\\n8\\n9\\n10\\n" >original &&\n'> <'\tgit add -A &&\n'> <'\tgit commit -m "Common commit" &&\n'> <'\n'> <'\tgit mv original rename &&\n'> 
          <'\techo 11 >>rename &&\n'> <'\tgit add -u &&\n'> <'\tgit commit -m "Renamed and modified" &&\n'> <'\n'> 
          <'\tgit checkout -b merge-branch-1 HEAD~1 &&\n'> <'\techo "random content" >random-file &&\n'> <'\tgit add -A &&\n'> 
          <'\tgit commit -m "Random, unrelated changes"\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'avoid unnecessary update, normal rename'>)} 
      {
        (SQ <'\n'> <'\tgit checkout -q avoid-unnecessary-update-1^0 &&\n'> 
          <'\ttest-chmtime =1000000000 rename &&\n'> <'\ttest-chmtime -v +0 rename >expect &&\n'> <'\tgit merge merge-branch-1 &&\n'> 
          <'\ttest-chmtime -v +0 rename >actual &&\n'> <'\ttest_cmp expect actual # "rename" should have stayed intact\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'setup to test avoiding unnecessary update, with D/F conflict'>)} 
      {
        (SQ <'\n'> <'\tgit reset --hard &&\n'> 
          <'\tgit checkout --orphan avoid-unnecessary-update-2 &&\n'> <'\tgit rm -rf . &&\n'> <'\tgit clean -fdqx &&\n'> <'\n'> <'\tmkdir df &&\n'> 
          <'\tprintf "1\\n2\\n3\\n4\\n5\\n6\\n7\\n8\\n9\\n10\\n" >df/file &&\n'> <'\tgit add -A &&\n'> <'\tgit commit -m "Common commit" &&\n'> <'\n'> <'\tgit mv df/file temp &&\n'> 
          <'\trm -rf df &&\n'> <'\tgit mv temp df &&\n'> <'\techo 11 >>df &&\n'> <'\tgit add -u &&\n'> 
          <'\tgit commit -m "Renamed and modified" &&\n'> <'\n'> <'\tgit checkout -b merge-branch-2 HEAD~1 &&\n'> <'\t>unrelated-change &&\n'> 
          <'\tgit add unrelated-change &&\n'> <'\tgit commit -m "Only unrelated changes"\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'avoid unnecessary update, with D/F conflict'>)} 
      {
        (SQ <'\n'> <'\tgit checkout -q avoid-unnecessary-update-2^0 &&\n'> 
          <'\ttest-chmtime =1000000000 df &&\n'> <'\ttest-chmtime -v +0 df >expect &&\n'> <'\tgit merge merge-branch-2 &&\n'> 
          <'\ttest-chmtime -v +0 df >actual &&\n'> <'\ttest_cmp expect actual # "df" should have stayed intact\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'setup avoid unnecessary update, dir->(file,nothing)'>)} 
      {
        (SQ <'\n'> <'\tgit rm -rf . &&\n'> <'\tgit clean -fdqx &&\n'> <'\trm -rf .git &&\n'> 
          <'\tgit init &&\n'> <'\n'> <'\t>irrelevant &&\n'> <'\tmkdir df &&\n'> <'\t>df/file &&\n'> <'\tgit add -A &&\n'> 
          <'\tgit commit -mA &&\n'> <'\n'> <'\tgit checkout -b side &&\n'> <'\tgit rm -rf df &&\n'> <'\tgit commit -mB &&\n'> <'\n'> 
          <'\tgit checkout master &&\n'> <'\tgit rm -rf df &&\n'> <'\techo bla >df &&\n'> <'\tgit add -A &&\n'> 
          <'\tgit commit -m "Add a newfile"\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'avoid unnecessary update, dir->(file,nothing)'>)} 
      {
        (SQ <'\n'> <'\tgit checkout -q master^0 &&\n'> <'\ttest-chmtime =1000000000 df &&\n'> 
          <'\ttest-chmtime -v +0 df >expect &&\n'> <'\tgit merge side &&\n'> <'\ttest-chmtime -v +0 df >actual &&\n'> 
          <'\ttest_cmp expect actual # "df" should have stayed intact\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'setup avoid unnecessary update, modify/delete'>)} 
      {
        (SQ <'\n'> <'\tgit rm -rf . &&\n'> <'\tgit clean -fdqx &&\n'> <'\trm -rf .git &&\n'> 
          <'\tgit init &&\n'> <'\n'> <'\t>irrelevant &&\n'> <'\t>file &&\n'> <'\tgit add -A &&\n'> <'\tgit commit -mA &&\n'> <'\n'> 
          <'\tgit checkout -b side &&\n'> <'\tgit rm -f file &&\n'> <'\tgit commit -m "Delete file" &&\n'> <'\n'> <'\tgit checkout master &&\n'> 
          <'\techo bla >file &&\n'> <'\tgit add -A &&\n'> <'\tgit commit -m "Modify file"\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'avoid unnecessary update, modify/delete'>)} 
      {
        (SQ <'\n'> <'\tgit checkout -q master^0 &&\n'> <'\ttest-chmtime =1000000000 file &&\n'> 
          <'\ttest-chmtime -v +0 file >expect &&\n'> <'\ttest_must_fail git merge side &&\n'> <'\ttest-chmtime -v +0 file >actual &&\n'> 
          <'\ttest_cmp expect actual # "file" should have stayed intact\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'setup avoid unnecessary update, rename/add-dest'>)} 
      {
        (SQ <'\n'> <'\tgit rm -rf . &&\n'> <'\tgit clean -fdqx &&\n'> <'\trm -rf .git &&\n'> 
          <'\tgit init &&\n'> <'\n'> <'\tprintf "1\\n2\\n3\\n4\\n5\\n6\\n7\\n8\\n" >file &&\n'> <'\tgit add -A &&\n'> 
          <'\tgit commit -mA &&\n'> <'\n'> <'\tgit checkout -b side &&\n'> <'\tcp file newfile &&\n'> <'\tgit add -A &&\n'> 
          <'\tgit commit -m "Add file copy" &&\n'> <'\n'> <'\tgit checkout master &&\n'> <'\tgit mv file newfile &&\n'> <'\tgit commit -m "Rename file"\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'avoid unnecessary update, rename/add-dest'>)} 
      {
        (SQ <'\n'> <'\tgit checkout -q master^0 &&\n'> <'\ttest-chmtime =1000000000 newfile &&\n'> 
          <'\ttest-chmtime -v +0 newfile >expect &&\n'> <'\tgit merge side &&\n'> <'\ttest-chmtime -v +0 newfile >actual &&\n'> 
          <'\ttest_cmp expect actual # "file" should have stayed intact\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'setup merge of rename + small change'>)} 
      {
        (SQ <'\n'> <'\tgit reset --hard &&\n'> 
          <'\tgit checkout --orphan rename-plus-small-change &&\n'> <'\tgit rm -rf . &&\n'> <'\tgit clean -fdqx &&\n'> <'\n'> <'\techo ORIGINAL >file &&\n'> 
          <'\tgit add file &&\n'> <'\n'> <'\ttest_tick &&\n'> <'\tgit commit -m Initial &&\n'> <'\tgit checkout -b rename_branch &&\n'> 
          <'\tgit mv file renamed_file &&\n'> <'\tgit commit -m Rename &&\n'> <'\tgit checkout rename-plus-small-change &&\n'> 
          <'\techo NEW-VERSION >file &&\n'> <'\tgit commit -a -m Reformat\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'merge rename + small change'>)} 
      {
        (SQ <'\n'> <'\tgit merge rename_branch &&\n'> <'\n'> 
          <'\ttest 1 -eq $(git ls-files -s | wc -l) &&\n'> <'\ttest 0 -eq $(git ls-files -o | wc -l) &&\n'> 
          <'\ttest $(git rev-parse HEAD:renamed_file) = $(git rev-parse HEAD~1:file)\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'setup for use of extended merge markers'>)} 
      {
        (SQ <'\n'> <'\tgit rm -rf . &&\n'> <'\tgit clean -fdqx &&\n'> <'\trm -rf .git &&\n'> 
          <'\tgit init &&\n'> <'\n'> <'\tprintf "1\\n2\\n3\\n4\\n5\\n6\\n7\\n8\\n" >original_file &&\n'> 
          <'\tgit add original_file &&\n'> <'\tgit commit -mA &&\n'> <'\n'> <'\tgit checkout -b rename &&\n'> <'\techo 9 >>original_file &&\n'> 
          <'\tgit add original_file &&\n'> <'\tgit mv original_file renamed_file &&\n'> <'\tgit commit -mB &&\n'> <'\n'> 
          <'\tgit checkout master &&\n'> <'\techo 8.5 >>original_file &&\n'> <'\tgit add original_file &&\n'> <'\tgit commit -mC\n'>
        )
      }
    )
    (AndOr
      ops: [Op_DAmp]
      children: [
        (SimpleCommand
          words: [{(cat)}]
          redirects: [
            (Redir op_id:Redir_Great fd:16777215 arg_word:{(expected)} spids:[1210])
            (HereDoc
              op_id: Redir_DLess
              fd: 16777215
              body: 
                {('1\n') ('2\n') ('3\n') ('4\n') ('5\n') ('6\n') ('7\n') ('8\n') 
                  ('<<<<<<< HEAD:renamed_file\n') ('9\n') ('=======\n') ('8.5\n') ('>>>>>>> master^0:original_file\n')
                }
              do_expansion: False
              here_end: EOF
              was_filled: T
              spids: [1213]
            )
          ]
        )
        (C {(test_expect_success)} {(SQ <'merge master into rename has correct extended markers'>)} 
          {
            (SQ <'\n'> <'\tgit checkout rename^0 &&\n'> 
              <'\ttest_must_fail git merge -s recursive master^0 &&\n'> <'\ttest_cmp expected renamed_file\n'>
            )
          }
        )
      ]
    )
    (AndOr
      ops: [Op_DAmp]
      children: [
        (SimpleCommand
          words: [{(cat)}]
          redirects: [
            (Redir op_id:Redir_Great fd:16777215 arg_word:{(expected)} spids:[1236])
            (HereDoc
              op_id: Redir_DLess
              fd: 16777215
              body: 
                {('1\n') ('2\n') ('3\n') ('4\n') ('5\n') ('6\n') ('7\n') ('8\n') 
                  ('<<<<<<< HEAD:original_file\n') ('8.5\n') ('=======\n') ('9\n') ('>>>>>>> rename^0:renamed_file\n')
                }
              do_expansion: False
              here_end: EOF
              was_filled: T
              spids: [1239]
            )
          ]
        )
        (C {(test_expect_success)} {(SQ <'merge rename into master has correct extended markers'>)} 
          {
            (SQ <'\n'> <'\tgit reset --hard &&\n'> <'\tgit checkout master^0 &&\n'> 
              <'\ttest_must_fail git merge -s recursive rename^0 &&\n'> <'\ttest_cmp expected renamed_file\n'>
            )
          }
        )
      ]
    )
    (C {(test_expect_success)} {(SQ <'setup spurious "refusing to lose untracked" message'>)} 
      {
        (SQ <'\n'> <'\tgit rm -rf . &&\n'> <'\tgit clean -fdqx &&\n'> <'\trm -rf .git &&\n'> 
          <'\tgit init &&\n'> <'\n'> <'\t> irrelevant_file &&\n'> <'\tprintf "1\\n2\\n3\\n4\\n5\\n6\\n7\\n8\\n" >original_file &&\n'> 
          <'\tgit add irrelevant_file original_file &&\n'> <'\tgit commit -mA &&\n'> <'\n'> <'\tgit checkout -b rename &&\n'> 
          <'\tgit mv original_file renamed_file &&\n'> <'\tgit commit -mB &&\n'> <'\n'> <'\tgit checkout master &&\n'> <'\tgit rm original_file &&\n'> 
          <'\tgit commit -mC\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'no spurious "refusing to lose untracked" message'>)} 
      {
        (SQ <'\n'> <'\tgit checkout master^0 &&\n'> 
          <'\ttest_must_fail git merge rename^0 2>errors.txt &&\n'> <'\t! grep "refusing to lose untracked file" errors.txt\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'do not follow renames for empty files'>)} 
      {
        (SQ <'\n'> <'\tgit checkout -f -b empty-base &&\n'> <'\t>empty1 &&\n'> <'\tgit add empty1 &&\n'> 
          <'\tgit commit -m base &&\n'> <'\techo content >empty1 &&\n'> <'\tgit add empty1 &&\n'> <'\tgit commit -m fill &&\n'> 
          <'\tgit checkout -b empty-topic HEAD^ &&\n'> <'\tgit mv empty1 empty2 &&\n'> <'\tgit commit -m rename &&\n'> 
          <'\ttest_must_fail git merge empty-base &&\n'> <'\t>expect &&\n'> <'\ttest_cmp expect empty2\n'>
        )
      }
    )
    (C {(test_done)})
  ]
)