(CommandList
  children: [
    (Assignment
      keyword: Assign_None
      pairs: [
        (assign_pair
          lhs: (LhsName name:test_description)
          op: Equal
          rhs: {(SQ <'core.whitespace rules and git apply'>)}
          spids: [4]
        )
      ]
      spids: [4]
    )
    (C {(.)} {(./test-lib.sh)})
    (FuncDef
      name: prepare_test_file
      body: 
        (BraceGroup
          children: [
            (SimpleCommand
              words: [{(sed)} {(-e)} {(DQ ('s/_/ /g'))} {(-e)} {(DQ ('s/>/\t/'))}]
              redirects: [
                (HereDoc
                  op_id: Redir_DLessDash
                  fd: 16777215
                  body: 
                    {('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')
                    }
                  do_expansion: False
                  here_end: EOF
                  was_filled: T
                  spids: [66]
                )
              ]
            )
          ]
          spids: [20]
        )
      spids: [15 19]
    )
    (FuncDef
      name: apply_patch
      body: 
        (BraceGroup
          children: [
            (AndOr
              ops: [Op_DAmp]
              children: [
                (SimpleCommand
                  redirects: [(Redir op_id:Redir_Great fd:16777215 arg_word:{(target)} spids:[81])]
                )
                (Pipeline
                  children: [
                    (SimpleCommand
                      words: [
                        {(sed)}
                        {(-e)}
                        {
                          (DQ ('s|') (Lit_Other '\\') ('([ab]') (Lit_Other '\\') (')/file|') 
                            (Lit_Other '\\') ('1/target|')
                          )
                        }
                      ]
                      redirects: [(Redir op_id:Redir_Less fd:16777215 arg_word:{(patch)} spids:[101])]
                    )
                    (C {(git)} {(apply)} {(DQ ($ VSub_At '$@'))})
                  ]
                  negated: F
                )
              ]
            )
          ]
          spids: [78]
        )
      spids: [73 77]
    )
    (FuncDef
      name: test_fix
      body: 
        (BraceGroup
          children: [
            (AndOr
              ops: [Op_DPipe]
              children: [
                (C {(apply_patch)} {(--whitespace) (Lit_Other '=') (fix)})
                (ControlFlow token:<ControlFlow_Return return> arg_word:{(1)})
              ]
            )
            (Pipeline
              children: [
                (C {($ VSub_Name '$DIFF')} {(file)} {(target)})
                (SimpleCommand
                  words: [{(sed)} {(-n)} {(-e)} {(DQ ('s/^> //p'))}]
                  redirects: [(Redir op_id:Redir_Great fd:16777215 arg_word:{(fixed)} spids:[166])]
                )
              ]
              negated: F
            )
            (Assignment
              keyword: Assign_None
              pairs: [
                (assign_pair
                  lhs: (LhsName name:fixed_cnt)
                  op: Equal
                  rhs: 
                    {
                      (CommandSubPart
                        command_list: 
                          (CommandList
                            children: [
                              (SimpleCommand
                                words: [{(wc)} {(-l)}]
                                redirects: [
                                  (Redir
                                    op_id: Redir_Less
                                    fd: 16777215
                                    arg_word: {(fixed)}
                                    spids: [181]
                                  )
                                ]
                              )
                            ]
                          )
                        left_token: <Left_CommandSub '$('>
                        spids: [176 183]
                      )
                    }
                  spids: [175]
                )
              ]
              spids: [175]
            )
            (Case
              to_match: {(DQ ($ VSub_Number '$1'))}
              arms: [
                (case_arm
                  pat_list: [{(SQ )}]
                  action: [
                    (Assignment
                      keyword: Assign_None
                      pairs: [
                        (assign_pair
                          lhs: (LhsName name:expect_cnt)
                          op: Equal
                          rhs: {($ VSub_Name '$fixed_cnt')}
                          spids: [199]
                        )
                      ]
                      spids: [199]
                    )
                  ]
                  spids: [16777215 197 202 16777215]
                )
                (case_arm
                  pat_list: [{(Lit_Other '?') (Lit_Other '*')}]
                  action: [
                    (Assignment
                      keyword: Assign_None
                      pairs: [
                        (assign_pair
                          lhs: (LhsName name:expect_cnt)
                          op: Equal
                          rhs: 
                            {
                              (CommandSubPart
                                command_list: 
                                  (CommandList
                                    children: [
                                      (Pipeline
                                        children: [
                                          (SimpleCommand
                                            words: [{(grep)} {(DQ ('[') ($ VSub_Number '$1') (']'))}]
                                            redirects: [
                                              (Redir
                                                op_id: Redir_Less
                                                fd: 16777215
                                                arg_word: {(fixed)}
                                                spids: [219]
                                              )
                                            ]
                                          )
                                          (C {(wc)} {(-l)})
                                        ]
                                        negated: F
                                      )
                                    ]
                                  )
                                left_token: <Left_CommandSub '$('>
                                spids: [210 227]
                              )
                            }
                          spids: [209]
                        )
                      ]
                      spids: [209]
                    )
                  ]
                  spids: [205 207 229 16777215]
                )
              ]
              spids: [186 192 232]
            )
            (AndOr
              ops: [Op_DPipe]
              children: [
                (C {(test)} {($ VSub_Name '$fixed_cnt')} {(-eq)} {($ VSub_Name '$expect_cnt')})
                (ControlFlow token:<ControlFlow_Return return> arg_word:{(1)})
              ]
            )
            (Case
              to_match: {(DQ ($ VSub_Number '$1'))}
              arms: [
                (case_arm
                  pat_list: [{(SQ )}]
                  action: [
                    (Assignment
                      keyword: Assign_None
                      pairs: [
                        (assign_pair
                          lhs: (LhsName name:expect_cnt)
                          op: Equal
                          rhs: {(0)}
                          spids: [268]
                        )
                      ]
                      spids: [268]
                    )
                  ]
                  spids: [16777215 266 271 16777215]
                )
                (case_arm
                  pat_list: [{(Lit_Other '?') (Lit_Other '*')}]
                  action: [
                    (Assignment
                      keyword: Assign_None
                      pairs: [
                        (assign_pair
                          lhs: (LhsName name:expect_cnt)
                          op: Equal
                          rhs: 
                            {
                              (CommandSubPart
                                command_list: 
                                  (CommandList
                                    children: [
                                      (Pipeline
                                        children: [
                                          (SimpleCommand
                                            words: [{(grep)} {(DQ ('[') ($ VSub_Number '$1') (']'))}]
                                            redirects: [
                                              (Redir
                                                op_id: Redir_Less
                                                fd: 16777215
                                                arg_word: {(file)}
                                                spids: [288]
                                              )
                                            ]
                                          )
                                          (C {(wc)} {(-l)})
                                        ]
                                        negated: F
                                      )
                                    ]
                                  )
                                left_token: <Left_CommandSub '$('>
                                spids: [279 296]
                              )
                            }
                          spids: [278]
                        )
                      ]
                      spids: [278]
                    )
                  ]
                  spids: [274 276 298 16777215]
                )
              ]
              spids: [255 261 301]
            )
            (AndOr
              ops: [Op_DPipe]
              children: [
                (C {(test)} {($ VSub_Name '$fixed_cnt')} {(-eq)} {($ VSub_Name '$expect_cnt')})
                (ControlFlow token:<ControlFlow_Return return> arg_word:{(1)})
              ]
            )
            (SimpleCommand
              words: [{(git)} {(diff-files)} {(-p)} {(target)}]
              redirects: [(Redir op_id:Redir_Great fd:16777215 arg_word:{(fixed-patch)} spids:[332])]
            )
            (AndOr
              ops: [Op_DAmp]
              children: [
                (C {(test)} {(-s)} {(fixed-patch)})
                (ControlFlow token:<ControlFlow_Return return> arg_word:{(0)})
              ]
            )
            (SimpleCommand
              redirects: [(Redir op_id:Redir_Great fd:16777215 arg_word:{(target)} spids:[354])]
            )
            (SimpleCommand
              words: [{(git)} {(apply)} {(--whitespace) (Lit_Other '=') (error-all)}]
              redirects: [(Redir op_id:Redir_Less fd:16777215 arg_word:{(fixed-patch)} spids:[366])]
            )
          ]
          spids: [123]
        )
      spids: [118 122]
    )
    (C {(test_expect_success)} {(setup)} 
      {
        (SQ <'\n'> <'\n'> <'\t>file &&\n'> <'\tgit add file &&\n'> <'\tprepare_test_file >file &&\n'> 
          <'\tgit diff-files -p >patch &&\n'> <'\t>target &&\n'> <'\tgit add target\n'> <'\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'whitespace=nowarn, default rule'>)} 
      {
        (SQ <'\n'> <'\n'> <'\tapply_patch --whitespace=nowarn &&\n'> <'\ttest_cmp file target\n'> <'\n'>)
      }
    )
    (C {(test_expect_success)} {(SQ <'whitespace=warn, default rule'>)} 
      {
        (SQ <'\n'> <'\n'> <'\tapply_patch --whitespace=warn &&\n'> <'\ttest_cmp file target\n'> <'\n'>)
      }
    )
    (C {(test_expect_success)} {(SQ <'whitespace=error-all, default rule'>)} 
      {
        (SQ <'\n'> <'\n'> <'\ttest_must_fail apply_patch --whitespace=error-all &&\n'> 
          <'\t! test -s target\n'> <'\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'whitespace=error-all, no rule'>)} 
      {
        (SQ <'\n'> <'\n'> <'\tgit config core.whitespace -trailing,-space-before,-indent &&\n'> 
          <'\tapply_patch --whitespace=error-all &&\n'> <'\ttest_cmp file target\n'> <'\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'whitespace=error-all, no rule (attribute)'>)} 
      {
        (SQ <'\n'> <'\n'> <'\tgit config --unset core.whitespace &&\n'> 
          <'\techo "target -whitespace" >.gitattributes &&\n'> <'\tapply_patch --whitespace=error-all &&\n'> <'\ttest_cmp file target\n'> <'\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'spaces inserted by tab-in-indent'>)} 
      {
        (SQ <'\n'> <'\n'> <'\tgit config core.whitespace -trailing,-space,-indent,tab &&\n'> 
          <'\trm -f .gitattributes &&\n'> <'\ttest_fix % &&\n'> <'\tsed -e "s/_/ /g" -e "s/>/\t/" <<-\\EOF >expect &&\n'> 
          <'\t\tAn_SP in an ordinary line>and a HT.\n'> <'\t\t________A HT (%).\n'> <'\t\t________A SP and a HT (@%).\n'> 
          <'\t\t_________A SP, a HT and a SP (@%).\n'> <'\t\t_______Seven SP.\n'> <'\t\t________Eight SP (#).\n'> <'\t\t________Seven SP and a HT (@%).\n'> 
          <'\t\t________________Eight SP and a HT (@#%).\n'> <'\t\t_________Seven SP, a HT and a SP (@%).\n'> 
          <'\t\t_________________Eight SP, a HT and a SP (@#%).\n'> <'\t\t_______________Fifteen SP (#).\n'> <'\t\t________________Fifteen SP and a HT (@#%).\n'> 
          <'\t\t________________Sixteen SP (#=).\n'> <'\t\t________________________Sixteen SP and a HT (@#%=).\n'> 
          <'\t\t_____a__Five SP, a non WS, two SP.\n'> <'\t\tA line with a (!) trailing SP_\n'> <'\t\tA line with a (!) trailing HT>\n'> <'\tEOF\n'> 
          <'\ttest_cmp expect target\n'> <'\n'>
        )
      }
    )
    (ForEach
      iter_name: t
      iter_words: [{(-)} {(SQ )}]
      do_arg_iter: F
      body: 
        (DoGroup
          children: [
            (Case
              to_match: {(DQ ($ VSub_Name '$t'))}
              arms: [
                (case_arm
                  pat_list: [{(SQ )}]
                  action: [
                    (Assignment
                      keyword: Assign_None
                      pairs: [
                        (assign_pair
                          lhs: (LhsName name:tt)
                          op: Equal
                          rhs: {(SQ <'!'>)}
                          spids: [530]
                        )
                      ]
                      spids: [530]
                    )
                  ]
                  spids: [16777215 528 535 16777215]
                )
                (case_arm
                  pat_list: [{(Lit_Other '*')}]
                  action: [
                    (Assignment
                      keyword: Assign_None
                      pairs: [
                        (assign_pair
                          lhs: (LhsName name:tt)
                          op: Equal
                          rhs: {(EmptyPart)}
                          spids: [540]
                        )
                      ]
                      spids: [540]
                    )
                  ]
                  spids: [537 538 542 16777215]
                )
              ]
              spids: [518 524 544]
            )
            (ForEach
              iter_name: s
              iter_words: [{(-)} {(SQ )}]
              do_arg_iter: F
              body: 
                (DoGroup
                  children: [
                    (Case
                      to_match: {(DQ ($ VSub_Name '$s'))}
                      arms: [
                        (case_arm
                          pat_list: [{(SQ )}]
                          action: [
                            (Assignment
                              keyword: Assign_None
                              pairs: [
                                (assign_pair
                                  lhs: (LhsName name:ts)
                                  op: Equal
                                  rhs: {(SQ <'@'>)}
                                  spids: [574]
                                )
                              ]
                              spids: [574]
                            )
                          ]
                          spids: [16777215 572 579 16777215]
                        )
                        (case_arm
                          pat_list: [{(Lit_Other '*')}]
                          action: [
                            (Assignment
                              keyword: Assign_None
                              pairs: [
                                (assign_pair
                                  lhs: (LhsName name:ts)
                                  op: Equal
                                  rhs: {(EmptyPart)}
                                  spids: [584]
                                )
                              ]
                              spids: [584]
                            )
                          ]
                          spids: [581 582 586 16777215]
                        )
                      ]
                      spids: [562 568 588]
                    )
                    (ForEach
                      iter_name: i
                      iter_words: [{(-)} {(SQ )}]
                      do_arg_iter: F
                      body: 
                        (DoGroup
                          children: [
                            (Case
                              to_match: {(DQ ($ VSub_Name '$i'))}
                              arms: [
                                (case_arm
                                  pat_list: [{(SQ )}]
                                  action: [
                                    (Assignment
                                      keyword: Assign_None
                                      pairs: [
                                        (assign_pair
                                          lhs: (LhsName name:ti)
                                          op: Equal
                                          rhs: {(SQ <'#'>)}
                                          spids: [618]
                                        )
                                        (assign_pair
                                          lhs: (LhsName name:ti16)
                                          op: Equal
                                          rhs: {(SQ <'='>)}
                                          spids: [623]
                                        )
                                      ]
                                      spids: [618]
                                    )
                                  ]
                                  spids: [16777215 616 627 16777215]
                                )
                                (case_arm
                                  pat_list: [{(Lit_Other '*')}]
                                  action: [
                                    (Assignment
                                      keyword: Assign_None
                                      pairs: [
                                        (assign_pair
                                          lhs: (LhsName name:ti)
                                          op: Equal
                                          rhs: {(EmptyPart)}
                                          spids: [632]
                                        )
                                        (assign_pair
                                          lhs: (LhsName name:ti16)
                                          op: Equal
                                          rhs: {(EmptyPart)}
                                          spids: [634]
                                        )
                                      ]
                                      spids: [632]
                                    )
                                  ]
                                  spids: [629 630 636 16777215]
                                )
                              ]
                              spids: [606 612 638]
                            )
                            (ForEach
                              iter_name: h
                              iter_words: [{(-)} {(SQ )}]
                              do_arg_iter: F
                              body: 
                                (DoGroup
                                  children: [
                                    (AndOr
                                      ops: [Op_DAmp]
                                      children: [
                                        (C {(Lit_Other '[')} {(-z)} 
                                          {(DQ ($ VSub_Name '$h') ($ VSub_Name '$i'))} {(Lit_Other ']')}
                                        )
                                        (ControlFlow
                                          token: <ControlFlow_Continue continue>
                                        )
                                      ]
                                    )
                                    (Case
                                      to_match: {(DQ ($ VSub_Name '$h'))}
                                      arms: [
                                        (case_arm
                                          pat_list: [{(SQ )}]
                                          action: [
                                            (Assignment
                                              keyword: Assign_None
                                              pairs: [
                                                (assign_pair
                                                  lhs: (LhsName name:th)
                                                  op: Equal
                                                  rhs: {(SQ <'%'>)}
                                                  spids: [684]
                                                )
                                              ]
                                              spids: [684]
                                            )
                                          ]
                                          spids: [16777215 682 689 16777215]
                                        )
                                        (case_arm
                                          pat_list: [{(Lit_Other '*')}]
                                          action: [
                                            (Assignment
                                              keyword: Assign_None
                                              pairs: [
                                                (assign_pair
                                                  lhs: (LhsName name:th)
                                                  op: Equal
                                                  rhs: {(EmptyPart)}
                                                  spids: [694]
                                                )
                                              ]
                                              spids: [694]
                                            )
                                          ]
                                          spids: [691 692 696 16777215]
                                        )
                                      ]
                                      spids: [672 678 698]
                                    )
                                    (Assignment
                                      keyword: Assign_None
                                      pairs: [
                                        (assign_pair
                                          lhs: (LhsName name:rule)
                                          op: Equal
                                          rhs: 
                                            {(${ VSub_Name t) (trailing) (Lit_Comma ',') 
                                              (${ VSub_Name s) (space) (Lit_Comma ',') (${ VSub_Name i) (indent) (Lit_Comma ',') (${ VSub_Name h) (tab)
                                            }
                                          spids: [701]
                                        )
                                      ]
                                      spids: [701]
                                    )
                                    (C {(rm)} {(-f)} {(.gitattributes)})
                                    (C {(test_expect_success)} {(DQ ('rule=') ($ VSub_Name '$rule'))} 
                                      {
                                        (SQ <'\n'> 
                                          <'\t\t\t\t\tgit config core.whitespace "$rule" &&\n'> <'\t\t\t\t\ttest_fix "$tt$ts$ti$th"\n'> <'\t\t\t\t'>
                                        )
                                      }
                                    )
                                    (C {(test_expect_success)} 
                                      {(DQ ('rule=') ($ VSub_Name '$rule') (',tabwidth=16'))} 
                                      {
                                        (SQ <'\n'> 
                                          <
'\t\t\t\t\tgit config core.whitespace "$rule,tabwidth=16" &&\n'
                                          > <'\t\t\t\t\ttest_fix "$tt$ts$ti16$th"\n'> <'\t\t\t\t'>
                                        )
                                      }
                                    )
                                    (C {(test_expect_success)} 
                                      {(DQ ('rule=') ($ VSub_Name '$rule') (' (attributes)'))} 
                                      {
                                        (SQ <'\n'> 
                                          <'\t\t\t\t\tgit config --unset core.whitespace &&\n'> <'\t\t\t\t\techo "target whitespace=$rule" >.gitattributes &&\n'> 
                                          <'\t\t\t\t\ttest_fix "$tt$ts$ti$th"\n'> <'\t\t\t\t'>
                                        )
                                      }
                                    )
                                    (C {(test_expect_success)} 
                                      {
                                        (DQ ('rule=') ($ VSub_Name '$rule') 
                                          (',tabwidth=16 (attributes)')
                                        )
                                      } 
                                      {
                                        (SQ <'\n'> 
                                          <
'\t\t\t\t\techo "target whitespace=$rule,tabwidth=16" >.gitattributes &&\n'
                                          > <'\t\t\t\t\ttest_fix "$tt$ts$ti16$th"\n'> <'\t\t\t\t'>
                                        )
                                      }
                                    )
                                  ]
                                  spids: [653 799]
                                )
                              spids: [646 16777215]
                            )
                          ]
                          spids: [603 802]
                        )
                      spids: [596 16777215]
                    )
                  ]
                  spids: [559 805]
                )
              spids: [552 16777215]
            )
          ]
          spids: [515 807]
        )
      spids: [509 16777215]
    )
    (FuncDef
      name: create_patch
      body: 
        (BraceGroup
          children: [
            (SimpleCommand
              words: [{(sed)} {(-e)} {(DQ ('s/_/ /'))}]
              redirects: [
                (HereDoc
                  op_id: Redir_DLessDash
                  fd: 16777215
                  body: 
                    {('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')
                    }
                  do_expansion: False
                  here_end: EOF
                  was_filled: T
                  spids: [826]
                )
              ]
            )
          ]
          spids: [815]
        )
      spids: [810 814]
    )
    (C {(test_expect_success)} {(SQ <'trailing whitespace & no newline at the end of file'>)} 
      {
        (SQ <'\n'> <'\t>target &&\n'> <'\tcreate_patch >patch-file &&\n'> 
          <'\tgit apply --whitespace=fix patch-file &&\n'> <'\tgrep "newline$" target &&\n'> <'\tgrep "^$" target\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'blank at EOF with --whitespace=fix (1)'>)} 
      {
        (SQ <'\n'> <'\ttest_might_fail git config --unset core.whitespace &&\n'> 
          <'\trm -f .gitattributes &&\n'> <'\n'> <'\t{ echo a; echo b; echo c; } >one &&\n'> <'\tgit add one &&\n'> 
          <'\t{ echo a; echo b; echo c; } >expect &&\n'> <'\t{ cat expect; echo; } >one &&\n'> <'\tgit diff -- one >patch &&\n'> <'\n'> 
          <'\tgit checkout one &&\n'> <'\tgit apply --whitespace=fix patch &&\n'> <'\ttest_cmp expect one\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'blank at EOF with --whitespace=fix (2)'>)} 
      {
        (SQ <'\n'> <'\t{ echo a; echo b; echo c; } >one &&\n'> <'\tgit add one &&\n'> 
          <'\t{ echo a; echo c; } >expect &&\n'> <'\t{ cat expect; echo; echo; } >one &&\n'> <'\tgit diff -- one >patch &&\n'> <'\n'> 
          <'\tgit checkout one &&\n'> <'\tgit apply --whitespace=fix patch &&\n'> <'\ttest_cmp expect one\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'blank at EOF with --whitespace=fix (3)'>)} 
      {
        (SQ <'\n'> <'\t{ echo a; echo b; echo; } >one &&\n'> <'\tgit add one &&\n'> 
          <'\t{ echo a; echo c; echo; } >expect &&\n'> <'\t{ cat expect; echo; echo; } >one &&\n'> <'\tgit diff -- one >patch &&\n'> <'\n'> 
          <'\tgit checkout one &&\n'> <'\tgit apply --whitespace=fix patch &&\n'> <'\ttest_cmp expect one\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'blank at end of hunk, not at EOF with --whitespace=fix'>)} 
      {
        (SQ <'\n'> <'\t{ echo a; echo b; echo; echo; echo; echo; echo; echo d; } >one &&\n'> 
          <'\tgit add one &&\n'> <'\t{ echo a; echo c; echo; echo; echo; echo; echo; echo; echo d; } >expect &&\n'> 
          <'\tcp expect one &&\n'> <'\tgit diff -- one >patch &&\n'> <'\n'> <'\tgit checkout one &&\n'> 
          <'\tgit apply --whitespace=fix patch &&\n'> <'\ttest_cmp expect one\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'blank at EOF with --whitespace=warn'>)} 
      {
        (SQ <'\n'> <'\t{ echo a; echo b; echo c; } >one &&\n'> <'\tgit add one &&\n'> 
          <'\techo >>one &&\n'> <'\tcat one >expect &&\n'> <'\tgit diff -- one >patch &&\n'> <'\n'> <'\tgit checkout one &&\n'> 
          <'\tgit apply --whitespace=warn patch 2>error &&\n'> <'\ttest_cmp expect one &&\n'> <'\tgrep "new blank line at EOF" error\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'blank at EOF with --whitespace=error'>)} 
      {
        (SQ <'\n'> <'\t{ echo a; echo b; echo c; } >one &&\n'> <'\tgit add one &&\n'> 
          <'\tcat one >expect &&\n'> <'\techo >>one &&\n'> <'\tgit diff -- one >patch &&\n'> <'\n'> <'\tgit checkout one &&\n'> 
          <'\ttest_must_fail git apply --whitespace=error patch 2>error &&\n'> <'\ttest_cmp expect one &&\n'> <'\tgrep "new blank line at EOF" error\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'blank but not empty at EOF'>)} 
      {
        (SQ <'\n'> <'\t{ echo a; echo b; echo c; } >one &&\n'> <'\tgit add one &&\n'> 
          <'\techo "   " >>one &&\n'> <'\tcat one >expect &&\n'> <'\tgit diff -- one >patch &&\n'> <'\n'> <'\tgit checkout one &&\n'> 
          <'\tgit apply --whitespace=warn patch 2>error &&\n'> <'\ttest_cmp expect one &&\n'> <'\tgrep "new blank line at EOF" error\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'applying beyond EOF requires one non-blank context line'>)} 
      {
        (SQ <'\n'> <'\t{ echo; echo; echo; echo; } >one &&\n'> <'\tgit add one &&\n'> 
          <'\t{ echo b; } >>one &&\n'> <'\tgit diff -- one >patch &&\n'> <'\n'> <'\tgit checkout one &&\n'> <'\t{ echo a; echo; } >one &&\n'> 
          <'\tcp one expect &&\n'> <'\ttest_must_fail git apply --whitespace=fix patch &&\n'> <'\ttest_cmp one expect &&\n'> 
          <'\ttest_must_fail git apply --ignore-space-change --whitespace=fix patch &&\n'> <'\ttest_cmp one expect\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'tons of blanks at EOF should not apply'>)} 
      {
        (SQ <'\n'> <'\tfor i in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16; do\n'> 
          <'\t\techo; echo; echo; echo;\n'> <'\tdone >one &&\n'> <'\tgit add one &&\n'> <'\techo a >>one &&\n'> <'\tgit diff -- one >patch &&\n'> 
          <'\n'> <'\t>one &&\n'> <'\ttest_must_fail git apply --whitespace=fix patch &&\n'> 
          <'\ttest_must_fail git apply --ignore-space-change --whitespace=fix patch\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'missing blank line at end with --whitespace=fix'>)} 
      {
        (SQ <'\n'> <'\techo a >one &&\n'> <'\techo >>one &&\n'> <'\tgit add one &&\n'> 
          <'\techo b >>one &&\n'> <'\tcp one expect &&\n'> <'\tgit diff -- one >patch &&\n'> <'\techo a >one &&\n'> 
          <'\tcp one saved-one &&\n'> <'\ttest_must_fail git apply patch &&\n'> <'\tgit apply --whitespace=fix patch &&\n'> 
          <'\ttest_cmp one expect &&\n'> <'\tmv saved-one one &&\n'> <'\tgit apply --ignore-space-change --whitespace=fix patch &&\n'> 
          <'\ttest_cmp one expect\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'two missing blank lines at end with --whitespace=fix'>)} 
      {
        (SQ <'\n'> <'\t{ echo a; echo; echo b; echo c; } >one &&\n'> <'\tcp one no-blank-lines &&\n'> 
          <'\t{ echo; echo; } >>one &&\n'> <'\tgit add one &&\n'> <'\techo d >>one &&\n'> <'\tcp one expect &&\n'> <'\techo >>one &&\n'> 
          <'\tgit diff -- one >patch &&\n'> <'\tcp no-blank-lines one &&\n'> <'\ttest_must_fail git apply patch &&\n'> 
          <'\tgit apply --whitespace=fix patch &&\n'> <'\ttest_cmp one expect &&\n'> <'\tmv no-blank-lines one &&\n'> 
          <'\ttest_must_fail git apply patch &&\n'> <'\tgit apply --ignore-space-change --whitespace=fix patch &&\n'> <'\ttest_cmp one expect\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'missing blank line at end, insert before end, --whitespace=fix'>)} 
      {
        (SQ <'\n'> <'\t{ echo a; echo; } >one &&\n'> <'\tgit add one &&\n'> 
          <'\t{ echo b; echo a; echo; } >one &&\n'> <'\tcp one expect &&\n'> <'\tgit diff -- one >patch &&\n'> <'\techo a >one &&\n'> 
          <'\ttest_must_fail git apply patch &&\n'> <'\tgit apply --whitespace=fix patch &&\n'> <'\ttest_cmp one expect\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'shrink file with tons of missing blanks at end of file'>)} 
      {
        (SQ <'\n'> <'\t{ echo a; echo b; echo c; } >one &&\n'> <'\tcp one no-blank-lines &&\n'> 
          <'\tfor i in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16; do\n'> <'\t\techo; echo; echo; echo;\n'> <'\tdone >>one &&\n'> <'\tgit add one &&\n'> <'\techo a >one &&\n'> 
          <'\tcp one expect &&\n'> <'\tgit diff -- one >patch &&\n'> <'\tcp no-blank-lines one &&\n'> 
          <'\ttest_must_fail git apply patch &&\n'> <'\tgit apply --whitespace=fix patch &&\n'> <'\ttest_cmp one expect &&\n'> 
          <'\tmv no-blank-lines one &&\n'> <'\tgit apply --ignore-space-change --whitespace=fix patch &&\n'> <'\ttest_cmp one expect\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'missing blanks at EOF must only match blank lines'>)} 
      {
        (SQ <'\n'> <'\t{ echo a; echo b; } >one &&\n'> <'\tgit add one &&\n'> 
          <'\t{ echo c; echo d; } >>one &&\n'> <'\tgit diff -- one >patch &&\n'> <'\n'> <'\techo a >one &&\n'> 
          <'\ttest_must_fail git apply patch &&\n'> <'\ttest_must_fail git apply --whitespace=fix patch &&\n'> 
          <'\ttest_must_fail git apply --ignore-space-change --whitespace=fix patch\n'>
        )
      }
    )
    (SimpleCommand
      words: [{(sed)} {(-e) (SQ <s/Z//>)}]
      redirects: [
        (Redir op_id:Redir_Great fd:16777215 arg_word:{(one)} spids:[1165])
        (HereDoc
          op_id: Redir_DLess
          fd: 16777215
          body: {(DQ ('a\n') ('b\n') ('c\n') ('\t\t      Z\n'))}
          do_expansion: True
          here_end: EOF
          was_filled: T
          spids: [1168]
        )
      ]
    )
    (C {(test_expect_success)} {(SQ <'missing blank line should match context line with spaces'>)} 
      {
        (SQ <'\n'> <'\tgit add one &&\n'> <'\techo d >>one &&\n'> <'\tgit diff -- one >patch &&\n'> 
          <'\t{ echo a; echo b; echo c; } >one &&\n'> <'\tcp one expect &&\n'> <'\t{ echo; echo d; } >>expect &&\n'> <'\tgit add one &&\n'> <'\n'> 
          <'\tgit apply --whitespace=fix patch &&\n'> <'\ttest_cmp one expect\n'>
        )
      }
    )
    (SimpleCommand
      words: [{(sed)} {(-e) (SQ <s/Z//>)}]
      redirects: [
        (Redir op_id:Redir_Great fd:16777215 arg_word:{(one)} spids:[1205])
        (HereDoc
          op_id: Redir_DLess
          fd: 16777215
          body: {(DQ ('a\n') ('b\n') ('c\n') ('\t\t      Z\n'))}
          do_expansion: True
          here_end: EOF
          was_filled: T
          spids: [1208]
        )
      ]
    )
    (C {(test_expect_success)} {(SQ <'same, but with the --ignore-space-option'>)} 
      {
        (SQ <'\n'> <'\tgit add one &&\n'> <'\techo d >>one &&\n'> <'\tcp one expect &&\n'> 
          <'\tgit diff -- one >patch &&\n'> <'\t{ echo a; echo b; echo c; } >one &&\n'> <'\tgit add one &&\n'> <'\n'> 
          <'\tgit checkout-index -f one &&\n'> <'\tgit apply --ignore-space-change --whitespace=fix patch &&\n'> <'\ttest_cmp one expect\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'same, but with CR-LF line endings && cr-at-eol set'>)} 
      {
        (SQ <'\n'> <'\tgit config core.whitespace cr-at-eol &&\n'> <'\tprintf "a\\r\\n" >one &&\n'> 
          <'\tprintf "b\\r\\n" >>one &&\n'> <'\tprintf "c\\r\\n" >>one &&\n'> <'\tcp one save-one &&\n'> 
          <'\tprintf "                 \\r\\n" >>one &&\n'> <'\tgit add one &&\n'> <'\tprintf "d\\r\\n" >>one &&\n'> <'\tcp one expect &&\n'> 
          <'\tgit diff -- one >patch &&\n'> <'\tmv save-one one &&\n'> <'\n'> <'\tgit apply --ignore-space-change --whitespace=fix patch &&\n'> 
          <'\ttest_cmp one expect\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'same, but with CR-LF line endings && cr-at-eol unset'>)} 
      {
        (SQ <'\n'> <'\tgit config --unset core.whitespace &&\n'> <'\tprintf "a\\r\\n" >one &&\n'> 
          <'\tprintf "b\\r\\n" >>one &&\n'> <'\tprintf "c\\r\\n" >>one &&\n'> <'\tcp one save-one &&\n'> 
          <'\tprintf "                 \\r\\n" >>one &&\n'> <'\tgit add one &&\n'> <'\tcp one expect &&\n'> <'\tprintf "d\\r\\n" >>one &&\n'> 
          <'\tgit diff -- one >patch &&\n'> <'\tmv save-one one &&\n'> <'\techo d >>expect &&\n'> <'\n'> 
          <'\tgit apply --ignore-space-change --whitespace=fix patch &&\n'> <'\ttest_cmp one expect\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'whitespace=fix to expand'>)} 
      {
        (SQ <'\n'> <'\tqz_to_tab_space >preimage <<-\\EOF &&\n'> <'\tQQa\n'> <'\tQQb\n'> <'\tQQc\n'> 
          <'\tZZZZZZZZZZZZZZZZd\n'> <'\tQQe\n'> <'\tQQf\n'> <'\tQQg\n'> <'\tEOF\n'> <'\tqz_to_tab_space >patch <<-\\EOF &&\n'> 
          <'\tdiff --git a/preimage b/preimage\n'> <'\t--- a/preimage\n'> <'\t+++ b/preimage\n'> <'\t@@ -1,7 +1,6 @@\n'> <'\t QQa\n'> <'\t QQb\n'> 
          <'\t QQc\n'> <'\t-QQd\n'> <'\t QQe\n'> <'\t QQf\n'> <'\t QQg\n'> <'\tEOF\n'> 
          <'\tgit -c core.whitespace=tab-in-indent apply --whitespace=fix patch\n'>
        )
      }
    )
    (C {(test_expect_success)} {(SQ <'whitespace check skipped for excluded paths'>)} 
      {
        (SQ <'\n'> <'\tgit config core.whitespace blank-at-eol &&\n'> <'\t>used &&\n'> 
          <'\t>unused &&\n'> <'\tgit add used unused &&\n'> <'\techo "used" >used &&\n'> <'\techo "unused " >unused &&\n'> 
          <'\tgit diff-files -p used unused >patch &&\n'> <'\tgit apply --include=used --stat --whitespace=error <patch\n'>
        )
      }
    )
    (C {(test_done)})
  ]
)