(CommandList children: [ (Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (LhsName name:test_description) op: Equal rhs: {(SQ <'git-difftool\n'> <'\n'> <'Testing basic diff tool invocation\n'>)} spids: [13] ) ] spids: [13] ) (C {(.)} {(./test-lib.sh)}) (FuncDef name: difftool_test_setup body: (BraceGroup children: [ (AndOr children: [ (C {(test_config)} {(diff.tool)} {(test-tool)}) (AndOr children: [ (C {(test_config)} {(difftool.test-tool.cmd)} {(SQ <'cat "$LOCAL"'>)}) (C {(test_config)} {(difftool.bogus-tool.cmd)} {(false)}) ] op_id: Op_DAmp ) ] op_id: Op_DAmp ) ] spids: [31] ) spids: [26 30] ) (FuncDef name: prompt_given body: (BraceGroup children: [ (Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (LhsName name:prompt) op: Equal rhs: {(DQ ($ VSub_Number '$1'))} spids: [71] ) ] spids: [71] ) (C {(test)} {(DQ ($ VSub_Name '$prompt'))} {(Lit_Other '=')} {(DQ ("Launch 'test-tool' [Y/n]? branch"))} ) ] spids: [68] ) spids: [63 67] ) (C {(test_expect_success)} {(PERL)} {(SQ <setup>)} { (SQ <'\n'> <'\techo master >file &&\n'> <'\tgit add file &&\n'> <'\tgit commit -m "added file" &&\n'> <'\n'> <'\tgit checkout -b branch master &&\n'> <'\techo branch >file &&\n'> <'\tgit commit -a -m "branch changed file" &&\n'> <'\tgit checkout master\n'> ) } ) (C {(test_expect_success)} {(PERL)} {(SQ <'custom commands'>)} { (SQ <'\n'> <'\tdifftool_test_setup &&\n'> <'\ttest_config difftool.test-tool.cmd "cat \\"\\$REMOTE\\"" &&\n'> <'\techo master >expect &&\n'> <'\tgit difftool --no-prompt branch >actual &&\n'> <'\ttest_cmp expect actual &&\n'> <'\n'> <'\ttest_config difftool.test-tool.cmd "cat \\"\\$LOCAL\\"" &&\n'> <'\techo branch >expect &&\n'> <'\tgit difftool --no-prompt branch >actual &&\n'> <'\ttest_cmp expect actual\n'> ) } ) (C {(test_expect_success)} {(PERL)} {(SQ <'custom tool commands override built-ins'>)} { (SQ <'\n'> <'\ttest_config difftool.vimdiff.cmd "cat \\"\\$REMOTE\\"" &&\n'> <'\techo master >expect &&\n'> <'\tgit difftool --tool vimdiff --no-prompt branch >actual &&\n'> <'\ttest_cmp expect actual\n'> ) } ) (C {(test_expect_success)} {(PERL)} {(SQ <'difftool ignores bad --tool values'>)} { (SQ <'\n'> <'\t: >expect &&\n'> <'\ttest_must_fail \\\n'> <'\t\tgit difftool --no-prompt --tool=bad-tool branch >actual &&\n'> <'\ttest_cmp expect actual\n'> ) } ) (C {(test_expect_success)} {(PERL)} {(SQ <'difftool forwards arguments to diff'>)} { (SQ <'\n'> <'\tdifftool_test_setup &&\n'> <'\t>for-diff &&\n'> <'\tgit add for-diff &&\n'> <'\techo changes>for-diff &&\n'> <'\tgit add for-diff &&\n'> <'\t: >expect &&\n'> <'\tgit difftool --cached --no-prompt -- for-diff >actual &&\n'> <'\ttest_cmp expect actual &&\n'> <'\tgit reset -- for-diff &&\n'> <'\trm for-diff\n'> ) } ) (C {(test_expect_success)} {(PERL)} {(SQ <'difftool ignores exit code'>)} { (SQ <'\n'> <'\ttest_config difftool.error.cmd false &&\n'> <'\tgit difftool -y -t error branch\n'> ) } ) (C {(test_expect_success)} {(PERL)} {(SQ <'difftool forwards exit code with --trust-exit-code'>)} { (SQ <'\n'> <'\ttest_config difftool.error.cmd false &&\n'> <'\ttest_must_fail git difftool -y --trust-exit-code -t error branch\n'> ) } ) (C {(test_expect_success)} {(PERL)} {(SQ <'difftool forwards exit code with --trust-exit-code for built-ins'>)} { (SQ <'\n'> <'\ttest_config difftool.vimdiff.path false &&\n'> <'\ttest_must_fail git difftool -y --trust-exit-code -t vimdiff branch\n'> ) } ) (C {(test_expect_success)} {(PERL)} {(SQ <'difftool honors difftool.trustExitCode = true'>)} { (SQ <'\n'> <'\ttest_config difftool.error.cmd false &&\n'> <'\ttest_config difftool.trustExitCode true &&\n'> <'\ttest_must_fail git difftool -y -t error branch\n'> ) } ) (C {(test_expect_success)} {(PERL)} {(SQ <'difftool honors difftool.trustExitCode = false'>)} { (SQ <'\n'> <'\ttest_config difftool.error.cmd false &&\n'> <'\ttest_config difftool.trustExitCode false &&\n'> <'\tgit difftool -y -t error branch\n'> ) } ) (C {(test_expect_success)} {(PERL)} {(SQ <'difftool ignores exit code with --no-trust-exit-code'>)} { (SQ <'\n'> <'\ttest_config difftool.error.cmd false &&\n'> <'\ttest_config difftool.trustExitCode true &&\n'> <'\tgit difftool -y --no-trust-exit-code -t error branch\n'> ) } ) (C {(test_expect_success)} {(PERL)} {(SQ <'difftool stops on error with --trust-exit-code'>)} { (SQ <'\n'> <'\ttest_when_finished "rm -f for-diff .git/fail-right-file" &&\n'> <'\ttest_when_finished "git reset -- for-diff" &&\n'> <'\twrite_script .git/fail-right-file <<-\\EOF &&\n'> <'\techo "$2"\n'> <'\texit 1\n'> <'\tEOF\n'> <'\t>for-diff &&\n'> <'\tgit add for-diff &&\n'> <'\techo file >expect &&\n'> <'\ttest_must_fail git difftool -y --trust-exit-code \\\n'> <'\t\t--extcmd .git/fail-right-file branch >actual &&\n'> <'\ttest_cmp expect actual\n'> ) } ) (C {(test_expect_success)} {(PERL)} {(SQ <'difftool honors exit status if command not found'>)} { (SQ <'\n'> <'\ttest_config difftool.nonexistent.cmd i-dont-exist &&\n'> <'\ttest_config difftool.trustExitCode false &&\n'> <'\ttest_must_fail git difftool -y -t nonexistent branch\n'> ) } ) (C {(test_expect_success)} {(PERL)} {(SQ <'difftool honors --gui'>)} { (SQ <'\n'> <'\tdifftool_test_setup &&\n'> <'\ttest_config merge.tool bogus-tool &&\n'> <'\ttest_config diff.tool bogus-tool &&\n'> <'\ttest_config diff.guitool test-tool &&\n'> <'\n'> <'\techo branch >expect &&\n'> <'\tgit difftool --no-prompt --gui branch >actual &&\n'> <'\ttest_cmp expect actual\n'> ) } ) (C {(test_expect_success)} {(PERL)} {(SQ <'difftool --gui last setting wins'>)} { (SQ <'\n'> <'\tdifftool_test_setup &&\n'> <'\t: >expect &&\n'> <'\tgit difftool --no-prompt --gui --no-gui >actual &&\n'> <'\ttest_cmp expect actual &&\n'> <'\n'> <'\ttest_config merge.tool bogus-tool &&\n'> <'\ttest_config diff.tool bogus-tool &&\n'> <'\ttest_config diff.guitool test-tool &&\n'> <'\techo branch >expect &&\n'> <'\tgit difftool --no-prompt --no-gui --gui branch >actual &&\n'> <'\ttest_cmp expect actual\n'> ) } ) (C {(test_expect_success)} {(PERL)} {(SQ <'difftool --gui works without configured diff.guitool'>)} { (SQ <'\n'> <'\tdifftool_test_setup &&\n'> <'\techo branch >expect &&\n'> <'\tgit difftool --no-prompt --gui branch >actual &&\n'> <'\ttest_cmp expect actual\n'> ) } ) (C {(test_expect_success)} {(PERL)} {(SQ <'GIT_DIFF_TOOL variable'>)} { (SQ <'\n'> <'\tdifftool_test_setup &&\n'> <'\tgit config --unset diff.tool &&\n'> <'\techo branch >expect &&\n'> <'\tGIT_DIFF_TOOL=test-tool git difftool --no-prompt branch >actual &&\n'> <'\ttest_cmp expect actual\n'> ) } ) (C {(test_expect_success)} {(PERL)} {(SQ <'GIT_DIFF_TOOL overrides'>)} { (SQ <'\n'> <'\tdifftool_test_setup &&\n'> <'\ttest_config diff.tool bogus-tool &&\n'> <'\ttest_config merge.tool bogus-tool &&\n'> <'\n'> <'\techo branch >expect &&\n'> <'\tGIT_DIFF_TOOL=test-tool git difftool --no-prompt branch >actual &&\n'> <'\ttest_cmp expect actual &&\n'> <'\n'> <'\ttest_config diff.tool bogus-tool &&\n'> <'\ttest_config merge.tool bogus-tool &&\n'> <'\tGIT_DIFF_TOOL=bogus-tool \\\n'> <'\t\tgit difftool --no-prompt --tool=test-tool branch >actual &&\n'> <'\ttest_cmp expect actual\n'> ) } ) (C {(test_expect_success)} {(PERL)} {(SQ <'GIT_DIFFTOOL_NO_PROMPT variable'>)} { (SQ <'\n'> <'\tdifftool_test_setup &&\n'> <'\techo branch >expect &&\n'> <'\tGIT_DIFFTOOL_NO_PROMPT=true git difftool branch >actual &&\n'> <'\ttest_cmp expect actual\n'> ) } ) (C {(test_expect_success)} {(PERL)} {(SQ <'GIT_DIFFTOOL_PROMPT variable'>)} { (SQ <'\n'> <'\tdifftool_test_setup &&\n'> <'\ttest_config difftool.prompt false &&\n'> <'\techo >input &&\n'> <'\tGIT_DIFFTOOL_PROMPT=true git difftool branch <input >output &&\n'> <'\tprompt=$(tail -1 <output) &&\n'> <'\tprompt_given "$prompt"\n'> ) } ) (C {(test_expect_success)} {(PERL)} {(SQ <'difftool.prompt config variable is false'>)} { (SQ <'\n'> <'\tdifftool_test_setup &&\n'> <'\ttest_config difftool.prompt false &&\n'> <'\techo branch >expect &&\n'> <'\tgit difftool branch >actual &&\n'> <'\ttest_cmp expect actual\n'> ) } ) (C {(test_expect_success)} {(PERL)} {(SQ <'difftool merge.prompt = false'>)} { (SQ <'\n'> <'\tdifftool_test_setup &&\n'> <'\ttest_might_fail git config --unset difftool.prompt &&\n'> <'\ttest_config mergetool.prompt false &&\n'> <'\techo branch >expect &&\n'> <'\tgit difftool branch >actual &&\n'> <'\ttest_cmp expect actual\n'> ) } ) (C {(test_expect_success)} {(PERL)} {(SQ <'difftool.prompt can overridden with -y'>)} { (SQ <'\n'> <'\tdifftool_test_setup &&\n'> <'\ttest_config difftool.prompt true &&\n'> <'\techo branch >expect &&\n'> <'\tgit difftool -y branch >actual &&\n'> <'\ttest_cmp expect actual\n'> ) } ) (C {(test_expect_success)} {(PERL)} {(SQ <'difftool.prompt can overridden with --prompt'>)} { (SQ <'\n'> <'\tdifftool_test_setup &&\n'> <'\ttest_config difftool.prompt false &&\n'> <'\techo >input &&\n'> <'\tgit difftool --prompt branch <input >output &&\n'> <'\tprompt=$(tail -1 <output) &&\n'> <'\tprompt_given "$prompt"\n'> ) } ) (C {(test_expect_success)} {(PERL)} {(SQ <'difftool last flag wins'>)} { (SQ <'\n'> <'\tdifftool_test_setup &&\n'> <'\techo branch >expect &&\n'> <'\tgit difftool --prompt --no-prompt branch >actual &&\n'> <'\ttest_cmp expect actual &&\n'> <'\techo >input &&\n'> <'\tgit difftool --no-prompt --prompt branch <input >output &&\n'> <'\tprompt=$(tail -1 <output) &&\n'> <'\tprompt_given "$prompt"\n'> ) } ) (C {(test_expect_success)} {(PERL)} {(SQ <'difftool + mergetool config variables'>)} { (SQ <'\n'> <'\ttest_config merge.tool test-tool &&\n'> <'\ttest_config mergetool.test-tool.cmd "cat \\$LOCAL" &&\n'> <'\techo branch >expect &&\n'> <'\tgit difftool --no-prompt branch >actual &&\n'> <'\ttest_cmp expect actual &&\n'> <'\n'> <'\t# set merge.tool to something bogus, diff.tool to test-tool\n'> <'\ttest_config merge.tool bogus-tool &&\n'> <'\ttest_config diff.tool test-tool &&\n'> <'\tgit difftool --no-prompt branch >actual &&\n'> <'\ttest_cmp expect actual\n'> ) } ) (C {(test_expect_success)} {(PERL)} {(SQ <'difftool.<tool>.path'>)} { (SQ <'\n'> <'\ttest_config difftool.tkdiff.path echo &&\n'> <'\tgit difftool --tool=tkdiff --no-prompt branch >output &&\n'> <'\tlines=$(grep file output | wc -l) &&\n'> <'\ttest "$lines" -eq 1\n'> ) } ) (C {(test_expect_success)} {(PERL)} {(SQ <'difftool --extcmd=cat'>)} { (SQ <'\n'> <'\techo branch >expect &&\n'> <'\techo master >>expect &&\n'> <'\tgit difftool --no-prompt --extcmd=cat branch >actual &&\n'> <'\ttest_cmp expect actual\n'> ) } ) (C {(test_expect_success)} {(PERL)} {(SQ <'difftool --extcmd cat'>)} { (SQ <'\n'> <'\techo branch >expect &&\n'> <'\techo master >>expect &&\n'> <'\tgit difftool --no-prompt --extcmd=cat branch >actual &&\n'> <'\ttest_cmp expect actual\n'> ) } ) (C {(test_expect_success)} {(PERL)} {(SQ <'difftool -x cat'>)} { (SQ <'\n'> <'\techo branch >expect &&\n'> <'\techo master >>expect &&\n'> <'\tgit difftool --no-prompt -x cat branch >actual &&\n'> <'\ttest_cmp expect actual\n'> ) } ) (C {(test_expect_success)} {(PERL)} {(SQ <'difftool --extcmd echo arg1'>)} { (SQ <'\n'> <'\techo file >expect &&\n'> <'\tgit difftool --no-prompt \\\n'> <'\t\t--extcmd sh\\ -c\\ \\"echo\\ \\$1\\" branch >actual &&\n'> <'\ttest_cmp expect actual\n'> ) } ) (C {(test_expect_success)} {(PERL)} {(SQ <'difftool --extcmd cat arg1'>)} { (SQ <'\n'> <'\techo master >expect &&\n'> <'\tgit difftool --no-prompt \\\n'> <'\t\t--extcmd sh\\ -c\\ \\"cat\\ \\$1\\" branch >actual &&\n'> <'\ttest_cmp expect actual\n'> ) } ) (C {(test_expect_success)} {(PERL)} {(SQ <'difftool --extcmd cat arg2'>)} { (SQ <'\n'> <'\techo branch >expect &&\n'> <'\tgit difftool --no-prompt \\\n'> <'\t\t--extcmd sh\\ -c\\ \\"cat\\ \\$2\\" branch >actual &&\n'> <'\ttest_cmp expect actual\n'> ) } ) (C {(test_expect_success)} {(PERL)} {(SQ <'setup with 2 files different'>)} { (SQ <'\n'> <'\techo m2 >file2 &&\n'> <'\tgit add file2 &&\n'> <'\tgit commit -m "added file2" &&\n'> <'\n'> <'\tgit checkout branch &&\n'> <'\techo br2 >file2 &&\n'> <'\tgit add file2 &&\n'> <'\tgit commit -a -m "branch changed file2" &&\n'> <'\tgit checkout master\n'> ) } ) (C {(test_expect_success)} {(PERL)} {(SQ <'say no to the first file'>)} { (SQ <'\n'> <'\t(echo n && echo) >input &&\n'> <'\tgit difftool -x cat branch <input >output &&\n'> <'\tgrep m2 output &&\n'> <'\tgrep br2 output &&\n'> <'\t! grep master output &&\n'> <'\t! grep branch output\n'> ) } ) (C {(test_expect_success)} {(PERL)} {(SQ <'say no to the second file'>)} { (SQ <'\n'> <'\t(echo && echo n) >input &&\n'> <'\tgit difftool -x cat branch <input >output &&\n'> <'\tgrep master output &&\n'> <'\tgrep branch output &&\n'> <'\t! grep m2 output &&\n'> <'\t! grep br2 output\n'> ) } ) (C {(test_expect_success)} {(PERL)} {(SQ <'ending prompt input with EOF'>)} { (SQ <'\n'> <'\tgit difftool -x cat branch </dev/null >output &&\n'> <'\t! grep master output &&\n'> <'\t! grep branch output &&\n'> <'\t! grep m2 output &&\n'> <'\t! grep br2 output\n'> ) } ) (C {(test_expect_success)} {(PERL)} {(SQ <'difftool --tool-help'>)} {(SQ <'\n'> <'\tgit difftool --tool-help >output &&\n'> <'\tgrep tool output\n'>)} ) (C {(test_expect_success)} {(PERL)} {(SQ <'setup change in subdirectory'>)} { (SQ <'\n'> <'\tgit checkout master &&\n'> <'\tmkdir sub &&\n'> <'\techo master >sub/sub &&\n'> <'\tgit add sub/sub &&\n'> <'\tgit commit -m "added sub/sub" &&\n'> <'\techo test >>file &&\n'> <'\techo test >>sub/sub &&\n'> <'\tgit add file sub/sub &&\n'> <'\tgit commit -m "modified both"\n'> ) } ) (FuncDef name: run_dir_diff_test body: (BraceGroup children: [ (C {(test_expect_success)} {(PERL)} {(DQ ($ VSub_Number '$1') (' --no-symlinks'))} { (DQ ('\n') ('\t\tsymlinks=--no-symlinks &&\n') ('\t\t') ($ VSub_Number '$2') ('\n') ('\t')) } ) (C {(test_expect_success)} {(PERL) (Lit_Comma ',') (SYMLINKS)} {(DQ ($ VSub_Number '$1') (' --symlinks'))} {(DQ ('\n') ('\t\tsymlinks=--symlinks &&\n') ('\t\t') ($ VSub_Number '$2') ('\n') ('\t'))} ) ] spids: [878] ) spids: [873 877] ) (C {(run_dir_diff_test)} {(SQ <'difftool -d'>)} { (SQ <'\n'> <'\tgit difftool -d $symlinks --extcmd ls branch >output &&\n'> <'\tgrep sub output &&\n'> <'\tgrep file output\n'> ) } ) (C {(run_dir_diff_test)} {(SQ <'difftool --dir-diff'>)} { (SQ <'\n'> <'\tgit difftool --dir-diff $symlinks --extcmd ls branch >output &&\n'> <'\tgrep sub output &&\n'> <'\tgrep file output\n'> ) } ) (C {(run_dir_diff_test)} {(SQ <'difftool --dir-diff ignores --prompt'>)} { (SQ <'\n'> <'\tgit difftool --dir-diff $symlinks --prompt --extcmd ls branch >output &&\n'> <'\tgrep sub output &&\n'> <'\tgrep file output\n'> ) } ) (C {(run_dir_diff_test)} {(SQ <'difftool --dir-diff from subdirectory'>)} { (SQ <'\n'> <'\t(\n'> <'\t\tcd sub &&\n'> <'\t\tgit difftool --dir-diff $symlinks --extcmd ls branch >output &&\n'> <'\t\tgrep sub output &&\n'> <'\t\tgrep file output\n'> <'\t)\n'> ) } ) (C {(run_dir_diff_test)} {(SQ <'difftool --dir-diff from subdirectory with GIT_DIR set'>)} { (SQ <'\n'> <'\t(\n'> <'\t\tGIT_DIR=$(pwd)/.git &&\n'> <'\t\texport GIT_DIR &&\n'> <'\t\tGIT_WORK_TREE=$(pwd) &&\n'> <'\t\texport GIT_WORK_TREE &&\n'> <'\t\tcd sub &&\n'> <'\t\tgit difftool --dir-diff $symlinks --extcmd ls \\\n'> <'\t\t\tbranch -- sub >output &&\n'> <'\t\tgrep sub output &&\n'> <'\t\t! grep file output\n'> <'\t)\n'> ) } ) (C {(run_dir_diff_test)} {(SQ <'difftool --dir-diff when worktree file is missing'>)} { (SQ <'\n'> <'\ttest_when_finished git reset --hard &&\n'> <'\trm file2 &&\n'> <'\tgit difftool --dir-diff $symlinks --extcmd ls branch master >output &&\n'> <'\tgrep file2 output\n'> ) } ) (C {(run_dir_diff_test)} {(SQ <'difftool --dir-diff with unmerged files'>)} { (SQ <'\n'> <'\ttest_when_finished git reset --hard &&\n'> <'\ttest_config difftool.echo.cmd "echo ok" &&\n'> <'\tgit checkout -B conflict-a &&\n'> <'\tgit checkout -B conflict-b &&\n'> <'\tgit checkout conflict-a &&\n'> <'\techo a >>file &&\n'> <'\tgit add file &&\n'> <'\tgit commit -m conflict-a &&\n'> <'\tgit checkout conflict-b &&\n'> <'\techo b >>file &&\n'> <'\tgit add file &&\n'> <'\tgit commit -m conflict-b &&\n'> <'\tgit checkout master &&\n'> <'\tgit merge conflict-a &&\n'> <'\ttest_must_fail git merge conflict-b &&\n'> <'\tcat >expect <<-EOF &&\n'> <'\t\tok\n'> <'\tEOF\n'> <'\tgit difftool --dir-diff $symlinks -t echo >actual &&\n'> <'\ttest_cmp expect actual\n'> ) } ) (SimpleCommand words: [{(write_script)} {(.git/CHECK_SYMLINKS)}] redirects: [ (HereDoc op_id: Redir_DLess fd: -1 body: {('for f in file file2 sub/sub\n') ('do\n') ('\techo "$f"\n') ('\tls -ld "$2/$f" | sed -e \'s/.* -> //\'\n') ('done >actual\n') } do_expansion: False here_end: EOF was_filled: True spids: [1054] ) ] ) (C {(test_expect_success)} {(PERL) (Lit_Comma ',') (SYMLINKS)} {(SQ <'difftool --dir-diff --symlink without unstaged changes'>)} { (SQ <'\n'> <'\tcat >expect <<-EOF &&\n'> <'\tfile\n'> <'\t$PWD/file\n'> <'\tfile2\n'> <'\t$PWD/file2\n'> <'\tsub/sub\n'> <'\t$PWD/sub/sub\n'> <'\tEOF\n'> <'\tgit difftool --dir-diff --symlink \\\n'> <'\t\t--extcmd "./.git/CHECK_SYMLINKS" branch HEAD &&\n'> <'\ttest_cmp actual expect\n'> ) } ) (SimpleCommand words: [{(write_script)} {(modify-right-file)}] redirects: [ (HereDoc op_id: Redir_DLess fd: -1 body: {('echo "new content" >"$2/file"\n')} do_expansion: False here_end: EOF was_filled: True spids: [1089] ) ] ) (C {(run_dir_diff_test)} {(SQ <'difftool --dir-diff syncs worktree with unstaged change'>)} { (SQ <'\n'> <'\ttest_when_finished git reset --hard &&\n'> <'\techo "orig content" >file &&\n'> <'\tgit difftool -d $symlinks --extcmd "$PWD/modify-right-file" branch &&\n'> <'\techo "new content" >expect &&\n'> <'\ttest_cmp expect file\n'> ) } ) (C {(run_dir_diff_test)} {(SQ <'difftool --dir-diff syncs worktree without unstaged change'>)} { (SQ <'\n'> <'\ttest_when_finished git reset --hard &&\n'> <'\tgit difftool -d $symlinks --extcmd "$PWD/modify-right-file" branch &&\n'> <'\techo "new content" >expect &&\n'> <'\ttest_cmp expect file\n'> ) } ) (SimpleCommand words: [{(write_script)} {(modify-file)}] redirects: [ (HereDoc op_id: Redir_DLess fd: -1 body: {('echo "new content" >file\n')} do_expansion: False here_end: EOF was_filled: True spids: [1129] ) ] ) (C {(test_expect_success)} {(PERL)} {(SQ <'difftool --no-symlinks does not overwrite working tree file '>)} { (SQ <'\n'> <'\techo "orig content" >file &&\n'> <'\tgit difftool --dir-diff --no-symlinks --extcmd "$PWD/modify-file" branch &&\n'> <'\techo "new content" >expect &&\n'> <'\ttest_cmp expect file\n'> ) } ) (SimpleCommand words: [{(write_script)} {(modify-both-files)}] redirects: [ (HereDoc op_id: Redir_DLess fd: -1 body: {('echo "wt content" >file &&\n') ('echo "tmp content" >"$2/file" &&\n') ('echo "$2" >tmpdir\n') } do_expansion: False here_end: EOF was_filled: True spids: [1155] ) ] ) (C {(test_expect_success)} {(PERL)} {(SQ <'difftool --no-symlinks detects conflict '>)} { (SQ <'\n'> <'\t(\n'> <'\t\tTMPDIR=$TRASH_DIRECTORY &&\n'> <'\t\texport TMPDIR &&\n'> <'\t\techo "orig content" >file &&\n'> < '\t\ttest_must_fail git difftool --dir-diff --no-symlinks --extcmd "$PWD/modify-both-files" branch &&\n' > <'\t\techo "wt content" >expect &&\n'> <'\t\ttest_cmp expect file &&\n'> <'\t\techo "tmp content" >expect &&\n'> <'\t\ttest_cmp expect "$(cat tmpdir)/file"\n'> <'\t)\n'> ) } ) (C {(test_expect_success)} {(PERL)} {(SQ <'difftool properly honors gitlink and core.worktree'>)} { (SQ <'\n'> <'\tgit submodule add ./. submod/ule &&\n'> <'\ttest_config -C submod/ule diff.tool checktrees &&\n'> <'\ttest_config -C submod/ule difftool.checktrees.cmd '> ) (EscapedLiteralPart token:<Lit_EscapedChar "\\'">) (SQ <'\n'> <'\t\ttest -d "$LOCAL" && test -d "$REMOTE" && echo good\n'> <'\t\t'>) (EscapedLiteralPart token:<Lit_EscapedChar "\\'">) (SQ <' &&\n'> <'\t(\n'> <'\t\tcd submod/ule &&\n'> <'\t\techo good >expect &&\n'> <'\t\tgit difftool --tool=checktrees --dir-diff HEAD~ >actual &&\n'> <'\t\ttest_cmp expect actual\n'> <'\t)\n'> ) } ) (C {(test_expect_success)} {(PERL) (Lit_Comma ',') (SYMLINKS)} {(SQ <'difftool --dir-diff symlinked directories'>)} { (SQ <'\n'> <'\tgit init dirlinks &&\n'> <'\t(\n'> <'\t\tcd dirlinks &&\n'> <'\t\tgit config diff.tool checktrees &&\n'> <'\t\tgit config difftool.checktrees.cmd "echo good" &&\n'> <'\t\tmkdir foo &&\n'> <'\t\t: >foo/bar &&\n'> <'\t\tgit add foo/bar &&\n'> <'\t\ttest_commit symlink-one &&\n'> <'\t\tln -s foo link &&\n'> <'\t\tgit add link &&\n'> <'\t\ttest_commit symlink-two &&\n'> <'\t\techo good >expect &&\n'> <'\t\tgit difftool --tool=checktrees --dir-diff HEAD~ >actual &&\n'> <'\t\ttest_cmp expect actual\n'> <'\t)\n'> ) } ) (C {(test_done)}) ] )