(command.CommandList children: [ (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:test_description) op: assign_op.Equal rhs: { (SQ <'git checkout tests.\n'> <'\n'> <'Creates master, forks renamer and side branches from it.\n'> <'Test switching across them.\n'> <'\n'> <' ! [master] Initial A one, A two\n'> <' * [renamer] Renamer R one->uno, M two\n'> <' ! [side] Side M one, D two, A three\n'> <' ! [simple] Simple D one, M two\n'> <' ----\n'> <' + [simple] Simple D one, M two\n'> <' + [side] Side M one, D two, A three\n'> <' * [renamer] Renamer R one->uno, M two\n'> <' +*++ [master] Initial A one, A two\n'> <'\n'> ) } spids: [13] ) ] ) (C {<.>} {<'./test-lib.sh'>}) (C {<test_tick>}) (command.ShFunction name: fill body: (BraceGroup children: [ (command.ForEach iter_name: i do_arg_iter: T body: (command.DoGroup children:[(C {<echo>} {(DQ ($ Id.VSub_DollarName '$i'))})]) ) ] ) ) (C {<test_expect_success>} {<setup>} { (SQ <'\n'> <'\n'> <'\tfill x y z > same &&\n'> <'\tfill 1 2 3 4 5 6 7 8 >one &&\n'> <'\tfill a b c d e >two &&\n'> <'\tgit add same one two &&\n'> <'\tgit commit -m "Initial A one, A two" &&\n'> <'\n'> <'\tgit checkout -b renamer &&\n'> <'\trm -f one &&\n'> <'\tfill 1 3 4 5 6 7 8 >uno &&\n'> <'\tgit add uno &&\n'> <'\tfill a b c d e f >two &&\n'> <'\tgit commit -a -m "Renamer R one->uno, M two" &&\n'> <'\n'> <'\tgit checkout -b side master &&\n'> <'\tfill 1 2 3 4 5 6 7 >one &&\n'> <'\tfill A B C D E >three &&\n'> <'\trm -f two &&\n'> <'\tgit update-index --add --remove one two three &&\n'> <'\tgit commit -m "Side M one, D two, A three" &&\n'> <'\n'> <'\tgit checkout -b simple master &&\n'> <'\trm -f one &&\n'> <'\tfill a c e > two &&\n'> <'\tgit commit -a -m "Simple D one, M two" &&\n'> <'\n'> <'\tgit checkout master\n'> ) } ) (C {<test_expect_success>} {(DQ <'checkout from non-existing branch'>)} { (SQ <'\n'> <'\n'> <'\tgit checkout -b delete-me master &&\n'> <'\trm .git/refs/heads/delete-me &&\n'> <'\ttest refs/heads/delete-me = "$(git symbolic-ref HEAD)" &&\n'> <'\tgit checkout master &&\n'> <'\ttest refs/heads/master = "$(git symbolic-ref HEAD)"\n'> ) } ) (C {<test_expect_success>} {(DQ <'checkout with dirty tree without -m'>)} { (SQ <'\n'> <'\n'> <'\tfill 0 1 2 3 4 5 6 7 8 >one &&\n'> <'\tif git checkout side\n'> <'\tthen\n'> <'\t\techo Not happy\n'> <'\t\tfalse\n'> <'\telse\n'> <'\t\techo "happy - failed correctly"\n'> <'\tfi\n'> <'\n'> ) } ) (C {<test_expect_success>} {(DQ <'checkout with unrelated dirty tree without -m'>)} { (SQ <'\n'> <'\n'> <'\tgit checkout -f master &&\n'> <'\tfill 0 1 2 3 4 5 6 7 8 >same &&\n'> <'\tcp same kept &&\n'> <'\tgit checkout side >messages &&\n'> <'\ttest_cmp same kept &&\n'> <'\tprintf "M\\t%s\\n" same >messages.expect &&\n'> <'\ttest_cmp messages.expect messages\n'> ) } ) (C {<test_expect_success>} {(DQ <'checkout -m with dirty tree'>)} { (SQ <'\n'> <'\n'> <'\tgit checkout -f master &&\n'> <'\tgit clean -f &&\n'> <'\n'> <'\tfill 0 1 2 3 4 5 6 7 8 >one &&\n'> <'\tgit checkout -m side > messages &&\n'> <'\n'> <'\ttest "$(git symbolic-ref HEAD)" = "refs/heads/side" &&\n'> <'\n'> <'\tprintf "M\\t%s\\n" one >expect.messages &&\n'> <'\ttest_cmp expect.messages messages &&\n'> <'\n'> <'\tfill "M\tone" "A\tthree" "D\ttwo" >expect.master &&\n'> <'\tgit diff --name-status master >current.master &&\n'> <'\ttest_cmp expect.master current.master &&\n'> <'\n'> <'\tfill "M\tone" >expect.side &&\n'> <'\tgit diff --name-status side >current.side &&\n'> <'\ttest_cmp expect.side current.side &&\n'> <'\n'> <'\t: >expect.index &&\n'> <'\tgit diff --cached >current.index &&\n'> <'\ttest_cmp expect.index current.index\n'> ) } ) (C {<test_expect_success>} {(DQ <'checkout -m with dirty tree, renamed'>)} { (SQ <'\n'> <'\n'> <'\tgit checkout -f master && git clean -f &&\n'> <'\n'> <'\tfill 1 2 3 4 5 7 8 >one &&\n'> <'\tif git checkout renamer\n'> <'\tthen\n'> <'\t\techo Not happy\n'> <'\t\tfalse\n'> <'\telse\n'> <'\t\techo "happy - failed correctly"\n'> <'\tfi &&\n'> <'\n'> <'\tgit checkout -m renamer &&\n'> <'\tfill 1 3 4 5 7 8 >expect &&\n'> <'\ttest_cmp expect uno &&\n'> <'\t! test -f one &&\n'> <'\tgit diff --cached >current &&\n'> <'\t! test -s current\n'> <'\n'> ) } ) (C {<test_expect_success>} {(SQ <'checkout -m with merge conflict'>)} { (SQ <'\n'> <'\n'> <'\tgit checkout -f master && git clean -f &&\n'> <'\n'> <'\tfill 1 T 3 4 5 6 S 8 >one &&\n'> <'\tif git checkout renamer\n'> <'\tthen\n'> <'\t\techo Not happy\n'> <'\t\tfalse\n'> <'\telse\n'> <'\t\techo "happy - failed correctly"\n'> <'\tfi &&\n'> <'\n'> <'\tgit checkout -m renamer &&\n'> <'\n'> <'\tgit diff master:one :3:uno |\n'> <'\tsed -e "1,/^@@/d" -e "/^ /d" -e "s/^-/d/" -e "s/^+/a/" >current &&\n'> <'\tfill d2 aT d7 aS >expect &&\n'> <'\ttest_cmp current expect &&\n'> <'\tgit diff --cached two >current &&\n'> <'\t! test -s current\n'> ) } ) (C {<test_expect_success>} {(SQ <'format of merge conflict from checkout -m'>)} { (SQ <'\n'> <'\n'> <'\tgit checkout -f master && git clean -f &&\n'> <'\n'> <'\tfill b d > two &&\n'> <'\tgit checkout -m simple &&\n'> <'\n'> <'\tgit ls-files >current &&\n'> <'\tfill same two two two >expect &&\n'> <'\ttest_cmp current expect &&\n'> <'\n'> <'\tcat <<-EOF >expect &&\n'> <'\t<<<<<<< simple\n'> <'\ta\n'> <'\tc\n'> <'\te\n'> <'\t=======\n'> <'\tb\n'> <'\td\n'> <'\t>>>>>>> local\n'> <'\tEOF\n'> <'\ttest_cmp two expect\n'> ) } ) (C {<test_expect_success>} {(SQ <'checkout --merge --conflict=diff3 <branch>'>)} { (SQ <'\n'> <'\n'> <'\tgit checkout -f master && git reset --hard && git clean -f &&\n'> <'\n'> <'\tfill b d > two &&\n'> <'\tgit checkout --merge --conflict=diff3 simple &&\n'> <'\n'> <'\tcat <<-EOF >expect &&\n'> <'\t<<<<<<< simple\n'> <'\ta\n'> <'\tc\n'> <'\te\n'> <'\t||||||| master\n'> <'\ta\n'> <'\tb\n'> <'\tc\n'> <'\td\n'> <'\te\n'> <'\t=======\n'> <'\tb\n'> <'\td\n'> <'\t>>>>>>> local\n'> <'\tEOF\n'> <'\ttest_cmp two expect\n'> ) } ) (C {<test_expect_success>} {(SQ <'switch to another branch while carrying a deletion'>)} { (SQ <'\n'> <'\n'> <'\tgit checkout -f master && git reset --hard && git clean -f &&\n'> <'\tgit rm two &&\n'> <'\n'> <'\ttest_must_fail git checkout simple 2>errs &&\n'> <'\ttest_i18ngrep overwritten errs &&\n'> <'\n'> <'\tgit checkout --merge simple 2>errs &&\n'> <'\ttest_i18ngrep ! overwritten errs &&\n'> <'\tgit ls-files -u &&\n'> <'\ttest_must_fail git cat-file -t :0:two &&\n'> <'\ttest "$(git cat-file -t :1:two)" = blob &&\n'> <'\ttest "$(git cat-file -t :2:two)" = blob &&\n'> <'\ttest_must_fail git cat-file -t :3:two\n'> ) } ) (C {<test_expect_success>} {(SQ <'checkout to detach HEAD (with advice declined)'>)} { (SQ <'\n'> <'\n'> <'\tgit config advice.detachedHead false &&\n'> <'\tgit checkout -f renamer && git clean -f &&\n'> <'\tgit checkout renamer^ 2>messages &&\n'> <'\ttest_i18ngrep "HEAD is now at 7329388" messages &&\n'> <'\ttest_line_count = 1 messages &&\n'> <'\tH=$(git rev-parse --verify HEAD) &&\n'> <'\tM=$(git show-ref -s --verify refs/heads/master) &&\n'> <'\ttest "z$H" = "z$M" &&\n'> <'\tif git symbolic-ref HEAD >/dev/null 2>&1\n'> <'\tthen\n'> <'\t\techo "OOPS, HEAD is still symbolic???"\n'> <'\t\tfalse\n'> <'\telse\n'> <'\t\t: happy\n'> <'\tfi\n'> ) } ) (C {<test_expect_success>} {(SQ <'checkout to detach HEAD'>)} { (SQ <'\n'> <'\tgit config advice.detachedHead true &&\n'> <'\tgit checkout -f renamer && git clean -f &&\n'> <'\tgit checkout renamer^ 2>messages &&\n'> <'\ttest_i18ngrep "HEAD is now at 7329388" messages &&\n'> <'\t(test_line_count -gt 1 messages || test -n "$GETTEXT_POISON") &&\n'> <'\tH=$(git rev-parse --verify HEAD) &&\n'> <'\tM=$(git show-ref -s --verify refs/heads/master) &&\n'> <'\ttest "z$H" = "z$M" &&\n'> <'\tif git symbolic-ref HEAD >/dev/null 2>&1\n'> <'\tthen\n'> <'\t\techo "OOPS, HEAD is still symbolic???"\n'> <'\t\tfalse\n'> <'\telse\n'> <'\t\t: happy\n'> <'\tfi\n'> ) } ) (C {<test_expect_success>} {(SQ <'checkout to detach HEAD with branchname^'>)} { (SQ <'\n'> <'\n'> <'\tgit checkout -f master && git clean -f &&\n'> <'\tgit checkout renamer^ &&\n'> <'\tH=$(git rev-parse --verify HEAD) &&\n'> <'\tM=$(git show-ref -s --verify refs/heads/master) &&\n'> <'\ttest "z$H" = "z$M" &&\n'> <'\tif git symbolic-ref HEAD >/dev/null 2>&1\n'> <'\tthen\n'> <'\t\techo "OOPS, HEAD is still symbolic???"\n'> <'\t\tfalse\n'> <'\telse\n'> <'\t\t: happy\n'> <'\tfi\n'> ) } ) (C {<test_expect_success>} {(SQ <'checkout to detach HEAD with :/message'>)} { (SQ <'\n'> <'\n'> <'\tgit checkout -f master && git clean -f &&\n'> <'\tgit checkout ":/Initial" &&\n'> <'\tH=$(git rev-parse --verify HEAD) &&\n'> <'\tM=$(git show-ref -s --verify refs/heads/master) &&\n'> <'\ttest "z$H" = "z$M" &&\n'> <'\tif git symbolic-ref HEAD >/dev/null 2>&1\n'> <'\tthen\n'> <'\t\techo "OOPS, HEAD is still symbolic???"\n'> <'\t\tfalse\n'> <'\telse\n'> <'\t\t: happy\n'> <'\tfi\n'> ) } ) (C {<test_expect_success>} {(SQ <'checkout to detach HEAD with HEAD^0'>)} { (SQ <'\n'> <'\n'> <'\tgit checkout -f master && git clean -f &&\n'> <'\tgit checkout HEAD^0 &&\n'> <'\tH=$(git rev-parse --verify HEAD) &&\n'> <'\tM=$(git show-ref -s --verify refs/heads/master) &&\n'> <'\ttest "z$H" = "z$M" &&\n'> <'\tif git symbolic-ref HEAD >/dev/null 2>&1\n'> <'\tthen\n'> <'\t\techo "OOPS, HEAD is still symbolic???"\n'> <'\t\tfalse\n'> <'\telse\n'> <'\t\t: happy\n'> <'\tfi\n'> ) } ) (C {<test_expect_success>} {(SQ <'checkout with ambiguous tag/branch names'>)} { (SQ <'\n'> <'\n'> <'\tgit tag both side &&\n'> <'\tgit branch both master &&\n'> <'\tgit reset --hard &&\n'> <'\tgit checkout master &&\n'> <'\n'> <'\tgit checkout both &&\n'> <'\tH=$(git rev-parse --verify HEAD) &&\n'> <'\tM=$(git show-ref -s --verify refs/heads/master) &&\n'> <'\ttest "z$H" = "z$M" &&\n'> <'\tname=$(git symbolic-ref HEAD 2>/dev/null) &&\n'> <'\ttest "z$name" = zrefs/heads/both\n'> <'\n'> ) } ) (C {<test_expect_success>} {(SQ <'checkout with ambiguous tag/branch names'>)} { (SQ <'\n'> <'\n'> <'\tgit reset --hard &&\n'> <'\tgit checkout master &&\n'> <'\n'> <'\tgit tag frotz side &&\n'> <'\tgit branch frotz master &&\n'> <'\tgit reset --hard &&\n'> <'\tgit checkout master &&\n'> <'\n'> <'\tgit checkout tags/frotz &&\n'> <'\tH=$(git rev-parse --verify HEAD) &&\n'> <'\tS=$(git show-ref -s --verify refs/heads/side) &&\n'> <'\ttest "z$H" = "z$S" &&\n'> <'\tif name=$(git symbolic-ref HEAD 2>/dev/null)\n'> <'\tthen\n'> <'\t\techo "Bad -- should have detached"\n'> <'\t\tfalse\n'> <'\telse\n'> <'\t\t: happy\n'> <'\tfi\n'> <'\n'> ) } ) (C {<test_expect_success>} {(SQ <'switch branches while in subdirectory'>)} { (SQ <'\n'> <'\n'> <'\tgit reset --hard &&\n'> <'\tgit checkout master &&\n'> <'\n'> <'\tmkdir subs &&\n'> <'\t(\n'> <'\t\tcd subs &&\n'> <'\t\tgit checkout side\n'> <'\t) &&\n'> <'\t! test -f subs/one &&\n'> <'\trm -fr subs\n'> <'\n'> ) } ) (C {<test_expect_success>} {(SQ <'checkout specific path while in subdirectory'>)} { (SQ <'\n'> <'\n'> <'\tgit reset --hard &&\n'> <'\tgit checkout side &&\n'> <'\tmkdir subs &&\n'> <'\t>subs/bero &&\n'> <'\tgit add subs/bero &&\n'> <'\tgit commit -m "add subs/bero" &&\n'> <'\n'> <'\tgit checkout master &&\n'> <'\tmkdir -p subs &&\n'> <'\t(\n'> <'\t\tcd subs &&\n'> <'\t\tgit checkout side -- bero\n'> <'\t) &&\n'> <'\ttest -f subs/bero\n'> <'\n'> ) } ) (C {<test_expect_success>} {(SQ <'checkout w/--track sets up tracking'>)} { (SQ <'\n'> <' git config branch.autosetupmerge false &&\n'> <' git checkout master &&\n'> <' git checkout --track -b track1 &&\n'> <' test "$(git config branch.track1.remote)" &&\n'> <' test "$(git config branch.track1.merge)"'> ) } ) (C {<test_expect_success>} {(SQ <'checkout w/autosetupmerge=always sets up tracking'>)} { (SQ <'\n'> <' test_when_finished git config branch.autosetupmerge false &&\n'> <' git config branch.autosetupmerge always &&\n'> <' git checkout master &&\n'> <' git checkout -b track2 &&\n'> <' test "$(git config branch.track2.remote)" &&\n'> <' test "$(git config branch.track2.merge)"'> ) } ) (C {<test_expect_success>} {(SQ <'checkout w/--track from non-branch HEAD fails'>)} { (SQ <'\n'> <' git checkout master^0 &&\n'> <' test_must_fail git symbolic-ref HEAD &&\n'> <' test_must_fail git checkout --track -b track &&\n'> <' test_must_fail git rev-parse --verify track &&\n'> <' test_must_fail git symbolic-ref HEAD &&\n'> <' test "z$(git rev-parse master^0)" = "z$(git rev-parse HEAD)"\n'> ) } ) (C {<test_expect_success>} {(SQ <'checkout w/--track from tag fails'>)} { (SQ <'\n'> <' git checkout master^0 &&\n'> <' test_must_fail git symbolic-ref HEAD &&\n'> <' test_must_fail git checkout --track -b track frotz &&\n'> <' test_must_fail git rev-parse --verify track &&\n'> <' test_must_fail git symbolic-ref HEAD &&\n'> <' test "z$(git rev-parse master^0)" = "z$(git rev-parse HEAD)"\n'> ) } ) (C {<test_expect_success>} {(SQ <'detach a symbolic link HEAD'>)} { (SQ <'\n'> <' git checkout master &&\n'> <' git config --bool core.prefersymlinkrefs yes &&\n'> <' git checkout side &&\n'> <' git checkout master &&\n'> <' it=$(git symbolic-ref HEAD) &&\n'> <' test "z$it" = zrefs/heads/master &&\n'> <' here=$(git rev-parse --verify refs/heads/master) &&\n'> <' git checkout side^ &&\n'> <' test "z$(git rev-parse --verify refs/heads/master)" = "z$here"\n'> ) } ) (C {<test_expect_success>} {(SQ <'checkout with --track fakes a sensible -b <name>'>)} { (SQ <'\n'> <' git config remote.origin.fetch "+refs/heads/*:refs/remotes/origin/*" &&\n'> <' git update-ref refs/remotes/origin/koala/bear renamer &&\n'> <'\n'> <' git checkout --track origin/koala/bear &&\n'> <' test "refs/heads/koala/bear" = "$(git symbolic-ref HEAD)" &&\n'> <' test "$(git rev-parse HEAD)" = "$(git rev-parse renamer)" &&\n'> <'\n'> <' git checkout master && git branch -D koala/bear &&\n'> <'\n'> <' git checkout --track refs/remotes/origin/koala/bear &&\n'> <' test "refs/heads/koala/bear" = "$(git symbolic-ref HEAD)" &&\n'> <' test "$(git rev-parse HEAD)" = "$(git rev-parse renamer)" &&\n'> <'\n'> <' git checkout master && git branch -D koala/bear &&\n'> <'\n'> <' git checkout --track remotes/origin/koala/bear &&\n'> <' test "refs/heads/koala/bear" = "$(git symbolic-ref HEAD)" &&\n'> <' test "$(git rev-parse HEAD)" = "$(git rev-parse renamer)"\n'> ) } ) (C {<test_expect_success>} {(SQ <'checkout with --track, but without -b, fails with too short tracked name'>)} {(SQ <'\n'> <' test_must_fail git checkout --track renamer'>)} ) (command.ShFunction name: setup_conflicting_index body: (BraceGroup children: [ (command.AndOr ops: [Id.Op_DAmp Id.Op_DAmp Id.Op_DAmp Id.Op_DAmp] children: [ (C {<rm>} {<-f>} {<'.git/index'>}) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:O) op: assign_op.Equal rhs: { (command_sub left_token: <Id.Left_DollarParen '$('> child: (command.Pipeline children: [ (C {<echo>} {<original>}) (C {<git>} {<hash-object>} {<-w>} {<--stdin>}) ] negated: F ) ) } spids: [733] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:A) op: assign_op.Equal rhs: { (command_sub left_token: <Id.Left_DollarParen '$('> child: (command.Pipeline children: [ (C {<echo>} {<ourside>}) (C {<git>} {<hash-object>} {<-w>} {<--stdin>}) ] negated: F ) ) } spids: [753] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:B) op: assign_op.Equal rhs: { (command_sub left_token: <Id.Left_DollarParen '$('> child: (command.Pipeline children: [ (C {<echo>} {<theirside>}) (C {<git>} {<hash-object>} {<-w>} {<--stdin>}) ] negated: F ) ) } spids: [773] ) ] ) (command.Pipeline children: [ (command.Subshell child: (command.AndOr ops: [Id.Op_DAmp Id.Op_DAmp Id.Op_DAmp Id.Op_DAmp] children: [ (C {<echo>} {(DQ <'100644 '> ($ Id.VSub_DollarName '$A') <' 0\tfild'>)}) (C {<echo>} {(DQ <'100644 '> ($ Id.VSub_DollarName '$O') <' 1\tfile'>)}) (C {<echo>} {(DQ <'100644 '> ($ Id.VSub_DollarName '$A') <' 2\tfile'>)}) (C {<echo>} {(DQ <'100644 '> ($ Id.VSub_DollarName '$B') <' 3\tfile'>)}) (C {<echo>} {(DQ <'100644 '> ($ Id.VSub_DollarName '$A') <' 0\tfilf'>)}) ] ) ) (C {<git>} {<update-index>} {<--index-info>}) ] negated: F ) ] ) ] ) ) (C {<test_expect_success>} {(SQ <'checkout an unmerged path should fail'>)} { (SQ <'\n'> <'\tsetup_conflicting_index &&\n'> <'\techo "none of the above" >sample &&\n'> <'\tcat sample >fild &&\n'> <'\tcat sample >file &&\n'> <'\tcat sample >filf &&\n'> <'\ttest_must_fail git checkout fild file filf &&\n'> <'\ttest_cmp sample fild &&\n'> <'\ttest_cmp sample filf &&\n'> <'\ttest_cmp sample file\n'> ) } ) (C {<test_expect_success>} {(SQ <'checkout with an unmerged path can be ignored'>)} { (SQ <'\n'> <'\tsetup_conflicting_index &&\n'> <'\techo "none of the above" >sample &&\n'> <'\techo ourside >expect &&\n'> <'\tcat sample >fild &&\n'> <'\tcat sample >file &&\n'> <'\tcat sample >filf &&\n'> <'\tgit checkout -f fild file filf &&\n'> <'\ttest_cmp expect fild &&\n'> <'\ttest_cmp expect filf &&\n'> <'\ttest_cmp sample file\n'> ) } ) (C {<test_expect_success>} {(SQ <'checkout unmerged stage'>)} { (SQ <'\n'> <'\tsetup_conflicting_index &&\n'> <'\techo "none of the above" >sample &&\n'> <'\techo ourside >expect &&\n'> <'\tcat sample >fild &&\n'> <'\tcat sample >file &&\n'> <'\tcat sample >filf &&\n'> <'\tgit checkout --ours . &&\n'> <'\ttest_cmp expect fild &&\n'> <'\ttest_cmp expect filf &&\n'> <'\ttest_cmp expect file &&\n'> <'\tgit checkout --theirs file &&\n'> <'\ttest ztheirside = "z$(cat file)"\n'> ) } ) (C {<test_expect_success>} {(SQ <'checkout with --merge'>)} { (SQ <'\n'> <'\tsetup_conflicting_index &&\n'> <'\techo "none of the above" >sample &&\n'> <'\techo ourside >expect &&\n'> <'\tcat sample >fild &&\n'> <'\tcat sample >file &&\n'> <'\tcat sample >filf &&\n'> <'\tgit checkout -m -- fild file filf &&\n'> <'\t(\n'> <'\t\techo "<<<<<<< ours"\n'> <'\t\techo ourside\n'> <'\t\techo "======="\n'> <'\t\techo theirside\n'> <'\t\techo ">>>>>>> theirs"\n'> <'\t) >merged &&\n'> <'\ttest_cmp expect fild &&\n'> <'\ttest_cmp expect filf &&\n'> <'\ttest_cmp merged file\n'> ) } ) (C {<test_expect_success>} {(SQ <'checkout with --merge, in diff3 -m style'>)} { (SQ <'\n'> <'\tgit config merge.conflictstyle diff3 &&\n'> <'\tsetup_conflicting_index &&\n'> <'\techo "none of the above" >sample &&\n'> <'\techo ourside >expect &&\n'> <'\tcat sample >fild &&\n'> <'\tcat sample >file &&\n'> <'\tcat sample >filf &&\n'> <'\tgit checkout -m -- fild file filf &&\n'> <'\t(\n'> <'\t\techo "<<<<<<< ours"\n'> <'\t\techo ourside\n'> <'\t\techo "||||||| base"\n'> <'\t\techo original\n'> <'\t\techo "======="\n'> <'\t\techo theirside\n'> <'\t\techo ">>>>>>> theirs"\n'> <'\t) >merged &&\n'> <'\ttest_cmp expect fild &&\n'> <'\ttest_cmp expect filf &&\n'> <'\ttest_cmp merged file\n'> ) } ) (C {<test_expect_success>} {(SQ <'checkout --conflict=merge, overriding config'>)} { (SQ <'\n'> <'\tgit config merge.conflictstyle diff3 &&\n'> <'\tsetup_conflicting_index &&\n'> <'\techo "none of the above" >sample &&\n'> <'\techo ourside >expect &&\n'> <'\tcat sample >fild &&\n'> <'\tcat sample >file &&\n'> <'\tcat sample >filf &&\n'> <'\tgit checkout --conflict=merge -- fild file filf &&\n'> <'\t(\n'> <'\t\techo "<<<<<<< ours"\n'> <'\t\techo ourside\n'> <'\t\techo "======="\n'> <'\t\techo theirside\n'> <'\t\techo ">>>>>>> theirs"\n'> <'\t) >merged &&\n'> <'\ttest_cmp expect fild &&\n'> <'\ttest_cmp expect filf &&\n'> <'\ttest_cmp merged file\n'> ) } ) (C {<test_expect_success>} {(SQ <'checkout --conflict=diff3'>)} { (SQ <'\n'> <'\ttest_unconfig merge.conflictstyle &&\n'> <'\tsetup_conflicting_index &&\n'> <'\techo "none of the above" >sample &&\n'> <'\techo ourside >expect &&\n'> <'\tcat sample >fild &&\n'> <'\tcat sample >file &&\n'> <'\tcat sample >filf &&\n'> <'\tgit checkout --conflict=diff3 -- fild file filf &&\n'> <'\t(\n'> <'\t\techo "<<<<<<< ours"\n'> <'\t\techo ourside\n'> <'\t\techo "||||||| base"\n'> <'\t\techo original\n'> <'\t\techo "======="\n'> <'\t\techo theirside\n'> <'\t\techo ">>>>>>> theirs"\n'> <'\t) >merged &&\n'> <'\ttest_cmp expect fild &&\n'> <'\ttest_cmp expect filf &&\n'> <'\ttest_cmp merged file\n'> ) } ) (C {<test_expect_success>} {(SQ <'failing checkout -b should not break working tree'>)} { (SQ <'\n'> <'\tgit reset --hard master &&\n'> <'\tgit symbolic-ref HEAD refs/heads/master &&\n'> <'\ttest_must_fail git checkout -b renamer side^ &&\n'> <'\ttest $(git symbolic-ref HEAD) = refs/heads/master &&\n'> <'\tgit diff --exit-code &&\n'> <'\tgit diff --cached --exit-code\n'> <'\n'> ) } ) (C {<test_expect_success>} {(SQ <'switch out of non-branch'>)} { (SQ <'\n'> <'\tgit reset --hard master &&\n'> <'\tgit checkout master^0 &&\n'> <'\techo modified >one &&\n'> <'\ttest_must_fail git checkout renamer 2>error.log &&\n'> <'\t! grep "^Previous HEAD" error.log\n'> ) } ) (command.Subshell child: (command.CommandList children: [ (C {<echo>} {(DQ <'#!'> ($ Id.VSub_DollarName '$SHELL_PATH'))}) (command.Simple words: [{<cat>}] redirects: [ (redir op: <Id.Redir_DLess '<<'> loc: (redir_loc.Fd fd:0) arg: (redir_param.HereDoc here_begin: {(word_part.EscapedLiteral token:<Id.Lit_EscapedChar '\\E'>) <OF>} here_end_span_id: 1108 stdin_parts: [ <'O=$1 A=$2 B=$3\n'> <'cat "$A" >.tmp\n'> <'exec >"$A"\n'> <'echo \'<<<<<<< filfre-theirs\'\n'> <'cat "$B"\n'> <'echo \'||||||| filfre-common\'\n'> <'cat "$O"\n'> <'echo \'=======\'\n'> <'cat ".tmp"\n'> <'echo \'>>>>>>> filfre-ours\'\n'> <'rm -f .tmp\n'> <'exit 1\n'> ] ) ) ] do_fork: T ) ] ) redirects: [(redir op:<Id.Redir_Great '>'> loc:(redir_loc.Fd fd:1) arg:{<filfre.sh>})] ) (C {<chmod>} {<Id.Lit_Other '+'> <x>} {<filfre.sh>}) (C {<test_expect_success>} {(SQ <'custom merge driver with checkout -m'>)} { (SQ <'\n'> <'\tgit reset --hard &&\n'> <'\n'> <'\tgit config merge.filfre.driver "./filfre.sh %O %A %B" &&\n'> <'\tgit config merge.filfre.name "Feel-free merge driver" &&\n'> <'\tgit config merge.filfre.recursive binary &&\n'> <'\techo "arm merge=filfre" >.gitattributes &&\n'> <'\n'> <'\tgit checkout -b left &&\n'> <'\techo neutral >arm &&\n'> <'\tgit add arm .gitattributes &&\n'> <'\ttest_tick &&\n'> <'\tgit commit -m neutral &&\n'> <'\tgit branch right &&\n'> <'\n'> <'\techo left >arm &&\n'> <'\ttest_tick &&\n'> <'\tgit commit -a -m left &&\n'> <'\tgit checkout right &&\n'> <'\n'> <'\techo right >arm &&\n'> <'\ttest_tick &&\n'> <'\tgit commit -a -m right &&\n'> <'\n'> <'\ttest_must_fail git merge left &&\n'> <'\t(\n'> <'\t\tfor t in filfre-common left right\n'> <'\t\tdo\n'> <'\t\t\tgrep $t arm || exit 1\n'> <'\t\tdone\n'> <'\t\texit 0\n'> <'\t) &&\n'> <'\n'> <'\tmv arm expect &&\n'> <'\tgit checkout -m arm &&\n'> <'\ttest_cmp expect arm\n'> ) } ) (C {<test_done>}) ] )