(command.CommandList
  children: [
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:test_description)
          op: assign_op.Equal
          rhs: {(SQ <'merge: handle file mode'>)}
          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'>
        )
      }
    )
    (command.ShFunction
      name: do_one_mode
      body: 
        (BraceGroup
          children: [
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:strategy)
                  op: assign_op.Equal
                  rhs: {($ Id.VSub_Number '$1')}
                  spids: [44]
                )
              ]
            )
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:us)
                  op: assign_op.Equal
                  rhs: {($ Id.VSub_Number '$2')}
                  spids: [48]
                )
              ]
            )
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:them)
                  op: assign_op.Equal
                  rhs: {($ Id.VSub_Number '$3')}
                  spids: [52]
                )
              ]
            )
            (C {<test_expect_success>} 
              {
                (DQ <'resolve single mode change ('> ($ Id.VSub_DollarName '$strategy') <', '> 
                  ($ Id.VSub_DollarName '$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 ('> ($ Id.VSub_DollarName '$strategy') <', '> 
                  ($ Id.VSub_DollarName '$us') <')'>
                )
              } {(SQ <'\n'> <'\t\ttest -x file1\n'> <'\t'>)}
            )
          ]
        )
    )
    (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'>
        )
      }
    )
    (command.ShFunction
      name: do_both_modes
      body: 
        (BraceGroup
          children: [
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:strategy)
                  op: assign_op.Equal
                  rhs: {($ Id.VSub_Number '$1')}
                  spids: [163]
                )
              ]
            )
            (C {<test_expect_success>} 
              {
                (DQ <'detect conflict on double mode change ('> ($ Id.VSub_DollarName '$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 ('> ($ Id.VSub_DollarName '$strategy') <')'>)} {(SQ <'\n'> <'\t\ttest -x file2\n'> <'\t'>)}
            )
          ]
        )
    )
    (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'>
        )
      }
    )
    (command.ShFunction
      name: do_delete_modechange
      body: 
        (BraceGroup
          children: [
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:strategy)
                  op: assign_op.Equal
                  rhs: {($ Id.VSub_Number '$1')}
                  spids: [242]
                )
              ]
            )
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:us)
                  op: assign_op.Equal
                  rhs: {($ Id.VSub_Number '$2')}
                  spids: [246]
                )
              ]
            )
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:them)
                  op: assign_op.Equal
                  rhs: {($ Id.VSub_Number '$3')}
                  spids: [250]
                )
              ]
            )
            (C {<test_expect_success>} 
              {
                (DQ <'detect delete/modechange conflict ('> ($ Id.VSub_DollarName '$strategy') <', '> 
                  ($ Id.VSub_DollarName '$us') <')'>
                )
              } 
              {
                (SQ <'\n'> <'\t\tgit reset --hard &&\n'> <'\t\tgit checkout $us &&\n'> 
                  <'\t\ttest_must_fail git merge -s $strategy $them\n'> <'\t'>
                )
              }
            )
          ]
        )
    )
    (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>})
  ]
)