(CommandList children: [ (Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (LhsName name:test_description) op: Equal rhs: {(SQ <'diff function context'>)} spids: [4] ) ] spids: [4] ) (C {(.)} {(./test-lib.sh)}) (Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (LhsName name:dir) op: Equal rhs: {(DQ ($ VSub_Name '$TEST_DIRECTORY') (/t4051))} spids: [15] ) ] spids: [15] ) (FuncDef name: commit_and_tag body: (BraceGroup children: [ (AndOr children: [ (Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (LhsName name:tag) op: Equal rhs: {($ VSub_Number '$1')} spids: [30] ) ] spids: [30] ) (AndOr children: [ (C {(shift)}) (AndOr children: [ (C {(git)} {(add)} {(DQ ($ VSub_At '$@'))}) (AndOr children: [ (C {(test_tick)}) (AndOr children: [ (C {(git)} {(commit)} {(-m)} {(DQ ($ VSub_Name '$tag'))}) (C {(git)} {(tag)} {(DQ ($ VSub_Name '$tag'))}) ] op_id: Op_DAmp ) ] op_id: Op_DAmp ) ] op_id: Op_DAmp ) ] op_id: Op_DAmp ) ] op_id: Op_DAmp ) ] spids: [27] ) spids: [22 26] ) (FuncDef name: first_context_line body: (BraceGroup children: [ (C {(awk)} {(SQ <'\n'> <'\t\tfound {print; exit}\n'> <'\t\t/^@@/ {found = 1}\n'> <'\t'>)}) ] spids: [86] ) spids: [81 85] ) (FuncDef name: last_context_line body: (BraceGroup children: [(C {(sed)} {(-ne)} {(EscapedLiteralPart token:<Lit_EscapedChar '\\$'>) (p)})] spids: [106] ) spids: [101 105] ) (FuncDef name: check_diff body: (BraceGroup children: [ (Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (LhsName name:name) op: Equal rhs: {($ VSub_Number '$1')} spids: [127] ) ] spids: [127] ) (Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (LhsName name:desc) op: Equal rhs: {($ VSub_Number '$2')} spids: [131] ) ] spids: [131] ) (Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (LhsName name:options) op: Equal rhs: {(DQ ('-W ') ($ VSub_Number '$3'))} spids: [135] ) ] spids: [135] ) (C {(test_expect_success)} {(DQ ($ VSub_Name '$desc'))} {(SQ <'\n'> <'\t\tgit diff $options "$name^" "$name" >"$name.diff"\n'> <'\t'>)} ) (C {(test_expect_success)} {(SQ <' diff applies'>)} { (SQ <'\n'> <'\t\ttest_when_finished "git reset --hard" &&\n'> <'\t\tgit checkout --detach "$name^" &&\n'> <'\t\tgit apply --index "$name.diff" &&\n'> <'\t\tgit diff --exit-code "$name"\n'> <'\t'> ) } ) ] spids: [124] ) spids: [119 123] ) (C {(test_expect_success)} {(SQ <setup>)} { (SQ <'\n'> <'\tcat "$dir/includes.c" "$dir/dummy.c" "$dir/dummy.c" "$dir/hello.c" \\\n'> <'\t\t"$dir/dummy.c" "$dir/dummy.c" >file.c &&\n'> <'\tcommit_and_tag initial file.c &&\n'> <'\n'> <'\tgrep -v "delete me from hello" <file.c >file.c.new &&\n'> <'\tmv file.c.new file.c &&\n'> <'\tcommit_and_tag changed_hello file.c &&\n'> <'\n'> <'\tgrep -v "delete me from includes" <file.c >file.c.new &&\n'> <'\tmv file.c.new file.c &&\n'> <'\tcommit_and_tag changed_includes file.c &&\n'> <'\n'> <'\tcat "$dir/appended1.c" >>file.c &&\n'> <'\tcommit_and_tag appended file.c &&\n'> <'\n'> <'\tcat "$dir/appended2.c" >>file.c &&\n'> <'\tcommit_and_tag extended file.c &&\n'> <'\n'> <'\tgrep -v "Begin of second part" <file.c >file.c.new &&\n'> <'\tmv file.c.new file.c &&\n'> <'\tcommit_and_tag long_common_tail file.c &&\n'> <'\n'> <'\tgit checkout initial &&\n'> <'\tcat "$dir/hello.c" "$dir/dummy.c" >file.c &&\n'> <'\tcommit_and_tag hello_dummy file.c &&\n'> <'\n'> <'\t# overlap function context of 1st change and -u context of 2nd change\n'> <'\tgrep -v "delete me from hello" <"$dir/hello.c" >file.c &&\n'> <'\tsed 2p <"$dir/dummy.c" >>file.c &&\n'> <'\tcommit_and_tag changed_hello_dummy file.c &&\n'> <'\n'> <'\tgit checkout initial &&\n'> <'\tgrep -v "delete me from hello" <file.c >file.c.new &&\n'> <'\tmv file.c.new file.c &&\n'> <'\tcat "$dir/appended1.c" >>file.c &&\n'> <'\tcommit_and_tag changed_hello_appended file.c\n'> ) } ) (C {(check_diff)} {(changed_hello)} {(SQ <'changed function'>)}) (C {(test_expect_success)} {(SQ <' context includes begin'>)} {(SQ <'\n'> <'\tgrep "^ .*Begin of hello" changed_hello.diff\n'>)} ) (C {(test_expect_success)} {(SQ <' context includes end'>)} {(SQ <'\n'> <'\tgrep "^ .*End of hello" changed_hello.diff\n'>)} ) (C {(test_expect_success)} {(SQ <' context does not include other functions'>)} {(SQ <'\n'> <'\ttest $(grep -c "^[ +-].*Begin" changed_hello.diff) -le 1\n'>)} ) (C {(test_expect_success)} {(SQ <' context does not include preceding empty lines'>)} {(SQ <'\n'> <'\ttest "$(first_context_line <changed_hello.diff)" != " "\n'>)} ) (C {(test_expect_success)} {(SQ <' context does not include trailing empty lines'>)} {(SQ <'\n'> <'\ttest "$(last_context_line <changed_hello.diff)" != " "\n'>)} ) (C {(check_diff)} {(changed_includes)} {(SQ <'changed includes'>)}) (C {(test_expect_success)} {(SQ <' context includes begin'>)} {(SQ <'\n'> <'\tgrep "^ .*Begin.h" changed_includes.diff\n'>)} ) (C {(test_expect_success)} {(SQ <' context includes end'>)} {(SQ <'\n'> <'\tgrep "^ .*End.h" changed_includes.diff\n'>)} ) (C {(test_expect_success)} {(SQ <' context does not include other functions'>)} {(SQ <'\n'> <'\ttest $(grep -c "^[ +-].*Begin" changed_includes.diff) -le 1\n'>)} ) (C {(test_expect_success)} {(SQ <' context does not include trailing empty lines'>)} {(SQ <'\n'> <'\ttest "$(last_context_line <changed_includes.diff)" != " "\n'>)} ) (C {(check_diff)} {(appended)} {(SQ <'appended function'>)}) (C {(test_expect_success)} {(SQ <' context includes begin'>)} {(SQ <'\n'> <'\tgrep "^[+].*Begin of first part" appended.diff\n'>)} ) (C {(test_expect_success)} {(SQ <' context includes end'>)} {(SQ <'\n'> <'\tgrep "^[+].*End of first part" appended.diff\n'>)} ) (C {(test_expect_success)} {(SQ <' context does not include other functions'>)} {(SQ <'\n'> <'\ttest $(grep -c "^[ +-].*Begin" appended.diff) -le 1\n'>)} ) (C {(check_diff)} {(extended)} {(SQ <'appended function part'>)}) (C {(test_expect_success)} {(SQ <' context includes begin'>)} {(SQ <'\n'> <'\tgrep "^ .*Begin of first part" extended.diff\n'>)} ) (C {(test_expect_success)} {(SQ <' context includes end'>)} {(SQ <'\n'> <'\tgrep "^[+].*End of second part" extended.diff\n'>)} ) (C {(test_expect_success)} {(SQ <' context does not include other functions'>)} {(SQ <'\n'> <'\ttest $(grep -c "^[ +-].*Begin" extended.diff) -le 2\n'>)} ) (C {(test_expect_success)} {(SQ <' context does not include preceding empty lines'>)} {(SQ <'\n'> <'\ttest "$(first_context_line <extended.diff)" != " "\n'>)} ) (C {(check_diff)} {(long_common_tail)} {(SQ <'change with long common tail and no context'>)} {(-U0)}) (C {(test_expect_success)} {(SQ <' context includes begin'>)} {(SQ <'\n'> <'\tgrep "^ .*Begin of first part" long_common_tail.diff\n'>)} ) (C {(test_expect_success)} {(SQ <' context includes end'>)} {(SQ <'\n'> <'\tgrep "^ .*End of second part" long_common_tail.diff\n'>)} ) (C {(test_expect_success)} {(SQ <' context does not include other functions'>)} {(SQ <'\n'> <'\ttest $(grep -c "^[ +-].*Begin" long_common_tail.diff) -le 2\n'>)} ) (C {(test_expect_success)} {(SQ <' context does not include preceding empty lines'>)} {(SQ <'\n'> <'\ttest "$(first_context_line <long_common_tail.diff.diff)" != " "\n'>)} ) (C {(check_diff)} {(changed_hello_appended)} {(SQ <'changed function plus appended function'>)}) (C {(test_expect_success)} {(SQ <' context includes begin'>)} { (SQ <'\n'> <'\tgrep "^ .*Begin of hello" changed_hello_appended.diff &&\n'> <'\tgrep "^[+].*Begin of first part" changed_hello_appended.diff\n'> ) } ) (C {(test_expect_success)} {(SQ <' context includes end'>)} { (SQ <'\n'> <'\tgrep "^ .*End of hello" changed_hello_appended.diff &&\n'> <'\tgrep "^[+].*End of first part" changed_hello_appended.diff\n'> ) } ) (C {(test_expect_success)} {(SQ <' context does not include other functions'>)} {(SQ <'\n'> <'\ttest $(grep -c "^[ +-].*Begin" changed_hello_appended.diff) -le 2\n'>)} ) (C {(check_diff)} {(changed_hello_dummy)} {(SQ <'changed two consecutive functions'>)}) (C {(test_expect_success)} {(SQ <' context includes begin'>)} { (SQ <'\n'> <'\tgrep "^ .*Begin of hello" changed_hello_dummy.diff &&\n'> <'\tgrep "^ .*Begin of dummy" changed_hello_dummy.diff\n'> ) } ) (C {(test_expect_success)} {(SQ <' context includes end'>)} { (SQ <'\n'> <'\tgrep "^ .*End of hello" changed_hello_dummy.diff &&\n'> <'\tgrep "^ .*End of dummy" changed_hello_dummy.diff\n'> ) } ) (C {(test_expect_success)} {(SQ <' overlapping hunks are merged'>)} {(SQ <'\n'> <'\ttest $(grep -c "^@@" changed_hello_dummy.diff) -eq 1\n'>)} ) (C {(test_done)}) ] )