(CommandList
  children: [
    (Assignment
      keyword: Assign_None
      pairs: [
        (assign_pair
          lhs: (LhsName name:test_description)
          op: Equal
          rhs: {(SQ <'merge: handle file mode'>)}
          spids: [4]
        )
      ]
      spids: [4]
    )
    (C {(.)} {(./test-lib.sh)})
    (C {(test_expect_success)} {(SQ <'set up mode change in one branch'>)} 
      {
        (SQ <'\n'> <'\t: >file1 &&\n'> <'\tgit add file1 &&\n'> <'\tgit commit -m initial &&\n'> 
          <'\tgit checkout -b a1 master &&\n'> <'\t: >dummy &&\n'> <'\tgit add dummy &&\n'> <'\tgit commit -m a &&\n'> 
          <'\tgit checkout -b b1 master &&\n'> <'\ttest_chmod +x file1 &&\n'> <'\tgit add file1 &&\n'> <'\tgit commit -m b1\n'>
        )
      }
    )
    (FuncDef
      name: do_one_mode
      body: 
        (BraceGroup
          children: [
            (Assignment
              keyword: Assign_None
              pairs: [
                (assign_pair
                  lhs: (LhsName name:strategy)
                  op: Equal
                  rhs: {($ VSub_Number '$1')}
                  spids: [44]
                )
              ]
              spids: [44]
            )
            (Assignment
              keyword: Assign_None
              pairs: [
                (assign_pair
                  lhs: (LhsName name:us)
                  op: Equal
                  rhs: {($ VSub_Number '$2')}
                  spids: [48]
                )
              ]
              spids: [48]
            )
            (Assignment
              keyword: Assign_None
              pairs: [
                (assign_pair
                  lhs: (LhsName name:them)
                  op: Equal
                  rhs: {($ VSub_Number '$3')}
                  spids: [52]
                )
              ]
              spids: [52]
            )
            (C {(test_expect_success)} 
              {
                (DQ ('resolve single mode change (') ($ VSub_Name '$strategy') (', ') 
                  ($ VSub_Name '$us') (')')
                )
              } 
              {
                (SQ <'\n'> <'\t\tgit checkout -f $us &&\n'> <'\t\tgit merge -s $strategy $them &&\n'> 
                  <'\t\tgit ls-files -s file1 | grep ^100755\n'> <'\t'>
                )
              }
            )
            (C {(test_expect_success)} {(FILEMODE)} 
              {
                (DQ ('verify executable bit on file (') ($ VSub_Name '$strategy') (', ') 
                  ($ VSub_Name '$us') (')')
                )
              } {(SQ <'\n'> <'\t\ttest -x file1\n'> <'\t'>)}
            )
          ]
          spids: [41]
        )
      spids: [36 40]
    )
    (C {(do_one_mode)} {(recursive)} {(a1)} {(b1)})
    (C {(do_one_mode)} {(recursive)} {(b1)} {(a1)})
    (C {(do_one_mode)} {(resolve)} {(a1)} {(b1)})
    (C {(do_one_mode)} {(resolve)} {(b1)} {(a1)})
    (C {(test_expect_success)} {(SQ <'set up mode change in both branches'>)} 
      {
        (SQ <'\n'> <'\tgit reset --hard HEAD &&\n'> <'\tgit checkout -b a2 master &&\n'> 
          <'\t: >file2 &&\n'> <'\tH=$(git hash-object file2) &&\n'> <'\ttest_chmod +x file2 &&\n'> <'\tgit commit -m a2 &&\n'> 
          <'\tgit checkout -b b2 master &&\n'> <'\t: >file2 &&\n'> <'\tgit add file2 &&\n'> <'\tgit commit -m b2 &&\n'> <'\t{\n'> 
          <'\t\techo "100755 $H 2\tfile2"\n'> <'\t\techo "100644 $H 3\tfile2"\n'> <'\t} >expect\n'>
        )
      }
    )
    (FuncDef
      name: do_both_modes
      body: 
        (BraceGroup
          children: [
            (Assignment
              keyword: Assign_None
              pairs: [
                (assign_pair
                  lhs: (LhsName name:strategy)
                  op: Equal
                  rhs: {($ VSub_Number '$1')}
                  spids: [163]
                )
              ]
              spids: [163]
            )
            (C {(test_expect_success)} 
              {(DQ ('detect conflict on double mode change (') ($ VSub_Name '$strategy') (')'))} 
              {
                (SQ <'\n'> <'\t\tgit reset --hard &&\n'> <'\t\tgit checkout -f a2 &&\n'> 
                  <'\t\ttest_must_fail git merge -s $strategy b2 &&\n'> <'\t\tgit ls-files -u >actual &&\n'> <'\t\ttest_cmp actual expect &&\n'> 
                  <'\t\tgit ls-files -s file2 | grep ^100755\n'> <'\t'>
                )
              }
            )
            (C {(test_expect_success)} {(FILEMODE)} 
              {(DQ ('verify executable bit on file (') ($ VSub_Name '$strategy') (')'))} {(SQ <'\n'> <'\t\ttest -x file2\n'> <'\t'>)}
            )
          ]
          spids: [160]
        )
      spids: [155 159]
    )
    (C {(do_both_modes)} {(recursive)})
    (C {(do_both_modes)} {(resolve)})
    (C {(test_expect_success)} {(SQ <'set up delete/modechange scenario'>)} 
      {
        (SQ <'\n'> <'\tgit reset --hard &&\n'> <'\tgit checkout -b deletion master &&\n'> 
          <'\tgit rm file1 &&\n'> <'\tgit commit -m deletion\n'>
        )
      }
    )
    (FuncDef
      name: do_delete_modechange
      body: 
        (BraceGroup
          children: [
            (Assignment
              keyword: Assign_None
              pairs: [
                (assign_pair
                  lhs: (LhsName name:strategy)
                  op: Equal
                  rhs: {($ VSub_Number '$1')}
                  spids: [242]
                )
              ]
              spids: [242]
            )
            (Assignment
              keyword: Assign_None
              pairs: [
                (assign_pair
                  lhs: (LhsName name:us)
                  op: Equal
                  rhs: {($ VSub_Number '$2')}
                  spids: [246]
                )
              ]
              spids: [246]
            )
            (Assignment
              keyword: Assign_None
              pairs: [
                (assign_pair
                  lhs: (LhsName name:them)
                  op: Equal
                  rhs: {($ VSub_Number '$3')}
                  spids: [250]
                )
              ]
              spids: [250]
            )
            (C {(test_expect_success)} 
              {
                (DQ ('detect delete/modechange conflict (') ($ VSub_Name '$strategy') (', ') 
                  ($ VSub_Name '$us') (')')
                )
              } 
              {
                (SQ <'\n'> <'\t\tgit reset --hard &&\n'> <'\t\tgit checkout $us &&\n'> 
                  <'\t\ttest_must_fail git merge -s $strategy $them\n'> <'\t'>
                )
              }
            )
          ]
          spids: [239]
        )
      spids: [234 238]
    )
    (C {(do_delete_modechange)} {(recursive)} {(b1)} {(deletion)})
    (C {(do_delete_modechange)} {(recursive)} {(deletion)} {(b1)})
    (C {(do_delete_modechange)} {(resolve)} {(b1)} {(deletion)})
    (C {(do_delete_modechange)} {(resolve)} {(deletion)} {(b1)})
    (C {(test_done)})
  ]
)