(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:'difference in submodules' span_id:6))}
          spids: [4]
        )
      ]
    )
    (C {(.)} {(./test-lib.sh)})
    (C {(.)} {(DQ ($ Id.VSub_DollarName '$TEST_DIRECTORY')) (/diff-lib.sh)})
    (C {(test_expect_success)} {(setup)} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:27) 
          (Token id:Id.Lit_Chars val:'\ttest_tick &&\n' span_id:28) (Token id:Id.Lit_Chars val:'\ttest_create_repo sub &&\n' span_id:29) 
          (Token id:Id.Lit_Chars val:'\t(\n' span_id:30) (Token id:Id.Lit_Chars val:'\t\tcd sub &&\n' span_id:31) 
          (Token id:Id.Lit_Chars val:'\t\techo hello >world &&\n' span_id:32) (Token id:Id.Lit_Chars val:'\t\tgit add world &&\n' span_id:33) 
          (Token id:Id.Lit_Chars val:'\t\tgit commit -m submodule\n' span_id:34) (Token id:Id.Lit_Chars val:'\t) &&\n' span_id:35) (Token id:Id.Lit_Chars val:'\n' span_id:36) 
          (Token id:Id.Lit_Chars val:'\ttest_tick &&\n' span_id:37) (Token id:Id.Lit_Chars val:'\techo frotz >nitfol &&\n' span_id:38) 
          (Token id:Id.Lit_Chars val:'\tgit add nitfol sub &&\n' span_id:39) (Token id:Id.Lit_Chars val:'\tgit commit -m superproject &&\n' span_id:40) 
          (Token id:Id.Lit_Chars val:'\n' span_id:41) (Token id:Id.Lit_Chars val:'\t(\n' span_id:42) 
          (Token id:Id.Lit_Chars val:'\t\tcd sub &&\n' span_id:43) (Token id:Id.Lit_Chars val:'\t\techo goodbye >world &&\n' span_id:44) 
          (Token id:Id.Lit_Chars val:'\t\tgit add world &&\n' span_id:45) (Token id:Id.Lit_Chars val:'\t\tgit commit -m "submodule #2"\n' span_id:46) 
          (Token id:Id.Lit_Chars val:'\t) &&\n' span_id:47) (Token id:Id.Lit_Chars val:'\n' span_id:48) (Token id:Id.Lit_Chars val:'\tset x $(\n' span_id:49) 
          (Token id:Id.Lit_Chars val:'\t\tcd sub &&\n' span_id:50) (Token id:Id.Lit_Chars val:'\t\tgit rev-list HEAD\n' span_id:51) 
          (Token id:Id.Lit_Chars val:'\t) &&\n' span_id:52) (Token id:Id.Lit_Chars val:'\techo ":160000 160000 $3 $_z40 M\tsub" >expect &&\n' span_id:53) 
          (Token id:Id.Lit_Chars val:'\tsubtip=$3 subprev=$2\n' span_id:54)
        )
      }
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'git diff --raw HEAD' span_id:61))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:65) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit diff --raw --abbrev=40 HEAD >actual &&\n'
            span_id: 66
          ) (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual\n' span_id:67)
        )
      }
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'git diff-index --raw HEAD' span_id:74))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:78) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit diff-index --raw HEAD >actual.index &&\n'
            span_id: 79
          ) (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual.index\n' span_id:80)
        )
      }
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'git diff-files --raw' span_id:87))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:91) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit diff-files --raw >actual.files &&\n'
            span_id: 92
          ) (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual.files\n' span_id:93)
        )
      }
    )
    (command.ShFunction
      name: expect_from_to
      body: 
        (command.BraceGroup
          children: [
            (C {(printf)} 
              {
                (DQ ('%sSubproject commit %s') (Id.Lit_Other '\\') ('n+Subproject commit %s') 
                  (Id.Lit_Other '\\') (n)
                )
              } {(DQ (-))} {(DQ ($ Id.VSub_Number '$1'))} {(DQ ($ Id.VSub_Number '$2'))}
            )
          ]
        )
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'git diff HEAD' span_id:135))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:139) 
          (Token id:Id.Lit_Chars val:'\tgit diff HEAD >actual &&\n' span_id:140) (Token id:Id.Lit_Chars val:'\tsed -e "1,/^@@/d" actual >actual.body &&\n' span_id:141) 
          (Token
            id: Id.Lit_Chars
            val: '\texpect_from_to >expect.body $subtip $subprev &&\n'
            span_id: 142
          ) (Token id:Id.Lit_Chars val:'\ttest_cmp expect.body actual.body\n' span_id:143)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'git diff HEAD with dirty submodule (work tree)' span_id:150))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:154) 
          (Token id:Id.Lit_Chars val:'\techo >>sub/world &&\n' span_id:155) (Token id:Id.Lit_Chars val:'\tgit diff HEAD >actual &&\n' span_id:156) 
          (Token
            id: Id.Lit_Chars
            val: '\tsed -e "1,/^@@/d" actual >actual.body &&\n'
            span_id: 157
          ) (Token id:Id.Lit_Chars val:'\texpect_from_to >expect.body $subtip $subprev-dirty &&\n' span_id:158) 
          (Token id:Id.Lit_Chars val:'\ttest_cmp expect.body actual.body\n' span_id:159)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'git diff HEAD with dirty submodule (index)' span_id:166))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:170) 
          (Token id:Id.Lit_Chars val:'\t(\n' span_id:171) (Token id:Id.Lit_Chars val:'\t\tcd sub &&\n' span_id:172) 
          (Token id:Id.Lit_Chars val:'\t\tgit reset --hard &&\n' span_id:173) (Token id:Id.Lit_Chars val:'\t\techo >>world &&\n' span_id:174) 
          (Token id:Id.Lit_Chars val:'\t\tgit add world\n' span_id:175) (Token id:Id.Lit_Chars val:'\t) &&\n' span_id:176) 
          (Token id:Id.Lit_Chars val:'\tgit diff HEAD >actual &&\n' span_id:177) (Token id:Id.Lit_Chars val:'\tsed -e "1,/^@@/d" actual >actual.body &&\n' span_id:178) 
          (Token
            id: Id.Lit_Chars
            val: '\texpect_from_to >expect.body $subtip $subprev-dirty &&\n'
            span_id: 179
          ) (Token id:Id.Lit_Chars val:'\ttest_cmp expect.body actual.body\n' span_id:180)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'git diff HEAD with dirty submodule (untracked)' span_id:187))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:191) 
          (Token id:Id.Lit_Chars val:'\t(\n' span_id:192) (Token id:Id.Lit_Chars val:'\t\tcd sub &&\n' span_id:193) 
          (Token id:Id.Lit_Chars val:'\t\tgit reset --hard &&\n' span_id:194) (Token id:Id.Lit_Chars val:'\t\tgit clean -qfdx &&\n' span_id:195) 
          (Token id:Id.Lit_Chars val:'\t\t>cruft\n' span_id:196) (Token id:Id.Lit_Chars val:'\t) &&\n' span_id:197) 
          (Token id:Id.Lit_Chars val:'\tgit diff HEAD >actual &&\n' span_id:198) (Token id:Id.Lit_Chars val:'\tsed -e "1,/^@@/d" actual >actual.body &&\n' span_id:199) 
          (Token
            id: Id.Lit_Chars
            val: '\texpect_from_to >expect.body $subtip $subprev-dirty &&\n'
            span_id: 200
          ) (Token id:Id.Lit_Chars val:'\ttest_cmp expect.body actual.body\n' span_id:201)
        )
      }
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'git diff HEAD with dirty submodule (work tree, refs match)'
            span_id: 208
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:212) 
          (Token id:Id.Lit_Chars val:'\tgit commit -m "x" sub &&\n' span_id:213) (Token id:Id.Lit_Chars val:'\techo >>sub/world &&\n' span_id:214) 
          (Token id:Id.Lit_Chars val:'\tgit diff HEAD >actual &&\n' span_id:215) (Token id:Id.Lit_Chars val:'\tsed -e "1,/^@@/d" actual >actual.body &&\n' span_id:216) 
          (Token
            id: Id.Lit_Chars
            val: '\texpect_from_to >expect.body $subprev $subprev-dirty &&\n'
            span_id: 217
          ) (Token id:Id.Lit_Chars val:'\ttest_cmp expect.body actual.body &&\n' span_id:218) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit diff --ignore-submodules HEAD >actual2 &&\n'
            span_id: 219
          ) (Token id:Id.Lit_Chars val:'\t! test -s actual2 &&\n' span_id:220) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit diff --ignore-submodules=untracked HEAD >actual3 &&\n'
            span_id: 221
          ) (Token id:Id.Lit_Chars val:'\tsed -e "1,/^@@/d" actual3 >actual3.body &&\n' span_id:222) 
          (Token
            id: Id.Lit_Chars
            val: '\texpect_from_to >expect.body $subprev $subprev-dirty &&\n'
            span_id: 223
          ) (Token id:Id.Lit_Chars val:'\ttest_cmp expect.body actual3.body &&\n' span_id:224) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit diff --ignore-submodules=dirty HEAD >actual4 &&\n'
            span_id: 225
          ) (Token id:Id.Lit_Chars val:'\t! test -s actual4\n' span_id:226)
        )
      }
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'git diff HEAD with dirty submodule (work tree, refs match) [.git/config]'
            span_id: 233
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:237) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit config diff.ignoreSubmodules all &&\n'
            span_id: 238
          ) (Token id:Id.Lit_Chars val:'\tgit diff HEAD >actual &&\n' span_id:239) 
          (Token id:Id.Lit_Chars val:'\t! test -s actual &&\n' span_id:240) (Token id:Id.Lit_Chars val:'\tgit config submodule.subname.ignore none &&\n' span_id:241) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit config submodule.subname.path sub &&\n'
            span_id: 242
          ) (Token id:Id.Lit_Chars val:'\tgit diff HEAD >actual &&\n' span_id:243) 
          (Token
            id: Id.Lit_Chars
            val: '\tsed -e "1,/^@@/d" actual >actual.body &&\n'
            span_id: 244
          ) (Token id:Id.Lit_Chars val:'\texpect_from_to >expect.body $subprev $subprev-dirty &&\n' span_id:245) 
          (Token id:Id.Lit_Chars val:'\ttest_cmp expect.body actual.body &&\n' span_id:246) (Token id:Id.Lit_Chars val:'\tgit config submodule.subname.ignore all &&\n' span_id:247) 
          (Token id:Id.Lit_Chars val:'\tgit diff HEAD >actual2 &&\n' span_id:248) (Token id:Id.Lit_Chars val:'\t! test -s actual2 &&\n' span_id:249) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit config submodule.subname.ignore untracked &&\n'
            span_id: 250
          ) (Token id:Id.Lit_Chars val:'\tgit diff HEAD >actual3 &&\n' span_id:251) 
          (Token
            id: Id.Lit_Chars
            val: '\tsed -e "1,/^@@/d" actual3 >actual3.body &&\n'
            span_id: 252
          ) (Token id:Id.Lit_Chars val:'\texpect_from_to >expect.body $subprev $subprev-dirty &&\n' span_id:253) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest_cmp expect.body actual3.body &&\n'
            span_id: 254
          ) (Token id:Id.Lit_Chars val:'\tgit config submodule.subname.ignore dirty &&\n' span_id:255) 
          (Token id:Id.Lit_Chars val:'\tgit diff HEAD >actual4 &&\n' span_id:256) (Token id:Id.Lit_Chars val:'\t! test -s actual4 &&\n' span_id:257) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit diff HEAD --ignore-submodules=none >actual &&\n'
            span_id: 258
          ) (Token id:Id.Lit_Chars val:'\tsed -e "1,/^@@/d" actual >actual.body &&\n' span_id:259) 
          (Token
            id: Id.Lit_Chars
            val: '\texpect_from_to >expect.body $subprev $subprev-dirty &&\n'
            span_id: 260
          ) (Token id:Id.Lit_Chars val:'\ttest_cmp expect.body actual.body &&\n' span_id:261) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit config --remove-section submodule.subname &&\n'
            span_id: 262
          ) (Token id:Id.Lit_Chars val:'\tgit config --unset diff.ignoreSubmodules\n' span_id:263)
        )
      }
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'git diff HEAD with dirty submodule (work tree, refs match) [.gitmodules]'
            span_id: 270
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:274) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit config diff.ignoreSubmodules dirty &&\n'
            span_id: 275
          ) (Token id:Id.Lit_Chars val:'\tgit diff HEAD >actual &&\n' span_id:276) 
          (Token id:Id.Lit_Chars val:'\t! test -s actual &&\n' span_id:277) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit config --add -f .gitmodules submodule.subname.ignore none &&\n'
            span_id: 278
          ) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit config --add -f .gitmodules submodule.subname.path sub &&\n'
            span_id: 279
          ) (Token id:Id.Lit_Chars val:'\tgit diff HEAD >actual &&\n' span_id:280) 
          (Token
            id: Id.Lit_Chars
            val: '\tsed -e "1,/^@@/d" actual >actual.body &&\n'
            span_id: 281
          ) (Token id:Id.Lit_Chars val:'\texpect_from_to >expect.body $subprev $subprev-dirty &&\n' span_id:282) 
          (Token id:Id.Lit_Chars val:'\ttest_cmp expect.body actual.body &&\n' span_id:283) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit config -f .gitmodules submodule.subname.ignore all &&\n'
            span_id: 284
          ) (Token id:Id.Lit_Chars val:'\tgit config -f .gitmodules submodule.subname.path sub &&\n' span_id:285) 
          (Token id:Id.Lit_Chars val:'\tgit diff HEAD >actual2 &&\n' span_id:286) (Token id:Id.Lit_Chars val:'\t! test -s actual2 &&\n' span_id:287) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit config -f .gitmodules submodule.subname.ignore untracked &&\n'
            span_id: 288
          ) (Token id:Id.Lit_Chars val:'\tgit diff HEAD >actual3 &&\n' span_id:289) 
          (Token
            id: Id.Lit_Chars
            val: '\tsed -e "1,/^@@/d" actual3 >actual3.body &&\n'
            span_id: 290
          ) (Token id:Id.Lit_Chars val:'\texpect_from_to >expect.body $subprev $subprev-dirty &&\n' span_id:291) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest_cmp expect.body actual3.body &&\n'
            span_id: 292
          ) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit config -f .gitmodules submodule.subname.ignore dirty &&\n'
            span_id: 293
          ) (Token id:Id.Lit_Chars val:'\tgit diff HEAD >actual4 &&\n' span_id:294) 
          (Token id:Id.Lit_Chars val:'\t! test -s actual4 &&\n' span_id:295) (Token id:Id.Lit_Chars val:'\tgit config submodule.subname.ignore none &&\n' span_id:296) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit config submodule.subname.path sub &&\n'
            span_id: 297
          ) (Token id:Id.Lit_Chars val:'\tgit diff HEAD >actual &&\n' span_id:298) 
          (Token
            id: Id.Lit_Chars
            val: '\tsed -e "1,/^@@/d" actual >actual.body &&\n'
            span_id: 299
          ) (Token id:Id.Lit_Chars val:'\texpect_from_to >expect.body $subprev $subprev-dirty &&\n' span_id:300) 
          (Token id:Id.Lit_Chars val:'\ttest_cmp expect.body actual.body &&\n' span_id:301) (Token id:Id.Lit_Chars val:'\tgit config --remove-section submodule.subname &&\n' span_id:302) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit config --remove-section -f .gitmodules submodule.subname &&\n'
            span_id: 303
          ) (Token id:Id.Lit_Chars val:'\tgit config --unset diff.ignoreSubmodules &&\n' span_id:304) 
          (Token id:Id.Lit_Chars val:'\trm .gitmodules\n' span_id:305)
        )
      }
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'git diff HEAD with dirty submodule (index, refs match)'
            span_id: 312
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:316) 
          (Token id:Id.Lit_Chars val:'\t(\n' span_id:317) (Token id:Id.Lit_Chars val:'\t\tcd sub &&\n' span_id:318) 
          (Token id:Id.Lit_Chars val:'\t\tgit reset --hard &&\n' span_id:319) (Token id:Id.Lit_Chars val:'\t\techo >>world &&\n' span_id:320) 
          (Token id:Id.Lit_Chars val:'\t\tgit add world\n' span_id:321) (Token id:Id.Lit_Chars val:'\t) &&\n' span_id:322) 
          (Token id:Id.Lit_Chars val:'\tgit diff HEAD >actual &&\n' span_id:323) (Token id:Id.Lit_Chars val:'\tsed -e "1,/^@@/d" actual >actual.body &&\n' span_id:324) 
          (Token
            id: Id.Lit_Chars
            val: '\texpect_from_to >expect.body $subprev $subprev-dirty &&\n'
            span_id: 325
          ) (Token id:Id.Lit_Chars val:'\ttest_cmp expect.body actual.body\n' span_id:326)
        )
      }
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'git diff HEAD with dirty submodule (untracked, refs match)'
            span_id: 333
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:337) 
          (Token id:Id.Lit_Chars val:'\t(\n' span_id:338) (Token id:Id.Lit_Chars val:'\t\tcd sub &&\n' span_id:339) 
          (Token id:Id.Lit_Chars val:'\t\tgit reset --hard &&\n' span_id:340) (Token id:Id.Lit_Chars val:'\t\tgit clean -qfdx &&\n' span_id:341) 
          (Token id:Id.Lit_Chars val:'\t\t>cruft\n' span_id:342) (Token id:Id.Lit_Chars val:'\t) &&\n' span_id:343) 
          (Token id:Id.Lit_Chars val:'\tgit diff HEAD >actual &&\n' span_id:344) (Token id:Id.Lit_Chars val:'\tsed -e "1,/^@@/d" actual >actual.body &&\n' span_id:345) 
          (Token
            id: Id.Lit_Chars
            val: '\texpect_from_to >expect.body $subprev $subprev-dirty &&\n'
            span_id: 346
          ) (Token id:Id.Lit_Chars val:'\ttest_cmp expect.body actual.body &&\n' span_id:347) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit diff --ignore-submodules=all HEAD >actual2 &&\n'
            span_id: 348
          ) (Token id:Id.Lit_Chars val:'\t! test -s actual2 &&\n' span_id:349) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit diff --ignore-submodules=untracked HEAD >actual3 &&\n'
            span_id: 350
          ) (Token id:Id.Lit_Chars val:'\t! test -s actual3 &&\n' span_id:351) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit diff --ignore-submodules=dirty HEAD >actual4 &&\n'
            span_id: 352
          ) (Token id:Id.Lit_Chars val:'\t! test -s actual4\n' span_id:353)
        )
      }
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'git diff HEAD with dirty submodule (untracked, refs match) [.git/config]'
            span_id: 360
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:364) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit config submodule.subname.ignore all &&\n'
            span_id: 365
          ) (Token id:Id.Lit_Chars val:'\tgit config submodule.subname.path sub &&\n' span_id:366) 
          (Token id:Id.Lit_Chars val:'\tgit diff HEAD >actual2 &&\n' span_id:367) (Token id:Id.Lit_Chars val:'\t! test -s actual2 &&\n' span_id:368) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit config submodule.subname.ignore untracked &&\n'
            span_id: 369
          ) (Token id:Id.Lit_Chars val:'\tgit diff HEAD >actual3 &&\n' span_id:370) 
          (Token id:Id.Lit_Chars val:'\t! test -s actual3 &&\n' span_id:371) (Token id:Id.Lit_Chars val:'\tgit config submodule.subname.ignore dirty &&\n' span_id:372) 
          (Token id:Id.Lit_Chars val:'\tgit diff HEAD >actual4 &&\n' span_id:373) (Token id:Id.Lit_Chars val:'\t! test -s actual4 &&\n' span_id:374) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit diff --ignore-submodules=none HEAD >actual &&\n'
            span_id: 375
          ) (Token id:Id.Lit_Chars val:'\tsed -e "1,/^@@/d" actual >actual.body &&\n' span_id:376) 
          (Token
            id: Id.Lit_Chars
            val: '\texpect_from_to >expect.body $subprev $subprev-dirty &&\n'
            span_id: 377
          ) (Token id:Id.Lit_Chars val:'\ttest_cmp expect.body actual.body &&\n' span_id:378) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit config --remove-section submodule.subname\n'
            span_id: 379
          )
        )
      }
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'git diff HEAD with dirty submodule (untracked, refs match) [.gitmodules]'
            span_id: 386
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:390) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit config --add -f .gitmodules submodule.subname.ignore all &&\n'
            span_id: 391
          ) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit config --add -f .gitmodules submodule.subname.path sub &&\n'
            span_id: 392
          ) (Token id:Id.Lit_Chars val:'\tgit diff HEAD >actual2 &&\n' span_id:393) 
          (Token id:Id.Lit_Chars val:'\t! test -s actual2 &&\n' span_id:394) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit config -f .gitmodules submodule.subname.ignore untracked &&\n'
            span_id: 395
          ) (Token id:Id.Lit_Chars val:'\tgit diff HEAD >actual3 &&\n' span_id:396) 
          (Token id:Id.Lit_Chars val:'\t! test -s actual3 &&\n' span_id:397) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit config -f .gitmodules submodule.subname.ignore dirty &&\n'
            span_id: 398
          ) (Token id:Id.Lit_Chars val:'\tgit diff HEAD >actual4 &&\n' span_id:399) 
          (Token id:Id.Lit_Chars val:'\t! test -s actual4 &&\n' span_id:400) (Token id:Id.Lit_Chars val:'\tgit config submodule.subname.ignore none &&\n' span_id:401) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit config submodule.subname.path sub &&\n'
            span_id: 402
          ) (Token id:Id.Lit_Chars val:'\tgit diff HEAD >actual &&\n' span_id:403) 
          (Token
            id: Id.Lit_Chars
            val: '\tsed -e "1,/^@@/d" actual >actual.body &&\n'
            span_id: 404
          ) (Token id:Id.Lit_Chars val:'\texpect_from_to >expect.body $subprev $subprev-dirty &&\n' span_id:405) 
          (Token id:Id.Lit_Chars val:'\ttest_cmp expect.body actual.body &&\n' span_id:406) (Token id:Id.Lit_Chars val:'\tgit config --remove-section submodule.subname &&\n' span_id:407) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit config --remove-section -f .gitmodules submodule.subname &&\n'
            span_id: 408
          ) (Token id:Id.Lit_Chars val:'\trm .gitmodules\n' span_id:409)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'git diff between submodule commits' span_id:416))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:420) 
          (Token id:Id.Lit_Chars val:'\tgit diff HEAD^..HEAD >actual &&\n' span_id:421) (Token id:Id.Lit_Chars val:'\tsed -e "1,/^@@/d" actual >actual.body &&\n' span_id:422) 
          (Token
            id: Id.Lit_Chars
            val: '\texpect_from_to >expect.body $subtip $subprev &&\n'
            span_id: 423
          ) (Token id:Id.Lit_Chars val:'\ttest_cmp expect.body actual.body &&\n' span_id:424) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit diff --ignore-submodules=dirty HEAD^..HEAD >actual &&\n'
            span_id: 425
          ) (Token id:Id.Lit_Chars val:'\tsed -e "1,/^@@/d" actual >actual.body &&\n' span_id:426) 
          (Token
            id: Id.Lit_Chars
            val: '\texpect_from_to >expect.body $subtip $subprev &&\n'
            span_id: 427
          ) (Token id:Id.Lit_Chars val:'\ttest_cmp expect.body actual.body &&\n' span_id:428) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit diff --ignore-submodules HEAD^..HEAD >actual &&\n'
            span_id: 429
          ) (Token id:Id.Lit_Chars val:'\t! test -s actual\n' span_id:430)
        )
      }
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'git diff between submodule commits [.git/config]'
            span_id: 437
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:441) 
          (Token id:Id.Lit_Chars val:'\tgit diff HEAD^..HEAD >actual &&\n' span_id:442) (Token id:Id.Lit_Chars val:'\tsed -e "1,/^@@/d" actual >actual.body &&\n' span_id:443) 
          (Token
            id: Id.Lit_Chars
            val: '\texpect_from_to >expect.body $subtip $subprev &&\n'
            span_id: 444
          ) (Token id:Id.Lit_Chars val:'\ttest_cmp expect.body actual.body &&\n' span_id:445) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit config submodule.subname.ignore dirty &&\n'
            span_id: 446
          ) (Token id:Id.Lit_Chars val:'\tgit config submodule.subname.path sub &&\n' span_id:447) 
          (Token id:Id.Lit_Chars val:'\tgit diff HEAD^..HEAD >actual &&\n' span_id:448) (Token id:Id.Lit_Chars val:'\tsed -e "1,/^@@/d" actual >actual.body &&\n' span_id:449) 
          (Token
            id: Id.Lit_Chars
            val: '\texpect_from_to >expect.body $subtip $subprev &&\n'
            span_id: 450
          ) (Token id:Id.Lit_Chars val:'\ttest_cmp expect.body actual.body &&\n' span_id:451) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit config submodule.subname.ignore all &&\n'
            span_id: 452
          ) (Token id:Id.Lit_Chars val:'\tgit diff HEAD^..HEAD >actual &&\n' span_id:453) 
          (Token id:Id.Lit_Chars val:'\t! test -s actual &&\n' span_id:454) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit diff --ignore-submodules=dirty HEAD^..HEAD >actual &&\n'
            span_id: 455
          ) (Token id:Id.Lit_Chars val:'\tsed -e "1,/^@@/d" actual >actual.body &&\n' span_id:456) 
          (Token
            id: Id.Lit_Chars
            val: '\texpect_from_to >expect.body $subtip $subprev &&\n'
            span_id: 457
          ) (Token id:Id.Lit_Chars val:'\tgit config --remove-section submodule.subname\n' span_id:458)
        )
      }
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'git diff between submodule commits [.gitmodules]'
            span_id: 465
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:469) 
          (Token id:Id.Lit_Chars val:'\tgit diff HEAD^..HEAD >actual &&\n' span_id:470) (Token id:Id.Lit_Chars val:'\tsed -e "1,/^@@/d" actual >actual.body &&\n' span_id:471) 
          (Token
            id: Id.Lit_Chars
            val: '\texpect_from_to >expect.body $subtip $subprev &&\n'
            span_id: 472
          ) (Token id:Id.Lit_Chars val:'\ttest_cmp expect.body actual.body &&\n' span_id:473) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit config --add -f .gitmodules submodule.subname.ignore dirty &&\n'
            span_id: 474
          ) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit config --add -f .gitmodules submodule.subname.path sub &&\n'
            span_id: 475
          ) (Token id:Id.Lit_Chars val:'\tgit diff HEAD^..HEAD >actual &&\n' span_id:476) 
          (Token
            id: Id.Lit_Chars
            val: '\tsed -e "1,/^@@/d" actual >actual.body &&\n'
            span_id: 477
          ) (Token id:Id.Lit_Chars val:'\texpect_from_to >expect.body $subtip $subprev &&\n' span_id:478) 
          (Token id:Id.Lit_Chars val:'\ttest_cmp expect.body actual.body &&\n' span_id:479) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit config -f .gitmodules submodule.subname.ignore all &&\n'
            span_id: 480
          ) (Token id:Id.Lit_Chars val:'\tgit diff HEAD^..HEAD >actual &&\n' span_id:481) 
          (Token id:Id.Lit_Chars val:'\t! test -s actual &&\n' span_id:482) (Token id:Id.Lit_Chars val:'\tgit config submodule.subname.ignore dirty &&\n' span_id:483) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit config submodule.subname.path sub &&\n'
            span_id: 484
          ) (Token id:Id.Lit_Chars val:'\tgit diff  HEAD^..HEAD >actual &&\n' span_id:485) 
          (Token
            id: Id.Lit_Chars
            val: '\tsed -e "1,/^@@/d" actual >actual.body &&\n'
            span_id: 486
          ) (Token id:Id.Lit_Chars val:'\texpect_from_to >expect.body $subtip $subprev &&\n' span_id:487) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit config --remove-section submodule.subname &&\n'
            span_id: 488
          ) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit config --remove-section -f .gitmodules submodule.subname &&\n'
            span_id: 489
          ) (Token id:Id.Lit_Chars val:'\trm .gitmodules\n' span_id:490)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'git diff (empty submodule dir)' span_id:497))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:501) 
          (Token id:Id.Lit_Chars val:'\t: >empty &&\n' span_id:502) (Token id:Id.Lit_Chars val:'\trm -rf sub/* sub/.git &&\n' span_id:503) 
          (Token id:Id.Lit_Chars val:'\tgit diff > actual.empty &&\n' span_id:504) (Token id:Id.Lit_Chars val:'\ttest_cmp empty actual.empty\n' span_id:505)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'conflicted submodule setup' span_id:512))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:516) (Token id:Id.Lit_Chars val:'\n' span_id:517) 
          (Token id:Id.Lit_Chars val:'\t# 39 efs\n' span_id:518) (Token id:Id.Lit_Chars val:'\tc=fffffffffffffffffffffffffffffffffffffff &&\n' span_id:519) 
          (Token id:Id.Lit_Chars val:'\t(\n' span_id:520) (Token id:Id.Lit_Chars val:'\t\techo "000000 $_z40 0\tsub" &&\n' span_id:521) 
          (Token id:Id.Lit_Chars val:'\t\techo "160000 1$c 1\tsub" &&\n' span_id:522) (Token id:Id.Lit_Chars val:'\t\techo "160000 2$c 2\tsub" &&\n' span_id:523) 
          (Token id:Id.Lit_Chars val:'\t\techo "160000 3$c 3\tsub"\n' span_id:524) (Token id:Id.Lit_Chars val:'\t) | git update-index --index-info &&\n' span_id:525) 
          (Token id:Id.Lit_Chars val:'\techo >expect.nosub ' span_id:526)
        ) (word_part.EscapedLiteral token:(Token id:Id.Lit_EscapedChar val:"\\'" span_id:528)) 
        (SQ (Token id:Id.Lit_Chars val:'diff --cc sub\n' span_id:530) 
          (Token id:Id.Lit_Chars val:'index 2ffffff,3ffffff..0000000\n' span_id:531) (Token id:Id.Lit_Chars val:'--- a/sub\n' span_id:532) 
          (Token id:Id.Lit_Chars val:'+++ b/sub\n' span_id:533) (Token id:Id.Lit_Chars val:'@@@ -1,1 -1,1 +1,1 @@@\n' span_id:534) 
          (Token
            id: Id.Lit_Chars
            val: '- Subproject commit 2fffffffffffffffffffffffffffffffffffffff\n'
            span_id: 535
          ) 
          (Token
            id: Id.Lit_Chars
            val: ' -Subproject commit 3fffffffffffffffffffffffffffffffffffffff\n'
            span_id: 536
          ) 
          (Token
            id: Id.Lit_Chars
            val: '++Subproject commit 0000000000000000000000000000000000000000'
            span_id: 537
          )
        ) (word_part.EscapedLiteral token:(Token id:Id.Lit_EscapedChar val:"\\'" span_id:539)) 
        (SQ (Token id:Id.Lit_Chars val:' &&\n' span_id:541) 
          (Token id:Id.Lit_Chars val:'\n' span_id:542) (Token id:Id.Lit_Chars val:'\thh=$(git rev-parse HEAD) &&\n' span_id:543) 
          (Token
            id: Id.Lit_Chars
            val: '\tsed -e "s/$_z40/$hh/" expect.nosub >expect.withsub\n'
            span_id: 544
          ) (Token id:Id.Lit_Chars val:'\n' span_id:545)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'combined (empty submodule)' span_id:552))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:556) 
          (Token id:Id.Lit_Chars val:'\trm -fr sub && mkdir sub &&\n' span_id:557) (Token id:Id.Lit_Chars val:'\tgit diff >actual &&\n' span_id:558) 
          (Token id:Id.Lit_Chars val:'\ttest_cmp expect.nosub actual\n' span_id:559)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'combined (with submodule)' span_id:566))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:570) 
          (Token id:Id.Lit_Chars val:'\trm -fr sub &&\n' span_id:571) (Token id:Id.Lit_Chars val:'\tgit clone --no-checkout . sub &&\n' span_id:572) 
          (Token id:Id.Lit_Chars val:'\tgit diff >actual &&\n' span_id:573) (Token id:Id.Lit_Chars val:'\ttest_cmp expect.withsub actual\n' span_id:574)
        )
      }
    )
    (C {(test_done)})
  ]
)