(command.CommandList
  children: [
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:test_description)
          op: assign_op.Equal
          rhs: {(SQ <'Test diff of symlinks.\n'> <'\n'>)}
          spids: [13]
        )
      ]
    )
    (C {<.>} {<'./test-lib.sh'>})
    (C {<.>} {(DQ ($ Id.VSub_DollarName '$TEST_DIRECTORY')) <'/diff-lib.sh'>})
    (C {<test_expect_success>} {(SQ <'diff new symlink and file'>)} 
      {
        (SQ <'\n'> <'\tcat >expected <<-\\EOF &&\n'> <'\tdiff --git a/frotz b/frotz\n'> 
          <'\tnew file mode 120000\n'> <'\tindex 0000000..7c465af\n'> <'\t--- /dev/null\n'> <'\t+++ b/frotz\n'> <'\t@@ -0,0 +1 @@\n'> 
          <'\t+xyzzy\n'> <'\t\\ No newline at end of file\n'> <'\tdiff --git a/nitfol b/nitfol\n'> <'\tnew file mode 100644\n'> 
          <'\tindex 0000000..7c465af\n'> <'\t--- /dev/null\n'> <'\t+++ b/nitfol\n'> <'\t@@ -0,0 +1 @@\n'> <'\t+xyzzy\n'> <'\tEOF\n'> <'\n'> 
          <'\t# the empty tree\n'> <'\tgit update-index &&\n'> <'\ttree=$(git write-tree) &&\n'> <'\n'> 
          <'\ttest_ln_s_add xyzzy frotz &&\n'> <'\techo xyzzy >nitfol &&\n'> <'\tgit update-index --add nitfol &&\n'> 
          <'\tGIT_DIFF_OPTS=--unified=0 git diff-index -M -p $tree >current &&\n'> <'\tcompare_diff_patch expected current\n'>
        )
      }
    )
    (C {<test_expect_success>} {(SQ <'diff unchanged symlink and file'>)} 
      {
        (SQ <'\n'> <'\ttree=$(git write-tree) &&\n'> <'\tgit update-index frotz nitfol &&\n'> 
          <'\ttest -z "$(git diff-index --name-only $tree)"\n'>
        )
      }
    )
    (C {<test_expect_success>} {(SQ <'diff removed symlink and file'>)} 
      {
        (SQ <'\n'> <'\tcat >expected <<-\\EOF &&\n'> <'\tdiff --git a/frotz b/frotz\n'> 
          <'\tdeleted file mode 120000\n'> <'\tindex 7c465af..0000000\n'> <'\t--- a/frotz\n'> <'\t+++ /dev/null\n'> <'\t@@ -1 +0,0 @@\n'> 
          <'\t-xyzzy\n'> <'\t\\ No newline at end of file\n'> <'\tdiff --git a/nitfol b/nitfol\n'> 
          <'\tdeleted file mode 100644\n'> <'\tindex 7c465af..0000000\n'> <'\t--- a/nitfol\n'> <'\t+++ /dev/null\n'> <'\t@@ -1 +0,0 @@\n'> 
          <'\t-xyzzy\n'> <'\tEOF\n'> <'\tmv frotz frotz2 &&\n'> <'\tmv nitfol nitfol2 &&\n'> 
          <'\tgit diff-index -M -p $tree >current &&\n'> <'\tcompare_diff_patch expected current\n'>
        )
      }
    )
    (C {<test_expect_success>} {(SQ <'diff identical, but newly created symlink and file'>)} 
      {
        (SQ <'\n'> <'\t>expected &&\n'> <'\trm -f frotz nitfol &&\n'> <'\techo xyzzy >nitfol &&\n'> 
          <'\ttest-chmtime +10 nitfol &&\n'> <'\tif test_have_prereq SYMLINKS\n'> <'\tthen\n'> <'\t\tln -s xyzzy frotz\n'> <'\telse\n'> 
          <'\t\tprintf xyzzy >frotz\n'> <'\t\t# the symlink property propagates from the index\n'> <'\tfi &&\n'> 
          <'\tgit diff-index -M -p $tree >current &&\n'> <'\tcompare_diff_patch expected current &&\n'> <'\n'> <'\t>expected &&\n'> 
          <'\tgit diff-index -M -p -w $tree >current &&\n'> <'\tcompare_diff_patch expected current\n'>
        )
      }
    )
    (C {<test_expect_success>} {(SQ <'diff different symlink and file'>)} 
      {
        (SQ <'\n'> <'\tcat >expected <<-\\EOF &&\n'> <'\tdiff --git a/frotz b/frotz\n'> 
          <'\tindex 7c465af..df1db54 120000\n'> <'\t--- a/frotz\n'> <'\t+++ b/frotz\n'> <'\t@@ -1 +1 @@\n'> <'\t-xyzzy\n'> 
          <'\t\\ No newline at end of file\n'> <'\t+yxyyz\n'> <'\t\\ No newline at end of file\n'> <'\tdiff --git a/nitfol b/nitfol\n'> 
          <'\tindex 7c465af..df1db54 100644\n'> <'\t--- a/nitfol\n'> <'\t+++ b/nitfol\n'> <'\t@@ -1 +1 @@\n'> <'\t-xyzzy\n'> <'\t+yxyyz\n'> <'\tEOF\n'> 
          <'\trm -f frotz &&\n'> <'\tif test_have_prereq SYMLINKS\n'> <'\tthen\n'> <'\t\tln -s yxyyz frotz\n'> <'\telse\n'> 
          <'\t\tprintf yxyyz >frotz\n'> <'\t\t# the symlink property propagates from the index\n'> <'\tfi &&\n'> <'\techo yxyyz >nitfol &&\n'> 
          <'\tgit diff-index -M -p $tree >current &&\n'> <'\tcompare_diff_patch expected current\n'>
        )
      }
    )
    (C {<test_expect_success>} {<SYMLINKS>} {(SQ <'diff symlinks with non-existing targets'>)} 
      {
        (SQ <'\n'> <'\tln -s narf pinky &&\n'> <'\tln -s take\\ over brain &&\n'> 
          <'\ttest_must_fail git diff --no-index pinky brain >output 2>output.err &&\n'> <'\tgrep narf output &&\n'> <'\t! test -s output.err\n'>
        )
      }
    )
    (C {<test_expect_success>} {<SYMLINKS>} {(SQ <'setup symlinks with attributes'>)} 
      {
        (SQ <'\n'> <'\techo "*.bin diff=bin" >>.gitattributes &&\n'> <'\techo content >file.bin &&\n'> 
          <'\tln -s file.bin link.bin &&\n'> <'\tgit add -N file.bin link.bin\n'>
        )
      }
    )
    (C {<test_expect_success>} {<SYMLINKS>} {(SQ <'symlinks do not respect userdiff config by path'>)} 
      {
        (SQ <'\n'> <'\tcat >expect <<-\\EOF &&\n'> <'\tdiff --git a/file.bin b/file.bin\n'> 
          <'\tindex e69de29..d95f3ad 100644\n'> <'\tBinary files a/file.bin and b/file.bin differ\n'> <'\tdiff --git a/link.bin b/link.bin\n'> 
          <'\tindex e69de29..dce41ec 120000\n'> <'\t--- a/link.bin\n'> <'\t+++ b/link.bin\n'> <'\t@@ -0,0 +1 @@\n'> <'\t+file.bin\n'> 
          <'\t\\ No newline at end of file\n'> <'\tEOF\n'> <'\tgit config diff.bin.binary true &&\n'> <'\tgit diff file.bin link.bin >actual &&\n'> 
          <'\ttest_cmp expect actual\n'>
        )
      }
    )
    (C {<test_done>})
  ]
)