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