(command.CommandList children: [ (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:test_description) op: assign_op.Equal rhs: { (SQ (Token id:Id.Lit_Chars val:'git-difftool\n' span_id:15) (Token id:Id.Lit_Chars val:'\n' span_id:16) (Token id:Id.Lit_Chars val:'Testing basic diff tool invocation\n' span_id:17) ) } spids: [13] ) ] ) (C {(.)} {(./test-lib.sh)}) (command.ShFunction name: difftool_test_setup body: (command.BraceGroup children: [ (command.AndOr ops: [Id.Op_DAmp Id.Op_DAmp] children: [ (C {(test_config)} {(diff.tool)} {(test-tool)}) (C {(test_config)} {(difftool.test-tool.cmd)} {(SQ (Token id:Id.Lit_Chars val:'cat "$LOCAL"' span_id:48))} ) (C {(test_config)} {(difftool.bogus-tool.cmd)} {(false)}) ] ) ] ) ) (command.ShFunction name: prompt_given body: (command.BraceGroup children: [ (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:prompt) op: assign_op.Equal rhs: {(DQ ($ Id.VSub_Number '$1'))} spids: [71] ) ] ) (C {(test)} {(DQ ($ Id.VSub_DollarName '$prompt'))} {(Id.Lit_Equals '=')} {(DQ ("Launch 'test-tool' [Y/n]? branch"))} ) ] ) ) (C {(test_expect_success)} {(PERL)} {(SQ (Token id:Id.Lit_Chars val:setup span_id:100))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:104) (Token id:Id.Lit_Chars val:'\techo master >file &&\n' span_id:105) (Token id:Id.Lit_Chars val:'\tgit add file &&\n' span_id:106) (Token id:Id.Lit_Chars val:'\tgit commit -m "added file" &&\n' span_id:107) (Token id:Id.Lit_Chars val:'\n' span_id:108) (Token id:Id.Lit_Chars val:'\tgit checkout -b branch master &&\n' span_id:109) (Token id:Id.Lit_Chars val:'\techo branch >file &&\n' span_id:110) (Token id: Id.Lit_Chars val: '\tgit commit -a -m "branch changed file" &&\n' span_id: 111 ) (Token id:Id.Lit_Chars val:'\tgit checkout master\n' span_id:112) ) } ) (C {(test_expect_success)} {(PERL)} {(SQ (Token id:Id.Lit_Chars val:'custom commands' span_id:124))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:128) (Token id:Id.Lit_Chars val:'\tdifftool_test_setup &&\n' span_id:129) (Token id: Id.Lit_Chars val: '\ttest_config difftool.test-tool.cmd "cat \\"\\$REMOTE\\"" &&\n' span_id: 130 ) (Token id:Id.Lit_Chars val:'\techo master >expect &&\n' span_id:131) (Token id: Id.Lit_Chars val: '\tgit difftool --no-prompt branch >actual &&\n' span_id: 132 ) (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual &&\n' span_id:133) (Token id:Id.Lit_Chars val:'\n' span_id:134) (Token id: Id.Lit_Chars val: '\ttest_config difftool.test-tool.cmd "cat \\"\\$LOCAL\\"" &&\n' span_id: 135 ) (Token id:Id.Lit_Chars val:'\techo branch >expect &&\n' span_id:136) (Token id: Id.Lit_Chars val: '\tgit difftool --no-prompt branch >actual &&\n' span_id: 137 ) (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual\n' span_id:138) ) } ) (C {(test_expect_success)} {(PERL)} {(SQ (Token id:Id.Lit_Chars val:'custom tool commands override built-ins' span_id:147))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:151) (Token id: Id.Lit_Chars val: '\ttest_config difftool.vimdiff.cmd "cat \\"\\$REMOTE\\"" &&\n' span_id: 152 ) (Token id:Id.Lit_Chars val:'\techo master >expect &&\n' span_id:153) (Token id: Id.Lit_Chars val: '\tgit difftool --tool vimdiff --no-prompt branch >actual &&\n' span_id: 154 ) (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual\n' span_id:155) ) } ) (C {(test_expect_success)} {(PERL)} {(SQ (Token id:Id.Lit_Chars val:'difftool ignores bad --tool values' span_id:164))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:168) (Token id:Id.Lit_Chars val:'\t: >expect &&\n' span_id:169) (Token id:Id.Lit_Chars val:'\ttest_must_fail \\\n' span_id:170) (Token id: Id.Lit_Chars val: '\t\tgit difftool --no-prompt --tool=bad-tool branch >actual &&\n' span_id: 171 ) (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual\n' span_id:172) ) } ) (C {(test_expect_success)} {(PERL)} {(SQ (Token id:Id.Lit_Chars val:'difftool forwards arguments to diff' span_id:181))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:185) (Token id:Id.Lit_Chars val:'\tdifftool_test_setup &&\n' span_id:186) (Token id:Id.Lit_Chars val:'\t>for-diff &&\n' span_id:187) (Token id:Id.Lit_Chars val:'\tgit add for-diff &&\n' span_id:188) (Token id:Id.Lit_Chars val:'\techo changes>for-diff &&\n' span_id:189) (Token id:Id.Lit_Chars val:'\tgit add for-diff &&\n' span_id:190) (Token id:Id.Lit_Chars val:'\t: >expect &&\n' span_id:191) (Token id: Id.Lit_Chars val: '\tgit difftool --cached --no-prompt -- for-diff >actual &&\n' span_id: 192 ) (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual &&\n' span_id:193) (Token id:Id.Lit_Chars val:'\tgit reset -- for-diff &&\n' span_id:194) (Token id:Id.Lit_Chars val:'\trm for-diff\n' span_id:195) ) } ) (C {(test_expect_success)} {(PERL)} {(SQ (Token id:Id.Lit_Chars val:'difftool ignores exit code' span_id:204))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:208) (Token id: Id.Lit_Chars val: '\ttest_config difftool.error.cmd false &&\n' span_id: 209 ) (Token id:Id.Lit_Chars val:'\tgit difftool -y -t error branch\n' span_id:210) ) } ) (C {(test_expect_success)} {(PERL)} { (SQ (Token id: Id.Lit_Chars val: 'difftool forwards exit code with --trust-exit-code' span_id: 219 ) ) } { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:223) (Token id: Id.Lit_Chars val: '\ttest_config difftool.error.cmd false &&\n' span_id: 224 ) (Token id: Id.Lit_Chars val: '\ttest_must_fail git difftool -y --trust-exit-code -t error branch\n' span_id: 225 ) ) } ) (C {(test_expect_success)} {(PERL)} { (SQ (Token id: Id.Lit_Chars val: 'difftool forwards exit code with --trust-exit-code for built-ins' span_id: 234 ) ) } { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:238) (Token id: Id.Lit_Chars val: '\ttest_config difftool.vimdiff.path false &&\n' span_id: 239 ) (Token id: Id.Lit_Chars val: '\ttest_must_fail git difftool -y --trust-exit-code -t vimdiff branch\n' span_id: 240 ) ) } ) (C {(test_expect_success)} {(PERL)} {(SQ (Token id:Id.Lit_Chars val:'difftool honors difftool.trustExitCode = true' span_id:249))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:253) (Token id: Id.Lit_Chars val: '\ttest_config difftool.error.cmd false &&\n' span_id: 254 ) (Token id:Id.Lit_Chars val:'\ttest_config difftool.trustExitCode true &&\n' span_id:255) (Token id: Id.Lit_Chars val: '\ttest_must_fail git difftool -y -t error branch\n' span_id: 256 ) ) } ) (C {(test_expect_success)} {(PERL)} {(SQ (Token id:Id.Lit_Chars val:'difftool honors difftool.trustExitCode = false' span_id:265))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:269) (Token id: Id.Lit_Chars val: '\ttest_config difftool.error.cmd false &&\n' span_id: 270 ) (Token id:Id.Lit_Chars val:'\ttest_config difftool.trustExitCode false &&\n' span_id:271) (Token id:Id.Lit_Chars val:'\tgit difftool -y -t error branch\n' span_id:272) ) } ) (C {(test_expect_success)} {(PERL)} { (SQ (Token id: Id.Lit_Chars val: 'difftool ignores exit code with --no-trust-exit-code' span_id: 281 ) ) } { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:285) (Token id: Id.Lit_Chars val: '\ttest_config difftool.error.cmd false &&\n' span_id: 286 ) (Token id:Id.Lit_Chars val:'\ttest_config difftool.trustExitCode true &&\n' span_id:287) (Token id: Id.Lit_Chars val: '\tgit difftool -y --no-trust-exit-code -t error branch\n' span_id: 288 ) ) } ) (C {(test_expect_success)} {(PERL)} {(SQ (Token id:Id.Lit_Chars val:'difftool stops on error with --trust-exit-code' span_id:297))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:301) (Token id: Id.Lit_Chars val: '\ttest_when_finished "rm -f for-diff .git/fail-right-file" &&\n' span_id: 302 ) (Token id:Id.Lit_Chars val:'\ttest_when_finished "git reset -- for-diff" &&\n' span_id:303) (Token id: Id.Lit_Chars val: '\twrite_script .git/fail-right-file <<-\\EOF &&\n' span_id: 304 ) (Token id:Id.Lit_Chars val:'\techo "$2"\n' span_id:305) (Token id:Id.Lit_Chars val:'\texit 1\n' span_id:306) (Token id:Id.Lit_Chars val:'\tEOF\n' span_id:307) (Token id:Id.Lit_Chars val:'\t>for-diff &&\n' span_id:308) (Token id:Id.Lit_Chars val:'\tgit add for-diff &&\n' span_id:309) (Token id:Id.Lit_Chars val:'\techo file >expect &&\n' span_id:310) (Token id:Id.Lit_Chars val:'\ttest_must_fail git difftool -y --trust-exit-code \\\n' span_id:311) (Token id: Id.Lit_Chars val: '\t\t--extcmd .git/fail-right-file branch >actual &&\n' span_id: 312 ) (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual\n' span_id:313) ) } ) (C {(test_expect_success)} {(PERL)} { (SQ (Token id: Id.Lit_Chars val: 'difftool honors exit status if command not found' span_id: 322 ) ) } { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:326) (Token id: Id.Lit_Chars val: '\ttest_config difftool.nonexistent.cmd i-dont-exist &&\n' span_id: 327 ) (Token id:Id.Lit_Chars val:'\ttest_config difftool.trustExitCode false &&\n' span_id:328) (Token id: Id.Lit_Chars val: '\ttest_must_fail git difftool -y -t nonexistent branch\n' span_id: 329 ) ) } ) (C {(test_expect_success)} {(PERL)} {(SQ (Token id:Id.Lit_Chars val:'difftool honors --gui' span_id:338))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:342) (Token id:Id.Lit_Chars val:'\tdifftool_test_setup &&\n' span_id:343) (Token id:Id.Lit_Chars val:'\ttest_config merge.tool bogus-tool &&\n' span_id:344) (Token id:Id.Lit_Chars val:'\ttest_config diff.tool bogus-tool &&\n' span_id:345) (Token id:Id.Lit_Chars val:'\ttest_config diff.guitool test-tool &&\n' span_id:346) (Token id:Id.Lit_Chars val:'\n' span_id:347) (Token id:Id.Lit_Chars val:'\techo branch >expect &&\n' span_id:348) (Token id: Id.Lit_Chars val: '\tgit difftool --no-prompt --gui branch >actual &&\n' span_id: 349 ) (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual\n' span_id:350) ) } ) (C {(test_expect_success)} {(PERL)} {(SQ (Token id:Id.Lit_Chars val:'difftool --gui last setting wins' span_id:359))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:363) (Token id:Id.Lit_Chars val:'\tdifftool_test_setup &&\n' span_id:364) (Token id:Id.Lit_Chars val:'\t: >expect &&\n' span_id:365) (Token id: Id.Lit_Chars val: '\tgit difftool --no-prompt --gui --no-gui >actual &&\n' span_id: 366 ) (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual &&\n' span_id:367) (Token id:Id.Lit_Chars val:'\n' span_id:368) (Token id:Id.Lit_Chars val:'\ttest_config merge.tool bogus-tool &&\n' span_id:369) (Token id:Id.Lit_Chars val:'\ttest_config diff.tool bogus-tool &&\n' span_id:370) (Token id:Id.Lit_Chars val:'\ttest_config diff.guitool test-tool &&\n' span_id:371) (Token id:Id.Lit_Chars val:'\techo branch >expect &&\n' span_id:372) (Token id: Id.Lit_Chars val: '\tgit difftool --no-prompt --no-gui --gui branch >actual &&\n' span_id: 373 ) (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual\n' span_id:374) ) } ) (C {(test_expect_success)} {(PERL)} { (SQ (Token id: Id.Lit_Chars val: 'difftool --gui works without configured diff.guitool' span_id: 383 ) ) } { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:387) (Token id:Id.Lit_Chars val:'\tdifftool_test_setup &&\n' span_id:388) (Token id:Id.Lit_Chars val:'\techo branch >expect &&\n' span_id:389) (Token id: Id.Lit_Chars val: '\tgit difftool --no-prompt --gui branch >actual &&\n' span_id: 390 ) (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual\n' span_id:391) ) } ) (C {(test_expect_success)} {(PERL)} {(SQ (Token id:Id.Lit_Chars val:'GIT_DIFF_TOOL variable' span_id:403))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:407) (Token id:Id.Lit_Chars val:'\tdifftool_test_setup &&\n' span_id:408) (Token id:Id.Lit_Chars val:'\tgit config --unset diff.tool &&\n' span_id:409) (Token id:Id.Lit_Chars val:'\techo branch >expect &&\n' span_id:410) (Token id: Id.Lit_Chars val: '\tGIT_DIFF_TOOL=test-tool git difftool --no-prompt branch >actual &&\n' span_id: 411 ) (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual\n' span_id:412) ) } ) (C {(test_expect_success)} {(PERL)} {(SQ (Token id:Id.Lit_Chars val:'GIT_DIFF_TOOL overrides' span_id:427))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:431) (Token id:Id.Lit_Chars val:'\tdifftool_test_setup &&\n' span_id:432) (Token id:Id.Lit_Chars val:'\ttest_config diff.tool bogus-tool &&\n' span_id:433) (Token id: Id.Lit_Chars val: '\ttest_config merge.tool bogus-tool &&\n' span_id: 434 ) (Token id:Id.Lit_Chars val:'\n' span_id:435) (Token id:Id.Lit_Chars val:'\techo branch >expect &&\n' span_id:436) (Token id: Id.Lit_Chars val: '\tGIT_DIFF_TOOL=test-tool git difftool --no-prompt branch >actual &&\n' span_id: 437 ) (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual &&\n' span_id:438) (Token id:Id.Lit_Chars val:'\n' span_id:439) (Token id:Id.Lit_Chars val:'\ttest_config diff.tool bogus-tool &&\n' span_id:440) (Token id: Id.Lit_Chars val: '\ttest_config merge.tool bogus-tool &&\n' span_id: 441 ) (Token id:Id.Lit_Chars val:'\tGIT_DIFF_TOOL=bogus-tool \\\n' span_id:442) (Token id: Id.Lit_Chars val: '\t\tgit difftool --no-prompt --tool=test-tool branch >actual &&\n' span_id: 443 ) (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual\n' span_id:444) ) } ) (C {(test_expect_success)} {(PERL)} {(SQ (Token id:Id.Lit_Chars val:'GIT_DIFFTOOL_NO_PROMPT variable' span_id:459))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:463) (Token id:Id.Lit_Chars val:'\tdifftool_test_setup &&\n' span_id:464) (Token id:Id.Lit_Chars val:'\techo branch >expect &&\n' span_id:465) (Token id: Id.Lit_Chars val: '\tGIT_DIFFTOOL_NO_PROMPT=true git difftool branch >actual &&\n' span_id: 466 ) (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual\n' span_id:467) ) } ) (C {(test_expect_success)} {(PERL)} {(SQ (Token id:Id.Lit_Chars val:'GIT_DIFFTOOL_PROMPT variable' span_id:482))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:486) (Token id:Id.Lit_Chars val:'\tdifftool_test_setup &&\n' span_id:487) (Token id:Id.Lit_Chars val:'\ttest_config difftool.prompt false &&\n' span_id:488) (Token id:Id.Lit_Chars val:'\techo >input &&\n' span_id:489) (Token id: Id.Lit_Chars val: '\tGIT_DIFFTOOL_PROMPT=true git difftool branch <input >output &&\n' span_id: 490 ) (Token id:Id.Lit_Chars val:'\tprompt=$(tail -1 <output) &&\n' span_id:491) (Token id:Id.Lit_Chars val:'\tprompt_given "$prompt"\n' span_id:492) ) } ) (C {(test_expect_success)} {(PERL)} {(SQ (Token id:Id.Lit_Chars val:'difftool.prompt config variable is false' span_id:504))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:508) (Token id:Id.Lit_Chars val:'\tdifftool_test_setup &&\n' span_id:509) (Token id:Id.Lit_Chars val:'\ttest_config difftool.prompt false &&\n' span_id:510) (Token id:Id.Lit_Chars val:'\techo branch >expect &&\n' span_id:511) (Token id:Id.Lit_Chars val:'\tgit difftool branch >actual &&\n' span_id:512) (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual\n' span_id:513) ) } ) (C {(test_expect_success)} {(PERL)} {(SQ (Token id:Id.Lit_Chars val:'difftool merge.prompt = false' span_id:525))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:529) (Token id:Id.Lit_Chars val:'\tdifftool_test_setup &&\n' span_id:530) (Token id:Id.Lit_Chars val:'\ttest_might_fail git config --unset difftool.prompt &&\n' span_id:531) (Token id: Id.Lit_Chars val: '\ttest_config mergetool.prompt false &&\n' span_id: 532 ) (Token id:Id.Lit_Chars val:'\techo branch >expect &&\n' span_id:533) (Token id:Id.Lit_Chars val:'\tgit difftool branch >actual &&\n' span_id:534) (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual\n' span_id:535) ) } ) (C {(test_expect_success)} {(PERL)} {(SQ (Token id:Id.Lit_Chars val:'difftool.prompt can overridden with -y' span_id:547))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:551) (Token id:Id.Lit_Chars val:'\tdifftool_test_setup &&\n' span_id:552) (Token id:Id.Lit_Chars val:'\ttest_config difftool.prompt true &&\n' span_id:553) (Token id:Id.Lit_Chars val:'\techo branch >expect &&\n' span_id:554) (Token id:Id.Lit_Chars val:'\tgit difftool -y branch >actual &&\n' span_id:555) (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual\n' span_id:556) ) } ) (C {(test_expect_success)} {(PERL)} {(SQ (Token id:Id.Lit_Chars val:'difftool.prompt can overridden with --prompt' span_id:568))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:572) (Token id:Id.Lit_Chars val:'\tdifftool_test_setup &&\n' span_id:573) (Token id:Id.Lit_Chars val:'\ttest_config difftool.prompt false &&\n' span_id:574) (Token id:Id.Lit_Chars val:'\techo >input &&\n' span_id:575) (Token id:Id.Lit_Chars val:'\tgit difftool --prompt branch <input >output &&\n' span_id:576) (Token id:Id.Lit_Chars val:'\tprompt=$(tail -1 <output) &&\n' span_id:577) (Token id:Id.Lit_Chars val:'\tprompt_given "$prompt"\n' span_id:578) ) } ) (C {(test_expect_success)} {(PERL)} {(SQ (Token id:Id.Lit_Chars val:'difftool last flag wins' span_id:590))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:594) (Token id:Id.Lit_Chars val:'\tdifftool_test_setup &&\n' span_id:595) (Token id:Id.Lit_Chars val:'\techo branch >expect &&\n' span_id:596) (Token id: Id.Lit_Chars val: '\tgit difftool --prompt --no-prompt branch >actual &&\n' span_id: 597 ) (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual &&\n' span_id:598) (Token id:Id.Lit_Chars val:'\techo >input &&\n' span_id:599) (Token id: Id.Lit_Chars val: '\tgit difftool --no-prompt --prompt branch <input >output &&\n' span_id: 600 ) (Token id:Id.Lit_Chars val:'\tprompt=$(tail -1 <output) &&\n' span_id:601) (Token id:Id.Lit_Chars val:'\tprompt_given "$prompt"\n' span_id:602) ) } ) (C {(test_expect_success)} {(PERL)} {(SQ (Token id:Id.Lit_Chars val:'difftool + mergetool config variables' span_id:617))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:621) (Token id:Id.Lit_Chars val:'\ttest_config merge.tool test-tool &&\n' span_id:622) (Token id:Id.Lit_Chars val:'\ttest_config mergetool.test-tool.cmd "cat \\$LOCAL" &&\n' span_id:623) (Token id:Id.Lit_Chars val:'\techo branch >expect &&\n' span_id:624) (Token id:Id.Lit_Chars val:'\tgit difftool --no-prompt branch >actual &&\n' span_id:625) (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual &&\n' span_id:626) (Token id:Id.Lit_Chars val:'\n' span_id:627) (Token id: Id.Lit_Chars val: '\t# set merge.tool to something bogus, diff.tool to test-tool\n' span_id: 628 ) (Token id:Id.Lit_Chars val:'\ttest_config merge.tool bogus-tool &&\n' span_id:629) (Token id:Id.Lit_Chars val:'\ttest_config diff.tool test-tool &&\n' span_id:630) (Token id:Id.Lit_Chars val:'\tgit difftool --no-prompt branch >actual &&\n' span_id:631) (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual\n' span_id:632) ) } ) (C {(test_expect_success)} {(PERL)} {(SQ (Token id:Id.Lit_Chars val:'difftool.<tool>.path' span_id:641))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:645) (Token id: Id.Lit_Chars val: '\ttest_config difftool.tkdiff.path echo &&\n' span_id: 646 ) (Token id: Id.Lit_Chars val: '\tgit difftool --tool=tkdiff --no-prompt branch >output &&\n' span_id: 647 ) (Token id:Id.Lit_Chars val:'\tlines=$(grep file output | wc -l) &&\n' span_id:648) (Token id:Id.Lit_Chars val:'\ttest "$lines" -eq 1\n' span_id:649) ) } ) (C {(test_expect_success)} {(PERL)} {(SQ (Token id:Id.Lit_Chars val:'difftool --extcmd=cat' span_id:658))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:662) (Token id:Id.Lit_Chars val:'\techo branch >expect &&\n' span_id:663) (Token id:Id.Lit_Chars val:'\techo master >>expect &&\n' span_id:664) (Token id: Id.Lit_Chars val: '\tgit difftool --no-prompt --extcmd=cat branch >actual &&\n' span_id: 665 ) (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual\n' span_id:666) ) } ) (C {(test_expect_success)} {(PERL)} {(SQ (Token id:Id.Lit_Chars val:'difftool --extcmd cat' span_id:675))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:679) (Token id:Id.Lit_Chars val:'\techo branch >expect &&\n' span_id:680) (Token id:Id.Lit_Chars val:'\techo master >>expect &&\n' span_id:681) (Token id: Id.Lit_Chars val: '\tgit difftool --no-prompt --extcmd=cat branch >actual &&\n' span_id: 682 ) (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual\n' span_id:683) ) } ) (C {(test_expect_success)} {(PERL)} {(SQ (Token id:Id.Lit_Chars val:'difftool -x cat' span_id:692))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:696) (Token id:Id.Lit_Chars val:'\techo branch >expect &&\n' span_id:697) (Token id:Id.Lit_Chars val:'\techo master >>expect &&\n' span_id:698) (Token id: Id.Lit_Chars val: '\tgit difftool --no-prompt -x cat branch >actual &&\n' span_id: 699 ) (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual\n' span_id:700) ) } ) (C {(test_expect_success)} {(PERL)} {(SQ (Token id:Id.Lit_Chars val:'difftool --extcmd echo arg1' span_id:709))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:713) (Token id:Id.Lit_Chars val:'\techo file >expect &&\n' span_id:714) (Token id:Id.Lit_Chars val:'\tgit difftool --no-prompt \\\n' span_id:715) (Token id: Id.Lit_Chars val: '\t\t--extcmd sh\\ -c\\ \\"echo\\ \\$1\\" branch >actual &&\n' span_id: 716 ) (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual\n' span_id:717) ) } ) (C {(test_expect_success)} {(PERL)} {(SQ (Token id:Id.Lit_Chars val:'difftool --extcmd cat arg1' span_id:726))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:730) (Token id:Id.Lit_Chars val:'\techo master >expect &&\n' span_id:731) (Token id:Id.Lit_Chars val:'\tgit difftool --no-prompt \\\n' span_id:732) (Token id: Id.Lit_Chars val: '\t\t--extcmd sh\\ -c\\ \\"cat\\ \\$1\\" branch >actual &&\n' span_id: 733 ) (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual\n' span_id:734) ) } ) (C {(test_expect_success)} {(PERL)} {(SQ (Token id:Id.Lit_Chars val:'difftool --extcmd cat arg2' span_id:743))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:747) (Token id:Id.Lit_Chars val:'\techo branch >expect &&\n' span_id:748) (Token id:Id.Lit_Chars val:'\tgit difftool --no-prompt \\\n' span_id:749) (Token id: Id.Lit_Chars val: '\t\t--extcmd sh\\ -c\\ \\"cat\\ \\$2\\" branch >actual &&\n' span_id: 750 ) (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual\n' span_id:751) ) } ) (C {(test_expect_success)} {(PERL)} {(SQ (Token id:Id.Lit_Chars val:'setup with 2 files different' span_id:763))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:767) (Token id:Id.Lit_Chars val:'\techo m2 >file2 &&\n' span_id:768) (Token id:Id.Lit_Chars val:'\tgit add file2 &&\n' span_id:769) (Token id:Id.Lit_Chars val:'\tgit commit -m "added file2" &&\n' span_id:770) (Token id:Id.Lit_Chars val:'\n' span_id:771) (Token id:Id.Lit_Chars val:'\tgit checkout branch &&\n' span_id:772) (Token id:Id.Lit_Chars val:'\techo br2 >file2 &&\n' span_id:773) (Token id:Id.Lit_Chars val:'\tgit add file2 &&\n' span_id:774) (Token id:Id.Lit_Chars val:'\tgit commit -a -m "branch changed file2" &&\n' span_id:775) (Token id:Id.Lit_Chars val:'\tgit checkout master\n' span_id:776) ) } ) (C {(test_expect_success)} {(PERL)} {(SQ (Token id:Id.Lit_Chars val:'say no to the first file' span_id:785))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:789) (Token id:Id.Lit_Chars val:'\t(echo n && echo) >input &&\n' span_id:790) (Token id:Id.Lit_Chars val:'\tgit difftool -x cat branch <input >output &&\n' span_id:791) (Token id:Id.Lit_Chars val:'\tgrep m2 output &&\n' span_id:792) (Token id:Id.Lit_Chars val:'\tgrep br2 output &&\n' span_id:793) (Token id:Id.Lit_Chars val:'\t! grep master output &&\n' span_id:794) (Token id:Id.Lit_Chars val:'\t! grep branch output\n' span_id:795) ) } ) (C {(test_expect_success)} {(PERL)} {(SQ (Token id:Id.Lit_Chars val:'say no to the second file' span_id:804))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:808) (Token id:Id.Lit_Chars val:'\t(echo && echo n) >input &&\n' span_id:809) (Token id:Id.Lit_Chars val:'\tgit difftool -x cat branch <input >output &&\n' span_id:810) (Token id:Id.Lit_Chars val:'\tgrep master output &&\n' span_id:811) (Token id:Id.Lit_Chars val:'\tgrep branch output &&\n' span_id:812) (Token id:Id.Lit_Chars val:'\t! grep m2 output &&\n' span_id:813) (Token id:Id.Lit_Chars val:'\t! grep br2 output\n' span_id:814) ) } ) (C {(test_expect_success)} {(PERL)} {(SQ (Token id:Id.Lit_Chars val:'ending prompt input with EOF' span_id:823))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:827) (Token id: Id.Lit_Chars val: '\tgit difftool -x cat branch </dev/null >output &&\n' span_id: 828 ) (Token id:Id.Lit_Chars val:'\t! grep master output &&\n' span_id:829) (Token id:Id.Lit_Chars val:'\t! grep branch output &&\n' span_id:830) (Token id:Id.Lit_Chars val:'\t! grep m2 output &&\n' span_id:831) (Token id:Id.Lit_Chars val:'\t! grep br2 output\n' span_id:832) ) } ) (C {(test_expect_success)} {(PERL)} {(SQ (Token id:Id.Lit_Chars val:'difftool --tool-help' span_id:841))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:845) (Token id:Id.Lit_Chars val:'\tgit difftool --tool-help >output &&\n' span_id:846) (Token id:Id.Lit_Chars val:'\tgrep tool output\n' span_id:847) ) } ) (C {(test_expect_success)} {(PERL)} {(SQ (Token id:Id.Lit_Chars val:'setup change in subdirectory' span_id:856))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:860) (Token id:Id.Lit_Chars val:'\tgit checkout master &&\n' span_id:861) (Token id:Id.Lit_Chars val:'\tmkdir sub &&\n' span_id:862) (Token id:Id.Lit_Chars val:'\techo master >sub/sub &&\n' span_id:863) (Token id:Id.Lit_Chars val:'\tgit add sub/sub &&\n' span_id:864) (Token id:Id.Lit_Chars val:'\tgit commit -m "added sub/sub" &&\n' span_id:865) (Token id:Id.Lit_Chars val:'\techo test >>file &&\n' span_id:866) (Token id:Id.Lit_Chars val:'\techo test >>sub/sub &&\n' span_id:867) (Token id:Id.Lit_Chars val:'\tgit add file sub/sub &&\n' span_id:868) (Token id:Id.Lit_Chars val:'\tgit commit -m "modified both"\n' span_id:869) ) } ) (command.ShFunction name: run_dir_diff_test body: (command.BraceGroup children: [ (C {(test_expect_success)} {(PERL)} {(DQ ($ Id.VSub_Number '$1') (' --no-symlinks'))} { (DQ ('\n') ('\t\tsymlinks=--no-symlinks &&\n') ('\t\t') ($ Id.VSub_Number '$2') ('\n') ('\t') ) } ) (C {(test_expect_success)} {(PERL) (Id.Lit_Comma ',') (SYMLINKS)} {(DQ ($ Id.VSub_Number '$1') (' --symlinks'))} {(DQ ('\n') ('\t\tsymlinks=--symlinks &&\n') ('\t\t') ($ Id.VSub_Number '$2') ('\n') ('\t'))} ) ] ) ) (C {(run_dir_diff_test)} {(SQ (Token id:Id.Lit_Chars val:'difftool -d' span_id:926))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:930) (Token id: Id.Lit_Chars val: '\tgit difftool -d $symlinks --extcmd ls branch >output &&\n' span_id: 931 ) (Token id:Id.Lit_Chars val:'\tgrep sub output &&\n' span_id:932) (Token id:Id.Lit_Chars val:'\tgrep file output\n' span_id:933) ) } ) (C {(run_dir_diff_test)} {(SQ (Token id:Id.Lit_Chars val:'difftool --dir-diff' span_id:940))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:944) (Token id: Id.Lit_Chars val: '\tgit difftool --dir-diff $symlinks --extcmd ls branch >output &&\n' span_id: 945 ) (Token id:Id.Lit_Chars val:'\tgrep sub output &&\n' span_id:946) (Token id:Id.Lit_Chars val:'\tgrep file output\n' span_id:947) ) } ) (C {(run_dir_diff_test)} {(SQ (Token id:Id.Lit_Chars val:'difftool --dir-diff ignores --prompt' span_id:954))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:958) (Token id: Id.Lit_Chars val: '\tgit difftool --dir-diff $symlinks --prompt --extcmd ls branch >output &&\n' span_id: 959 ) (Token id:Id.Lit_Chars val:'\tgrep sub output &&\n' span_id:960) (Token id:Id.Lit_Chars val:'\tgrep file output\n' span_id:961) ) } ) (C {(run_dir_diff_test)} {(SQ (Token id:Id.Lit_Chars val:'difftool --dir-diff from subdirectory' span_id:968))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:972) (Token id:Id.Lit_Chars val:'\t(\n' span_id:973) (Token id:Id.Lit_Chars val:'\t\tcd sub &&\n' span_id:974) (Token id: Id.Lit_Chars val: '\t\tgit difftool --dir-diff $symlinks --extcmd ls branch >output &&\n' span_id: 975 ) (Token id:Id.Lit_Chars val:'\t\tgrep sub output &&\n' span_id:976) (Token id:Id.Lit_Chars val:'\t\tgrep file output\n' span_id:977) (Token id:Id.Lit_Chars val:'\t)\n' span_id:978) ) } ) (C {(run_dir_diff_test)} { (SQ (Token id: Id.Lit_Chars val: 'difftool --dir-diff from subdirectory with GIT_DIR set' span_id: 985 ) ) } { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:989) (Token id:Id.Lit_Chars val:'\t(\n' span_id:990) (Token id:Id.Lit_Chars val:'\t\tGIT_DIR=$(pwd)/.git &&\n' span_id:991) (Token id:Id.Lit_Chars val:'\t\texport GIT_DIR &&\n' span_id:992) (Token id:Id.Lit_Chars val:'\t\tGIT_WORK_TREE=$(pwd) &&\n' span_id:993) (Token id:Id.Lit_Chars val:'\t\texport GIT_WORK_TREE &&\n' span_id:994) (Token id:Id.Lit_Chars val:'\t\tcd sub &&\n' span_id:995) (Token id: Id.Lit_Chars val: '\t\tgit difftool --dir-diff $symlinks --extcmd ls \\\n' span_id: 996 ) (Token id:Id.Lit_Chars val:'\t\t\tbranch -- sub >output &&\n' span_id:997) (Token id:Id.Lit_Chars val:'\t\tgrep sub output &&\n' span_id:998) (Token id:Id.Lit_Chars val:'\t\t! grep file output\n' span_id:999) (Token id:Id.Lit_Chars val:'\t)\n' span_id:1000) ) } ) (C {(run_dir_diff_test)} { (SQ (Token id: Id.Lit_Chars val: 'difftool --dir-diff when worktree file is missing' span_id: 1007 ) ) } { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:1011) (Token id: Id.Lit_Chars val: '\ttest_when_finished git reset --hard &&\n' span_id: 1012 ) (Token id:Id.Lit_Chars val:'\trm file2 &&\n' span_id:1013) (Token id: Id.Lit_Chars val: '\tgit difftool --dir-diff $symlinks --extcmd ls branch master >output &&\n' span_id: 1014 ) (Token id:Id.Lit_Chars val:'\tgrep file2 output\n' span_id:1015) ) } ) (C {(run_dir_diff_test)} {(SQ (Token id:Id.Lit_Chars val:'difftool --dir-diff with unmerged files' span_id:1022))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:1026) (Token id: Id.Lit_Chars val: '\ttest_when_finished git reset --hard &&\n' span_id: 1027 ) (Token id:Id.Lit_Chars val:'\ttest_config difftool.echo.cmd "echo ok" &&\n' span_id:1028) (Token id:Id.Lit_Chars val:'\tgit checkout -B conflict-a &&\n' span_id:1029) (Token id:Id.Lit_Chars val:'\tgit checkout -B conflict-b &&\n' span_id:1030) (Token id:Id.Lit_Chars val:'\tgit checkout conflict-a &&\n' span_id:1031) (Token id:Id.Lit_Chars val:'\techo a >>file &&\n' span_id:1032) (Token id:Id.Lit_Chars val:'\tgit add file &&\n' span_id:1033) (Token id:Id.Lit_Chars val:'\tgit commit -m conflict-a &&\n' span_id:1034) (Token id:Id.Lit_Chars val:'\tgit checkout conflict-b &&\n' span_id:1035) (Token id:Id.Lit_Chars val:'\techo b >>file &&\n' span_id:1036) (Token id:Id.Lit_Chars val:'\tgit add file &&\n' span_id:1037) (Token id:Id.Lit_Chars val:'\tgit commit -m conflict-b &&\n' span_id:1038) (Token id:Id.Lit_Chars val:'\tgit checkout master &&\n' span_id:1039) (Token id:Id.Lit_Chars val:'\tgit merge conflict-a &&\n' span_id:1040) (Token id: Id.Lit_Chars val: '\ttest_must_fail git merge conflict-b &&\n' span_id: 1041 ) (Token id:Id.Lit_Chars val:'\tcat >expect <<-EOF &&\n' span_id:1042) (Token id:Id.Lit_Chars val:'\t\tok\n' span_id:1043) (Token id:Id.Lit_Chars val:'\tEOF\n' span_id:1044) (Token id: Id.Lit_Chars val: '\tgit difftool --dir-diff $symlinks -t echo >actual &&\n' span_id: 1045 ) (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual\n' span_id:1046) ) } ) (command.Simple words: [{(write_script)} {(.git/CHECK_SYMLINKS)}] redirects: [ (redir.HereDoc op: (Token id:Id.Redir_DLess val:'<<' span_id:1054) fd: -1 here_begin: {(word_part.EscapedLiteral token:(Token id:Id.Lit_EscapedChar val:'\\E' span_id:1055)) (OF) } here_end_span_id: 1063 stdin_parts: [ ('for f in file file2 sub/sub\n') ('do\n') ('\techo "$f"\n') ('\tls -ld "$2/$f" | sed -e \'s/.* -> //\'\n') ('done >actual\n') ] ) ] ) (C {(test_expect_success)} {(PERL) (Id.Lit_Comma ',') (SYMLINKS)} { (SQ (Token id: Id.Lit_Chars val: 'difftool --dir-diff --symlink without unstaged changes' span_id: 1072 ) ) } { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:1076) (Token id:Id.Lit_Chars val:'\tcat >expect <<-EOF &&\n' span_id:1077) (Token id:Id.Lit_Chars val:'\tfile\n' span_id:1078) (Token id:Id.Lit_Chars val:'\t$PWD/file\n' span_id:1079) (Token id:Id.Lit_Chars val:'\tfile2\n' span_id:1080) (Token id:Id.Lit_Chars val:'\t$PWD/file2\n' span_id:1081) (Token id:Id.Lit_Chars val:'\tsub/sub\n' span_id:1082) (Token id:Id.Lit_Chars val:'\t$PWD/sub/sub\n' span_id:1083) (Token id:Id.Lit_Chars val:'\tEOF\n' span_id:1084) (Token id: Id.Lit_Chars val: '\tgit difftool --dir-diff --symlink \\\n' span_id: 1085 ) (Token id:Id.Lit_Chars val:'\t\t--extcmd "./.git/CHECK_SYMLINKS" branch HEAD &&\n' span_id:1086) (Token id:Id.Lit_Chars val:'\ttest_cmp actual expect\n' span_id:1087) ) } ) (command.Simple words: [{(write_script)} {(modify-right-file)}] redirects: [ (redir.HereDoc op: (Token id:Id.Redir_DLess val:'<<' span_id:1095) fd: -1 here_begin: {(word_part.EscapedLiteral token:(Token id:Id.Lit_EscapedChar val:'\\E' span_id:1096)) (OF) } here_end_span_id: 1100 stdin_parts: [('echo "new content" >"$2/file"\n')] ) ] ) (C {(run_dir_diff_test)} { (SQ (Token id: Id.Lit_Chars val: 'difftool --dir-diff syncs worktree with unstaged change' span_id: 1105 ) ) } { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:1109) (Token id: Id.Lit_Chars val: '\ttest_when_finished git reset --hard &&\n' span_id: 1110 ) (Token id:Id.Lit_Chars val:'\techo "orig content" >file &&\n' span_id:1111) (Token id: Id.Lit_Chars val: '\tgit difftool -d $symlinks --extcmd "$PWD/modify-right-file" branch &&\n' span_id: 1112 ) (Token id:Id.Lit_Chars val:'\techo "new content" >expect &&\n' span_id:1113) (Token id:Id.Lit_Chars val:'\ttest_cmp expect file\n' span_id:1114) ) } ) (C {(run_dir_diff_test)} { (SQ (Token id: Id.Lit_Chars val: 'difftool --dir-diff syncs worktree without unstaged change' span_id: 1121 ) ) } { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:1125) (Token id: Id.Lit_Chars val: '\ttest_when_finished git reset --hard &&\n' span_id: 1126 ) (Token id: Id.Lit_Chars val: '\tgit difftool -d $symlinks --extcmd "$PWD/modify-right-file" branch &&\n' span_id: 1127 ) (Token id:Id.Lit_Chars val:'\techo "new content" >expect &&\n' span_id:1128) (Token id:Id.Lit_Chars val:'\ttest_cmp expect file\n' span_id:1129) ) } ) (command.Simple words: [{(write_script)} {(modify-file)}] redirects: [ (redir.HereDoc op: (Token id:Id.Redir_DLess val:'<<' span_id:1137) fd: -1 here_begin: {(word_part.EscapedLiteral token:(Token id:Id.Lit_EscapedChar val:'\\E' span_id:1138)) (OF) } here_end_span_id: 1142 stdin_parts: [('echo "new content" >file\n')] ) ] ) (C {(test_expect_success)} {(PERL)} { (SQ (Token id: Id.Lit_Chars val: 'difftool --no-symlinks does not overwrite working tree file ' span_id: 1149 ) ) } { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:1153) (Token id:Id.Lit_Chars val:'\techo "orig content" >file &&\n' span_id:1154) (Token id: Id.Lit_Chars val: '\tgit difftool --dir-diff --no-symlinks --extcmd "$PWD/modify-file" branch &&\n' span_id: 1155 ) (Token id:Id.Lit_Chars val:'\techo "new content" >expect &&\n' span_id:1156) (Token id:Id.Lit_Chars val:'\ttest_cmp expect file\n' span_id:1157) ) } ) (command.Simple words: [{(write_script)} {(modify-both-files)}] redirects: [ (redir.HereDoc op: (Token id:Id.Redir_DLess val:'<<' span_id:1165) fd: -1 here_begin: {(word_part.EscapedLiteral token:(Token id:Id.Lit_EscapedChar val:'\\E' span_id:1166)) (OF) } here_end_span_id: 1172 stdin_parts: [ ('echo "wt content" >file &&\n') ('echo "tmp content" >"$2/file" &&\n') ('echo "$2" >tmpdir\n') ] ) ] ) (C {(test_expect_success)} {(PERL)} {(SQ (Token id:Id.Lit_Chars val:'difftool --no-symlinks detects conflict ' span_id:1179))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:1183) (Token id:Id.Lit_Chars val:'\t(\n' span_id:1184) (Token id:Id.Lit_Chars val:'\t\tTMPDIR=$TRASH_DIRECTORY &&\n' span_id:1185) (Token id:Id.Lit_Chars val:'\t\texport TMPDIR &&\n' span_id:1186) (Token id:Id.Lit_Chars val:'\t\techo "orig content" >file &&\n' span_id:1187) (Token id: Id.Lit_Chars val: '\t\ttest_must_fail git difftool --dir-diff --no-symlinks --extcmd "$PWD/modify-both-files" branch &&\n' span_id: 1188 ) (Token id:Id.Lit_Chars val:'\t\techo "wt content" >expect &&\n' span_id:1189) (Token id:Id.Lit_Chars val:'\t\ttest_cmp expect file &&\n' span_id:1190) (Token id:Id.Lit_Chars val:'\t\techo "tmp content" >expect &&\n' span_id:1191) (Token id: Id.Lit_Chars val: '\t\ttest_cmp expect "$(cat tmpdir)/file"\n' span_id: 1192 ) (Token id:Id.Lit_Chars val:'\t)\n' span_id:1193) ) } ) (C {(test_expect_success)} {(PERL)} { (SQ (Token id: Id.Lit_Chars val: 'difftool properly honors gitlink and core.worktree' span_id: 1202 ) ) } { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:1206) (Token id: Id.Lit_Chars val: '\tgit submodule add ./. submod/ule &&\n' span_id: 1207 ) (Token id:Id.Lit_Chars val:'\ttest_config -C submod/ule diff.tool checktrees &&\n' span_id:1208) (Token id: Id.Lit_Chars val: '\ttest_config -C submod/ule difftool.checktrees.cmd ' span_id: 1209 ) ) (word_part.EscapedLiteral token:(Token id:Id.Lit_EscapedChar val:"\\'" span_id:1211)) (SQ (Token id:Id.Lit_Chars val:'\n' span_id:1213) (Token id: Id.Lit_Chars val: '\t\ttest -d "$LOCAL" && test -d "$REMOTE" && echo good\n' span_id: 1214 ) (Token id:Id.Lit_Chars val:'\t\t' span_id:1215) ) (word_part.EscapedLiteral token:(Token id:Id.Lit_EscapedChar val:"\\'" span_id:1217)) (SQ (Token id:Id.Lit_Chars val:' &&\n' span_id:1219) (Token id:Id.Lit_Chars val:'\t(\n' span_id:1220) (Token id:Id.Lit_Chars val:'\t\tcd submod/ule &&\n' span_id:1221) (Token id:Id.Lit_Chars val:'\t\techo good >expect &&\n' span_id:1222) (Token id: Id.Lit_Chars val: '\t\tgit difftool --tool=checktrees --dir-diff HEAD~ >actual &&\n' span_id: 1223 ) (Token id:Id.Lit_Chars val:'\t\ttest_cmp expect actual\n' span_id:1224) (Token id:Id.Lit_Chars val:'\t)\n' span_id:1225) ) } ) (C {(test_expect_success)} {(PERL) (Id.Lit_Comma ',') (SYMLINKS)} {(SQ (Token id:Id.Lit_Chars val:'difftool --dir-diff symlinked directories' span_id:1236))} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:1240) (Token id:Id.Lit_Chars val:'\tgit init dirlinks &&\n' span_id:1241) (Token id:Id.Lit_Chars val:'\t(\n' span_id:1242) (Token id:Id.Lit_Chars val:'\t\tcd dirlinks &&\n' span_id:1243) (Token id:Id.Lit_Chars val:'\t\tgit config diff.tool checktrees &&\n' span_id:1244) (Token id: Id.Lit_Chars val: '\t\tgit config difftool.checktrees.cmd "echo good" &&\n' span_id: 1245 ) (Token id:Id.Lit_Chars val:'\t\tmkdir foo &&\n' span_id:1246) (Token id:Id.Lit_Chars val:'\t\t: >foo/bar &&\n' span_id:1247) (Token id:Id.Lit_Chars val:'\t\tgit add foo/bar &&\n' span_id:1248) (Token id:Id.Lit_Chars val:'\t\ttest_commit symlink-one &&\n' span_id:1249) (Token id:Id.Lit_Chars val:'\t\tln -s foo link &&\n' span_id:1250) (Token id:Id.Lit_Chars val:'\t\tgit add link &&\n' span_id:1251) (Token id:Id.Lit_Chars val:'\t\ttest_commit symlink-two &&\n' span_id:1252) (Token id:Id.Lit_Chars val:'\t\techo good >expect &&\n' span_id:1253) (Token id: Id.Lit_Chars val: '\t\tgit difftool --tool=checktrees --dir-diff HEAD~ >actual &&\n' span_id: 1254 ) (Token id:Id.Lit_Chars val:'\t\ttest_cmp expect actual\n' span_id:1255) (Token id:Id.Lit_Chars val:'\t)\n' span_id:1256) ) } ) (C {(test_done)}) ] )