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