(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:'git merge\n' span_id:6) 
                (Token id:Id.Lit_Chars val:'\n' span_id:7) (Token id:Id.Lit_Chars val:'Testing pull.* configuration parsing.' span_id:8)
              )
            }
          spids: [4]
        )
      ]
    )
    (C {(.)} {(./test-lib.sh)})
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:setup span_id:20))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:24) 
          (Token id:Id.Lit_Chars val:'\techo c0 >c0.c &&\n' span_id:25) (Token id:Id.Lit_Chars val:'\tgit add c0.c &&\n' span_id:26) 
          (Token id:Id.Lit_Chars val:'\tgit commit -m c0 &&\n' span_id:27) (Token id:Id.Lit_Chars val:'\tgit tag c0 &&\n' span_id:28) 
          (Token id:Id.Lit_Chars val:'\techo c1 >c1.c &&\n' span_id:29) (Token id:Id.Lit_Chars val:'\tgit add c1.c &&\n' span_id:30) 
          (Token id:Id.Lit_Chars val:'\tgit commit -m c1 &&\n' span_id:31) (Token id:Id.Lit_Chars val:'\tgit tag c1 &&\n' span_id:32) 
          (Token id:Id.Lit_Chars val:'\tgit reset --hard c0 &&\n' span_id:33) (Token id:Id.Lit_Chars val:'\techo c2 >c2.c &&\n' span_id:34) 
          (Token id:Id.Lit_Chars val:'\tgit add c2.c &&\n' span_id:35) (Token id:Id.Lit_Chars val:'\tgit commit -m c2 &&\n' span_id:36) 
          (Token id:Id.Lit_Chars val:'\tgit tag c2 &&\n' span_id:37) (Token id:Id.Lit_Chars val:'\tgit reset --hard c0 &&\n' span_id:38) 
          (Token id:Id.Lit_Chars val:'\techo c3 >c3.c &&\n' span_id:39) (Token id:Id.Lit_Chars val:'\tgit add c3.c &&\n' span_id:40) 
          (Token id:Id.Lit_Chars val:'\tgit commit -m c3 &&\n' span_id:41) (Token id:Id.Lit_Chars val:'\tgit tag c3\n' span_id:42)
        )
      }
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'merge c1 with c2' span_id:49))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:53) 
          (Token id:Id.Lit_Chars val:'\tgit reset --hard c1 &&\n' span_id:54) (Token id:Id.Lit_Chars val:'\ttest -f c0.c &&\n' span_id:55) 
          (Token id:Id.Lit_Chars val:'\ttest -f c1.c &&\n' span_id:56) (Token id:Id.Lit_Chars val:'\ttest ! -f c2.c &&\n' span_id:57) 
          (Token id:Id.Lit_Chars val:'\ttest ! -f c3.c &&\n' span_id:58) (Token id:Id.Lit_Chars val:'\tgit merge c2 &&\n' span_id:59) 
          (Token id:Id.Lit_Chars val:'\ttest -f c1.c &&\n' span_id:60) (Token id:Id.Lit_Chars val:'\ttest -f c2.c\n' span_id:61)
        )
      }
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'fast-forward pull succeeds with "true" in pull.ff'
            span_id: 68
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:72) 
          (Token id:Id.Lit_Chars val:'\tgit reset --hard c0 &&\n' span_id:73) (Token id:Id.Lit_Chars val:'\ttest_config pull.ff true &&\n' span_id:74) 
          (Token id:Id.Lit_Chars val:'\tgit pull . c1 &&\n' span_id:75) (Token id:Id.Lit_Chars val:'\ttest "$(git rev-parse HEAD)" = "$(git rev-parse c1)"\n' span_id:76)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'pull.ff=true overrides merge.ff=false' span_id:83))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:87) 
          (Token id:Id.Lit_Chars val:'\tgit reset --hard c0 &&\n' span_id:88) (Token id:Id.Lit_Chars val:'\ttest_config merge.ff false &&\n' span_id:89) 
          (Token id:Id.Lit_Chars val:'\ttest_config pull.ff true &&\n' span_id:90) (Token id:Id.Lit_Chars val:'\tgit pull . c1 &&\n' span_id:91) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest "$(git rev-parse HEAD)" = "$(git rev-parse c1)"\n'
            span_id: 92
          )
        )
      }
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'fast-forward pull creates merge with "false" in pull.ff'
            span_id: 99
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:103) 
          (Token id:Id.Lit_Chars val:'\tgit reset --hard c0 &&\n' span_id:104) (Token id:Id.Lit_Chars val:'\ttest_config pull.ff false &&\n' span_id:105) 
          (Token id:Id.Lit_Chars val:'\tgit pull . c1 &&\n' span_id:106) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest "$(git rev-parse HEAD^1)" = "$(git rev-parse c0)" &&\n'
            span_id: 107
          ) (Token id:Id.Lit_Chars val:'\ttest "$(git rev-parse HEAD^2)" = "$(git rev-parse c1)"\n' span_id:108)
        )
      }
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'pull prevents non-fast-forward with "only" in pull.ff'
            span_id: 115
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:119) 
          (Token id:Id.Lit_Chars val:'\tgit reset --hard c1 &&\n' span_id:120) (Token id:Id.Lit_Chars val:'\ttest_config pull.ff only &&\n' span_id:121) 
          (Token id:Id.Lit_Chars val:'\ttest_must_fail git pull . c3\n' span_id:122)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'merge c1 with c2 (ours in pull.twohead)' span_id:129))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:133) 
          (Token id:Id.Lit_Chars val:'\tgit reset --hard c1 &&\n' span_id:134) (Token id:Id.Lit_Chars val:'\tgit config pull.twohead ours &&\n' span_id:135) 
          (Token id:Id.Lit_Chars val:'\tgit merge c2 &&\n' span_id:136) (Token id:Id.Lit_Chars val:'\ttest -f c1.c &&\n' span_id:137) 
          (Token id:Id.Lit_Chars val:'\t! test -f c2.c\n' span_id:138)
        )
      }
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'merge c1 with c2 and c3 (recursive in pull.octopus)'
            span_id: 145
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:149) 
          (Token id:Id.Lit_Chars val:'\tgit reset --hard c1 &&\n' span_id:150) (Token id:Id.Lit_Chars val:'\tgit config pull.octopus "recursive" &&\n' span_id:151) 
          (Token id:Id.Lit_Chars val:'\ttest_must_fail git merge c2 c3 &&\n' span_id:152) (Token id:Id.Lit_Chars val:'\ttest "$(git rev-parse c1)" = "$(git rev-parse HEAD)"\n' span_id:153)
        )
      }
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'merge c1 with c2 and c3 (recursive and octopus in pull.octopus)'
            span_id: 160
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:164) 
          (Token id:Id.Lit_Chars val:'\tgit reset --hard c1 &&\n' span_id:165) (Token id:Id.Lit_Chars val:'\tgit config pull.octopus "recursive octopus" &&\n' span_id:166) 
          (Token id:Id.Lit_Chars val:'\tgit merge c2 c3 &&\n' span_id:167) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest "$(git rev-parse c1)" != "$(git rev-parse HEAD)" &&\n'
            span_id: 168
          ) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest "$(git rev-parse c1)" = "$(git rev-parse HEAD^1)" &&\n'
            span_id: 169
          ) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest "$(git rev-parse c2)" = "$(git rev-parse HEAD^2)" &&\n'
            span_id: 170
          ) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest "$(git rev-parse c3)" = "$(git rev-parse HEAD^3)" &&\n'
            span_id: 171
          ) (Token id:Id.Lit_Chars val:'\tgit diff --exit-code &&\n' span_id:172) 
          (Token id:Id.Lit_Chars val:'\ttest -f c0.c &&\n' span_id:173) (Token id:Id.Lit_Chars val:'\ttest -f c1.c &&\n' span_id:174) 
          (Token id:Id.Lit_Chars val:'\ttest -f c2.c &&\n' span_id:175) (Token id:Id.Lit_Chars val:'\ttest -f c3.c\n' span_id:176)
        )
      }
    )
    (command.ShFunction
      name: conflict_count
      body: 
        (command.BraceGroup
          children: [
            (command.Pipeline
              children: [
                (command.BraceGroup
                  children: [
                    (C {(git)} {(diff-files)} {(--name-only)})
                    (C {(git)} {(ls-files)} {(--unmerged)})
                  ]
                )
                (C {(wc)} {(-l)})
              ]
              negated: F
            )
          ]
        )
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'setup conflicted merge' span_id:246))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:250) 
          (Token id:Id.Lit_Chars val:'\tgit reset --hard c0 &&\n' span_id:251) (Token id:Id.Lit_Chars val:'\techo A >conflict.c &&\n' span_id:252) 
          (Token id:Id.Lit_Chars val:'\tgit add conflict.c &&\n' span_id:253) (Token id:Id.Lit_Chars val:'\techo contents >foo.c &&\n' span_id:254) 
          (Token id:Id.Lit_Chars val:'\tgit add foo.c &&\n' span_id:255) (Token id:Id.Lit_Chars val:'\tgit commit -m c4 &&\n' span_id:256) 
          (Token id:Id.Lit_Chars val:'\tgit tag c4 &&\n' span_id:257) (Token id:Id.Lit_Chars val:'\techo B >conflict.c &&\n' span_id:258) 
          (Token id:Id.Lit_Chars val:'\tgit add conflict.c &&\n' span_id:259) (Token id:Id.Lit_Chars val:'\tgit mv foo.c bar.c &&\n' span_id:260) 
          (Token id:Id.Lit_Chars val:'\tgit commit -m c5 &&\n' span_id:261) (Token id:Id.Lit_Chars val:'\tgit tag c5 &&\n' span_id:262) 
          (Token id:Id.Lit_Chars val:'\tgit reset --hard c4 &&\n' span_id:263) (Token id:Id.Lit_Chars val:'\techo C >conflict.c &&\n' span_id:264) 
          (Token id:Id.Lit_Chars val:'\tgit add conflict.c &&\n' span_id:265) (Token id:Id.Lit_Chars val:'\techo secondline >> foo.c &&\n' span_id:266) 
          (Token id:Id.Lit_Chars val:'\tgit add foo.c &&\n' span_id:267) (Token id:Id.Lit_Chars val:'\tgit commit -m c6 &&\n' span_id:268) 
          (Token id:Id.Lit_Chars val:'\tgit tag c6\n' span_id:269)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'merge picks up the best result' span_id:283))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:287) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit config --unset-all pull.twohead &&\n'
            span_id: 288
          ) (Token id:Id.Lit_Chars val:'\tgit reset --hard c5 &&\n' span_id:289) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest_must_fail git merge -s resolve c6 &&\n'
            span_id: 290
          ) (Token id:Id.Lit_Chars val:'\tresolve_count=$(conflict_count) &&\n' span_id:291) 
          (Token id:Id.Lit_Chars val:'\tgit reset --hard c5 &&\n' span_id:292) (Token id:Id.Lit_Chars val:'\ttest_must_fail git merge -s recursive c6 &&\n' span_id:293) 
          (Token
            id: Id.Lit_Chars
            val: '\trecursive_count=$(conflict_count) &&\n'
            span_id: 294
          ) (Token id:Id.Lit_Chars val:'\tgit reset --hard c5 &&\n' span_id:295) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest_must_fail git merge -s recursive -s resolve c6 &&\n'
            span_id: 296
          ) (Token id:Id.Lit_Chars val:'\tauto_count=$(conflict_count) &&\n' span_id:297) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest $auto_count = $recursive_count &&\n'
            span_id: 298
          ) (Token id:Id.Lit_Chars val:'\ttest $auto_count != $resolve_count\n' span_id:299)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'merge picks up the best result (from config)' span_id:306))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:310) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit config pull.twohead "recursive resolve" &&\n'
            span_id: 311
          ) (Token id:Id.Lit_Chars val:'\tgit reset --hard c5 &&\n' span_id:312) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest_must_fail git merge -s resolve c6 &&\n'
            span_id: 313
          ) (Token id:Id.Lit_Chars val:'\tresolve_count=$(conflict_count) &&\n' span_id:314) 
          (Token id:Id.Lit_Chars val:'\tgit reset --hard c5 &&\n' span_id:315) (Token id:Id.Lit_Chars val:'\ttest_must_fail git merge -s recursive c6 &&\n' span_id:316) 
          (Token
            id: Id.Lit_Chars
            val: '\trecursive_count=$(conflict_count) &&\n'
            span_id: 317
          ) (Token id:Id.Lit_Chars val:'\tgit reset --hard c5 &&\n' span_id:318) 
          (Token id:Id.Lit_Chars val:'\ttest_must_fail git merge c6 &&\n' span_id:319) (Token id:Id.Lit_Chars val:'\tauto_count=$(conflict_count) &&\n' span_id:320) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest $auto_count = $recursive_count &&\n'
            span_id: 321
          ) (Token id:Id.Lit_Chars val:'\ttest $auto_count != $resolve_count\n' span_id:322)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'merge errors out on invalid strategy' span_id:329))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:333) 
          (Token id:Id.Lit_Chars val:'\tgit config pull.twohead "foobar" &&\n' span_id:334) (Token id:Id.Lit_Chars val:'\tgit reset --hard c5 &&\n' span_id:335) 
          (Token id:Id.Lit_Chars val:'\ttest_must_fail git merge c6\n' span_id:336)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'merge errors out on invalid strategy' span_id:343))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:347) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit config --unset-all pull.twohead &&\n'
            span_id: 348
          ) (Token id:Id.Lit_Chars val:'\tgit reset --hard c5 &&\n' span_id:349) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest_must_fail git merge -s "resolve recursive" c6\n'
            span_id: 350
          )
        )
      }
    )
    (C {(test_done)})
  ]
)