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