(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 indent heuristic.\n' span_id:6) 
                (Token id:Id.Lit_Chars val:'\n' span_id:7)
              )
            }
          spids: [4]
        )
      ]
    )
    (C {(.)} {(./test-lib.sh)})
    (C {(.)} {(DQ ($ Id.VSub_DollarName '$TEST_DIRECTORY')) (/diff-lib.sh)})
    (command.ShFunction
      name: compare_diff
      body: 
        (command.BraceGroup
          children: [
            (command.Simple
              words: [{(sed)} {(-e)} {(DQ ('/^index /d'))}]
              redirects: [
                (redir.Redir
                  op: (Token id:Id.Redir_Less val:'<' span_id:44)
                  fd: -1
                  arg_word: {(DQ ($ Id.VSub_Number '$1'))}
                )
                (redir.Redir
                  op: (Token id:Id.Redir_Great val:'>' span_id:49)
                  fd: -1
                  arg_word: {(.tmp-1)}
                )
              ]
            )
            (command.Simple
              words: [{(sed)} {(-e)} {(DQ ('/^index /d'))}]
              redirects: [
                (redir.Redir
                  op: (Token id:Id.Redir_Less val:'<' span_id:61)
                  fd: -1
                  arg_word: {(DQ ($ Id.VSub_Number '$2'))}
                )
                (redir.Redir
                  op: (Token id:Id.Redir_Great val:'>' span_id:66)
                  fd: -1
                  arg_word: {(.tmp-2)}
                )
              ]
            )
            (command.AndOr
              ops: [Id.Op_DAmp]
              children: [(C {(test_cmp)} {(.tmp-1)} {(.tmp-2)}) (C {(rm)} {(-f)} {(.tmp-1)} {(.tmp-2)})]
            )
          ]
        )
    )
    (command.ShFunction
      name: compare_blame
      body: 
        (command.BraceGroup
          children: [
            (command.Simple
              words: [
                {(sed)}
                {(-n)}
                {(-e)}
                {(DQ ('1,4d'))}
                {(-e)}
                {(DQ ('s/^') (Id.Lit_Other '\\') ('+//p'))}
              ]
              redirects: [
                (redir.Redir
                  op: (Token id:Id.Redir_Less val:'<' span_id:121)
                  fd: -1
                  arg_word: {(DQ ($ Id.VSub_Number '$1'))}
                )
                (redir.Redir
                  op: (Token id:Id.Redir_Great val:'>' span_id:126)
                  fd: -1
                  arg_word: {(.tmp-1)}
                )
              ]
            )
            (command.Simple
              words: [{(sed)} {(-ne)} {(DQ ('s/^[^^][^)]*) *//p'))}]
              redirects: [
                (redir.Redir
                  op: (Token id:Id.Redir_Less val:'<' span_id:138)
                  fd: -1
                  arg_word: {(DQ ($ Id.VSub_Number '$2'))}
                )
                (redir.Redir
                  op: (Token id:Id.Redir_Great val:'>' span_id:143)
                  fd: -1
                  arg_word: {(.tmp-2)}
                )
              ]
            )
            (command.AndOr
              ops: [Id.Op_DAmp]
              children: [(C {(test_cmp)} {(.tmp-1)} {(.tmp-2)}) (C {(rm)} {(-f)} {(.tmp-1)} {(.tmp-2)})]
            )
          ]
        )
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:prepare span_id:169))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:173) 
          (Token id:Id.Lit_Chars val:'\tcat <<-\\EOF >spaces.txt &&\n' span_id:174) (Token id:Id.Lit_Chars val:'\t1\n' span_id:175) (Token id:Id.Lit_Chars val:'\t2\n' span_id:176) 
          (Token id:Id.Lit_Chars val:'\ta\n' span_id:177) (Token id:Id.Lit_Chars val:'\n' span_id:178) (Token id:Id.Lit_Chars val:'\tb\n' span_id:179) 
          (Token id:Id.Lit_Chars val:'\t3\n' span_id:180) (Token id:Id.Lit_Chars val:'\t4\n' span_id:181) (Token id:Id.Lit_Chars val:'\tEOF\n' span_id:182) 
          (Token id:Id.Lit_Chars val:'\n' span_id:183) (Token id:Id.Lit_Chars val:'\tcat <<-\\EOF >functions.c &&\n' span_id:184) 
          (Token id:Id.Lit_Chars val:'\t1\n' span_id:185) (Token id:Id.Lit_Chars val:'\t2\n' span_id:186) 
          (Token id:Id.Lit_Chars val:'\t/* function */\n' span_id:187) (Token id:Id.Lit_Chars val:'\tfoo() {\n' span_id:188) 
          (Token id:Id.Lit_Chars val:'\t    foo\n' span_id:189) (Token id:Id.Lit_Chars val:'\t}\n' span_id:190) (Token id:Id.Lit_Chars val:'\n' span_id:191) 
          (Token id:Id.Lit_Chars val:'\t3\n' span_id:192) (Token id:Id.Lit_Chars val:'\t4\n' span_id:193) (Token id:Id.Lit_Chars val:'\tEOF\n' span_id:194) 
          (Token id:Id.Lit_Chars val:'\n' span_id:195) (Token id:Id.Lit_Chars val:'\tgit add spaces.txt functions.c &&\n' span_id:196) 
          (Token id:Id.Lit_Chars val:'\ttest_tick &&\n' span_id:197) (Token id:Id.Lit_Chars val:'\tgit commit -m initial &&\n' span_id:198) 
          (Token id:Id.Lit_Chars val:'\tgit branch old &&\n' span_id:199) (Token id:Id.Lit_Chars val:'\n' span_id:200) 
          (Token id:Id.Lit_Chars val:'\tcat <<-\\EOF >spaces.txt &&\n' span_id:201) (Token id:Id.Lit_Chars val:'\t1\n' span_id:202) (Token id:Id.Lit_Chars val:'\t2\n' span_id:203) 
          (Token id:Id.Lit_Chars val:'\ta\n' span_id:204) (Token id:Id.Lit_Chars val:'\n' span_id:205) (Token id:Id.Lit_Chars val:'\tb\n' span_id:206) 
          (Token id:Id.Lit_Chars val:'\ta\n' span_id:207) (Token id:Id.Lit_Chars val:'\n' span_id:208) (Token id:Id.Lit_Chars val:'\tb\n' span_id:209) 
          (Token id:Id.Lit_Chars val:'\t3\n' span_id:210) (Token id:Id.Lit_Chars val:'\t4\n' span_id:211) (Token id:Id.Lit_Chars val:'\tEOF\n' span_id:212) 
          (Token id:Id.Lit_Chars val:'\n' span_id:213) (Token id:Id.Lit_Chars val:'\tcat <<-\\EOF >functions.c &&\n' span_id:214) 
          (Token id:Id.Lit_Chars val:'\t1\n' span_id:215) (Token id:Id.Lit_Chars val:'\t2\n' span_id:216) 
          (Token id:Id.Lit_Chars val:'\t/* function */\n' span_id:217) (Token id:Id.Lit_Chars val:'\tbar() {\n' span_id:218) 
          (Token id:Id.Lit_Chars val:'\t    foo\n' span_id:219) (Token id:Id.Lit_Chars val:'\t}\n' span_id:220) (Token id:Id.Lit_Chars val:'\n' span_id:221) 
          (Token id:Id.Lit_Chars val:'\t/* function */\n' span_id:222) (Token id:Id.Lit_Chars val:'\tfoo() {\n' span_id:223) 
          (Token id:Id.Lit_Chars val:'\t    foo\n' span_id:224) (Token id:Id.Lit_Chars val:'\t}\n' span_id:225) (Token id:Id.Lit_Chars val:'\n' span_id:226) 
          (Token id:Id.Lit_Chars val:'\t3\n' span_id:227) (Token id:Id.Lit_Chars val:'\t4\n' span_id:228) (Token id:Id.Lit_Chars val:'\tEOF\n' span_id:229) 
          (Token id:Id.Lit_Chars val:'\n' span_id:230) (Token id:Id.Lit_Chars val:'\tgit add spaces.txt functions.c &&\n' span_id:231) 
          (Token id:Id.Lit_Chars val:'\ttest_tick &&\n' span_id:232) (Token id:Id.Lit_Chars val:'\tgit commit -m initial &&\n' span_id:233) 
          (Token id:Id.Lit_Chars val:'\tgit branch new &&\n' span_id:234) (Token id:Id.Lit_Chars val:'\n' span_id:235) 
          (Token
            id: Id.Lit_Chars
            val: '\ttr "_" " " <<-\\EOF >spaces-expect &&\n'
            span_id: 236
          ) (Token id:Id.Lit_Chars val:'\tdiff --git a/spaces.txt b/spaces.txt\n' span_id:237) 
          (Token id:Id.Lit_Chars val:'\t--- a/spaces.txt\n' span_id:238) (Token id:Id.Lit_Chars val:'\t+++ b/spaces.txt\n' span_id:239) 
          (Token id:Id.Lit_Chars val:'\t@@ -3,5 +3,8 @@\n' span_id:240) (Token id:Id.Lit_Chars val:'\t a\n' span_id:241) (Token id:Id.Lit_Chars val:'\t_\n' span_id:242) 
          (Token id:Id.Lit_Chars val:'\t b\n' span_id:243) (Token id:Id.Lit_Chars val:'\t+a\n' span_id:244) (Token id:Id.Lit_Chars val:'\t+\n' span_id:245) 
          (Token id:Id.Lit_Chars val:'\t+b\n' span_id:246) (Token id:Id.Lit_Chars val:'\t 3\n' span_id:247) (Token id:Id.Lit_Chars val:'\t 4\n' span_id:248) 
          (Token id:Id.Lit_Chars val:'\tEOF\n' span_id:249) (Token id:Id.Lit_Chars val:'\n' span_id:250) 
          (Token
            id: Id.Lit_Chars
            val: '\ttr "_" " " <<-\\EOF >spaces-compacted-expect &&\n'
            span_id: 251
          ) (Token id:Id.Lit_Chars val:'\tdiff --git a/spaces.txt b/spaces.txt\n' span_id:252) 
          (Token id:Id.Lit_Chars val:'\t--- a/spaces.txt\n' span_id:253) (Token id:Id.Lit_Chars val:'\t+++ b/spaces.txt\n' span_id:254) 
          (Token id:Id.Lit_Chars val:'\t@@ -2,6 +2,9 @@\n' span_id:255) (Token id:Id.Lit_Chars val:'\t 2\n' span_id:256) (Token id:Id.Lit_Chars val:'\t a\n' span_id:257) 
          (Token id:Id.Lit_Chars val:'\t_\n' span_id:258) (Token id:Id.Lit_Chars val:'\t+b\n' span_id:259) (Token id:Id.Lit_Chars val:'\t+a\n' span_id:260) 
          (Token id:Id.Lit_Chars val:'\t+\n' span_id:261) (Token id:Id.Lit_Chars val:'\t b\n' span_id:262) (Token id:Id.Lit_Chars val:'\t 3\n' span_id:263) 
          (Token id:Id.Lit_Chars val:'\t 4\n' span_id:264) (Token id:Id.Lit_Chars val:'\tEOF\n' span_id:265) (Token id:Id.Lit_Chars val:'\n' span_id:266) 
          (Token
            id: Id.Lit_Chars
            val: '\ttr "_" " " <<-\\EOF >functions-expect &&\n'
            span_id: 267
          ) (Token id:Id.Lit_Chars val:'\tdiff --git a/functions.c b/functions.c\n' span_id:268) 
          (Token id:Id.Lit_Chars val:'\t--- a/functions.c\n' span_id:269) (Token id:Id.Lit_Chars val:'\t+++ b/functions.c\n' span_id:270) 
          (Token id:Id.Lit_Chars val:'\t@@ -1,6 +1,11 @@\n' span_id:271) (Token id:Id.Lit_Chars val:'\t 1\n' span_id:272) (Token id:Id.Lit_Chars val:'\t 2\n' span_id:273) 
          (Token id:Id.Lit_Chars val:'\t /* function */\n' span_id:274) (Token id:Id.Lit_Chars val:'\t+bar() {\n' span_id:275) 
          (Token id:Id.Lit_Chars val:'\t+    foo\n' span_id:276) (Token id:Id.Lit_Chars val:'\t+}\n' span_id:277) (Token id:Id.Lit_Chars val:'\t+\n' span_id:278) 
          (Token id:Id.Lit_Chars val:'\t+/* function */\n' span_id:279) (Token id:Id.Lit_Chars val:'\t foo() {\n' span_id:280) 
          (Token id:Id.Lit_Chars val:'\t     foo\n' span_id:281) (Token id:Id.Lit_Chars val:'\t }\n' span_id:282) (Token id:Id.Lit_Chars val:'\tEOF\n' span_id:283) 
          (Token id:Id.Lit_Chars val:'\n' span_id:284) (Token id:Id.Lit_Chars val:'\ttr "_" " " <<-\\EOF >functions-compacted-expect\n' span_id:285) 
          (Token
            id: Id.Lit_Chars
            val: '\tdiff --git a/functions.c b/functions.c\n'
            span_id: 286
          ) (Token id:Id.Lit_Chars val:'\t--- a/functions.c\n' span_id:287) 
          (Token id:Id.Lit_Chars val:'\t+++ b/functions.c\n' span_id:288) (Token id:Id.Lit_Chars val:'\t@@ -1,5 +1,10 @@\n' span_id:289) 
          (Token id:Id.Lit_Chars val:'\t 1\n' span_id:290) (Token id:Id.Lit_Chars val:'\t 2\n' span_id:291) 
          (Token id:Id.Lit_Chars val:'\t+/* function */\n' span_id:292) (Token id:Id.Lit_Chars val:'\t+bar() {\n' span_id:293) 
          (Token id:Id.Lit_Chars val:'\t+    foo\n' span_id:294) (Token id:Id.Lit_Chars val:'\t+}\n' span_id:295) (Token id:Id.Lit_Chars val:'\t+\n' span_id:296) 
          (Token id:Id.Lit_Chars val:'\t /* function */\n' span_id:297) (Token id:Id.Lit_Chars val:'\t foo() {\n' span_id:298) 
          (Token id:Id.Lit_Chars val:'\t     foo\n' span_id:299) (Token id:Id.Lit_Chars val:'\tEOF\n' span_id:300)
        )
      }
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'diff: ugly spaces' span_id:307))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:311) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit diff old new -- spaces.txt >out &&\n'
            span_id: 312
          ) (Token id:Id.Lit_Chars val:'\tcompare_diff spaces-expect out\n' span_id:313)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'diff: nice spaces with --indent-heuristic' span_id:320))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:324) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit diff --indent-heuristic old new -- spaces.txt >out-compacted &&\n'
            span_id: 325
          ) (Token id:Id.Lit_Chars val:'\tcompare_diff spaces-compacted-expect out-compacted\n' span_id:326)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'diff: nice spaces with diff.indentHeuristic' span_id:333))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:337) 
          (Token
            id: Id.Lit_Chars
            val: 
'\tgit -c diff.indentHeuristic=true diff old new -- spaces.txt >out-compacted2 &&\n'
            span_id: 338
          ) (Token id:Id.Lit_Chars val:'\tcompare_diff spaces-compacted-expect out-compacted2\n' span_id:339)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'diff: --no-indent-heuristic overrides config' span_id:346))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:350) 
          (Token
            id: Id.Lit_Chars
            val: 
'\tgit -c diff.indentHeuristic=true diff --no-indent-heuristic old new -- spaces.txt >out2 &&\n'
            span_id: 351
          ) (Token id:Id.Lit_Chars val:'\tcompare_diff spaces-expect out2\n' span_id:352)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'diff: --indent-heuristic with --patience' span_id:359))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:363) 
          (Token
            id: Id.Lit_Chars
            val: 
'\tgit diff --indent-heuristic --patience old new -- spaces.txt >out-compacted3 &&\n'
            span_id: 364
          ) (Token id:Id.Lit_Chars val:'\tcompare_diff spaces-compacted-expect out-compacted3\n' span_id:365)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'diff: --indent-heuristic with --histogram' span_id:372))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:376) 
          (Token
            id: Id.Lit_Chars
            val: 
'\tgit diff --indent-heuristic --histogram old new -- spaces.txt >out-compacted4 &&\n'
            span_id: 377
          ) (Token id:Id.Lit_Chars val:'\tcompare_diff spaces-compacted-expect out-compacted4\n' span_id:378)
        )
      }
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'diff: ugly functions' span_id:385))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:389) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit diff old new -- functions.c >out &&\n'
            span_id: 390
          ) (Token id:Id.Lit_Chars val:'\tcompare_diff functions-expect out\n' span_id:391)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'diff: nice functions with --indent-heuristic' span_id:398))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:402) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit diff --indent-heuristic old new -- functions.c >out-compacted &&\n'
            span_id: 403
          ) (Token id:Id.Lit_Chars val:'\tcompare_diff functions-compacted-expect out-compacted\n' span_id:404)
        )
      }
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'blame: ugly spaces' span_id:411))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:415) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit blame old..new -- spaces.txt >out-blame &&\n'
            span_id: 416
          ) (Token id:Id.Lit_Chars val:'\tcompare_blame spaces-expect out-blame\n' span_id:417)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'blame: nice spaces with --indent-heuristic' span_id:424))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:428) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit blame --indent-heuristic old..new -- spaces.txt >out-blame-compacted &&\n'
            span_id: 429
          ) 
          (Token
            id: Id.Lit_Chars
            val: '\tcompare_blame spaces-compacted-expect out-blame-compacted\n'
            span_id: 430
          )
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'blame: nice spaces with diff.indentHeuristic' span_id:437))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:441) 
          (Token
            id: Id.Lit_Chars
            val: 
'\tgit -c diff.indentHeuristic=true blame old..new -- spaces.txt >out-blame-compacted2 &&\n'
            span_id: 442
          ) 
          (Token
            id: Id.Lit_Chars
            val: '\tcompare_blame spaces-compacted-expect out-blame-compacted2\n'
            span_id: 443
          )
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'blame: --no-indent-heuristic overrides config' span_id:450))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:454) 
          (Token
            id: Id.Lit_Chars
            val: 
'\tgit -c diff.indentHeuristic=true blame --no-indent-heuristic old..new -- spaces.txt >out-blame2 &&\n'
            span_id: 455
          ) (Token id:Id.Lit_Chars val:'\tgit blame old..new -- spaces.txt >out-blame &&\n' span_id:456) 
          (Token
            id: Id.Lit_Chars
            val: '\tcompare_blame spaces-expect out-blame2\n'
            span_id: 457
          )
        )
      }
    )
    (C {(test_done)})
  ]
)