(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>}) ] )