(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:'core.whitespace rules and git apply' span_id:6))}
          spids: [4]
        )
      ]
    )
    (C {(.)} {(./test-lib.sh)})
    (command.ShFunction
      name: prepare_test_file
      body: 
        (command.BraceGroup
          children: [
            (command.Simple
              words: [{(sed)} {(-e)} {(DQ ('s/_/ /g'))} {(-e)} {(DQ ('s/>/\t/'))}]
              redirects: [
                (redir.HereDoc
                  op: (Token id:Id.Redir_DLessDash val:'<<-' span_id:66)
                  fd: -1
                  here_begin: 
                    {
                      (word_part.EscapedLiteral
                        token: (Token id:Id.Lit_EscapedChar val:'\\E' span_id:67)
                      ) (OF)
                    }
                  here_end_span_id: 87
                  stdin_parts: [
                    ('An_SP in an ordinary line>and a HT.\n')
                    ('>A HT (%).\n')
                    ('_>A SP and a HT (@%).\n')
                    ('_>_A SP, a HT and a SP (@%).\n')
                    ('_______Seven SP.\n')
                    ('________Eight SP (#).\n')
                    ('_______>Seven SP and a HT (@%).\n')
                    ('________>Eight SP and a HT (@#%).\n')
                    ('_______>_Seven SP, a HT and a SP (@%).\n')
                    ('________>_Eight SP, a HT and a SP (@#%).\n')
                    ('_______________Fifteen SP (#).\n')
                    ('_______________>Fifteen SP and a HT (@#%).\n')
                    ('________________Sixteen SP (#=).\n')
                    ('________________>Sixteen SP and a HT (@#%=).\n')
                    ('_____a__Five SP, a non WS, two SP.\n')
                    ('A line with a (!) trailing SP_\n')
                    ('A line with a (!) trailing HT>\n')
                  ]
                )
              ]
            )
          ]
        )
    )
    (command.ShFunction
      name: apply_patch
      body: 
        (command.BraceGroup
          children: [
            (command.AndOr
              ops: [Id.Op_DAmp]
              children: [
                (command.Simple
                  redirects: [
                    (redir.Redir
                      op: (Token id:Id.Redir_Great val:'>' span_id:99)
                      fd: -1
                      arg_word: {(target)}
                    )
                  ]
                )
                (command.Pipeline
                  children: [
                    (command.Simple
                      words: [
                        {(sed)}
                        {(-e)}
                        {
                          (DQ ('s|') (Id.Lit_Other '\\') ('([ab]') (Id.Lit_Other '\\') (')/file|') 
                            (Id.Lit_Other '\\') ('1/target|')
                          )
                        }
                      ]
                      redirects: [
                        (redir.Redir
                          op: (Token id:Id.Redir_Less val:'<' span_id:119)
                          fd: -1
                          arg_word: {(patch)}
                        )
                      ]
                    )
                    (C {(git)} {(apply)} {(DQ ($ Id.VSub_At '$@'))})
                  ]
                  negated: F
                )
              ]
            )
          ]
        )
    )
    (command.ShFunction
      name: test_fix
      body: 
        (command.BraceGroup
          children: [
            (command.AndOr
              ops: [Id.Op_DPipe]
              children: [
                (C {(apply_patch)} {(--whitespace) (Id.Lit_Equals '=') (fix)})
                (command.ControlFlow
                  token: (Token id:Id.ControlFlow_Return val:return span_id:156)
                  arg_word: {(1)}
                )
              ]
            )
            (command.Pipeline
              children: [
                (C {($ Id.VSub_DollarName '$DIFF')} {(file)} {(target)})
                (command.Simple
                  words: [{(sed)} {(-n)} {(-e)} {(DQ ('s/^> //p'))}]
                  redirects: [
                    (redir.Redir
                      op: (Token id:Id.Redir_Great val:'>' span_id:184)
                      fd: -1
                      arg_word: {(fixed)}
                    )
                  ]
                )
              ]
              negated: F
            )
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:fixed_cnt)
                  op: assign_op.Equal
                  rhs: 
                    {
                      (command_sub
                        left_token: (Token id:Id.Left_DollarParen val:'$(' span_id:194)
                        command_list: 
                          (command.CommandList
                            children: [
                              (command.Simple
                                words: [{(wc)} {(-l)}]
                                redirects: [
                                  (redir.Redir
                                    op: (Token id:Id.Redir_Less val:'<' span_id:199)
                                    fd: -1
                                    arg_word: {(fixed)}
                                  )
                                ]
                              )
                            ]
                          )
                      )
                    }
                  spids: [193]
                )
              ]
            )
            (command.Case
              to_match: {(DQ ($ Id.VSub_Number '$1'))}
              arms: [
                (case_arm
                  pat_list: [{(SQ )}]
                  action: [
                    (command.ShAssignment
                      pairs: [
                        (assign_pair
                          lhs: (sh_lhs_expr.Name name:expect_cnt)
                          op: assign_op.Equal
                          rhs: {($ Id.VSub_DollarName '$fixed_cnt')}
                          spids: [217]
                        )
                      ]
                    )
                  ]
                  spids: [213 215 220 -1]
                )
                (case_arm
                  pat_list: [{(Id.Lit_QMark '?') (Id.Lit_Star '*')}]
                  action: [
                    (command.ShAssignment
                      pairs: [
                        (assign_pair
                          lhs: (sh_lhs_expr.Name name:expect_cnt)
                          op: assign_op.Equal
                          rhs: 
                            {
                              (command_sub
                                left_token: (Token id:Id.Left_DollarParen val:'$(' span_id:228)
                                command_list: 
                                  (command.CommandList
                                    children: [
                                      (command.Pipeline
                                        children: [
                                          (command.Simple
                                            words: [{(grep)} {(DQ ('[') ($ Id.VSub_Number '$1') (']'))}]
                                            redirects: [
                                              (redir.Redir
                                                op: (Token id:Id.Redir_Less val:'<' span_id:237)
                                                fd: -1
                                                arg_word: {(fixed)}
                                              )
                                            ]
                                          )
                                          (C {(wc)} {(-l)})
                                        ]
                                        negated: F
                                      )
                                    ]
                                  )
                              )
                            }
                          spids: [227]
                        )
                      ]
                    )
                  ]
                  spids: [223 225 247 -1]
                )
              ]
            )
            (command.AndOr
              ops: [Id.Op_DPipe]
              children: [
                (C {(test)} {($ Id.VSub_DollarName '$fixed_cnt')} {(-eq)} 
                  {($ Id.VSub_DollarName '$expect_cnt')}
                )
                (command.ControlFlow
                  token: (Token id:Id.ControlFlow_Return val:return span_id:263)
                  arg_word: {(1)}
                )
              ]
            )
            (command.Case
              to_match: {(DQ ($ Id.VSub_Number '$1'))}
              arms: [
                (case_arm
                  pat_list: [{(SQ )}]
                  action: [
                    (command.ShAssignment
                      pairs: [
                        (assign_pair
                          lhs: (sh_lhs_expr.Name name:expect_cnt)
                          op: assign_op.Equal
                          rhs: {(0)}
                          spids: [286]
                        )
                      ]
                    )
                  ]
                  spids: [282 284 289 -1]
                )
                (case_arm
                  pat_list: [{(Id.Lit_QMark '?') (Id.Lit_Star '*')}]
                  action: [
                    (command.ShAssignment
                      pairs: [
                        (assign_pair
                          lhs: (sh_lhs_expr.Name name:expect_cnt)
                          op: assign_op.Equal
                          rhs: 
                            {
                              (command_sub
                                left_token: (Token id:Id.Left_DollarParen val:'$(' span_id:297)
                                command_list: 
                                  (command.CommandList
                                    children: [
                                      (command.Pipeline
                                        children: [
                                          (command.Simple
                                            words: [{(grep)} {(DQ ('[') ($ Id.VSub_Number '$1') (']'))}]
                                            redirects: [
                                              (redir.Redir
                                                op: (Token id:Id.Redir_Less val:'<' span_id:306)
                                                fd: -1
                                                arg_word: {(file)}
                                              )
                                            ]
                                          )
                                          (C {(wc)} {(-l)})
                                        ]
                                        negated: F
                                      )
                                    ]
                                  )
                              )
                            }
                          spids: [296]
                        )
                      ]
                    )
                  ]
                  spids: [292 294 316 -1]
                )
              ]
            )
            (command.AndOr
              ops: [Id.Op_DPipe]
              children: [
                (C {(test)} {($ Id.VSub_DollarName '$fixed_cnt')} {(-eq)} 
                  {($ Id.VSub_DollarName '$expect_cnt')}
                )
                (command.ControlFlow
                  token: (Token id:Id.ControlFlow_Return val:return span_id:332)
                  arg_word: {(1)}
                )
              ]
            )
            (command.Simple
              words: [{(git)} {(diff-files)} {(-p)} {(target)}]
              redirects: [
                (redir.Redir
                  op: (Token id:Id.Redir_Great val:'>' span_id:350)
                  fd: -1
                  arg_word: {(fixed-patch)}
                )
              ]
            )
            (command.AndOr
              ops: [Id.Op_DAmp]
              children: [
                (C {(test)} {(-s)} {(fixed-patch)})
                (command.ControlFlow
                  token: (Token id:Id.ControlFlow_Return val:return span_id:362)
                  arg_word: {(0)}
                )
              ]
            )
            (command.Simple
              redirects: [
                (redir.Redir
                  op: (Token id:Id.Redir_Great val:'>' span_id:372)
                  fd: -1
                  arg_word: {(target)}
                )
              ]
            )
            (command.Simple
              words: [{(git)} {(apply)} {(--whitespace) (Id.Lit_Equals '=') (error-all)}]
              redirects: [
                (redir.Redir
                  op: (Token id:Id.Redir_Less val:'<' span_id:384)
                  fd: -1
                  arg_word: {(fixed-patch)}
                )
              ]
            )
          ]
        )
    )
    (C {(test_expect_success)} {(setup)} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:396) (Token id:Id.Lit_Chars val:'\n' span_id:397) 
          (Token id:Id.Lit_Chars val:'\t>file &&\n' span_id:398) (Token id:Id.Lit_Chars val:'\tgit add file &&\n' span_id:399) 
          (Token id:Id.Lit_Chars val:'\tprepare_test_file >file &&\n' span_id:400) (Token id:Id.Lit_Chars val:'\tgit diff-files -p >patch &&\n' span_id:401) 
          (Token id:Id.Lit_Chars val:'\t>target &&\n' span_id:402) (Token id:Id.Lit_Chars val:'\tgit add target\n' span_id:403) 
          (Token id:Id.Lit_Chars val:'\n' span_id:404)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'whitespace=nowarn, default rule' span_id:411))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:415) (Token id:Id.Lit_Chars val:'\n' span_id:416) 
          (Token id:Id.Lit_Chars val:'\tapply_patch --whitespace=nowarn &&\n' span_id:417) (Token id:Id.Lit_Chars val:'\ttest_cmp file target\n' span_id:418) 
          (Token id:Id.Lit_Chars val:'\n' span_id:419)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'whitespace=warn, default rule' span_id:426))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:430) (Token id:Id.Lit_Chars val:'\n' span_id:431) 
          (Token id:Id.Lit_Chars val:'\tapply_patch --whitespace=warn &&\n' span_id:432) (Token id:Id.Lit_Chars val:'\ttest_cmp file target\n' span_id:433) 
          (Token id:Id.Lit_Chars val:'\n' span_id:434)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'whitespace=error-all, default rule' span_id:441))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:445) (Token id:Id.Lit_Chars val:'\n' span_id:446) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest_must_fail apply_patch --whitespace=error-all &&\n'
            span_id: 447
          ) (Token id:Id.Lit_Chars val:'\t! test -s target\n' span_id:448) 
          (Token id:Id.Lit_Chars val:'\n' span_id:449)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'whitespace=error-all, no rule' span_id:456))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:460) (Token id:Id.Lit_Chars val:'\n' span_id:461) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit config core.whitespace -trailing,-space-before,-indent &&\n'
            span_id: 462
          ) (Token id:Id.Lit_Chars val:'\tapply_patch --whitespace=error-all &&\n' span_id:463) 
          (Token id:Id.Lit_Chars val:'\ttest_cmp file target\n' span_id:464) (Token id:Id.Lit_Chars val:'\n' span_id:465)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'whitespace=error-all, no rule (attribute)' span_id:472))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:476) (Token id:Id.Lit_Chars val:'\n' span_id:477) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit config --unset core.whitespace &&\n'
            span_id: 478
          ) (Token id:Id.Lit_Chars val:'\techo "target -whitespace" >.gitattributes &&\n' span_id:479) 
          (Token
            id: Id.Lit_Chars
            val: '\tapply_patch --whitespace=error-all &&\n'
            span_id: 480
          ) (Token id:Id.Lit_Chars val:'\ttest_cmp file target\n' span_id:481) 
          (Token id:Id.Lit_Chars val:'\n' span_id:482)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'spaces inserted by tab-in-indent' span_id:489))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:493) (Token id:Id.Lit_Chars val:'\n' span_id:494) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit config core.whitespace -trailing,-space,-indent,tab &&\n'
            span_id: 495
          ) (Token id:Id.Lit_Chars val:'\trm -f .gitattributes &&\n' span_id:496) 
          (Token id:Id.Lit_Chars val:'\ttest_fix % &&\n' span_id:497) (Token id:Id.Lit_Chars val:'\tsed -e "s/_/ /g" -e "s/>/\t/" <<-\\EOF >expect &&\n' span_id:498) 
          (Token
            id: Id.Lit_Chars
            val: '\t\tAn_SP in an ordinary line>and a HT.\n'
            span_id: 499
          ) (Token id:Id.Lit_Chars val:'\t\t________A HT (%).\n' span_id:500) 
          (Token id:Id.Lit_Chars val:'\t\t________A SP and a HT (@%).\n' span_id:501) (Token id:Id.Lit_Chars val:'\t\t_________A SP, a HT and a SP (@%).\n' span_id:502) 
          (Token id:Id.Lit_Chars val:'\t\t_______Seven SP.\n' span_id:503) (Token id:Id.Lit_Chars val:'\t\t________Eight SP (#).\n' span_id:504) 
          (Token id:Id.Lit_Chars val:'\t\t________Seven SP and a HT (@%).\n' span_id:505) (Token id:Id.Lit_Chars val:'\t\t________________Eight SP and a HT (@#%).\n' span_id:506) 
          (Token
            id: Id.Lit_Chars
            val: '\t\t_________Seven SP, a HT and a SP (@%).\n'
            span_id: 507
          ) (Token id:Id.Lit_Chars val:'\t\t_________________Eight SP, a HT and a SP (@#%).\n' span_id:508) 
          (Token id:Id.Lit_Chars val:'\t\t_______________Fifteen SP (#).\n' span_id:509) (Token id:Id.Lit_Chars val:'\t\t________________Fifteen SP and a HT (@#%).\n' span_id:510) 
          (Token id:Id.Lit_Chars val:'\t\t________________Sixteen SP (#=).\n' span_id:511) (Token id:Id.Lit_Chars val:'\t\t________________________Sixteen SP and a HT (@#%=).\n' span_id:512) 
          (Token
            id: Id.Lit_Chars
            val: '\t\t_____a__Five SP, a non WS, two SP.\n'
            span_id: 513
          ) (Token id:Id.Lit_Chars val:'\t\tA line with a (!) trailing SP_\n' span_id:514) 
          (Token id:Id.Lit_Chars val:'\t\tA line with a (!) trailing HT>\n' span_id:515) (Token id:Id.Lit_Chars val:'\tEOF\n' span_id:516) 
          (Token id:Id.Lit_Chars val:'\ttest_cmp expect target\n' span_id:517) (Token id:Id.Lit_Chars val:'\n' span_id:518)
        )
      }
    )
    (command.ForEach
      iter_name: t
      iter_words: [{(-)} {(SQ )}]
      do_arg_iter: F
      body: 
        (command.DoGroup
          children: [
            (command.Case
              to_match: {(DQ ($ Id.VSub_DollarName '$t'))}
              arms: [
                (case_arm
                  pat_list: [{(SQ )}]
                  action: [
                    (command.ShAssignment
                      pairs: [
                        (assign_pair
                          lhs: (sh_lhs_expr.Name name:tt)
                          op: assign_op.Equal
                          rhs: {(SQ (Token id:Id.Lit_Chars val:'!' span_id:550))}
                          spids: [548]
                        )
                      ]
                    )
                  ]
                  spids: [544 546 553 -1]
                )
                (case_arm
                  pat_list: [{(Id.Lit_Star '*')}]
                  action: [
                    (command.ShAssignment
                      pairs: [
                        (assign_pair
                          lhs: (sh_lhs_expr.Name name:tt)
                          op: assign_op.Equal
                          rhs: (word.Empty)
                          spids: [558]
                        )
                      ]
                    )
                  ]
                  spids: [555 556 560 -1]
                )
              ]
            )
            (command.ForEach
              iter_name: s
              iter_words: [{(-)} {(SQ )}]
              do_arg_iter: F
              body: 
                (command.DoGroup
                  children: [
                    (command.Case
                      to_match: {(DQ ($ Id.VSub_DollarName '$s'))}
                      arms: [
                        (case_arm
                          pat_list: [{(SQ )}]
                          action: [
                            (command.ShAssignment
                              pairs: [
                                (assign_pair
                                  lhs: (sh_lhs_expr.Name name:ts)
                                  op: assign_op.Equal
                                  rhs: {(SQ (Token id:Id.Lit_Chars val:'@' span_id:594))}
                                  spids: [592]
                                )
                              ]
                            )
                          ]
                          spids: [588 590 597 -1]
                        )
                        (case_arm
                          pat_list: [{(Id.Lit_Star '*')}]
                          action: [
                            (command.ShAssignment
                              pairs: [
                                (assign_pair
                                  lhs: (sh_lhs_expr.Name name:ts)
                                  op: assign_op.Equal
                                  rhs: (word.Empty)
                                  spids: [602]
                                )
                              ]
                            )
                          ]
                          spids: [599 600 604 -1]
                        )
                      ]
                    )
                    (command.ForEach
                      iter_name: i
                      iter_words: [{(-)} {(SQ )}]
                      do_arg_iter: F
                      body: 
                        (command.DoGroup
                          children: [
                            (command.Case
                              to_match: {(DQ ($ Id.VSub_DollarName '$i'))}
                              arms: [
                                (case_arm
                                  pat_list: [{(SQ )}]
                                  action: [
                                    (command.ShAssignment
                                      pairs: [
                                        (assign_pair
                                          lhs: (sh_lhs_expr.Name name:ti)
                                          op: assign_op.Equal
                                          rhs: {(SQ (Token id:Id.Lit_Chars val:'#' span_id:638))}
                                          spids: [636]
                                        )
                                        (assign_pair
                                          lhs: (sh_lhs_expr.Name name:ti16)
                                          op: assign_op.Equal
                                          rhs: {(SQ (Token id:Id.Lit_Chars val:'=' span_id:643))}
                                          spids: [641]
                                        )
                                      ]
                                    )
                                  ]
                                  spids: [632 634 645 -1]
                                )
                                (case_arm
                                  pat_list: [{(Id.Lit_Star '*')}]
                                  action: [
                                    (command.ShAssignment
                                      pairs: [
                                        (assign_pair
                                          lhs: (sh_lhs_expr.Name name:ti)
                                          op: assign_op.Equal
                                          rhs: (word.Empty)
                                          spids: [650]
                                        )
                                        (assign_pair
                                          lhs: (sh_lhs_expr.Name name:ti16)
                                          op: assign_op.Equal
                                          rhs: (word.Empty)
                                          spids: [652]
                                        )
                                      ]
                                    )
                                  ]
                                  spids: [647 648 654 -1]
                                )
                              ]
                            )
                            (command.ForEach
                              iter_name: h
                              iter_words: [{(-)} {(SQ )}]
                              do_arg_iter: F
                              body: 
                                (command.DoGroup
                                  children: [
                                    (command.AndOr
                                      ops: [Id.Op_DAmp]
                                      children: [
                                        (C {(Id.Lit_LBracket '[')} {(-z)} 
                                          {
                                            (DQ ($ Id.VSub_DollarName '$h') 
                                              ($ Id.VSub_DollarName '$i')
                                            )
                                          } {(Id.Lit_RBracket ']')}
                                        )
                                        (command.ControlFlow
                                          token: 
                                            (Token
                                              id: Id.ControlFlow_Continue
                                              val: continue
                                              span_id: 687
                                            )
                                        )
                                      ]
                                    )
                                    (command.Case
                                      to_match: {(DQ ($ Id.VSub_DollarName '$h'))}
                                      arms: [
                                        (case_arm
                                          pat_list: [{(SQ )}]
                                          action: [
                                            (command.ShAssignment
                                              pairs: [
                                                (assign_pair
                                                  lhs: (sh_lhs_expr.Name name:th)
                                                  op: assign_op.Equal
                                                  rhs: 
                                                    {(SQ (Token id:Id.Lit_Chars val:'%' span_id:704))}
                                                  spids: [702]
                                                )
                                              ]
                                            )
                                          ]
                                          spids: [698 700 707 -1]
                                        )
                                        (case_arm
                                          pat_list: [{(Id.Lit_Star '*')}]
                                          action: [
                                            (command.ShAssignment
                                              pairs: [
                                                (assign_pair
                                                  lhs: (sh_lhs_expr.Name name:th)
                                                  op: assign_op.Equal
                                                  rhs: (word.Empty)
                                                  spids: [712]
                                                )
                                              ]
                                            )
                                          ]
                                          spids: [709 710 714 -1]
                                        )
                                      ]
                                    )
                                    (command.ShAssignment
                                      pairs: [
                                        (assign_pair
                                          lhs: (sh_lhs_expr.Name name:rule)
                                          op: assign_op.Equal
                                          rhs: 
                                            {(${ Id.VSub_Name t) (trailing) (Id.Lit_Comma ',') 
                                              (${ Id.VSub_Name s) (space) (Id.Lit_Comma ',') (${ Id.VSub_Name i) (indent) (Id.Lit_Comma ',') (${ Id.VSub_Name h) (tab)
                                            }
                                          spids: [719]
                                        )
                                      ]
                                    )
                                    (C {(rm)} {(-f)} {(.gitattributes)})
                                    (C {(test_expect_success)} 
                                      {(DQ ('rule=') ($ Id.VSub_DollarName '$rule'))} 
                                      {
                                        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:757) 
                                          (Token
                                            id: Id.Lit_Chars
                                            val: '\t\t\t\t\tgit config core.whitespace "$rule" &&\n'
                                            span_id: 758
                                          ) (Token id:Id.Lit_Chars val:'\t\t\t\t\ttest_fix "$tt$ts$ti$th"\n' span_id:759) 
                                          (Token
                                            id: Id.Lit_Chars
                                            val: '\t\t\t\t'
                                            span_id: 760
                                          )
                                        )
                                      }
                                    )
                                    (C {(test_expect_success)} 
                                      {(DQ ('rule=') ($ Id.VSub_DollarName '$rule') (',tabwidth=16'))} 
                                      {
                                        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:774) 
                                          (Token
                                            id: Id.Lit_Chars
                                            val: 
'\t\t\t\t\tgit config core.whitespace "$rule,tabwidth=16" &&\n'
                                            span_id: 775
                                          ) (Token id:Id.Lit_Chars val:'\t\t\t\t\ttest_fix "$tt$ts$ti16$th"\n' span_id:776) 
                                          (Token
                                            id: Id.Lit_Chars
                                            val: '\t\t\t\t'
                                            span_id: 777
                                          )
                                        )
                                      }
                                    )
                                    (C {(test_expect_success)} 
                                      {
                                        (DQ ('rule=') ($ Id.VSub_DollarName '$rule') (' (attributes)'))
                                      } 
                                      {
                                        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:791) 
                                          (Token
                                            id: Id.Lit_Chars
                                            val: '\t\t\t\t\tgit config --unset core.whitespace &&\n'
                                            span_id: 792
                                          ) 
                                          (Token
                                            id: Id.Lit_Chars
                                            val: 
'\t\t\t\t\techo "target whitespace=$rule" >.gitattributes &&\n'
                                            span_id: 793
                                          ) (Token id:Id.Lit_Chars val:'\t\t\t\t\ttest_fix "$tt$ts$ti$th"\n' span_id:794) 
                                          (Token
                                            id: Id.Lit_Chars
                                            val: '\t\t\t\t'
                                            span_id: 795
                                          )
                                        )
                                      }
                                    )
                                    (C {(test_expect_success)} 
                                      {
                                        (DQ ('rule=') ($ Id.VSub_DollarName '$rule') 
                                          (',tabwidth=16 (attributes)')
                                        )
                                      } 
                                      {
                                        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:809) 
                                          (Token
                                            id: Id.Lit_Chars
                                            val: 
'\t\t\t\t\techo "target whitespace=$rule,tabwidth=16" >.gitattributes &&\n'
                                            span_id: 810
                                          ) (Token id:Id.Lit_Chars val:'\t\t\t\t\ttest_fix "$tt$ts$ti16$th"\n' span_id:811) 
                                          (Token
                                            id: Id.Lit_Chars
                                            val: '\t\t\t\t'
                                            span_id: 812
                                          )
                                        )
                                      }
                                    )
                                  ]
                                )
                            )
                          ]
                        )
                    )
                  ]
                )
            )
          ]
        )
    )
    (command.ShFunction
      name: create_patch
      body: 
        (command.BraceGroup
          children: [
            (command.Simple
              words: [{(sed)} {(-e)} {(DQ ('s/_/ /'))}]
              redirects: [
                (redir.HereDoc
                  op: (Token id:Id.Redir_DLessDash val:'<<-' span_id:844)
                  fd: -1
                  here_begin: 
                    {
                      (word_part.EscapedLiteral
                        token: (Token id:Id.Lit_EscapedChar val:'\\E' span_id:845)
                      ) (OF)
                    }
                  here_end_span_id: 857
                  stdin_parts: [
                    ('diff --git a/target b/target\n')
                    ('index e69de29..8bd6648 100644\n')
                    ('--- a/target\n')
                    ('+++ b/target\n')
                    ('@@ -0,0 +1,3 @@\n')
                    ('+An empty line follows\n')
                    ('+\n')
                    ('+A line with trailing whitespace and no newline_\n')
                    ('\\ No newline at end of file\n')
                  ]
                )
              ]
            )
          ]
        )
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'trailing whitespace & no newline at the end of file'
            span_id: 864
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:868) 
          (Token id:Id.Lit_Chars val:'\t>target &&\n' span_id:869) (Token id:Id.Lit_Chars val:'\tcreate_patch >patch-file &&\n' span_id:870) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit apply --whitespace=fix patch-file &&\n'
            span_id: 871
          ) (Token id:Id.Lit_Chars val:'\tgrep "newline$" target &&\n' span_id:872) 
          (Token id:Id.Lit_Chars val:'\tgrep "^$" target\n' span_id:873)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'blank at EOF with --whitespace=fix (1)' span_id:880))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:884) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest_might_fail git config --unset core.whitespace &&\n'
            span_id: 885
          ) (Token id:Id.Lit_Chars val:'\trm -f .gitattributes &&\n' span_id:886) 
          (Token id:Id.Lit_Chars val:'\n' span_id:887) (Token id:Id.Lit_Chars val:'\t{ echo a; echo b; echo c; } >one &&\n' span_id:888) 
          (Token id:Id.Lit_Chars val:'\tgit add one &&\n' span_id:889) (Token id:Id.Lit_Chars val:'\t{ echo a; echo b; echo c; } >expect &&\n' span_id:890) 
          (Token id:Id.Lit_Chars val:'\t{ cat expect; echo; } >one &&\n' span_id:891) (Token id:Id.Lit_Chars val:'\tgit diff -- one >patch &&\n' span_id:892) 
          (Token id:Id.Lit_Chars val:'\n' span_id:893) (Token id:Id.Lit_Chars val:'\tgit checkout one &&\n' span_id:894) 
          (Token id:Id.Lit_Chars val:'\tgit apply --whitespace=fix patch &&\n' span_id:895) (Token id:Id.Lit_Chars val:'\ttest_cmp expect one\n' span_id:896)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'blank at EOF with --whitespace=fix (2)' span_id:903))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:907) 
          (Token id:Id.Lit_Chars val:'\t{ echo a; echo b; echo c; } >one &&\n' span_id:908) (Token id:Id.Lit_Chars val:'\tgit add one &&\n' span_id:909) 
          (Token id:Id.Lit_Chars val:'\t{ echo a; echo c; } >expect &&\n' span_id:910) (Token id:Id.Lit_Chars val:'\t{ cat expect; echo; echo; } >one &&\n' span_id:911) 
          (Token id:Id.Lit_Chars val:'\tgit diff -- one >patch &&\n' span_id:912) (Token id:Id.Lit_Chars val:'\n' span_id:913) 
          (Token id:Id.Lit_Chars val:'\tgit checkout one &&\n' span_id:914) (Token id:Id.Lit_Chars val:'\tgit apply --whitespace=fix patch &&\n' span_id:915) 
          (Token id:Id.Lit_Chars val:'\ttest_cmp expect one\n' span_id:916)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'blank at EOF with --whitespace=fix (3)' span_id:923))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:927) 
          (Token id:Id.Lit_Chars val:'\t{ echo a; echo b; echo; } >one &&\n' span_id:928) (Token id:Id.Lit_Chars val:'\tgit add one &&\n' span_id:929) 
          (Token
            id: Id.Lit_Chars
            val: '\t{ echo a; echo c; echo; } >expect &&\n'
            span_id: 930
          ) (Token id:Id.Lit_Chars val:'\t{ cat expect; echo; echo; } >one &&\n' span_id:931) 
          (Token id:Id.Lit_Chars val:'\tgit diff -- one >patch &&\n' span_id:932) (Token id:Id.Lit_Chars val:'\n' span_id:933) 
          (Token id:Id.Lit_Chars val:'\tgit checkout one &&\n' span_id:934) (Token id:Id.Lit_Chars val:'\tgit apply --whitespace=fix patch &&\n' span_id:935) 
          (Token id:Id.Lit_Chars val:'\ttest_cmp expect one\n' span_id:936)
        )
      }
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'blank at end of hunk, not at EOF with --whitespace=fix'
            span_id: 943
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:947) 
          (Token
            id: Id.Lit_Chars
            val: '\t{ echo a; echo b; echo; echo; echo; echo; echo; echo d; } >one &&\n'
            span_id: 948
          ) (Token id:Id.Lit_Chars val:'\tgit add one &&\n' span_id:949) 
          (Token
            id: Id.Lit_Chars
            val: '\t{ echo a; echo c; echo; echo; echo; echo; echo; echo; echo d; } >expect &&\n'
            span_id: 950
          ) (Token id:Id.Lit_Chars val:'\tcp expect one &&\n' span_id:951) 
          (Token id:Id.Lit_Chars val:'\tgit diff -- one >patch &&\n' span_id:952) (Token id:Id.Lit_Chars val:'\n' span_id:953) 
          (Token id:Id.Lit_Chars val:'\tgit checkout one &&\n' span_id:954) (Token id:Id.Lit_Chars val:'\tgit apply --whitespace=fix patch &&\n' span_id:955) 
          (Token id:Id.Lit_Chars val:'\ttest_cmp expect one\n' span_id:956)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'blank at EOF with --whitespace=warn' span_id:963))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:967) 
          (Token id:Id.Lit_Chars val:'\t{ echo a; echo b; echo c; } >one &&\n' span_id:968) (Token id:Id.Lit_Chars val:'\tgit add one &&\n' span_id:969) 
          (Token id:Id.Lit_Chars val:'\techo >>one &&\n' span_id:970) (Token id:Id.Lit_Chars val:'\tcat one >expect &&\n' span_id:971) 
          (Token id:Id.Lit_Chars val:'\tgit diff -- one >patch &&\n' span_id:972) (Token id:Id.Lit_Chars val:'\n' span_id:973) 
          (Token id:Id.Lit_Chars val:'\tgit checkout one &&\n' span_id:974) (Token id:Id.Lit_Chars val:'\tgit apply --whitespace=warn patch 2>error &&\n' span_id:975) 
          (Token id:Id.Lit_Chars val:'\ttest_cmp expect one &&\n' span_id:976) (Token id:Id.Lit_Chars val:'\tgrep "new blank line at EOF" error\n' span_id:977)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'blank at EOF with --whitespace=error' span_id:984))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:988) 
          (Token id:Id.Lit_Chars val:'\t{ echo a; echo b; echo c; } >one &&\n' span_id:989) (Token id:Id.Lit_Chars val:'\tgit add one &&\n' span_id:990) 
          (Token id:Id.Lit_Chars val:'\tcat one >expect &&\n' span_id:991) (Token id:Id.Lit_Chars val:'\techo >>one &&\n' span_id:992) 
          (Token id:Id.Lit_Chars val:'\tgit diff -- one >patch &&\n' span_id:993) (Token id:Id.Lit_Chars val:'\n' span_id:994) 
          (Token id:Id.Lit_Chars val:'\tgit checkout one &&\n' span_id:995) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest_must_fail git apply --whitespace=error patch 2>error &&\n'
            span_id: 996
          ) (Token id:Id.Lit_Chars val:'\ttest_cmp expect one &&\n' span_id:997) 
          (Token id:Id.Lit_Chars val:'\tgrep "new blank line at EOF" error\n' span_id:998)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'blank but not empty at EOF' span_id:1005))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:1009) 
          (Token
            id: Id.Lit_Chars
            val: '\t{ echo a; echo b; echo c; } >one &&\n'
            span_id: 1010
          ) (Token id:Id.Lit_Chars val:'\tgit add one &&\n' span_id:1011) 
          (Token id:Id.Lit_Chars val:'\techo "   " >>one &&\n' span_id:1012) (Token id:Id.Lit_Chars val:'\tcat one >expect &&\n' span_id:1013) 
          (Token id:Id.Lit_Chars val:'\tgit diff -- one >patch &&\n' span_id:1014) (Token id:Id.Lit_Chars val:'\n' span_id:1015) 
          (Token id:Id.Lit_Chars val:'\tgit checkout one &&\n' span_id:1016) (Token id:Id.Lit_Chars val:'\tgit apply --whitespace=warn patch 2>error &&\n' span_id:1017) 
          (Token id:Id.Lit_Chars val:'\ttest_cmp expect one &&\n' span_id:1018) (Token id:Id.Lit_Chars val:'\tgrep "new blank line at EOF" error\n' span_id:1019)
        )
      }
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'applying beyond EOF requires one non-blank context line'
            span_id: 1026
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:1030) 
          (Token
            id: Id.Lit_Chars
            val: '\t{ echo; echo; echo; echo; } >one &&\n'
            span_id: 1031
          ) (Token id:Id.Lit_Chars val:'\tgit add one &&\n' span_id:1032) 
          (Token id:Id.Lit_Chars val:'\t{ echo b; } >>one &&\n' span_id:1033) (Token id:Id.Lit_Chars val:'\tgit diff -- one >patch &&\n' span_id:1034) 
          (Token id:Id.Lit_Chars val:'\n' span_id:1035) (Token id:Id.Lit_Chars val:'\tgit checkout one &&\n' span_id:1036) 
          (Token id:Id.Lit_Chars val:'\t{ echo a; echo; } >one &&\n' span_id:1037) (Token id:Id.Lit_Chars val:'\tcp one expect &&\n' span_id:1038) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest_must_fail git apply --whitespace=fix patch &&\n'
            span_id: 1039
          ) (Token id:Id.Lit_Chars val:'\ttest_cmp one expect &&\n' span_id:1040) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest_must_fail git apply --ignore-space-change --whitespace=fix patch &&\n'
            span_id: 1041
          ) (Token id:Id.Lit_Chars val:'\ttest_cmp one expect\n' span_id:1042)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'tons of blanks at EOF should not apply' span_id:1049))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:1053) 
          (Token
            id: Id.Lit_Chars
            val: '\tfor i in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16; do\n'
            span_id: 1054
          ) (Token id:Id.Lit_Chars val:'\t\techo; echo; echo; echo;\n' span_id:1055) 
          (Token id:Id.Lit_Chars val:'\tdone >one &&\n' span_id:1056) (Token id:Id.Lit_Chars val:'\tgit add one &&\n' span_id:1057) 
          (Token id:Id.Lit_Chars val:'\techo a >>one &&\n' span_id:1058) (Token id:Id.Lit_Chars val:'\tgit diff -- one >patch &&\n' span_id:1059) 
          (Token id:Id.Lit_Chars val:'\n' span_id:1060) (Token id:Id.Lit_Chars val:'\t>one &&\n' span_id:1061) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest_must_fail git apply --whitespace=fix patch &&\n'
            span_id: 1062
          ) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest_must_fail git apply --ignore-space-change --whitespace=fix patch\n'
            span_id: 1063
          )
        )
      }
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'missing blank line at end with --whitespace=fix'
            span_id: 1070
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:1074) 
          (Token id:Id.Lit_Chars val:'\techo a >one &&\n' span_id:1075) (Token id:Id.Lit_Chars val:'\techo >>one &&\n' span_id:1076) 
          (Token id:Id.Lit_Chars val:'\tgit add one &&\n' span_id:1077) (Token id:Id.Lit_Chars val:'\techo b >>one &&\n' span_id:1078) 
          (Token id:Id.Lit_Chars val:'\tcp one expect &&\n' span_id:1079) (Token id:Id.Lit_Chars val:'\tgit diff -- one >patch &&\n' span_id:1080) 
          (Token id:Id.Lit_Chars val:'\techo a >one &&\n' span_id:1081) (Token id:Id.Lit_Chars val:'\tcp one saved-one &&\n' span_id:1082) 
          (Token id:Id.Lit_Chars val:'\ttest_must_fail git apply patch &&\n' span_id:1083) (Token id:Id.Lit_Chars val:'\tgit apply --whitespace=fix patch &&\n' span_id:1084) 
          (Token id:Id.Lit_Chars val:'\ttest_cmp one expect &&\n' span_id:1085) (Token id:Id.Lit_Chars val:'\tmv saved-one one &&\n' span_id:1086) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit apply --ignore-space-change --whitespace=fix patch &&\n'
            span_id: 1087
          ) (Token id:Id.Lit_Chars val:'\ttest_cmp one expect\n' span_id:1088)
        )
      }
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'two missing blank lines at end with --whitespace=fix'
            span_id: 1095
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:1099) 
          (Token
            id: Id.Lit_Chars
            val: '\t{ echo a; echo; echo b; echo c; } >one &&\n'
            span_id: 1100
          ) (Token id:Id.Lit_Chars val:'\tcp one no-blank-lines &&\n' span_id:1101) 
          (Token id:Id.Lit_Chars val:'\t{ echo; echo; } >>one &&\n' span_id:1102) (Token id:Id.Lit_Chars val:'\tgit add one &&\n' span_id:1103) 
          (Token id:Id.Lit_Chars val:'\techo d >>one &&\n' span_id:1104) (Token id:Id.Lit_Chars val:'\tcp one expect &&\n' span_id:1105) 
          (Token id:Id.Lit_Chars val:'\techo >>one &&\n' span_id:1106) (Token id:Id.Lit_Chars val:'\tgit diff -- one >patch &&\n' span_id:1107) 
          (Token id:Id.Lit_Chars val:'\tcp no-blank-lines one &&\n' span_id:1108) (Token id:Id.Lit_Chars val:'\ttest_must_fail git apply patch &&\n' span_id:1109) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit apply --whitespace=fix patch &&\n'
            span_id: 1110
          ) (Token id:Id.Lit_Chars val:'\ttest_cmp one expect &&\n' span_id:1111) 
          (Token id:Id.Lit_Chars val:'\tmv no-blank-lines one &&\n' span_id:1112) (Token id:Id.Lit_Chars val:'\ttest_must_fail git apply patch &&\n' span_id:1113) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit apply --ignore-space-change --whitespace=fix patch &&\n'
            span_id: 1114
          ) (Token id:Id.Lit_Chars val:'\ttest_cmp one expect\n' span_id:1115)
        )
      }
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'missing blank line at end, insert before end, --whitespace=fix'
            span_id: 1122
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:1126) 
          (Token id:Id.Lit_Chars val:'\t{ echo a; echo; } >one &&\n' span_id:1127) (Token id:Id.Lit_Chars val:'\tgit add one &&\n' span_id:1128) 
          (Token id:Id.Lit_Chars val:'\t{ echo b; echo a; echo; } >one &&\n' span_id:1129) (Token id:Id.Lit_Chars val:'\tcp one expect &&\n' span_id:1130) 
          (Token id:Id.Lit_Chars val:'\tgit diff -- one >patch &&\n' span_id:1131) (Token id:Id.Lit_Chars val:'\techo a >one &&\n' span_id:1132) 
          (Token id:Id.Lit_Chars val:'\ttest_must_fail git apply patch &&\n' span_id:1133) (Token id:Id.Lit_Chars val:'\tgit apply --whitespace=fix patch &&\n' span_id:1134) 
          (Token id:Id.Lit_Chars val:'\ttest_cmp one expect\n' span_id:1135)
        )
      }
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'shrink file with tons of missing blanks at end of file'
            span_id: 1142
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:1146) 
          (Token
            id: Id.Lit_Chars
            val: '\t{ echo a; echo b; echo c; } >one &&\n'
            span_id: 1147
          ) (Token id:Id.Lit_Chars val:'\tcp one no-blank-lines &&\n' span_id:1148) 
          (Token
            id: Id.Lit_Chars
            val: '\tfor i in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16; do\n'
            span_id: 1149
          ) (Token id:Id.Lit_Chars val:'\t\techo; echo; echo; echo;\n' span_id:1150) 
          (Token id:Id.Lit_Chars val:'\tdone >>one &&\n' span_id:1151) (Token id:Id.Lit_Chars val:'\tgit add one &&\n' span_id:1152) 
          (Token id:Id.Lit_Chars val:'\techo a >one &&\n' span_id:1153) (Token id:Id.Lit_Chars val:'\tcp one expect &&\n' span_id:1154) 
          (Token id:Id.Lit_Chars val:'\tgit diff -- one >patch &&\n' span_id:1155) (Token id:Id.Lit_Chars val:'\tcp no-blank-lines one &&\n' span_id:1156) 
          (Token id:Id.Lit_Chars val:'\ttest_must_fail git apply patch &&\n' span_id:1157) (Token id:Id.Lit_Chars val:'\tgit apply --whitespace=fix patch &&\n' span_id:1158) 
          (Token id:Id.Lit_Chars val:'\ttest_cmp one expect &&\n' span_id:1159) (Token id:Id.Lit_Chars val:'\tmv no-blank-lines one &&\n' span_id:1160) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit apply --ignore-space-change --whitespace=fix patch &&\n'
            span_id: 1161
          ) (Token id:Id.Lit_Chars val:'\ttest_cmp one expect\n' span_id:1162)
        )
      }
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'missing blanks at EOF must only match blank lines'
            span_id: 1169
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:1173) 
          (Token id:Id.Lit_Chars val:'\t{ echo a; echo b; } >one &&\n' span_id:1174) (Token id:Id.Lit_Chars val:'\tgit add one &&\n' span_id:1175) 
          (Token id:Id.Lit_Chars val:'\t{ echo c; echo d; } >>one &&\n' span_id:1176) (Token id:Id.Lit_Chars val:'\tgit diff -- one >patch &&\n' span_id:1177) 
          (Token id:Id.Lit_Chars val:'\n' span_id:1178) (Token id:Id.Lit_Chars val:'\techo a >one &&\n' span_id:1179) 
          (Token id:Id.Lit_Chars val:'\ttest_must_fail git apply patch &&\n' span_id:1180) (Token id:Id.Lit_Chars val:'\ttest_must_fail git apply --whitespace=fix patch &&\n' span_id:1181) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest_must_fail git apply --ignore-space-change --whitespace=fix patch\n'
            span_id: 1182
          )
        )
      }
    )
    (command.Simple
      words: [{(sed)} {(-e) (SQ (Token id:Id.Lit_Chars val:s/Z// span_id:1190))}]
      redirects: [
        (redir.Redir op:(Token id:Id.Redir_Great val:'>' span_id:1193) fd:-1 arg_word:{(one)})
        (redir.HereDoc
          op: (Token id:Id.Redir_DLess val:'<<' span_id:1196)
          fd: -1
          here_begin: {(EOF)}
          here_end_span_id: 1204
          stdin_parts: [('a\n') ('b\n') ('c\n') ('\t\t      Z\n')]
        )
      ]
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'missing blank line should match context line with spaces'
            span_id: 1209
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:1213) 
          (Token id:Id.Lit_Chars val:'\tgit add one &&\n' span_id:1214) (Token id:Id.Lit_Chars val:'\techo d >>one &&\n' span_id:1215) 
          (Token id:Id.Lit_Chars val:'\tgit diff -- one >patch &&\n' span_id:1216) (Token id:Id.Lit_Chars val:'\t{ echo a; echo b; echo c; } >one &&\n' span_id:1217) 
          (Token id:Id.Lit_Chars val:'\tcp one expect &&\n' span_id:1218) (Token id:Id.Lit_Chars val:'\t{ echo; echo d; } >>expect &&\n' span_id:1219) 
          (Token id:Id.Lit_Chars val:'\tgit add one &&\n' span_id:1220) (Token id:Id.Lit_Chars val:'\n' span_id:1221) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit apply --whitespace=fix patch &&\n'
            span_id: 1222
          ) (Token id:Id.Lit_Chars val:'\ttest_cmp one expect\n' span_id:1223)
        )
      }
    )
    (command.Simple
      words: [{(sed)} {(-e) (SQ (Token id:Id.Lit_Chars val:s/Z// span_id:1231))}]
      redirects: [
        (redir.Redir op:(Token id:Id.Redir_Great val:'>' span_id:1234) fd:-1 arg_word:{(one)})
        (redir.HereDoc
          op: (Token id:Id.Redir_DLess val:'<<' span_id:1237)
          fd: -1
          here_begin: {(EOF)}
          here_end_span_id: 1245
          stdin_parts: [('a\n') ('b\n') ('c\n') ('\t\t      Z\n')]
        )
      ]
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'same, but with the --ignore-space-option' span_id:1250))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:1254) 
          (Token id:Id.Lit_Chars val:'\tgit add one &&\n' span_id:1255) (Token id:Id.Lit_Chars val:'\techo d >>one &&\n' span_id:1256) 
          (Token id:Id.Lit_Chars val:'\tcp one expect &&\n' span_id:1257) (Token id:Id.Lit_Chars val:'\tgit diff -- one >patch &&\n' span_id:1258) 
          (Token
            id: Id.Lit_Chars
            val: '\t{ echo a; echo b; echo c; } >one &&\n'
            span_id: 1259
          ) (Token id:Id.Lit_Chars val:'\tgit add one &&\n' span_id:1260) 
          (Token id:Id.Lit_Chars val:'\n' span_id:1261) (Token id:Id.Lit_Chars val:'\tgit checkout-index -f one &&\n' span_id:1262) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit apply --ignore-space-change --whitespace=fix patch &&\n'
            span_id: 1263
          ) (Token id:Id.Lit_Chars val:'\ttest_cmp one expect\n' span_id:1264)
        )
      }
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'same, but with CR-LF line endings && cr-at-eol set'
            span_id: 1271
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:1275) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit config core.whitespace cr-at-eol &&\n'
            span_id: 1276
          ) (Token id:Id.Lit_Chars val:'\tprintf "a\\r\\n" >one &&\n' span_id:1277) 
          (Token id:Id.Lit_Chars val:'\tprintf "b\\r\\n" >>one &&\n' span_id:1278) (Token id:Id.Lit_Chars val:'\tprintf "c\\r\\n" >>one &&\n' span_id:1279) 
          (Token id:Id.Lit_Chars val:'\tcp one save-one &&\n' span_id:1280) (Token id:Id.Lit_Chars val:'\tprintf "                 \\r\\n" >>one &&\n' span_id:1281) 
          (Token id:Id.Lit_Chars val:'\tgit add one &&\n' span_id:1282) (Token id:Id.Lit_Chars val:'\tprintf "d\\r\\n" >>one &&\n' span_id:1283) 
          (Token id:Id.Lit_Chars val:'\tcp one expect &&\n' span_id:1284) (Token id:Id.Lit_Chars val:'\tgit diff -- one >patch &&\n' span_id:1285) 
          (Token id:Id.Lit_Chars val:'\tmv save-one one &&\n' span_id:1286) (Token id:Id.Lit_Chars val:'\n' span_id:1287) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit apply --ignore-space-change --whitespace=fix patch &&\n'
            span_id: 1288
          ) (Token id:Id.Lit_Chars val:'\ttest_cmp one expect\n' span_id:1289)
        )
      }
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'same, but with CR-LF line endings && cr-at-eol unset'
            span_id: 1296
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:1300) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit config --unset core.whitespace &&\n'
            span_id: 1301
          ) (Token id:Id.Lit_Chars val:'\tprintf "a\\r\\n" >one &&\n' span_id:1302) 
          (Token id:Id.Lit_Chars val:'\tprintf "b\\r\\n" >>one &&\n' span_id:1303) (Token id:Id.Lit_Chars val:'\tprintf "c\\r\\n" >>one &&\n' span_id:1304) 
          (Token id:Id.Lit_Chars val:'\tcp one save-one &&\n' span_id:1305) (Token id:Id.Lit_Chars val:'\tprintf "                 \\r\\n" >>one &&\n' span_id:1306) 
          (Token id:Id.Lit_Chars val:'\tgit add one &&\n' span_id:1307) (Token id:Id.Lit_Chars val:'\tcp one expect &&\n' span_id:1308) 
          (Token id:Id.Lit_Chars val:'\tprintf "d\\r\\n" >>one &&\n' span_id:1309) (Token id:Id.Lit_Chars val:'\tgit diff -- one >patch &&\n' span_id:1310) 
          (Token id:Id.Lit_Chars val:'\tmv save-one one &&\n' span_id:1311) (Token id:Id.Lit_Chars val:'\techo d >>expect &&\n' span_id:1312) 
          (Token id:Id.Lit_Chars val:'\n' span_id:1313) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit apply --ignore-space-change --whitespace=fix patch &&\n'
            span_id: 1314
          ) (Token id:Id.Lit_Chars val:'\ttest_cmp one expect\n' span_id:1315)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'whitespace=fix to expand' span_id:1322))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:1326) 
          (Token
            id: Id.Lit_Chars
            val: '\tqz_to_tab_space >preimage <<-\\EOF &&\n'
            span_id: 1327
          ) (Token id:Id.Lit_Chars val:'\tQQa\n' span_id:1328) (Token id:Id.Lit_Chars val:'\tQQb\n' span_id:1329) 
          (Token id:Id.Lit_Chars val:'\tQQc\n' span_id:1330) (Token id:Id.Lit_Chars val:'\tZZZZZZZZZZZZZZZZd\n' span_id:1331) 
          (Token id:Id.Lit_Chars val:'\tQQe\n' span_id:1332) (Token id:Id.Lit_Chars val:'\tQQf\n' span_id:1333) (Token id:Id.Lit_Chars val:'\tQQg\n' span_id:1334) 
          (Token id:Id.Lit_Chars val:'\tEOF\n' span_id:1335) (Token id:Id.Lit_Chars val:'\tqz_to_tab_space >patch <<-\\EOF &&\n' span_id:1336) 
          (Token id:Id.Lit_Chars val:'\tdiff --git a/preimage b/preimage\n' span_id:1337) (Token id:Id.Lit_Chars val:'\t--- a/preimage\n' span_id:1338) 
          (Token id:Id.Lit_Chars val:'\t+++ b/preimage\n' span_id:1339) (Token id:Id.Lit_Chars val:'\t@@ -1,7 +1,6 @@\n' span_id:1340) 
          (Token id:Id.Lit_Chars val:'\t QQa\n' span_id:1341) (Token id:Id.Lit_Chars val:'\t QQb\n' span_id:1342) 
          (Token id:Id.Lit_Chars val:'\t QQc\n' span_id:1343) (Token id:Id.Lit_Chars val:'\t-QQd\n' span_id:1344) 
          (Token id:Id.Lit_Chars val:'\t QQe\n' span_id:1345) (Token id:Id.Lit_Chars val:'\t QQf\n' span_id:1346) 
          (Token id:Id.Lit_Chars val:'\t QQg\n' span_id:1347) (Token id:Id.Lit_Chars val:'\tEOF\n' span_id:1348) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit -c core.whitespace=tab-in-indent apply --whitespace=fix patch\n'
            span_id: 1349
          )
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'whitespace check skipped for excluded paths' span_id:1356))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:1360) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit config core.whitespace blank-at-eol &&\n'
            span_id: 1361
          ) (Token id:Id.Lit_Chars val:'\t>used &&\n' span_id:1362) 
          (Token id:Id.Lit_Chars val:'\t>unused &&\n' span_id:1363) (Token id:Id.Lit_Chars val:'\tgit add used unused &&\n' span_id:1364) 
          (Token id:Id.Lit_Chars val:'\techo "used" >used &&\n' span_id:1365) (Token id:Id.Lit_Chars val:'\techo "unused " >unused &&\n' span_id:1366) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit diff-files -p used unused >patch &&\n'
            span_id: 1367
          ) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit apply --include=used --stat --whitespace=error <patch\n'
            span_id: 1368
          )
        )
      }
    )
    (C {(test_done)})
  ]
)