(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: 'CRLF merge conflict across text=auto change\n'
                  span_id: 6
                ) (Token id:Id.Lit_Chars val:'\n' span_id:7) 
                (Token
                  id: Id.Lit_Chars
                  val: '* [master] remove .gitattributes\n'
                  span_id: 8
                ) (Token id:Id.Lit_Chars val:' ! [side] add line from b\n' span_id:9) 
                (Token id:Id.Lit_Chars val:'--\n' span_id:10) (Token id:Id.Lit_Chars val:' + [side] add line from b\n' span_id:11) 
                (Token
                  id: Id.Lit_Chars
                  val: '*  [master] remove .gitattributes\n'
                  span_id: 12
                ) (Token id:Id.Lit_Chars val:'*  [master^] add line from a\n' span_id:13) 
                (Token
                  id: Id.Lit_Chars
                  val: '*  [master~2] normalize file\n'
                  span_id: 14
                ) (Token id:Id.Lit_Chars val:'*+ [side^] Initial\n' span_id:15)
              )
            }
          spids: [4]
        )
      ]
    )
    (C {(.)} {(./test-lib.sh)})
    (command.AndOr
      ops: [Id.Op_DAmp]
      children: [
        (C {(test_have_prereq)} {(SED_STRIPS_CR)})
        (command.ShAssignment
          pairs: [
            (assign_pair
              lhs: (sh_lhs_expr.Name name:SED_OPTIONS)
              op: assign_op.Equal
              rhs: {(-b)}
              spids: [30]
            )
          ]
        )
      ]
    )
    (command.ShFunction
      name: compare_files
      body: 
        (command.BraceGroup
          children: [
            (command.AndOr
              ops: [Id.Op_DAmp Id.Op_DAmp Id.Op_DAmp]
              children: [
                (command.Simple
                  words: [{(tr)} {(SQ (Token id:Id.Lit_Chars val:'\\015\\000' span_id:45))} {(QN)}]
                  redirects: [
                    (redir.Redir
                      op: (Token id:Id.Redir_Less val:'<' span_id:50)
                      fd: -1
                      arg_word: {(DQ ($ Id.VSub_Number '$1'))}
                    )
                    (redir.Redir
                      op: (Token id:Id.Redir_Great val:'>' span_id:55)
                      fd: -1
                      arg_word: {(DQ ($ Id.VSub_Number '$1')) (.expect)}
                    )
                  ]
                )
                (command.Simple
                  words: [{(tr)} {(SQ (Token id:Id.Lit_Chars val:'\\015\\000' span_id:67))} {(QN)}]
                  redirects: [
                    (redir.Redir
                      op: (Token id:Id.Redir_Less val:'<' span_id:72)
                      fd: -1
                      arg_word: {(DQ ($ Id.VSub_Number '$2'))}
                    )
                    (redir.Redir
                      op: (Token id:Id.Redir_Great val:'>' span_id:77)
                      fd: -1
                      arg_word: {(DQ ($ Id.VSub_Number '$2')) (.actual)}
                    )
                  ]
                )
                (C {(test_cmp)} {(DQ ($ Id.VSub_Number '$1')) (.expect)} 
                  {(DQ ($ Id.VSub_Number '$2')) (.actual)}
                )
                (C {(rm)} {(DQ ($ Id.VSub_Number '$1')) (.expect)} 
                  {(DQ ($ Id.VSub_Number '$2')) (.actual)}
                )
              ]
            )
          ]
        )
    )
    (C {(test_expect_success)} {(setup)} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:121) 
          (Token id:Id.Lit_Chars val:'\tgit config core.autocrlf false &&\n' span_id:122) (Token id:Id.Lit_Chars val:'\n' span_id:123) 
          (Token
            id: Id.Lit_Chars
            val: '\techo first line | append_cr >file &&\n'
            span_id: 124
          ) (Token id:Id.Lit_Chars val:'\techo first line >control_file &&\n' span_id:125) 
          (Token id:Id.Lit_Chars val:'\techo only line >inert_file &&\n' span_id:126) (Token id:Id.Lit_Chars val:'\n' span_id:127) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit add file control_file inert_file &&\n'
            span_id: 128
          ) (Token id:Id.Lit_Chars val:'\ttest_tick &&\n' span_id:129) 
          (Token id:Id.Lit_Chars val:'\tgit commit -m "Initial" &&\n' span_id:130) (Token id:Id.Lit_Chars val:'\tgit tag initial &&\n' span_id:131) 
          (Token id:Id.Lit_Chars val:'\tgit branch side &&\n' span_id:132) (Token id:Id.Lit_Chars val:'\n' span_id:133) 
          (Token
            id: Id.Lit_Chars
            val: '\techo "* text=auto" >.gitattributes &&\n'
            span_id: 134
          ) (Token id:Id.Lit_Chars val:'\techo first line >file &&\n' span_id:135) 
          (Token id:Id.Lit_Chars val:'\tgit add .gitattributes file &&\n' span_id:136) (Token id:Id.Lit_Chars val:'\ttest_tick &&\n' span_id:137) 
          (Token id:Id.Lit_Chars val:'\tgit commit -m "normalize file" &&\n' span_id:138) (Token id:Id.Lit_Chars val:'\n' span_id:139) 
          (Token
            id: Id.Lit_Chars
            val: '\techo same line | append_cr >>file &&\n'
            span_id: 140
          ) (Token id:Id.Lit_Chars val:'\techo same line >>control_file &&\n' span_id:141) 
          (Token id:Id.Lit_Chars val:'\tgit add file control_file &&\n' span_id:142) (Token id:Id.Lit_Chars val:'\ttest_tick &&\n' span_id:143) 
          (Token id:Id.Lit_Chars val:'\tgit commit -m "add line from a" &&\n' span_id:144) (Token id:Id.Lit_Chars val:'\tgit tag a &&\n' span_id:145) 
          (Token id:Id.Lit_Chars val:'\n' span_id:146) (Token id:Id.Lit_Chars val:'\tgit rm .gitattributes &&\n' span_id:147) 
          (Token id:Id.Lit_Chars val:'\trm file &&\n' span_id:148) (Token id:Id.Lit_Chars val:'\tgit checkout file &&\n' span_id:149) 
          (Token id:Id.Lit_Chars val:'\ttest_tick &&\n' span_id:150) (Token id:Id.Lit_Chars val:'\tgit commit -m "remove .gitattributes" &&\n' span_id:151) 
          (Token id:Id.Lit_Chars val:'\tgit tag c &&\n' span_id:152) (Token id:Id.Lit_Chars val:'\n' span_id:153) 
          (Token id:Id.Lit_Chars val:'\tgit checkout side &&\n' span_id:154) (Token id:Id.Lit_Chars val:'\techo same line | append_cr >>file &&\n' span_id:155) 
          (Token id:Id.Lit_Chars val:'\techo same line >>control_file &&\n' span_id:156) (Token id:Id.Lit_Chars val:'\tgit add file control_file &&\n' span_id:157) 
          (Token id:Id.Lit_Chars val:'\ttest_tick &&\n' span_id:158) (Token id:Id.Lit_Chars val:'\tgit commit -m "add line from b" &&\n' span_id:159) 
          (Token id:Id.Lit_Chars val:'\tgit tag b &&\n' span_id:160) (Token id:Id.Lit_Chars val:'\n' span_id:161) 
          (Token id:Id.Lit_Chars val:'\tgit checkout master\n' span_id:162)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'set up fuzz_conflict() helper' span_id:169))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:173) 
          (Token id:Id.Lit_Chars val:'\tfuzz_conflict() {\n' span_id:174) 
          (Token
            id: Id.Lit_Chars
            val: '\t\tsed $SED_OPTIONS -e "s/^\\([<>=]......\\) .*/\\1/" "$@"\n'
            span_id: 175
          ) (Token id:Id.Lit_Chars val:'\t}\n' span_id:176)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'Merge after setting text=auto' span_id:183))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:187) 
          (Token id:Id.Lit_Chars val:'\tcat <<-\\EOF >expected &&\n' span_id:188) (Token id:Id.Lit_Chars val:'\tfirst line\n' span_id:189) 
          (Token id:Id.Lit_Chars val:'\tsame line\n' span_id:190) (Token id:Id.Lit_Chars val:'\tEOF\n' span_id:191) (Token id:Id.Lit_Chars val:'\n' span_id:192) 
          (Token
            id: Id.Lit_Chars
            val: '\tif test_have_prereq NATIVE_CRLF; then\n'
            span_id: 193
          ) (Token id:Id.Lit_Chars val:'\t\tappend_cr <expected >expected.temp &&\n' span_id:194) 
          (Token id:Id.Lit_Chars val:'\t\tmv expected.temp expected\n' span_id:195) (Token id:Id.Lit_Chars val:'\tfi &&\n' span_id:196) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit config merge.renormalize true &&\n'
            span_id: 197
          ) (Token id:Id.Lit_Chars val:'\tgit rm -fr . &&\n' span_id:198) 
          (Token id:Id.Lit_Chars val:'\trm -f .gitattributes &&\n' span_id:199) (Token id:Id.Lit_Chars val:'\tgit reset --hard a &&\n' span_id:200) 
          (Token id:Id.Lit_Chars val:'\tgit merge b &&\n' span_id:201) (Token id:Id.Lit_Chars val:'\tcompare_files expected file\n' span_id:202)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'Merge addition of text=auto eol=LF' span_id:209))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:213) 
          (Token id:Id.Lit_Chars val:'\tgit config core.eol lf &&\n' span_id:214) (Token id:Id.Lit_Chars val:'\tcat <<-\\EOF >expected &&\n' span_id:215) 
          (Token id:Id.Lit_Chars val:'\tfirst line\n' span_id:216) (Token id:Id.Lit_Chars val:'\tsame line\n' span_id:217) 
          (Token id:Id.Lit_Chars val:'\tEOF\n' span_id:218) (Token id:Id.Lit_Chars val:'\n' span_id:219) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit config merge.renormalize true &&\n'
            span_id: 220
          ) (Token id:Id.Lit_Chars val:'\tgit rm -fr . &&\n' span_id:221) 
          (Token id:Id.Lit_Chars val:'\trm -f .gitattributes &&\n' span_id:222) (Token id:Id.Lit_Chars val:'\tgit reset --hard b &&\n' span_id:223) 
          (Token id:Id.Lit_Chars val:'\tgit merge a &&\n' span_id:224) (Token id:Id.Lit_Chars val:'\tcompare_files  expected file\n' span_id:225)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'Merge addition of text=auto eol=CRLF' span_id:232))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:236) 
          (Token id:Id.Lit_Chars val:'\tgit config core.eol crlf &&\n' span_id:237) (Token id:Id.Lit_Chars val:'\tcat <<-\\EOF >expected &&\n' span_id:238) 
          (Token id:Id.Lit_Chars val:'\tfirst line\n' span_id:239) (Token id:Id.Lit_Chars val:'\tsame line\n' span_id:240) 
          (Token id:Id.Lit_Chars val:'\tEOF\n' span_id:241) (Token id:Id.Lit_Chars val:'\n' span_id:242) 
          (Token
            id: Id.Lit_Chars
            val: '\tappend_cr <expected >expected.temp &&\n'
            span_id: 243
          ) (Token id:Id.Lit_Chars val:'\tmv expected.temp expected &&\n' span_id:244) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit config merge.renormalize true &&\n'
            span_id: 245
          ) (Token id:Id.Lit_Chars val:'\tgit rm -fr . &&\n' span_id:246) 
          (Token id:Id.Lit_Chars val:'\trm -f .gitattributes &&\n' span_id:247) (Token id:Id.Lit_Chars val:'\tgit reset --hard b &&\n' span_id:248) 
          (Token
            id: Id.Lit_Chars
            val: '\techo >&2 "After git reset --hard b" &&\n'
            span_id: 249
          ) (Token id:Id.Lit_Chars val:'\tgit ls-files -s --eol >&2 &&\n' span_id:250) 
          (Token id:Id.Lit_Chars val:'\tgit merge a &&\n' span_id:251) (Token id:Id.Lit_Chars val:'\tcompare_files  expected file\n' span_id:252)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'Detect CRLF/LF conflict after setting text=auto' span_id:259))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:263) 
          (Token id:Id.Lit_Chars val:'\tgit config core.eol native &&\n' span_id:264) (Token id:Id.Lit_Chars val:'\techo "<<<<<<<" >expected &&\n' span_id:265) 
          (Token id:Id.Lit_Chars val:'\techo first line >>expected &&\n' span_id:266) (Token id:Id.Lit_Chars val:'\techo same line >>expected &&\n' span_id:267) 
          (Token id:Id.Lit_Chars val:'\techo ======= >>expected &&\n' span_id:268) (Token id:Id.Lit_Chars val:'\techo first line | append_cr >>expected &&\n' span_id:269) 
          (Token
            id: Id.Lit_Chars
            val: '\techo same line | append_cr >>expected &&\n'
            span_id: 270
          ) (Token id:Id.Lit_Chars val:'\techo ">>>>>>>" >>expected &&\n' span_id:271) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit config merge.renormalize false &&\n'
            span_id: 272
          ) (Token id:Id.Lit_Chars val:'\trm -f .gitattributes &&\n' span_id:273) 
          (Token id:Id.Lit_Chars val:'\tgit reset --hard a &&\n' span_id:274) (Token id:Id.Lit_Chars val:'\ttest_must_fail git merge b &&\n' span_id:275) 
          (Token id:Id.Lit_Chars val:'\tfuzz_conflict file >file.fuzzy &&\n' span_id:276) (Token id:Id.Lit_Chars val:'\tcompare_files expected file.fuzzy\n' span_id:277)
        )
      }
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'Detect LF/CRLF conflict from addition of text=auto'
            span_id: 284
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:288) 
          (Token id:Id.Lit_Chars val:'\techo "<<<<<<<" >expected &&\n' span_id:289) (Token id:Id.Lit_Chars val:'\techo first line | append_cr >>expected &&\n' span_id:290) 
          (Token
            id: Id.Lit_Chars
            val: '\techo same line | append_cr >>expected &&\n'
            span_id: 291
          ) (Token id:Id.Lit_Chars val:'\techo ======= >>expected &&\n' span_id:292) 
          (Token id:Id.Lit_Chars val:'\techo first line >>expected &&\n' span_id:293) (Token id:Id.Lit_Chars val:'\techo same line >>expected &&\n' span_id:294) 
          (Token id:Id.Lit_Chars val:'\techo ">>>>>>>" >>expected &&\n' span_id:295) (Token id:Id.Lit_Chars val:'\tgit config merge.renormalize false &&\n' span_id:296) 
          (Token id:Id.Lit_Chars val:'\trm -f .gitattributes &&\n' span_id:297) (Token id:Id.Lit_Chars val:'\tgit reset --hard b &&\n' span_id:298) 
          (Token id:Id.Lit_Chars val:'\ttest_must_fail git merge a &&\n' span_id:299) (Token id:Id.Lit_Chars val:'\tfuzz_conflict file >file.fuzzy &&\n' span_id:300) 
          (Token id:Id.Lit_Chars val:'\tcompare_files expected file.fuzzy\n' span_id:301)
        )
      }
    )
    (C {(test_expect_failure)} 
      {(SQ (Token id:Id.Lit_Chars val:'checkout -m after setting text=auto' span_id:308))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:312) 
          (Token id:Id.Lit_Chars val:'\tcat <<-\\EOF >expected &&\n' span_id:313) (Token id:Id.Lit_Chars val:'\tfirst line\n' span_id:314) 
          (Token id:Id.Lit_Chars val:'\tsame line\n' span_id:315) (Token id:Id.Lit_Chars val:'\tEOF\n' span_id:316) (Token id:Id.Lit_Chars val:'\n' span_id:317) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit config merge.renormalize true &&\n'
            span_id: 318
          ) (Token id:Id.Lit_Chars val:'\tgit rm -fr . &&\n' span_id:319) 
          (Token id:Id.Lit_Chars val:'\trm -f .gitattributes &&\n' span_id:320) (Token id:Id.Lit_Chars val:'\tgit reset --hard initial &&\n' span_id:321) 
          (Token id:Id.Lit_Chars val:'\tgit checkout a -- . &&\n' span_id:322) (Token id:Id.Lit_Chars val:'\tgit checkout -m b &&\n' span_id:323) 
          (Token id:Id.Lit_Chars val:'\tcompare_files expected file\n' span_id:324)
        )
      }
    )
    (C {(test_expect_failure)} 
      {(SQ (Token id:Id.Lit_Chars val:'checkout -m addition of text=auto' span_id:331))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:335) 
          (Token id:Id.Lit_Chars val:'\tcat <<-\\EOF >expected &&\n' span_id:336) (Token id:Id.Lit_Chars val:'\tfirst line\n' span_id:337) 
          (Token id:Id.Lit_Chars val:'\tsame line\n' span_id:338) (Token id:Id.Lit_Chars val:'\tEOF\n' span_id:339) (Token id:Id.Lit_Chars val:'\n' span_id:340) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit config merge.renormalize true &&\n'
            span_id: 341
          ) (Token id:Id.Lit_Chars val:'\tgit rm -fr . &&\n' span_id:342) 
          (Token id:Id.Lit_Chars val:'\trm -f .gitattributes file &&\n' span_id:343) (Token id:Id.Lit_Chars val:'\tgit reset --hard initial &&\n' span_id:344) 
          (Token id:Id.Lit_Chars val:'\tgit checkout b -- . &&\n' span_id:345) (Token id:Id.Lit_Chars val:'\tgit checkout -m a &&\n' span_id:346) 
          (Token id:Id.Lit_Chars val:'\tcompare_files expected file\n' span_id:347)
        )
      }
    )
    (C {(test_expect_failure)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'cherry-pick patch from after text=auto was added'
            span_id: 354
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:358) 
          (Token id:Id.Lit_Chars val:'\tappend_cr <<-\\EOF >expected &&\n' span_id:359) (Token id:Id.Lit_Chars val:'\tfirst line\n' span_id:360) 
          (Token id:Id.Lit_Chars val:'\tsame line\n' span_id:361) (Token id:Id.Lit_Chars val:'\tEOF\n' span_id:362) (Token id:Id.Lit_Chars val:'\n' span_id:363) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit config merge.renormalize true &&\n'
            span_id: 364
          ) (Token id:Id.Lit_Chars val:'\tgit rm -fr . &&\n' span_id:365) 
          (Token id:Id.Lit_Chars val:'\tgit reset --hard b &&\n' span_id:366) (Token id:Id.Lit_Chars val:'\ttest_must_fail git cherry-pick a >err 2>&1 &&\n' span_id:367) 
          (Token id:Id.Lit_Chars val:'\tgrep "[Nn]othing added" err &&\n' span_id:368) (Token id:Id.Lit_Chars val:'\tcompare_files expected file\n' span_id:369)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'Test delete/normalize conflict' span_id:376))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:380) 
          (Token id:Id.Lit_Chars val:'\tgit checkout -f side &&\n' span_id:381) (Token id:Id.Lit_Chars val:'\tgit rm -fr . &&\n' span_id:382) 
          (Token id:Id.Lit_Chars val:'\trm -f .gitattributes &&\n' span_id:383) (Token id:Id.Lit_Chars val:'\tgit reset --hard initial &&\n' span_id:384) 
          (Token id:Id.Lit_Chars val:'\tgit rm file &&\n' span_id:385) (Token id:Id.Lit_Chars val:'\tgit commit -m "remove file" &&\n' span_id:386) 
          (Token id:Id.Lit_Chars val:'\tgit checkout master &&\n' span_id:387) (Token id:Id.Lit_Chars val:'\tgit reset --hard a^ &&\n' span_id:388) 
          (Token id:Id.Lit_Chars val:'\tgit merge side\n' span_id:389)
        )
      }
    )
    (C {(test_done)})
  ]
)