(command.CommandList
  children: [
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:test_description)
          op: assign_op.Equal
          rhs: {(SQ <'Test diff indent heuristic.\n'> <'\n'>)}
          spids: [4]
        )
      ]
    )
    (C {<.>} {<'./test-lib.sh'>})
    (C {<.>} {(DQ ($ Id.VSub_DollarName '$TEST_DIRECTORY')) <'/diff-lib.sh'>})
    (command.ShFunction
      name: compare_diff
      body: 
        (BraceGroup
          children: [
            (command.Simple
              words: [{<sed>} {<-e>} {(DQ <'/^index /d'>)}]
              redirects: [
                (redir
                  op: <Id.Redir_Less '<'>
                  loc: (redir_loc.Fd fd:0)
                  arg: {(DQ ($ Id.VSub_Number '$1'))}
                )
                (redir op:<Id.Redir_Great '>'> loc:(redir_loc.Fd fd:1) arg:{<.tmp-1>})
              ]
              do_fork: T
            )
            (command.Simple
              words: [{<sed>} {<-e>} {(DQ <'/^index /d'>)}]
              redirects: [
                (redir
                  op: <Id.Redir_Less '<'>
                  loc: (redir_loc.Fd fd:0)
                  arg: {(DQ ($ Id.VSub_Number '$2'))}
                )
                (redir op:<Id.Redir_Great '>'> loc:(redir_loc.Fd fd:1) arg:{<.tmp-2>})
              ]
              do_fork: T
            )
            (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: 
        (BraceGroup
          children: [
            (command.Simple
              words: [
                {<sed>}
                {<-n>}
                {<-e>}
                {(DQ <'1,4d'>)}
                {<-e>}
                {(DQ <'s/^'> <Id.Lit_BadBackslash '\\'> <'+//p'>)}
              ]
              redirects: [
                (redir
                  op: <Id.Redir_Less '<'>
                  loc: (redir_loc.Fd fd:0)
                  arg: {(DQ ($ Id.VSub_Number '$1'))}
                )
                (redir op:<Id.Redir_Great '>'> loc:(redir_loc.Fd fd:1) arg:{<.tmp-1>})
              ]
              do_fork: T
            )
            (command.Simple
              words: [{<sed>} {<-ne>} {(DQ <'s/^[^^][^)]*) *//p'>)}]
              redirects: [
                (redir
                  op: <Id.Redir_Less '<'>
                  loc: (redir_loc.Fd fd:0)
                  arg: {(DQ ($ Id.VSub_Number '$2'))}
                )
                (redir op:<Id.Redir_Great '>'> loc:(redir_loc.Fd fd:1) arg:{<.tmp-2>})
              ]
              do_fork: T
            )
            (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 <prepare>)} 
      {
        (SQ <'\n'> <'\tcat <<-\\EOF >spaces.txt &&\n'> <'\t1\n'> <'\t2\n'> <'\ta\n'> <'\n'> <'\tb\n'> 
          <'\t3\n'> <'\t4\n'> <'\tEOF\n'> <'\n'> <'\tcat <<-\\EOF >functions.c &&\n'> <'\t1\n'> <'\t2\n'> 
          <'\t/* function */\n'> <'\tfoo() {\n'> <'\t    foo\n'> <'\t}\n'> <'\n'> <'\t3\n'> <'\t4\n'> <'\tEOF\n'> <'\n'> 
          <'\tgit add spaces.txt functions.c &&\n'> <'\ttest_tick &&\n'> <'\tgit commit -m initial &&\n'> <'\tgit branch old &&\n'> <'\n'> 
          <'\tcat <<-\\EOF >spaces.txt &&\n'> <'\t1\n'> <'\t2\n'> <'\ta\n'> <'\n'> <'\tb\n'> <'\ta\n'> <'\n'> <'\tb\n'> <'\t3\n'> <'\t4\n'> <'\tEOF\n'> <'\n'> 
          <'\tcat <<-\\EOF >functions.c &&\n'> <'\t1\n'> <'\t2\n'> <'\t/* function */\n'> <'\tbar() {\n'> <'\t    foo\n'> <'\t}\n'> <'\n'> 
          <'\t/* function */\n'> <'\tfoo() {\n'> <'\t    foo\n'> <'\t}\n'> <'\n'> <'\t3\n'> <'\t4\n'> <'\tEOF\n'> <'\n'> 
          <'\tgit add spaces.txt functions.c &&\n'> <'\ttest_tick &&\n'> <'\tgit commit -m initial &&\n'> <'\tgit branch new &&\n'> <'\n'> 
          <'\ttr "_" " " <<-\\EOF >spaces-expect &&\n'> <'\tdiff --git a/spaces.txt b/spaces.txt\n'> <'\t--- a/spaces.txt\n'> <'\t+++ b/spaces.txt\n'> 
          <'\t@@ -3,5 +3,8 @@\n'> <'\t a\n'> <'\t_\n'> <'\t b\n'> <'\t+a\n'> <'\t+\n'> <'\t+b\n'> <'\t 3\n'> <'\t 4\n'> <'\tEOF\n'> <'\n'> 
          <'\ttr "_" " " <<-\\EOF >spaces-compacted-expect &&\n'> <'\tdiff --git a/spaces.txt b/spaces.txt\n'> <'\t--- a/spaces.txt\n'> <'\t+++ b/spaces.txt\n'> 
          <'\t@@ -2,6 +2,9 @@\n'> <'\t 2\n'> <'\t a\n'> <'\t_\n'> <'\t+b\n'> <'\t+a\n'> <'\t+\n'> <'\t b\n'> <'\t 3\n'> <'\t 4\n'> <'\tEOF\n'> 
          <'\n'> <'\ttr "_" " " <<-\\EOF >functions-expect &&\n'> <'\tdiff --git a/functions.c b/functions.c\n'> 
          <'\t--- a/functions.c\n'> <'\t+++ b/functions.c\n'> <'\t@@ -1,6 +1,11 @@\n'> <'\t 1\n'> <'\t 2\n'> <'\t /* function */\n'> 
          <'\t+bar() {\n'> <'\t+    foo\n'> <'\t+}\n'> <'\t+\n'> <'\t+/* function */\n'> <'\t foo() {\n'> <'\t     foo\n'> <'\t }\n'> 
          <'\tEOF\n'> <'\n'> <'\ttr "_" " " <<-\\EOF >functions-compacted-expect\n'> 
          <'\tdiff --git a/functions.c b/functions.c\n'> <'\t--- a/functions.c\n'> <'\t+++ b/functions.c\n'> <'\t@@ -1,5 +1,10 @@\n'> <'\t 1\n'> <'\t 2\n'> 
          <'\t+/* function */\n'> <'\t+bar() {\n'> <'\t+    foo\n'> <'\t+}\n'> <'\t+\n'> <'\t /* function */\n'> <'\t foo() {\n'> 
          <'\t     foo\n'> <'\tEOF\n'>
        )
      }
    )
    (C {<test_expect_success>} {(SQ <'diff: ugly spaces'>)} 
      {
        (SQ <'\n'> <'\tgit diff old new -- spaces.txt >out &&\n'> 
          <'\tcompare_diff spaces-expect out\n'>
        )
      }
    )
    (C {<test_expect_success>} {(SQ <'diff: nice spaces with --indent-heuristic'>)} 
      {
        (SQ <'\n'> <'\tgit diff --indent-heuristic old new -- spaces.txt >out-compacted &&\n'> 
          <'\tcompare_diff spaces-compacted-expect out-compacted\n'>
        )
      }
    )
    (C {<test_expect_success>} {(SQ <'diff: nice spaces with diff.indentHeuristic'>)} 
      {
        (SQ <'\n'> 
          <'\tgit -c diff.indentHeuristic=true diff old new -- spaces.txt >out-compacted2 &&\n'> <'\tcompare_diff spaces-compacted-expect out-compacted2\n'>
        )
      }
    )
    (C {<test_expect_success>} {(SQ <'diff: --no-indent-heuristic overrides config'>)} 
      {
        (SQ <'\n'> 
          <
'\tgit -c diff.indentHeuristic=true diff --no-indent-heuristic old new -- spaces.txt >out2 &&\n'
          > <'\tcompare_diff spaces-expect out2\n'>
        )
      }
    )
    (C {<test_expect_success>} {(SQ <'diff: --indent-heuristic with --patience'>)} 
      {
        (SQ <'\n'> 
          <'\tgit diff --indent-heuristic --patience old new -- spaces.txt >out-compacted3 &&\n'> <'\tcompare_diff spaces-compacted-expect out-compacted3\n'>
        )
      }
    )
    (C {<test_expect_success>} {(SQ <'diff: --indent-heuristic with --histogram'>)} 
      {
        (SQ <'\n'> 
          <'\tgit diff --indent-heuristic --histogram old new -- spaces.txt >out-compacted4 &&\n'> <'\tcompare_diff spaces-compacted-expect out-compacted4\n'>
        )
      }
    )
    (C {<test_expect_success>} {(SQ <'diff: ugly functions'>)} 
      {
        (SQ <'\n'> <'\tgit diff old new -- functions.c >out &&\n'> 
          <'\tcompare_diff functions-expect out\n'>
        )
      }
    )
    (C {<test_expect_success>} {(SQ <'diff: nice functions with --indent-heuristic'>)} 
      {
        (SQ <'\n'> <'\tgit diff --indent-heuristic old new -- functions.c >out-compacted &&\n'> 
          <'\tcompare_diff functions-compacted-expect out-compacted\n'>
        )
      }
    )
    (C {<test_expect_success>} {(SQ <'blame: ugly spaces'>)} 
      {
        (SQ <'\n'> <'\tgit blame old..new -- spaces.txt >out-blame &&\n'> 
          <'\tcompare_blame spaces-expect out-blame\n'>
        )
      }
    )
    (C {<test_expect_success>} {(SQ <'blame: nice spaces with --indent-heuristic'>)} 
      {
        (SQ <'\n'> <'\tgit blame --indent-heuristic old..new -- spaces.txt >out-blame-compacted &&\n'> 
          <'\tcompare_blame spaces-compacted-expect out-blame-compacted\n'>
        )
      }
    )
    (C {<test_expect_success>} {(SQ <'blame: nice spaces with diff.indentHeuristic'>)} 
      {
        (SQ <'\n'> 
          <
'\tgit -c diff.indentHeuristic=true blame old..new -- spaces.txt >out-blame-compacted2 &&\n'
          > <'\tcompare_blame spaces-compacted-expect out-blame-compacted2\n'>
        )
      }
    )
    (C {<test_expect_success>} {(SQ <'blame: --no-indent-heuristic overrides config'>)} 
      {
        (SQ <'\n'> 
          <
'\tgit -c diff.indentHeuristic=true blame --no-indent-heuristic old..new -- spaces.txt >out-blame2 &&\n'
          > <'\tgit blame old..new -- spaces.txt >out-blame &&\n'> <'\tcompare_blame spaces-expect out-blame2\n'>
        )
      }
    )
    (C {<test_done>})
  ]
)