(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:'Test diff of symlinks.\n' span_id:15) 
                (Token id:Id.Lit_Chars val:'\n' span_id:16)
              )
            }
          spids: [13]
        )
      ]
    )
    (C {(.)} {(./test-lib.sh)})
    (C {(.)} {(DQ ($ Id.VSub_DollarName '$TEST_DIRECTORY')) (/diff-lib.sh)})
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'diff new symlink and file' span_id:34))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:38) 
          (Token id:Id.Lit_Chars val:'\tcat >expected <<-\\EOF &&\n' span_id:39) (Token id:Id.Lit_Chars val:'\tdiff --git a/frotz b/frotz\n' span_id:40) 
          (Token id:Id.Lit_Chars val:'\tnew file mode 120000\n' span_id:41) (Token id:Id.Lit_Chars val:'\tindex 0000000..7c465af\n' span_id:42) 
          (Token id:Id.Lit_Chars val:'\t--- /dev/null\n' span_id:43) (Token id:Id.Lit_Chars val:'\t+++ b/frotz\n' span_id:44) 
          (Token id:Id.Lit_Chars val:'\t@@ -0,0 +1 @@\n' span_id:45) (Token id:Id.Lit_Chars val:'\t+xyzzy\n' span_id:46) 
          (Token id:Id.Lit_Chars val:'\t\\ No newline at end of file\n' span_id:47) (Token id:Id.Lit_Chars val:'\tdiff --git a/nitfol b/nitfol\n' span_id:48) 
          (Token id:Id.Lit_Chars val:'\tnew file mode 100644\n' span_id:49) (Token id:Id.Lit_Chars val:'\tindex 0000000..7c465af\n' span_id:50) 
          (Token id:Id.Lit_Chars val:'\t--- /dev/null\n' span_id:51) (Token id:Id.Lit_Chars val:'\t+++ b/nitfol\n' span_id:52) 
          (Token id:Id.Lit_Chars val:'\t@@ -0,0 +1 @@\n' span_id:53) (Token id:Id.Lit_Chars val:'\t+xyzzy\n' span_id:54) (Token id:Id.Lit_Chars val:'\tEOF\n' span_id:55) 
          (Token id:Id.Lit_Chars val:'\n' span_id:56) (Token id:Id.Lit_Chars val:'\t# the empty tree\n' span_id:57) 
          (Token id:Id.Lit_Chars val:'\tgit update-index &&\n' span_id:58) (Token id:Id.Lit_Chars val:'\ttree=$(git write-tree) &&\n' span_id:59) 
          (Token id:Id.Lit_Chars val:'\n' span_id:60) (Token id:Id.Lit_Chars val:'\ttest_ln_s_add xyzzy frotz &&\n' span_id:61) 
          (Token id:Id.Lit_Chars val:'\techo xyzzy >nitfol &&\n' span_id:62) (Token id:Id.Lit_Chars val:'\tgit update-index --add nitfol &&\n' span_id:63) 
          (Token
            id: Id.Lit_Chars
            val: '\tGIT_DIFF_OPTS=--unified=0 git diff-index -M -p $tree >current &&\n'
            span_id: 64
          ) (Token id:Id.Lit_Chars val:'\tcompare_diff_patch expected current\n' span_id:65)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'diff unchanged symlink and file' span_id:72))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:76) 
          (Token id:Id.Lit_Chars val:'\ttree=$(git write-tree) &&\n' span_id:77) (Token id:Id.Lit_Chars val:'\tgit update-index frotz nitfol &&\n' span_id:78) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest -z "$(git diff-index --name-only $tree)"\n'
            span_id: 79
          )
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'diff removed symlink and file' span_id:86))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:90) 
          (Token id:Id.Lit_Chars val:'\tcat >expected <<-\\EOF &&\n' span_id:91) (Token id:Id.Lit_Chars val:'\tdiff --git a/frotz b/frotz\n' span_id:92) 
          (Token id:Id.Lit_Chars val:'\tdeleted file mode 120000\n' span_id:93) (Token id:Id.Lit_Chars val:'\tindex 7c465af..0000000\n' span_id:94) 
          (Token id:Id.Lit_Chars val:'\t--- a/frotz\n' span_id:95) (Token id:Id.Lit_Chars val:'\t+++ /dev/null\n' span_id:96) 
          (Token id:Id.Lit_Chars val:'\t@@ -1 +0,0 @@\n' span_id:97) (Token id:Id.Lit_Chars val:'\t-xyzzy\n' span_id:98) 
          (Token id:Id.Lit_Chars val:'\t\\ No newline at end of file\n' span_id:99) (Token id:Id.Lit_Chars val:'\tdiff --git a/nitfol b/nitfol\n' span_id:100) 
          (Token id:Id.Lit_Chars val:'\tdeleted file mode 100644\n' span_id:101) (Token id:Id.Lit_Chars val:'\tindex 7c465af..0000000\n' span_id:102) 
          (Token id:Id.Lit_Chars val:'\t--- a/nitfol\n' span_id:103) (Token id:Id.Lit_Chars val:'\t+++ /dev/null\n' span_id:104) 
          (Token id:Id.Lit_Chars val:'\t@@ -1 +0,0 @@\n' span_id:105) (Token id:Id.Lit_Chars val:'\t-xyzzy\n' span_id:106) (Token id:Id.Lit_Chars val:'\tEOF\n' span_id:107) 
          (Token id:Id.Lit_Chars val:'\tmv frotz frotz2 &&\n' span_id:108) (Token id:Id.Lit_Chars val:'\tmv nitfol nitfol2 &&\n' span_id:109) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit diff-index -M -p $tree >current &&\n'
            span_id: 110
          ) (Token id:Id.Lit_Chars val:'\tcompare_diff_patch expected current\n' span_id:111)
        )
      }
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'diff identical, but newly created symlink and file'
            span_id: 118
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:122) 
          (Token id:Id.Lit_Chars val:'\t>expected &&\n' span_id:123) (Token id:Id.Lit_Chars val:'\trm -f frotz nitfol &&\n' span_id:124) 
          (Token id:Id.Lit_Chars val:'\techo xyzzy >nitfol &&\n' span_id:125) (Token id:Id.Lit_Chars val:'\ttest-chmtime +10 nitfol &&\n' span_id:126) 
          (Token id:Id.Lit_Chars val:'\tif test_have_prereq SYMLINKS\n' span_id:127) (Token id:Id.Lit_Chars val:'\tthen\n' span_id:128) 
          (Token id:Id.Lit_Chars val:'\t\tln -s xyzzy frotz\n' span_id:129) (Token id:Id.Lit_Chars val:'\telse\n' span_id:130) 
          (Token id:Id.Lit_Chars val:'\t\tprintf xyzzy >frotz\n' span_id:131) (Token id:Id.Lit_Chars val:'\t\t# the symlink property propagates from the index\n' span_id:132) 
          (Token id:Id.Lit_Chars val:'\tfi &&\n' span_id:133) (Token id:Id.Lit_Chars val:'\tgit diff-index -M -p $tree >current &&\n' span_id:134) 
          (Token
            id: Id.Lit_Chars
            val: '\tcompare_diff_patch expected current &&\n'
            span_id: 135
          ) (Token id:Id.Lit_Chars val:'\n' span_id:136) 
          (Token id:Id.Lit_Chars val:'\t>expected &&\n' span_id:137) (Token id:Id.Lit_Chars val:'\tgit diff-index -M -p -w $tree >current &&\n' span_id:138) 
          (Token id:Id.Lit_Chars val:'\tcompare_diff_patch expected current\n' span_id:139)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'diff different symlink and file' span_id:146))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:150) 
          (Token id:Id.Lit_Chars val:'\tcat >expected <<-\\EOF &&\n' span_id:151) (Token id:Id.Lit_Chars val:'\tdiff --git a/frotz b/frotz\n' span_id:152) 
          (Token id:Id.Lit_Chars val:'\tindex 7c465af..df1db54 120000\n' span_id:153) (Token id:Id.Lit_Chars val:'\t--- a/frotz\n' span_id:154) 
          (Token id:Id.Lit_Chars val:'\t+++ b/frotz\n' span_id:155) (Token id:Id.Lit_Chars val:'\t@@ -1 +1 @@\n' span_id:156) 
          (Token id:Id.Lit_Chars val:'\t-xyzzy\n' span_id:157) (Token id:Id.Lit_Chars val:'\t\\ No newline at end of file\n' span_id:158) 
          (Token id:Id.Lit_Chars val:'\t+yxyyz\n' span_id:159) (Token id:Id.Lit_Chars val:'\t\\ No newline at end of file\n' span_id:160) 
          (Token id:Id.Lit_Chars val:'\tdiff --git a/nitfol b/nitfol\n' span_id:161) (Token id:Id.Lit_Chars val:'\tindex 7c465af..df1db54 100644\n' span_id:162) 
          (Token id:Id.Lit_Chars val:'\t--- a/nitfol\n' span_id:163) (Token id:Id.Lit_Chars val:'\t+++ b/nitfol\n' span_id:164) 
          (Token id:Id.Lit_Chars val:'\t@@ -1 +1 @@\n' span_id:165) (Token id:Id.Lit_Chars val:'\t-xyzzy\n' span_id:166) 
          (Token id:Id.Lit_Chars val:'\t+yxyyz\n' span_id:167) (Token id:Id.Lit_Chars val:'\tEOF\n' span_id:168) 
          (Token id:Id.Lit_Chars val:'\trm -f frotz &&\n' span_id:169) (Token id:Id.Lit_Chars val:'\tif test_have_prereq SYMLINKS\n' span_id:170) 
          (Token id:Id.Lit_Chars val:'\tthen\n' span_id:171) (Token id:Id.Lit_Chars val:'\t\tln -s yxyyz frotz\n' span_id:172) 
          (Token id:Id.Lit_Chars val:'\telse\n' span_id:173) (Token id:Id.Lit_Chars val:'\t\tprintf yxyyz >frotz\n' span_id:174) 
          (Token
            id: Id.Lit_Chars
            val: '\t\t# the symlink property propagates from the index\n'
            span_id: 175
          ) (Token id:Id.Lit_Chars val:'\tfi &&\n' span_id:176) 
          (Token id:Id.Lit_Chars val:'\techo yxyyz >nitfol &&\n' span_id:177) (Token id:Id.Lit_Chars val:'\tgit diff-index -M -p $tree >current &&\n' span_id:178) 
          (Token id:Id.Lit_Chars val:'\tcompare_diff_patch expected current\n' span_id:179)
        )
      }
    )
    (C {(test_expect_success)} {(SYMLINKS)} 
      {(SQ (Token id:Id.Lit_Chars val:'diff symlinks with non-existing targets' span_id:188))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:192) 
          (Token id:Id.Lit_Chars val:'\tln -s narf pinky &&\n' span_id:193) (Token id:Id.Lit_Chars val:'\tln -s take\\ over brain &&\n' span_id:194) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest_must_fail git diff --no-index pinky brain >output 2>output.err &&\n'
            span_id: 195
          ) (Token id:Id.Lit_Chars val:'\tgrep narf output &&\n' span_id:196) 
          (Token id:Id.Lit_Chars val:'\t! test -s output.err\n' span_id:197)
        )
      }
    )
    (C {(test_expect_success)} {(SYMLINKS)} 
      {(SQ (Token id:Id.Lit_Chars val:'setup symlinks with attributes' span_id:206))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:210) 
          (Token
            id: Id.Lit_Chars
            val: '\techo "*.bin diff=bin" >>.gitattributes &&\n'
            span_id: 211
          ) (Token id:Id.Lit_Chars val:'\techo content >file.bin &&\n' span_id:212) 
          (Token id:Id.Lit_Chars val:'\tln -s file.bin link.bin &&\n' span_id:213) (Token id:Id.Lit_Chars val:'\tgit add -N file.bin link.bin\n' span_id:214)
        )
      }
    )
    (C {(test_expect_success)} {(SYMLINKS)} 
      {(SQ (Token id:Id.Lit_Chars val:'symlinks do not respect userdiff config by path' span_id:223))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:227) 
          (Token id:Id.Lit_Chars val:'\tcat >expect <<-\\EOF &&\n' span_id:228) (Token id:Id.Lit_Chars val:'\tdiff --git a/file.bin b/file.bin\n' span_id:229) 
          (Token id:Id.Lit_Chars val:'\tindex e69de29..d95f3ad 100644\n' span_id:230) (Token id:Id.Lit_Chars val:'\tBinary files a/file.bin and b/file.bin differ\n' span_id:231) 
          (Token id:Id.Lit_Chars val:'\tdiff --git a/link.bin b/link.bin\n' span_id:232) (Token id:Id.Lit_Chars val:'\tindex e69de29..dce41ec 120000\n' span_id:233) 
          (Token id:Id.Lit_Chars val:'\t--- a/link.bin\n' span_id:234) (Token id:Id.Lit_Chars val:'\t+++ b/link.bin\n' span_id:235) 
          (Token id:Id.Lit_Chars val:'\t@@ -0,0 +1 @@\n' span_id:236) (Token id:Id.Lit_Chars val:'\t+file.bin\n' span_id:237) 
          (Token id:Id.Lit_Chars val:'\t\\ No newline at end of file\n' span_id:238) (Token id:Id.Lit_Chars val:'\tEOF\n' span_id:239) 
          (Token id:Id.Lit_Chars val:'\tgit config diff.bin.binary true &&\n' span_id:240) (Token id:Id.Lit_Chars val:'\tgit diff file.bin link.bin >actual &&\n' span_id:241) 
          (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual\n' span_id:242)
        )
      }
    )
    (C {(test_done)})
  ]
)