(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 log' span_id:6))}
          spids: [4]
        )
      ]
    )
    (C {(.)} {(./test-lib.sh)})
    (C {(.)} {(DQ ($ Id.VSub_DollarName '$TEST_DIRECTORY') (/lib-gpg.sh))})
    (C {(test_expect_success)} {(setup)} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:27) (Token id:Id.Lit_Chars val:'\n' span_id:28) 
          (Token id:Id.Lit_Chars val:'\techo one >one &&\n' span_id:29) (Token id:Id.Lit_Chars val:'\tgit add one &&\n' span_id:30) 
          (Token id:Id.Lit_Chars val:'\ttest_tick &&\n' span_id:31) (Token id:Id.Lit_Chars val:'\tgit commit -m initial &&\n' span_id:32) 
          (Token id:Id.Lit_Chars val:'\n' span_id:33) (Token id:Id.Lit_Chars val:'\techo ichi >one &&\n' span_id:34) 
          (Token id:Id.Lit_Chars val:'\tgit add one &&\n' span_id:35) (Token id:Id.Lit_Chars val:'\ttest_tick &&\n' span_id:36) 
          (Token id:Id.Lit_Chars val:'\tgit commit -m second &&\n' span_id:37) (Token id:Id.Lit_Chars val:'\n' span_id:38) 
          (Token id:Id.Lit_Chars val:'\tgit mv one ichi &&\n' span_id:39) (Token id:Id.Lit_Chars val:'\ttest_tick &&\n' span_id:40) 
          (Token id:Id.Lit_Chars val:'\tgit commit -m third &&\n' span_id:41) (Token id:Id.Lit_Chars val:'\n' span_id:42) 
          (Token id:Id.Lit_Chars val:'\tcp ichi ein &&\n' span_id:43) (Token id:Id.Lit_Chars val:'\tgit add ein &&\n' span_id:44) 
          (Token id:Id.Lit_Chars val:'\ttest_tick &&\n' span_id:45) (Token id:Id.Lit_Chars val:'\tgit commit -m fourth &&\n' span_id:46) 
          (Token id:Id.Lit_Chars val:'\n' span_id:47) (Token id:Id.Lit_Chars val:'\tmkdir a &&\n' span_id:48) 
          (Token id:Id.Lit_Chars val:'\techo ni >a/two &&\n' span_id:49) (Token id:Id.Lit_Chars val:'\tgit add a/two &&\n' span_id:50) 
          (Token id:Id.Lit_Chars val:'\ttest_tick &&\n' span_id:51) (Token id:Id.Lit_Chars val:'\tgit commit -m fifth  &&\n' span_id:52) 
          (Token id:Id.Lit_Chars val:'\n' span_id:53) (Token id:Id.Lit_Chars val:'\tgit rm a/two &&\n' span_id:54) 
          (Token id:Id.Lit_Chars val:'\ttest_tick &&\n' span_id:55) (Token id:Id.Lit_Chars val:'\tgit commit -m sixth\n' span_id:56) 
          (Token id:Id.Lit_Chars val:'\n' span_id:57)
        )
      }
    )
    (command.Simple
      words: [
        {(printf)}
        {
          (DQ (sixth) (Id.Lit_Other '\\') (nfifth) (Id.Lit_Other '\\') (nfourth) (Id.Lit_Other '\\') 
            (nthird) (Id.Lit_Other '\\') (nsecond) (Id.Lit_Other '\\') (ninitial)
          )
        }
      ]
      redirects: [
        (redir.Redir op:(Token id:Id.Redir_Great val:'>' span_id:77) fd:-1 arg_word:{(expect)})
      ]
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:pretty span_id:84))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:88) (Token id:Id.Lit_Chars val:'\n' span_id:89) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit log --pretty="format:%s" > actual &&\n'
            span_id: 90
          ) (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual\n' span_id:91)
        )
      }
    )
    (command.Simple
      words: [
        {(printf)}
        {
          (DQ (sixth) (Id.Lit_Other '\\') (nfifth) (Id.Lit_Other '\\') (nfourth) (Id.Lit_Other '\\') 
            (nthird) (Id.Lit_Other '\\') (nsecond) (Id.Lit_Other '\\') (ninitial) (Id.Lit_Other '\\') (n)
          )
        }
      ]
      redirects: [
        (redir.Redir
          op: (Token id:Id.Redir_Great val:'>' span_id:113)
          fd: -1
          arg_word: {(expect)}
        )
      ]
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'pretty (tformat)' span_id:120))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:124) (Token id:Id.Lit_Chars val:'\n' span_id:125) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit log --pretty="tformat:%s" > actual &&\n'
            span_id: 126
          ) (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual\n' span_id:127)
        )
      }
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'pretty (shortcut)' span_id:134))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:138) (Token id:Id.Lit_Chars val:'\n' span_id:139) 
          (Token id:Id.Lit_Chars val:'\tgit log --pretty="%s" > actual &&\n' span_id:140) (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual\n' span_id:141)
        )
      }
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:format span_id:148))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:152) (Token id:Id.Lit_Chars val:'\n' span_id:153) 
          (Token id:Id.Lit_Chars val:'\tgit log --format="%s" > actual &&\n' span_id:154) (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual\n' span_id:155)
        )
      }
    )
    (command.Simple
      words: [{(cat)}]
      redirects: [
        (redir.Redir
          op: (Token id:Id.Redir_Great val:'>' span_id:161)
          fd: -1
          arg_word: {(expect)}
        )
        (redir.HereDoc
          op: (Token id:Id.Redir_DLess val:'<<' span_id:165)
          fd: -1
          here_begin: {(EOF)}
          here_end_span_id: 176
          stdin_parts: [
            (' This is\n')
            ('  the sixth\n')
            ('  commit.\n')
            (' This is\n')
            ('  the fifth\n')
            ('  commit.\n')
          ]
        )
      ]
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'format %w(11,1,2)' span_id:181))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:185) (Token id:Id.Lit_Chars val:'\n' span_id:186) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit log -2 --format="%w(11,1,2)This is the %s commit." > actual &&\n'
            span_id: 187
          ) (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual\n' span_id:188)
        )
      }
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'format %w(,1,2)' span_id:195))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:199) (Token id:Id.Lit_Chars val:'\n' span_id:200) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit log -2 --format="%w(,1,2)This is%nthe %s%ncommit." > actual &&\n'
            span_id: 201
          ) (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual\n' span_id:202)
        )
      }
    )
    (command.Simple
      words: [{(cat)}]
      redirects: [
        (redir.Redir
          op: (Token id:Id.Redir_Great val:'>' span_id:208)
          fd: -1
          arg_word: {(expect)}
        )
        (redir.HereDoc
          op: (Token id:Id.Redir_DLess val:'<<' span_id:212)
          fd: -1
          here_begin: {(EOF)}
          here_end_span_id: 223
          stdin_parts: [
            ('804a787 sixth\n')
            ('394ef78 fifth\n')
            ('5d31159 fourth\n')
            ('2fbe8c0 third\n')
            ('f7dab8e second\n')
            ('3a2fdcb initial\n')
          ]
        )
      ]
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:oneline span_id:227))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:231) (Token id:Id.Lit_Chars val:'\n' span_id:232) 
          (Token id:Id.Lit_Chars val:'\tgit log --oneline > actual &&\n' span_id:233) (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual\n' span_id:234)
        )
      }
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'diff-filter=A' span_id:241))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:245) (Token id:Id.Lit_Chars val:'\n' span_id:246) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit log --no-renames --pretty="format:%s" --diff-filter=A HEAD > actual &&\n'
            span_id: 247
          ) 
          (Token
            id: Id.Lit_Chars
            val: 
'\tgit log --no-renames --pretty="format:%s" --diff-filter A HEAD > actual-separate &&\n'
            span_id: 248
          ) (Token id:Id.Lit_Chars val:'\tprintf "fifth\\nfourth\\nthird\\ninitial" > expect &&\n' span_id:249) 
          (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual &&\n' span_id:250) (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual-separate\n' span_id:251) 
          (Token id:Id.Lit_Chars val:'\n' span_id:252)
        )
      }
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'diff-filter=M' span_id:259))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:263) (Token id:Id.Lit_Chars val:'\n' span_id:264) 
          (Token
            id: Id.Lit_Chars
            val: '\tactual=$(git log --pretty="format:%s" --diff-filter=M HEAD) &&\n'
            span_id: 265
          ) (Token id:Id.Lit_Chars val:'\texpect=$(echo second) &&\n' span_id:266) 
          (Token id:Id.Lit_Chars val:'\tverbose test "$actual" = "$expect"\n' span_id:267) (Token id:Id.Lit_Chars val:'\n' span_id:268)
        )
      }
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'diff-filter=D' span_id:275))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:279) (Token id:Id.Lit_Chars val:'\n' span_id:280) 
          (Token
            id: Id.Lit_Chars
            val: '\tactual=$(git log --no-renames --pretty="format:%s" --diff-filter=D HEAD) &&\n'
            span_id: 281
          ) (Token id:Id.Lit_Chars val:'\texpect=$(echo sixth ; echo third) &&\n' span_id:282) 
          (Token id:Id.Lit_Chars val:'\tverbose test "$actual" = "$expect"\n' span_id:283) (Token id:Id.Lit_Chars val:'\n' span_id:284)
        )
      }
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'diff-filter=R' span_id:291))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:295) (Token id:Id.Lit_Chars val:'\n' span_id:296) 
          (Token
            id: Id.Lit_Chars
            val: '\tactual=$(git log -M --pretty="format:%s" --diff-filter=R HEAD) &&\n'
            span_id: 297
          ) (Token id:Id.Lit_Chars val:'\texpect=$(echo third) &&\n' span_id:298) 
          (Token id:Id.Lit_Chars val:'\tverbose test "$actual" = "$expect"\n' span_id:299) (Token id:Id.Lit_Chars val:'\n' span_id:300)
        )
      }
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'diff-filter=C' span_id:307))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:311) (Token id:Id.Lit_Chars val:'\n' span_id:312) 
          (Token
            id: Id.Lit_Chars
            val: '\tactual=$(git log -C -C --pretty="format:%s" --diff-filter=C HEAD) &&\n'
            span_id: 313
          ) (Token id:Id.Lit_Chars val:'\texpect=$(echo fourth) &&\n' span_id:314) 
          (Token id:Id.Lit_Chars val:'\tverbose test "$actual" = "$expect"\n' span_id:315) (Token id:Id.Lit_Chars val:'\n' span_id:316)
        )
      }
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'git log --follow' span_id:323))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:327) (Token id:Id.Lit_Chars val:'\n' span_id:328) 
          (Token
            id: Id.Lit_Chars
            val: '\tactual=$(git log --follow --pretty="format:%s" ichi) &&\n'
            span_id: 329
          ) (Token id:Id.Lit_Chars val:'\texpect=$(echo third ; echo second ; echo initial) &&\n' span_id:330) 
          (Token id:Id.Lit_Chars val:'\tverbose test "$actual" = "$expect"\n' span_id:331)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'git config log.follow works like --follow' span_id:338))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:342) 
          (Token id:Id.Lit_Chars val:'\ttest_config log.follow true &&\n' span_id:343) (Token id:Id.Lit_Chars val:'\tactual=$(git log --pretty="format:%s" ichi) &&\n' span_id:344) 
          (Token
            id: Id.Lit_Chars
            val: '\texpect=$(echo third ; echo second ; echo initial) &&\n'
            span_id: 345
          ) (Token id:Id.Lit_Chars val:'\tverbose test "$actual" = "$expect"\n' span_id:346)
        )
      }
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'git config log.follow does not die with multiple paths'
            span_id: 353
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:357) 
          (Token id:Id.Lit_Chars val:'\ttest_config log.follow true &&\n' span_id:358) (Token id:Id.Lit_Chars val:'\tgit log --pretty="format:%s" ichi ein\n' span_id:359)
        )
      }
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'git config log.follow does not die with no paths'
            span_id: 366
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:370) 
          (Token id:Id.Lit_Chars val:'\ttest_config log.follow true &&\n' span_id:371) (Token id:Id.Lit_Chars val:'\tgit log --\n' span_id:372)
        )
      }
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'git config log.follow is overridden by --no-follow'
            span_id: 379
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:383) 
          (Token id:Id.Lit_Chars val:'\ttest_config log.follow true &&\n' span_id:384) 
          (Token
            id: Id.Lit_Chars
            val: '\tactual=$(git log --no-follow --pretty="format:%s" ichi) &&\n'
            span_id: 385
          ) (Token id:Id.Lit_Chars val:'\texpect="third" &&\n' span_id:386) 
          (Token id:Id.Lit_Chars val:'\tverbose test "$actual" = "$expect"\n' span_id:387)
        )
      }
    )
    (command.Simple
      words: [{(cat)}]
      redirects: [
        (redir.Redir
          op: (Token id:Id.Redir_Great val:'>' span_id:393)
          fd: -1
          arg_word: {(expect)}
        )
        (redir.HereDoc
          op: (Token id:Id.Redir_DLess val:'<<' span_id:397)
          fd: -1
          here_begin: {(EOF)}
          here_end_span_id: 405
          stdin_parts: [('804a787 sixth\n') ('394ef78 fifth\n') ('5d31159 fourth\n')]
        )
      ]
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'git log --no-walk <commits> sorts by commit time'
            span_id: 409
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:413) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit log --no-walk --oneline 5d31159 804a787 394ef78 > actual &&\n'
            span_id: 414
          ) (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual\n' span_id:415)
        )
      }
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'git log --no-walk=sorted <commits> sorts by commit time'
            span_id: 422
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:426) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit log --no-walk=sorted --oneline 5d31159 804a787 394ef78 > actual &&\n'
            span_id: 427
          ) (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual\n' span_id:428)
        )
      }
    )
    (command.Simple
      words: [{(cat)}]
      redirects: [
        (redir.Redir
          op: (Token id:Id.Redir_Great val:'>' span_id:434)
          fd: -1
          arg_word: {(expect)}
        )
        (redir.HereDoc
          op: (Token id:Id.Redir_DLess val:'<<' span_id:438)
          fd: -1
          here_begin: {(EOF)}
          here_end_span_id: 446
          stdin_parts: [('=== 804a787 sixth\n') ('=== 394ef78 fifth\n') ('=== 5d31159 fourth\n')]
        )
      ]
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'git log --line-prefix="=== " --no-walk <commits> sorts by commit time'
            span_id: 450
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:454) 
          (Token
            id: Id.Lit_Chars
            val: 
'\tgit log --line-prefix="=== " --no-walk --oneline 5d31159 804a787 394ef78 > actual &&\n'
            span_id: 455
          ) (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual\n' span_id:456)
        )
      }
    )
    (command.Simple
      words: [{(cat)}]
      redirects: [
        (redir.Redir
          op: (Token id:Id.Redir_Great val:'>' span_id:462)
          fd: -1
          arg_word: {(expect)}
        )
        (redir.HereDoc
          op: (Token id:Id.Redir_DLess val:'<<' span_id:466)
          fd: -1
          here_begin: {(EOF)}
          here_end_span_id: 474
          stdin_parts: [('5d31159 fourth\n') ('804a787 sixth\n') ('394ef78 fifth\n')]
        )
      ]
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'git log --no-walk=unsorted <commits> leaves list of commits as given'
            span_id: 478
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:482) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit log --no-walk=unsorted --oneline 5d31159 804a787 394ef78 > actual &&\n'
            span_id: 483
          ) (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual\n' span_id:484)
        )
      }
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'git show <commits> leaves list of commits as given'
            span_id: 491
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:495) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit show --oneline -s 5d31159 804a787 394ef78 > actual &&\n'
            span_id: 496
          ) (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual\n' span_id:497)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'setup case sensitivity tests' span_id:504))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:508) 
          (Token id:Id.Lit_Chars val:'\techo case >one &&\n' span_id:509) (Token id:Id.Lit_Chars val:'\ttest_tick &&\n' span_id:510) 
          (Token id:Id.Lit_Chars val:'\tgit add one &&\n' span_id:511) (Token id:Id.Lit_Chars val:'\tgit commit -a -m Second\n' span_id:512)
        )
      }
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'log --grep' span_id:519))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:523) 
          (Token id:Id.Lit_Chars val:'\techo second >expect &&\n' span_id:524) (Token id:Id.Lit_Chars val:'\tgit log -1 --pretty="tformat:%s" --grep=sec >actual &&\n' span_id:525) 
          (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual\n' span_id:526)
        )
      }
    )
    (command.Simple
      words: [{(cat)}]
      redirects: [
        (redir.Redir
          op: (Token id:Id.Redir_Great val:'>' span_id:532)
          fd: -1
          arg_word: {(expect)}
        )
        (redir.HereDoc
          op: (Token id:Id.Redir_DLess val:'<<' span_id:536)
          fd: -1
          here_begin: {(EOF)}
          here_end_span_id: 543
          stdin_parts: [('second\n') ('initial\n')]
        )
      ]
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'log --invert-grep --grep' span_id:547))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:551) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit log --pretty="tformat:%s" --invert-grep --grep=th --grep=Sec >actual &&\n'
            span_id: 552
          ) (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual\n' span_id:553)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'log --invert-grep --grep -i' span_id:560))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:564) 
          (Token id:Id.Lit_Chars val:'\techo initial >expect &&\n' span_id:565) 
          (Token
            id: Id.Lit_Chars
            val: 
'\tgit log --pretty="tformat:%s" --invert-grep -i --grep=th --grep=Sec >actual &&\n'
            span_id: 566
          ) (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual\n' span_id:567)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'log --grep option parsing' span_id:574))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:578) 
          (Token id:Id.Lit_Chars val:'\techo second >expect &&\n' span_id:579) (Token id:Id.Lit_Chars val:'\tgit log -1 --pretty="tformat:%s" --grep sec >actual &&\n' span_id:580) 
          (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual &&\n' span_id:581) (Token id:Id.Lit_Chars val:'\ttest_must_fail git log -1 --pretty="tformat:%s" --grep\n' span_id:582)
        )
      }
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'log -i --grep' span_id:589))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:593) 
          (Token id:Id.Lit_Chars val:'\techo Second >expect &&\n' span_id:594) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit log -1 --pretty="tformat:%s" -i --grep=sec >actual &&\n'
            span_id: 595
          ) (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual\n' span_id:596)
        )
      }
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'log --grep -i' span_id:603))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:607) 
          (Token id:Id.Lit_Chars val:'\techo Second >expect &&\n' span_id:608) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit log -1 --pretty="tformat:%s" --grep=sec -i >actual &&\n'
            span_id: 609
          ) (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual\n' span_id:610)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'log -F -E --grep=<ere> uses ere' span_id:617))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:621) 
          (Token id:Id.Lit_Chars val:'\techo second >expect &&\n' span_id:622) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit log -1 --pretty="tformat:%s" -F -E --grep=s.c.nd >actual &&\n'
            span_id: 623
          ) (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual\n' span_id:624)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'log with grep.patternType configuration' span_id:631))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:635) 
          (Token id:Id.Lit_Chars val:'\t>expect &&\n' span_id:636) (Token id:Id.Lit_Chars val:'\tgit -c grep.patterntype=fixed \\\n' span_id:637) 
          (Token
            id: Id.Lit_Chars
            val: '\tlog -1 --pretty=tformat:%s --grep=s.c.nd >actual &&\n'
            span_id: 638
          ) (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual\n' span_id:639)
        )
      }
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'log with grep.patternType configuration and command line'
            span_id: 646
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:650) 
          (Token id:Id.Lit_Chars val:'\techo second >expect &&\n' span_id:651) (Token id:Id.Lit_Chars val:'\tgit -c grep.patterntype=fixed \\\n' span_id:652) 
          (Token
            id: Id.Lit_Chars
            val: '\tlog -1 --pretty=tformat:%s --basic-regexp --grep=s.c.nd >actual &&\n'
            span_id: 653
          ) (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual\n' span_id:654)
        )
      }
    )
    (command.Simple
      words: [{(cat)}]
      redirects: [
        (redir.Redir
          op: (Token id:Id.Redir_Great val:'>' span_id:660)
          fd: -1
          arg_word: {(expect)}
        )
        (redir.HereDoc
          op: (Token id:Id.Redir_DLess val:'<<' span_id:664)
          fd: -1
          here_begin: {(EOF)}
          here_end_span_id: 675
          stdin_parts: [
            ('* Second\n')
            ('* sixth\n')
            ('* fifth\n')
            ('* fourth\n')
            ('* third\n')
            ('* second\n')
            ('* initial\n')
          ]
        )
      ]
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'simple log --graph' span_id:680))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:684) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit log --graph --pretty=tformat:%s >actual &&\n'
            span_id: 685
          ) (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual\n' span_id:686)
        )
      }
    )
    (command.Simple
      words: [{(cat)}]
      redirects: [
        (redir.Redir
          op: (Token id:Id.Redir_Great val:'>' span_id:692)
          fd: -1
          arg_word: {(expect)}
        )
        (redir.HereDoc
          op: (Token id:Id.Redir_DLess val:'<<' span_id:696)
          fd: -1
          here_begin: {(EOF)}
          here_end_span_id: 707
          stdin_parts: [
            ('123 * Second\n')
            ('123 * sixth\n')
            ('123 * fifth\n')
            ('123 * fourth\n')
            ('123 * third\n')
            ('123 * second\n')
            ('123 * initial\n')
          ]
        )
      ]
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'simple log --graph --line-prefix="123 "' span_id:712))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:716) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit log --graph --line-prefix="123 " --pretty=tformat:%s >actual &&\n'
            span_id: 717
          ) (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual\n' span_id:718)
        )
      }
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'set up merge history' span_id:725))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:729) 
          (Token id:Id.Lit_Chars val:'\tgit checkout -b side HEAD~4 &&\n' span_id:730) (Token id:Id.Lit_Chars val:'\ttest_commit side-1 1 1 &&\n' span_id:731) 
          (Token id:Id.Lit_Chars val:'\ttest_commit side-2 2 2 &&\n' span_id:732) (Token id:Id.Lit_Chars val:'\tgit checkout master &&\n' span_id:733) 
          (Token id:Id.Lit_Chars val:'\tgit merge side\n' span_id:734)
        )
      }
    )
    (command.Simple
      words: [{(cat)}]
      redirects: [
        (redir.Redir
          op: (Token id:Id.Redir_Great val:'>' span_id:740)
          fd: -1
          arg_word: {(expect)}
        )
        (redir.HereDoc
          op: (Token id:Id.Redir_DLess val:'<<' span_id:744)
          fd: -1
          here_begin: 
            {(word_part.EscapedLiteral token:(Token id:Id.Lit_EscapedChar val:'\\E' span_id:745)) 
              (OF)
            }
          here_end_span_id: 760
          stdin_parts: [
            ("*   Merge branch 'side'\n")
            ('|\\\n')
            ('| * side-2\n')
            ('| * side-1\n')
            ('* | Second\n')
            ('* | sixth\n')
            ('* | fifth\n')
            ('* | fourth\n')
            ('|/\n')
            ('* third\n')
            ('* second\n')
            ('* initial\n')
          ]
        )
      ]
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'log --graph with merge' span_id:765))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:769) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit log --graph --date-order --pretty=tformat:%s |\n'
            span_id: 770
          ) (Token id:Id.Lit_Chars val:'\t\tsed "s/ *\\$//" >actual &&\n' span_id:771) 
          (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual\n' span_id:772)
        )
      }
    )
    (command.Simple
      words: [{(cat)}]
      redirects: [
        (redir.Redir
          op: (Token id:Id.Redir_Great val:'>' span_id:778)
          fd: -1
          arg_word: {(expect)}
        )
        (redir.HereDoc
          op: (Token id:Id.Redir_DLess val:'<<' span_id:782)
          fd: -1
          here_begin: 
            {(word_part.EscapedLiteral token:(Token id:Id.Lit_EscapedChar val:'\\E' span_id:783)) 
              (OF)
            }
          here_end_span_id: 798
          stdin_parts: [
            ("| | | *   Merge branch 'side'\n")
            ('| | | |\\\n')
            ('| | | | * side-2\n')
            ('| | | | * side-1\n')
            ('| | | * | Second\n')
            ('| | | * | sixth\n')
            ('| | | * | fifth\n')
            ('| | | * | fourth\n')
            ('| | | |/\n')
            ('| | | * third\n')
            ('| | | * second\n')
            ('| | | * initial\n')
          ]
        )
      ]
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'log --graph --line-prefix="| | | " with merge' span_id:803))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:807) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit log --line-prefix="| | | " --graph --date-order --pretty=tformat:%s |\n'
            span_id: 808
          ) (Token id:Id.Lit_Chars val:'\t\tsed "s/ *\\$//" >actual &&\n' span_id:809) 
          (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual\n' span_id:810)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'log --raw --graph -m with merge' span_id:817))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:821) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit log --raw --graph --oneline -m master | head -n 500 >actual &&\n'
            span_id: 822
          ) (Token id:Id.Lit_Chars val:'\tgrep "initial" actual\n' span_id:823)
        )
      }
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'diff-tree --graph' span_id:830))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:834) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit diff-tree --graph master^ | head -n 500 >actual &&\n'
            span_id: 835
          ) (Token id:Id.Lit_Chars val:'\tgrep "one" actual\n' span_id:836)
        )
      }
    )
    (command.Simple
      words: [{(cat)}]
      redirects: [
        (redir.Redir
          op: (Token id:Id.Redir_Great val:'>' span_id:842)
          fd: -1
          arg_word: {(expect)}
        )
        (redir.HereDoc
          op: (Token id:Id.Redir_DLess val:'<<' span_id:846)
          fd: -1
          here_begin: 
            {(word_part.EscapedLiteral token:(Token id:Id.Lit_EscapedChar val:'\\E' span_id:847)) 
              (OF)
            }
          here_end_span_id: 900
          stdin_parts: [
            ('*   commit master\n')
            ('|\\  Merge: A B\n')
            ('| | Author: A U Thor <author@example.com>\n')
            ('| |\n')
            ("| |     Merge branch 'side'\n")
            ('| |\n')
            ('| * commit side\n')
            ('| | Author: A U Thor <author@example.com>\n')
            ('| |\n')
            ('| |     side-2\n')
            ('| |\n')
            ('| * commit tags/side-1\n')
            ('| | Author: A U Thor <author@example.com>\n')
            ('| |\n')
            ('| |     side-1\n')
            ('| |\n')
            ('* | commit master~1\n')
            ('| | Author: A U Thor <author@example.com>\n')
            ('| |\n')
            ('| |     Second\n')
            ('| |\n')
            ('* | commit master~2\n')
            ('| | Author: A U Thor <author@example.com>\n')
            ('| |\n')
            ('| |     sixth\n')
            ('| |\n')
            ('* | commit master~3\n')
            ('| | Author: A U Thor <author@example.com>\n')
            ('| |\n')
            ('| |     fifth\n')
            ('| |\n')
            ('* | commit master~4\n')
            ('|/  Author: A U Thor <author@example.com>\n')
            ('|\n')
            ('|       fourth\n')
            ('|\n')
            ('* commit tags/side-1~1\n')
            ('| Author: A U Thor <author@example.com>\n')
            ('|\n')
            ('|     third\n')
            ('|\n')
            ('* commit tags/side-1~2\n')
            ('| Author: A U Thor <author@example.com>\n')
            ('|\n')
            ('|     second\n')
            ('|\n')
            ('* commit tags/side-1~3\n')
            ('  Author: A U Thor <author@example.com>\n')
            ('\n')
            ('      initial\n')
          ]
        )
      ]
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'log --graph with full output' span_id:905))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:909) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit log --graph --date-order --pretty=short |\n'
            span_id: 910
          ) (Token id:Id.Lit_Chars val:'\t\tgit name-rev --name-only --stdin |\n' span_id:911) 
          (Token
            id: Id.Lit_Chars
            val: '\t\tsed "s/Merge:.*/Merge: A B/;s/ *\\$//" >actual &&\n'
            span_id: 912
          ) (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual\n' span_id:913)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'set up more tangled history' span_id:920))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:924) 
          (Token id:Id.Lit_Chars val:'\tgit checkout -b tangle HEAD~6 &&\n' span_id:925) (Token id:Id.Lit_Chars val:'\ttest_commit tangle-a tangle-a a &&\n' span_id:926) 
          (Token id:Id.Lit_Chars val:'\tgit merge master~3 &&\n' span_id:927) (Token id:Id.Lit_Chars val:'\tgit merge side~1 &&\n' span_id:928) 
          (Token id:Id.Lit_Chars val:'\tgit checkout master &&\n' span_id:929) (Token id:Id.Lit_Chars val:'\tgit merge tangle &&\n' span_id:930) 
          (Token id:Id.Lit_Chars val:'\tgit checkout -b reach &&\n' span_id:931) (Token id:Id.Lit_Chars val:'\ttest_commit reach &&\n' span_id:932) 
          (Token id:Id.Lit_Chars val:'\tgit checkout master &&\n' span_id:933) (Token id:Id.Lit_Chars val:'\tgit checkout -b octopus-a &&\n' span_id:934) 
          (Token id:Id.Lit_Chars val:'\ttest_commit octopus-a &&\n' span_id:935) (Token id:Id.Lit_Chars val:'\tgit checkout master &&\n' span_id:936) 
          (Token id:Id.Lit_Chars val:'\tgit checkout -b octopus-b &&\n' span_id:937) (Token id:Id.Lit_Chars val:'\ttest_commit octopus-b &&\n' span_id:938) 
          (Token id:Id.Lit_Chars val:'\tgit checkout master &&\n' span_id:939) (Token id:Id.Lit_Chars val:'\ttest_commit seventh &&\n' span_id:940) 
          (Token id:Id.Lit_Chars val:'\tgit merge octopus-a octopus-b &&\n' span_id:941) (Token id:Id.Lit_Chars val:'\tgit merge reach\n' span_id:942)
        )
      }
    )
    (command.Simple
      words: [{(cat)}]
      redirects: [
        (redir.Redir
          op: (Token id:Id.Redir_Great val:'>' span_id:948)
          fd: -1
          arg_word: {(expect)}
        )
        (redir.HereDoc
          op: (Token id:Id.Redir_DLess val:'<<' span_id:952)
          fd: -1
          here_begin: 
            {(word_part.EscapedLiteral token:(Token id:Id.Lit_EscapedChar val:'\\E' span_id:953)) 
              (OF)
            }
          here_end_span_id: 994
          stdin_parts: [
            ("*   Merge tag 'reach'\n")
            ('|\\\n')
            ('| \\\n')
            ('|  \\\n')
            ("*-. \\   Merge tags 'octopus-a' and 'octopus-b'\n")
            ('|\\ \\ \\\n')
            ('* | | | seventh\n')
            ('| | * | octopus-b\n')
            ('| |/ /\n')
            ('|/| |\n')
            ('| * | octopus-a\n')
            ('|/ /\n')
            ('| * reach\n')
            ('|/\n')
            ("*   Merge branch 'tangle'\n")
            ('|\\\n')
            ("| *   Merge branch 'side' (early part) into tangle\n")
            ('| |\\\n')
            ("| * \\   Merge branch 'master' (early part) into tangle\n")
            ('| |\\ \\\n')
            ('| * | | tangle-a\n')
            ("* | | |   Merge branch 'side'\n")
            ('|\\ \\ \\ \\\n')
            ('| * | | | side-2\n')
            ('| | |_|/\n')
            ('| |/| |\n')
            ('| * | | side-1\n')
            ('* | | | Second\n')
            ('* | | | sixth\n')
            ('| |_|/\n')
            ('|/| |\n')
            ('* | | fifth\n')
            ('* | | fourth\n')
            ('|/ /\n')
            ('* | third\n')
            ('|/\n')
            ('* second\n')
            ('* initial\n')
          ]
        )
      ]
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'log --graph with merge' span_id:999))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:1003) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit log --graph --date-order --pretty=tformat:%s |\n'
            span_id: 1004
          ) (Token id:Id.Lit_Chars val:'\t\tsed "s/ *\\$//" >actual &&\n' span_id:1005) 
          (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual\n' span_id:1006)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'log.decorate configuration' span_id:1013))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:1017) 
          (Token id:Id.Lit_Chars val:'\tgit log --oneline >expect.none &&\n' span_id:1018) (Token id:Id.Lit_Chars val:'\tgit log --oneline --decorate >expect.short &&\n' span_id:1019) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit log --oneline --decorate=full >expect.full &&\n'
            span_id: 1020
          ) (Token id:Id.Lit_Chars val:'\n' span_id:1021) 
          (Token
            id: Id.Lit_Chars
            val: '\techo "[log] decorate" >>.git/config &&\n'
            span_id: 1022
          ) (Token id:Id.Lit_Chars val:'\tgit log --oneline >actual &&\n' span_id:1023) 
          (Token id:Id.Lit_Chars val:'\ttest_cmp expect.short actual &&\n' span_id:1024) (Token id:Id.Lit_Chars val:'\n' span_id:1025) 
          (Token id:Id.Lit_Chars val:'\ttest_config log.decorate true &&\n' span_id:1026) (Token id:Id.Lit_Chars val:'\tgit log --oneline >actual &&\n' span_id:1027) 
          (Token id:Id.Lit_Chars val:'\ttest_cmp expect.short actual &&\n' span_id:1028) (Token id:Id.Lit_Chars val:'\tgit log --oneline --decorate=full >actual &&\n' span_id:1029) 
          (Token id:Id.Lit_Chars val:'\ttest_cmp expect.full actual &&\n' span_id:1030) (Token id:Id.Lit_Chars val:'\tgit log --oneline --decorate=no >actual &&\n' span_id:1031) 
          (Token id:Id.Lit_Chars val:'\ttest_cmp expect.none actual &&\n' span_id:1032) (Token id:Id.Lit_Chars val:'\n' span_id:1033) 
          (Token id:Id.Lit_Chars val:'\ttest_config log.decorate no &&\n' span_id:1034) (Token id:Id.Lit_Chars val:'\tgit log --oneline >actual &&\n' span_id:1035) 
          (Token id:Id.Lit_Chars val:'\ttest_cmp expect.none actual &&\n' span_id:1036) (Token id:Id.Lit_Chars val:'\tgit log --oneline --decorate >actual &&\n' span_id:1037) 
          (Token id:Id.Lit_Chars val:'\ttest_cmp expect.short actual &&\n' span_id:1038) (Token id:Id.Lit_Chars val:'\tgit log --oneline --decorate=full >actual &&\n' span_id:1039) 
          (Token id:Id.Lit_Chars val:'\ttest_cmp expect.full actual &&\n' span_id:1040) (Token id:Id.Lit_Chars val:'\n' span_id:1041) 
          (Token id:Id.Lit_Chars val:'\ttest_config log.decorate 1 &&\n' span_id:1042) (Token id:Id.Lit_Chars val:'\tgit log --oneline >actual &&\n' span_id:1043) 
          (Token id:Id.Lit_Chars val:'\ttest_cmp expect.short actual &&\n' span_id:1044) (Token id:Id.Lit_Chars val:'\tgit log --oneline --decorate=full >actual &&\n' span_id:1045) 
          (Token id:Id.Lit_Chars val:'\ttest_cmp expect.full actual &&\n' span_id:1046) (Token id:Id.Lit_Chars val:'\tgit log --oneline --decorate=no >actual &&\n' span_id:1047) 
          (Token id:Id.Lit_Chars val:'\ttest_cmp expect.none actual &&\n' span_id:1048) (Token id:Id.Lit_Chars val:'\n' span_id:1049) 
          (Token id:Id.Lit_Chars val:'\ttest_config log.decorate short &&\n' span_id:1050) (Token id:Id.Lit_Chars val:'\tgit log --oneline >actual &&\n' span_id:1051) 
          (Token id:Id.Lit_Chars val:'\ttest_cmp expect.short actual &&\n' span_id:1052) (Token id:Id.Lit_Chars val:'\tgit log --oneline --no-decorate >actual &&\n' span_id:1053) 
          (Token id:Id.Lit_Chars val:'\ttest_cmp expect.none actual &&\n' span_id:1054) (Token id:Id.Lit_Chars val:'\tgit log --oneline --decorate=full >actual &&\n' span_id:1055) 
          (Token id:Id.Lit_Chars val:'\ttest_cmp expect.full actual &&\n' span_id:1056) (Token id:Id.Lit_Chars val:'\n' span_id:1057) 
          (Token id:Id.Lit_Chars val:'\ttest_config log.decorate full &&\n' span_id:1058) (Token id:Id.Lit_Chars val:'\tgit log --oneline >actual &&\n' span_id:1059) 
          (Token id:Id.Lit_Chars val:'\ttest_cmp expect.full actual &&\n' span_id:1060) (Token id:Id.Lit_Chars val:'\tgit log --oneline --no-decorate >actual &&\n' span_id:1061) 
          (Token id:Id.Lit_Chars val:'\ttest_cmp expect.none actual &&\n' span_id:1062) (Token id:Id.Lit_Chars val:'\tgit log --oneline --decorate >actual &&\n' span_id:1063) 
          (Token id:Id.Lit_Chars val:'\ttest_cmp expect.short actual &&\n' span_id:1064) (Token id:Id.Lit_Chars val:'\n' span_id:1065) 
          (Token id:Id.Lit_Chars val:'\ttest_unconfig log.decorate &&\n' span_id:1066) (Token id:Id.Lit_Chars val:'\tgit log --pretty=raw >expect.raw &&\n' span_id:1067) 
          (Token id:Id.Lit_Chars val:'\ttest_config log.decorate full &&\n' span_id:1068) (Token id:Id.Lit_Chars val:'\tgit log --pretty=raw >actual &&\n' span_id:1069) 
          (Token id:Id.Lit_Chars val:'\ttest_cmp expect.raw actual\n' span_id:1070) (Token id:Id.Lit_Chars val:'\n' span_id:1071)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'reflog is expected format' span_id:1078))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:1082) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit log -g --abbrev-commit --pretty=oneline >expect &&\n'
            span_id: 1083
          ) (Token id:Id.Lit_Chars val:'\tgit reflog >actual &&\n' span_id:1084) 
          (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual\n' span_id:1085)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'whatchanged is expected format' span_id:1092))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:1096) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit log --no-merges --raw >expect &&\n'
            span_id: 1097
          ) (Token id:Id.Lit_Chars val:'\tgit whatchanged >actual &&\n' span_id:1098) 
          (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual\n' span_id:1099)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'log.abbrevCommit configuration' span_id:1106))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:1110) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit log --abbrev-commit >expect.log.abbrev &&\n'
            span_id: 1111
          ) (Token id:Id.Lit_Chars val:'\tgit log --no-abbrev-commit >expect.log.full &&\n' span_id:1112) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit log --pretty=raw >expect.log.raw &&\n'
            span_id: 1113
          ) (Token id:Id.Lit_Chars val:'\tgit reflog --abbrev-commit >expect.reflog.abbrev &&\n' span_id:1114) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit reflog --no-abbrev-commit >expect.reflog.full &&\n'
            span_id: 1115
          ) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit whatchanged --abbrev-commit >expect.whatchanged.abbrev &&\n'
            span_id: 1116
          ) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit whatchanged --no-abbrev-commit >expect.whatchanged.full &&\n'
            span_id: 1117
          ) (Token id:Id.Lit_Chars val:'\n' span_id:1118) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest_config log.abbrevCommit true &&\n'
            span_id: 1119
          ) (Token id:Id.Lit_Chars val:'\n' span_id:1120) 
          (Token id:Id.Lit_Chars val:'\tgit log >actual &&\n' span_id:1121) (Token id:Id.Lit_Chars val:'\ttest_cmp expect.log.abbrev actual &&\n' span_id:1122) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit log --no-abbrev-commit >actual &&\n'
            span_id: 1123
          ) (Token id:Id.Lit_Chars val:'\ttest_cmp expect.log.full actual &&\n' span_id:1124) 
          (Token id:Id.Lit_Chars val:'\n' span_id:1125) (Token id:Id.Lit_Chars val:'\tgit log --pretty=raw >actual &&\n' span_id:1126) 
          (Token id:Id.Lit_Chars val:'\ttest_cmp expect.log.raw actual &&\n' span_id:1127) (Token id:Id.Lit_Chars val:'\n' span_id:1128) 
          (Token id:Id.Lit_Chars val:'\tgit reflog >actual &&\n' span_id:1129) (Token id:Id.Lit_Chars val:'\ttest_cmp expect.reflog.abbrev actual &&\n' span_id:1130) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit reflog --no-abbrev-commit >actual &&\n'
            span_id: 1131
          ) (Token id:Id.Lit_Chars val:'\ttest_cmp expect.reflog.full actual &&\n' span_id:1132) 
          (Token id:Id.Lit_Chars val:'\n' span_id:1133) (Token id:Id.Lit_Chars val:'\tgit whatchanged >actual &&\n' span_id:1134) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest_cmp expect.whatchanged.abbrev actual &&\n'
            span_id: 1135
          ) (Token id:Id.Lit_Chars val:'\tgit whatchanged --no-abbrev-commit >actual &&\n' span_id:1136) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest_cmp expect.whatchanged.full actual\n'
            span_id: 1137
          )
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'show added path under "--follow -M"' span_id:1144))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:1148) 
          (Token
            id: Id.Lit_Chars
            val: '\t# This tests for a regression introduced in v1.7.2-rc0~103^2~2\n'
            span_id: 1149
          ) (Token id:Id.Lit_Chars val:'\ttest_create_repo regression &&\n' span_id:1150) 
          (Token id:Id.Lit_Chars val:'\t(\n' span_id:1151) (Token id:Id.Lit_Chars val:'\t\tcd regression &&\n' span_id:1152) 
          (Token
            id: Id.Lit_Chars
            val: '\t\ttest_commit needs-another-commit &&\n'
            span_id: 1153
          ) (Token id:Id.Lit_Chars val:'\t\ttest_commit foo.bar &&\n' span_id:1154) 
          (Token
            id: Id.Lit_Chars
            val: '\t\tgit log -M --follow -p foo.bar.t &&\n'
            span_id: 1155
          ) (Token id:Id.Lit_Chars val:'\t\tgit log -M --follow --stat foo.bar.t &&\n' span_id:1156) 
          (Token
            id: Id.Lit_Chars
            val: '\t\tgit log -M --follow --name-only foo.bar.t\n'
            span_id: 1157
          ) (Token id:Id.Lit_Chars val:'\t)\n' span_id:1158)
        )
      }
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'git log -c --follow' span_id:1165))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:1169) 
          (Token id:Id.Lit_Chars val:'\ttest_create_repo follow-c &&\n' span_id:1170) (Token id:Id.Lit_Chars val:'\t(\n' span_id:1171) 
          (Token id:Id.Lit_Chars val:'\t\tcd follow-c &&\n' span_id:1172) (Token id:Id.Lit_Chars val:'\t\ttest_commit initial file original &&\n' span_id:1173) 
          (Token id:Id.Lit_Chars val:'\t\tgit rm file &&\n' span_id:1174) (Token id:Id.Lit_Chars val:'\t\ttest_commit rename file2 original &&\n' span_id:1175) 
          (Token id:Id.Lit_Chars val:'\t\tgit reset --hard initial &&\n' span_id:1176) (Token id:Id.Lit_Chars val:'\t\ttest_commit modify file foo &&\n' span_id:1177) 
          (Token id:Id.Lit_Chars val:'\t\tgit merge -m merge rename &&\n' span_id:1178) (Token id:Id.Lit_Chars val:'\t\tgit log -c --follow file2\n' span_id:1179) 
          (Token id:Id.Lit_Chars val:'\t)\n' span_id:1180)
        )
      }
    )
    (command.Simple
      words: [{(cat)}]
      redirects: [
        (redir.Redir
          op: (Token id:Id.Redir_Great val:'>' span_id:1186)
          fd: -1
          arg_word: {(expect)}
        )
        (redir.HereDoc
          op: (Token id:Id.Redir_DLess val:'<<' span_id:1189)
          fd: -1
          here_begin: 
            {(word_part.EscapedLiteral token:(Token id:Id.Lit_EscapedChar val:'\\E' span_id:1190)) 
              (OF)
            }
          here_end_span_id: 1461
          stdin_parts: [
            ('*   commit COMMIT_OBJECT_NAME\n')
            ('|\\  Merge: MERGE_PARENTS\n')
            ('| | Author: A U Thor <author@example.com>\n')
            ('| |\n')
            ('| |     Merge HEADS DESCRIPTION\n')
            ('| |\n')
            ('| * commit COMMIT_OBJECT_NAME\n')
            ('| | Author: A U Thor <author@example.com>\n')
            ('| |\n')
            ('| |     reach\n')
            ('| | ---\n')
            ('| |  reach.t | 1 +\n')
            ('| |  1 file changed, 1 insertion(+)\n')
            ('| |\n')
            ('| | diff --git a/reach.t b/reach.t\n')
            ('| | new file mode 100644\n')
            ('| | index 0000000..10c9591\n')
            ('| | --- /dev/null\n')
            ('| | +++ b/reach.t\n')
            ('| | @@ -0,0 +1 @@\n')
            ('| | +reach\n')
            ('| |\n')
            ('|  \\\n')
            ('*-. \\   commit COMMIT_OBJECT_NAME\n')
            ('|\\ \\ \\  Merge: MERGE_PARENTS\n')
            ('| | | | Author: A U Thor <author@example.com>\n')
            ('| | | |\n')
            ('| | | |     Merge HEADS DESCRIPTION\n')
            ('| | | |\n')
            ('| | * | commit COMMIT_OBJECT_NAME\n')
            ('| | |/  Author: A U Thor <author@example.com>\n')
            ('| | |\n')
            ('| | |       octopus-b\n')
            ('| | |   ---\n')
            ('| | |    octopus-b.t | 1 +\n')
            ('| | |    1 file changed, 1 insertion(+)\n')
            ('| | |\n')
            ('| | |   diff --git a/octopus-b.t b/octopus-b.t\n')
            ('| | |   new file mode 100644\n')
            ('| | |   index 0000000..d5fcad0\n')
            ('| | |   --- /dev/null\n')
            ('| | |   +++ b/octopus-b.t\n')
            ('| | |   @@ -0,0 +1 @@\n')
            ('| | |   +octopus-b\n')
            ('| | |\n')
            ('| * | commit COMMIT_OBJECT_NAME\n')
            ('| |/  Author: A U Thor <author@example.com>\n')
            ('| |\n')
            ('| |       octopus-a\n')
            ('| |   ---\n')
            ('| |    octopus-a.t | 1 +\n')
            ('| |    1 file changed, 1 insertion(+)\n')
            ('| |\n')
            ('| |   diff --git a/octopus-a.t b/octopus-a.t\n')
            ('| |   new file mode 100644\n')
            ('| |   index 0000000..11ee015\n')
            ('| |   --- /dev/null\n')
            ('| |   +++ b/octopus-a.t\n')
            ('| |   @@ -0,0 +1 @@\n')
            ('| |   +octopus-a\n')
            ('| |\n')
            ('* | commit COMMIT_OBJECT_NAME\n')
            ('|/  Author: A U Thor <author@example.com>\n')
            ('|\n')
            ('|       seventh\n')
            ('|   ---\n')
            ('|    seventh.t | 1 +\n')
            ('|    1 file changed, 1 insertion(+)\n')
            ('|\n')
            ('|   diff --git a/seventh.t b/seventh.t\n')
            ('|   new file mode 100644\n')
            ('|   index 0000000..9744ffc\n')
            ('|   --- /dev/null\n')
            ('|   +++ b/seventh.t\n')
            ('|   @@ -0,0 +1 @@\n')
            ('|   +seventh\n')
            ('|\n')
            ('*   commit COMMIT_OBJECT_NAME\n')
            ('|\\  Merge: MERGE_PARENTS\n')
            ('| | Author: A U Thor <author@example.com>\n')
            ('| |\n')
            ("| |     Merge branch 'tangle'\n")
            ('| |\n')
            ('| *   commit COMMIT_OBJECT_NAME\n')
            ('| |\\  Merge: MERGE_PARENTS\n')
            ('| | | Author: A U Thor <author@example.com>\n')
            ('| | |\n')
            ("| | |     Merge branch 'side' (early part) into tangle\n")
            ('| | |\n')
            ('| * |   commit COMMIT_OBJECT_NAME\n')
            ('| |\\ \\  Merge: MERGE_PARENTS\n')
            ('| | | | Author: A U Thor <author@example.com>\n')
            ('| | | |\n')
            ("| | | |     Merge branch 'master' (early part) into tangle\n")
            ('| | | |\n')
            ('| * | | commit COMMIT_OBJECT_NAME\n')
            ('| | | | Author: A U Thor <author@example.com>\n')
            ('| | | |\n')
            ('| | | |     tangle-a\n')
            ('| | | | ---\n')
            ('| | | |  tangle-a | 1 +\n')
            ('| | | |  1 file changed, 1 insertion(+)\n')
            ('| | | |\n')
            ('| | | | diff --git a/tangle-a b/tangle-a\n')
            ('| | | | new file mode 100644\n')
            ('| | | | index 0000000..7898192\n')
            ('| | | | --- /dev/null\n')
            ('| | | | +++ b/tangle-a\n')
            ('| | | | @@ -0,0 +1 @@\n')
            ('| | | | +a\n')
            ('| | | |\n')
            ('* | | |   commit COMMIT_OBJECT_NAME\n')
            ('|\\ \\ \\ \\  Merge: MERGE_PARENTS\n')
            ('| | | | | Author: A U Thor <author@example.com>\n')
            ('| | | | |\n')
            ("| | | | |     Merge branch 'side'\n")
            ('| | | | |\n')
            ('| * | | | commit COMMIT_OBJECT_NAME\n')
            ('| | |_|/  Author: A U Thor <author@example.com>\n')
            ('| |/| |\n')
            ('| | | |       side-2\n')
            ('| | | |   ---\n')
            ('| | | |    2 | 1 +\n')
            ('| | | |    1 file changed, 1 insertion(+)\n')
            ('| | | |\n')
            ('| | | |   diff --git a/2 b/2\n')
            ('| | | |   new file mode 100644\n')
            ('| | | |   index 0000000..0cfbf08\n')
            ('| | | |   --- /dev/null\n')
            ('| | | |   +++ b/2\n')
            ('| | | |   @@ -0,0 +1 @@\n')
            ('| | | |   +2\n')
            ('| | | |\n')
            ('| * | | commit COMMIT_OBJECT_NAME\n')
            ('| | | | Author: A U Thor <author@example.com>\n')
            ('| | | |\n')
            ('| | | |     side-1\n')
            ('| | | | ---\n')
            ('| | | |  1 | 1 +\n')
            ('| | | |  1 file changed, 1 insertion(+)\n')
            ('| | | |\n')
            ('| | | | diff --git a/1 b/1\n')
            ('| | | | new file mode 100644\n')
            ('| | | | index 0000000..d00491f\n')
            ('| | | | --- /dev/null\n')
            ('| | | | +++ b/1\n')
            ('| | | | @@ -0,0 +1 @@\n')
            ('| | | | +1\n')
            ('| | | |\n')
            ('* | | | commit COMMIT_OBJECT_NAME\n')
            ('| | | | Author: A U Thor <author@example.com>\n')
            ('| | | |\n')
            ('| | | |     Second\n')
            ('| | | | ---\n')
            ('| | | |  one | 1 +\n')
            ('| | | |  1 file changed, 1 insertion(+)\n')
            ('| | | |\n')
            ('| | | | diff --git a/one b/one\n')
            ('| | | | new file mode 100644\n')
            ('| | | | index 0000000..9a33383\n')
            ('| | | | --- /dev/null\n')
            ('| | | | +++ b/one\n')
            ('| | | | @@ -0,0 +1 @@\n')
            ('| | | | +case\n')
            ('| | | |\n')
            ('* | | | commit COMMIT_OBJECT_NAME\n')
            ('| |_|/  Author: A U Thor <author@example.com>\n')
            ('|/| |\n')
            ('| | |       sixth\n')
            ('| | |   ---\n')
            ('| | |    a/two | 1 -\n')
            ('| | |    1 file changed, 1 deletion(-)\n')
            ('| | |\n')
            ('| | |   diff --git a/a/two b/a/two\n')
            ('| | |   deleted file mode 100644\n')
            ('| | |   index 9245af5..0000000\n')
            ('| | |   --- a/a/two\n')
            ('| | |   +++ /dev/null\n')
            ('| | |   @@ -1 +0,0 @@\n')
            ('| | |   -ni\n')
            ('| | |\n')
            ('* | | commit COMMIT_OBJECT_NAME\n')
            ('| | | Author: A U Thor <author@example.com>\n')
            ('| | |\n')
            ('| | |     fifth\n')
            ('| | | ---\n')
            ('| | |  a/two | 1 +\n')
            ('| | |  1 file changed, 1 insertion(+)\n')
            ('| | |\n')
            ('| | | diff --git a/a/two b/a/two\n')
            ('| | | new file mode 100644\n')
            ('| | | index 0000000..9245af5\n')
            ('| | | --- /dev/null\n')
            ('| | | +++ b/a/two\n')
            ('| | | @@ -0,0 +1 @@\n')
            ('| | | +ni\n')
            ('| | |\n')
            ('* | | commit COMMIT_OBJECT_NAME\n')
            ('|/ /  Author: A U Thor <author@example.com>\n')
            ('| |\n')
            ('| |       fourth\n')
            ('| |   ---\n')
            ('| |    ein | 1 +\n')
            ('| |    1 file changed, 1 insertion(+)\n')
            ('| |\n')
            ('| |   diff --git a/ein b/ein\n')
            ('| |   new file mode 100644\n')
            ('| |   index 0000000..9d7e69f\n')
            ('| |   --- /dev/null\n')
            ('| |   +++ b/ein\n')
            ('| |   @@ -0,0 +1 @@\n')
            ('| |   +ichi\n')
            ('| |\n')
            ('* | commit COMMIT_OBJECT_NAME\n')
            ('|/  Author: A U Thor <author@example.com>\n')
            ('|\n')
            ('|       third\n')
            ('|   ---\n')
            ('|    ichi | 1 +\n')
            ('|    one  | 1 -\n')
            ('|    2 files changed, 1 insertion(+), 1 deletion(-)\n')
            ('|\n')
            ('|   diff --git a/ichi b/ichi\n')
            ('|   new file mode 100644\n')
            ('|   index 0000000..9d7e69f\n')
            ('|   --- /dev/null\n')
            ('|   +++ b/ichi\n')
            ('|   @@ -0,0 +1 @@\n')
            ('|   +ichi\n')
            ('|   diff --git a/one b/one\n')
            ('|   deleted file mode 100644\n')
            ('|   index 9d7e69f..0000000\n')
            ('|   --- a/one\n')
            ('|   +++ /dev/null\n')
            ('|   @@ -1 +0,0 @@\n')
            ('|   -ichi\n')
            ('|\n')
            ('* commit COMMIT_OBJECT_NAME\n')
            ('| Author: A U Thor <author@example.com>\n')
            ('|\n')
            ('|     second\n')
            ('| ---\n')
            ('|  one | 2 +-\n')
            ('|  1 file changed, 1 insertion(+), 1 deletion(-)\n')
            ('|\n')
            ('| diff --git a/one b/one\n')
            ('| index 5626abf..9d7e69f 100644\n')
            ('| --- a/one\n')
            ('| +++ b/one\n')
            ('| @@ -1 +1 @@\n')
            ('| -one\n')
            ('| +ichi\n')
            ('|\n')
            ('* commit COMMIT_OBJECT_NAME\n')
            ('  Author: A U Thor <author@example.com>\n')
            ('\n')
            ('      initial\n')
            ('  ---\n')
            ('   one | 1 +\n')
            ('   1 file changed, 1 insertion(+)\n')
            ('\n')
            ('  diff --git a/one b/one\n')
            ('  new file mode 100644\n')
            ('  index 0000000..5626abf\n')
            ('  --- /dev/null\n')
            ('  +++ b/one\n')
            ('  @@ -0,0 +1 @@\n')
            ('  +one\n')
          ]
        )
      ]
    )
    (command.ShFunction
      name: sanitize_output
      body: 
        (command.BraceGroup
          children: [
            (C {(sed)} {(-e)} {(SQ (Token id:Id.Lit_Chars val:'s/ *$//' span_id:1476))} {(-e)} 
              {
                (SQ 
                  (Token
                    id: Id.Lit_Chars
                    val: 's/commit [0-9a-f]*$/commit COMMIT_OBJECT_NAME/'
                    span_id: 1484
                  )
                )
              } {(-e)} {(SQ (Token id:Id.Lit_Chars val:'s/Merge: [ 0-9a-f]*$/Merge: MERGE_PARENTS/' span_id:1492))} 
              {(-e)} {(SQ (Token id:Id.Lit_Chars val:'s/Merge tag.*/Merge HEADS DESCRIPTION/' span_id:1500))} {(-e)} 
              {
                (SQ 
                  (Token
                    id: Id.Lit_Chars
                    val: 's/Merge commit.*/Merge HEADS DESCRIPTION/'
                    span_id: 1508
                  )
                )
              } {(-e)} {(SQ (Token id:Id.Lit_Chars val:'s/, 0 deletions(-)//' span_id:1516))} {(-e)} 
              {(SQ (Token id:Id.Lit_Chars val:'s/, 0 insertions(+)//' span_id:1524))} {(-e)} {(SQ (Token id:Id.Lit_Chars val:'s/ 1 files changed, / 1 file changed, /' span_id:1532))} {(-e)} 
              {(SQ (Token id:Id.Lit_Chars val:'s/, 1 deletions(-)/, 1 deletion(-)/' span_id:1540))} {(-e)} {(SQ (Token id:Id.Lit_Chars val:'s/, 1 insertions(+)/, 1 insertion(+)/' span_id:1548))}
            )
          ]
        )
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'log --graph with diff and stats' span_id:1557))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:1561) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit log --no-renames --graph --pretty=short --stat -p >actual &&\n'
            span_id: 1562
          ) (Token id:Id.Lit_Chars val:'\tsanitize_output >actual.sanitized <actual &&\n' span_id:1563) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest_i18ncmp expect actual.sanitized\n'
            span_id: 1564
          )
        )
      }
    )
    (command.Simple
      words: [{(cat)}]
      redirects: [
        (redir.Redir
          op: (Token id:Id.Redir_Great val:'>' span_id:1570)
          fd: -1
          arg_word: {(expect)}
        )
        (redir.HereDoc
          op: (Token id:Id.Redir_DLess val:'<<' span_id:1573)
          fd: -1
          here_begin: 
            {(word_part.EscapedLiteral token:(Token id:Id.Lit_EscapedChar val:'\\E' span_id:1574)) 
              (OF)
            }
          here_end_span_id: 1845
          stdin_parts: [
            ('*** *   commit COMMIT_OBJECT_NAME\n')
            ('*** |\\  Merge: MERGE_PARENTS\n')
            ('*** | | Author: A U Thor <author@example.com>\n')
            ('*** | |\n')
            ('*** | |     Merge HEADS DESCRIPTION\n')
            ('*** | |\n')
            ('*** | * commit COMMIT_OBJECT_NAME\n')
            ('*** | | Author: A U Thor <author@example.com>\n')
            ('*** | |\n')
            ('*** | |     reach\n')
            ('*** | | ---\n')
            ('*** | |  reach.t | 1 +\n')
            ('*** | |  1 file changed, 1 insertion(+)\n')
            ('*** | |\n')
            ('*** | | diff --git a/reach.t b/reach.t\n')
            ('*** | | new file mode 100644\n')
            ('*** | | index 0000000..10c9591\n')
            ('*** | | --- /dev/null\n')
            ('*** | | +++ b/reach.t\n')
            ('*** | | @@ -0,0 +1 @@\n')
            ('*** | | +reach\n')
            ('*** | |\n')
            ('*** |  \\\n')
            ('*** *-. \\   commit COMMIT_OBJECT_NAME\n')
            ('*** |\\ \\ \\  Merge: MERGE_PARENTS\n')
            ('*** | | | | Author: A U Thor <author@example.com>\n')
            ('*** | | | |\n')
            ('*** | | | |     Merge HEADS DESCRIPTION\n')
            ('*** | | | |\n')
            ('*** | | * | commit COMMIT_OBJECT_NAME\n')
            ('*** | | |/  Author: A U Thor <author@example.com>\n')
            ('*** | | |\n')
            ('*** | | |       octopus-b\n')
            ('*** | | |   ---\n')
            ('*** | | |    octopus-b.t | 1 +\n')
            ('*** | | |    1 file changed, 1 insertion(+)\n')
            ('*** | | |\n')
            ('*** | | |   diff --git a/octopus-b.t b/octopus-b.t\n')
            ('*** | | |   new file mode 100644\n')
            ('*** | | |   index 0000000..d5fcad0\n')
            ('*** | | |   --- /dev/null\n')
            ('*** | | |   +++ b/octopus-b.t\n')
            ('*** | | |   @@ -0,0 +1 @@\n')
            ('*** | | |   +octopus-b\n')
            ('*** | | |\n')
            ('*** | * | commit COMMIT_OBJECT_NAME\n')
            ('*** | |/  Author: A U Thor <author@example.com>\n')
            ('*** | |\n')
            ('*** | |       octopus-a\n')
            ('*** | |   ---\n')
            ('*** | |    octopus-a.t | 1 +\n')
            ('*** | |    1 file changed, 1 insertion(+)\n')
            ('*** | |\n')
            ('*** | |   diff --git a/octopus-a.t b/octopus-a.t\n')
            ('*** | |   new file mode 100644\n')
            ('*** | |   index 0000000..11ee015\n')
            ('*** | |   --- /dev/null\n')
            ('*** | |   +++ b/octopus-a.t\n')
            ('*** | |   @@ -0,0 +1 @@\n')
            ('*** | |   +octopus-a\n')
            ('*** | |\n')
            ('*** * | commit COMMIT_OBJECT_NAME\n')
            ('*** |/  Author: A U Thor <author@example.com>\n')
            ('*** |\n')
            ('*** |       seventh\n')
            ('*** |   ---\n')
            ('*** |    seventh.t | 1 +\n')
            ('*** |    1 file changed, 1 insertion(+)\n')
            ('*** |\n')
            ('*** |   diff --git a/seventh.t b/seventh.t\n')
            ('*** |   new file mode 100644\n')
            ('*** |   index 0000000..9744ffc\n')
            ('*** |   --- /dev/null\n')
            ('*** |   +++ b/seventh.t\n')
            ('*** |   @@ -0,0 +1 @@\n')
            ('*** |   +seventh\n')
            ('*** |\n')
            ('*** *   commit COMMIT_OBJECT_NAME\n')
            ('*** |\\  Merge: MERGE_PARENTS\n')
            ('*** | | Author: A U Thor <author@example.com>\n')
            ('*** | |\n')
            ("*** | |     Merge branch 'tangle'\n")
            ('*** | |\n')
            ('*** | *   commit COMMIT_OBJECT_NAME\n')
            ('*** | |\\  Merge: MERGE_PARENTS\n')
            ('*** | | | Author: A U Thor <author@example.com>\n')
            ('*** | | |\n')
            ("*** | | |     Merge branch 'side' (early part) into tangle\n")
            ('*** | | |\n')
            ('*** | * |   commit COMMIT_OBJECT_NAME\n')
            ('*** | |\\ \\  Merge: MERGE_PARENTS\n')
            ('*** | | | | Author: A U Thor <author@example.com>\n')
            ('*** | | | |\n')
            ("*** | | | |     Merge branch 'master' (early part) into tangle\n")
            ('*** | | | |\n')
            ('*** | * | | commit COMMIT_OBJECT_NAME\n')
            ('*** | | | | Author: A U Thor <author@example.com>\n')
            ('*** | | | |\n')
            ('*** | | | |     tangle-a\n')
            ('*** | | | | ---\n')
            ('*** | | | |  tangle-a | 1 +\n')
            ('*** | | | |  1 file changed, 1 insertion(+)\n')
            ('*** | | | |\n')
            ('*** | | | | diff --git a/tangle-a b/tangle-a\n')
            ('*** | | | | new file mode 100644\n')
            ('*** | | | | index 0000000..7898192\n')
            ('*** | | | | --- /dev/null\n')
            ('*** | | | | +++ b/tangle-a\n')
            ('*** | | | | @@ -0,0 +1 @@\n')
            ('*** | | | | +a\n')
            ('*** | | | |\n')
            ('*** * | | |   commit COMMIT_OBJECT_NAME\n')
            ('*** |\\ \\ \\ \\  Merge: MERGE_PARENTS\n')
            ('*** | | | | | Author: A U Thor <author@example.com>\n')
            ('*** | | | | |\n')
            ("*** | | | | |     Merge branch 'side'\n")
            ('*** | | | | |\n')
            ('*** | * | | | commit COMMIT_OBJECT_NAME\n')
            ('*** | | |_|/  Author: A U Thor <author@example.com>\n')
            ('*** | |/| |\n')
            ('*** | | | |       side-2\n')
            ('*** | | | |   ---\n')
            ('*** | | | |    2 | 1 +\n')
            ('*** | | | |    1 file changed, 1 insertion(+)\n')
            ('*** | | | |\n')
            ('*** | | | |   diff --git a/2 b/2\n')
            ('*** | | | |   new file mode 100644\n')
            ('*** | | | |   index 0000000..0cfbf08\n')
            ('*** | | | |   --- /dev/null\n')
            ('*** | | | |   +++ b/2\n')
            ('*** | | | |   @@ -0,0 +1 @@\n')
            ('*** | | | |   +2\n')
            ('*** | | | |\n')
            ('*** | * | | commit COMMIT_OBJECT_NAME\n')
            ('*** | | | | Author: A U Thor <author@example.com>\n')
            ('*** | | | |\n')
            ('*** | | | |     side-1\n')
            ('*** | | | | ---\n')
            ('*** | | | |  1 | 1 +\n')
            ('*** | | | |  1 file changed, 1 insertion(+)\n')
            ('*** | | | |\n')
            ('*** | | | | diff --git a/1 b/1\n')
            ('*** | | | | new file mode 100644\n')
            ('*** | | | | index 0000000..d00491f\n')
            ('*** | | | | --- /dev/null\n')
            ('*** | | | | +++ b/1\n')
            ('*** | | | | @@ -0,0 +1 @@\n')
            ('*** | | | | +1\n')
            ('*** | | | |\n')
            ('*** * | | | commit COMMIT_OBJECT_NAME\n')
            ('*** | | | | Author: A U Thor <author@example.com>\n')
            ('*** | | | |\n')
            ('*** | | | |     Second\n')
            ('*** | | | | ---\n')
            ('*** | | | |  one | 1 +\n')
            ('*** | | | |  1 file changed, 1 insertion(+)\n')
            ('*** | | | |\n')
            ('*** | | | | diff --git a/one b/one\n')
            ('*** | | | | new file mode 100644\n')
            ('*** | | | | index 0000000..9a33383\n')
            ('*** | | | | --- /dev/null\n')
            ('*** | | | | +++ b/one\n')
            ('*** | | | | @@ -0,0 +1 @@\n')
            ('*** | | | | +case\n')
            ('*** | | | |\n')
            ('*** * | | | commit COMMIT_OBJECT_NAME\n')
            ('*** | |_|/  Author: A U Thor <author@example.com>\n')
            ('*** |/| |\n')
            ('*** | | |       sixth\n')
            ('*** | | |   ---\n')
            ('*** | | |    a/two | 1 -\n')
            ('*** | | |    1 file changed, 1 deletion(-)\n')
            ('*** | | |\n')
            ('*** | | |   diff --git a/a/two b/a/two\n')
            ('*** | | |   deleted file mode 100644\n')
            ('*** | | |   index 9245af5..0000000\n')
            ('*** | | |   --- a/a/two\n')
            ('*** | | |   +++ /dev/null\n')
            ('*** | | |   @@ -1 +0,0 @@\n')
            ('*** | | |   -ni\n')
            ('*** | | |\n')
            ('*** * | | commit COMMIT_OBJECT_NAME\n')
            ('*** | | | Author: A U Thor <author@example.com>\n')
            ('*** | | |\n')
            ('*** | | |     fifth\n')
            ('*** | | | ---\n')
            ('*** | | |  a/two | 1 +\n')
            ('*** | | |  1 file changed, 1 insertion(+)\n')
            ('*** | | |\n')
            ('*** | | | diff --git a/a/two b/a/two\n')
            ('*** | | | new file mode 100644\n')
            ('*** | | | index 0000000..9245af5\n')
            ('*** | | | --- /dev/null\n')
            ('*** | | | +++ b/a/two\n')
            ('*** | | | @@ -0,0 +1 @@\n')
            ('*** | | | +ni\n')
            ('*** | | |\n')
            ('*** * | | commit COMMIT_OBJECT_NAME\n')
            ('*** |/ /  Author: A U Thor <author@example.com>\n')
            ('*** | |\n')
            ('*** | |       fourth\n')
            ('*** | |   ---\n')
            ('*** | |    ein | 1 +\n')
            ('*** | |    1 file changed, 1 insertion(+)\n')
            ('*** | |\n')
            ('*** | |   diff --git a/ein b/ein\n')
            ('*** | |   new file mode 100644\n')
            ('*** | |   index 0000000..9d7e69f\n')
            ('*** | |   --- /dev/null\n')
            ('*** | |   +++ b/ein\n')
            ('*** | |   @@ -0,0 +1 @@\n')
            ('*** | |   +ichi\n')
            ('*** | |\n')
            ('*** * | commit COMMIT_OBJECT_NAME\n')
            ('*** |/  Author: A U Thor <author@example.com>\n')
            ('*** |\n')
            ('*** |       third\n')
            ('*** |   ---\n')
            ('*** |    ichi | 1 +\n')
            ('*** |    one  | 1 -\n')
            ('*** |    2 files changed, 1 insertion(+), 1 deletion(-)\n')
            ('*** |\n')
            ('*** |   diff --git a/ichi b/ichi\n')
            ('*** |   new file mode 100644\n')
            ('*** |   index 0000000..9d7e69f\n')
            ('*** |   --- /dev/null\n')
            ('*** |   +++ b/ichi\n')
            ('*** |   @@ -0,0 +1 @@\n')
            ('*** |   +ichi\n')
            ('*** |   diff --git a/one b/one\n')
            ('*** |   deleted file mode 100644\n')
            ('*** |   index 9d7e69f..0000000\n')
            ('*** |   --- a/one\n')
            ('*** |   +++ /dev/null\n')
            ('*** |   @@ -1 +0,0 @@\n')
            ('*** |   -ichi\n')
            ('*** |\n')
            ('*** * commit COMMIT_OBJECT_NAME\n')
            ('*** | Author: A U Thor <author@example.com>\n')
            ('*** |\n')
            ('*** |     second\n')
            ('*** | ---\n')
            ('*** |  one | 2 +-\n')
            ('*** |  1 file changed, 1 insertion(+), 1 deletion(-)\n')
            ('*** |\n')
            ('*** | diff --git a/one b/one\n')
            ('*** | index 5626abf..9d7e69f 100644\n')
            ('*** | --- a/one\n')
            ('*** | +++ b/one\n')
            ('*** | @@ -1 +1 @@\n')
            ('*** | -one\n')
            ('*** | +ichi\n')
            ('*** |\n')
            ('*** * commit COMMIT_OBJECT_NAME\n')
            ('***   Author: A U Thor <author@example.com>\n')
            ('***\n')
            ('***       initial\n')
            ('***   ---\n')
            ('***    one | 1 +\n')
            ('***    1 file changed, 1 insertion(+)\n')
            ('***\n')
            ('***   diff --git a/one b/one\n')
            ('***   new file mode 100644\n')
            ('***   index 0000000..5626abf\n')
            ('***   --- /dev/null\n')
            ('***   +++ b/one\n')
            ('***   @@ -0,0 +1 @@\n')
            ('***   +one\n')
          ]
        )
      ]
    )
    (C {(test_expect_success)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'log --line-prefix="*** " --graph with diff and stats'
            span_id: 1850
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:1854) 
          (Token
            id: Id.Lit_Chars
            val: 
'\tgit log --line-prefix="*** " --no-renames --graph --pretty=short --stat -p >actual &&\n'
            span_id: 1855
          ) (Token id:Id.Lit_Chars val:'\tsanitize_output >actual.sanitized <actual &&\n' span_id:1856) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest_i18ncmp expect actual.sanitized\n'
            span_id: 1857
          )
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'dotdot is a parent directory' span_id:1864))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:1868) 
          (Token id:Id.Lit_Chars val:'\tmkdir -p a/b &&\n' span_id:1869) (Token id:Id.Lit_Chars val:'\t( echo sixth && echo fifth ) >expect &&\n' span_id:1870) 
          (Token
            id: Id.Lit_Chars
            val: '\t( cd a/b && git log --format=%s .. ) >actual &&\n'
            span_id: 1871
          ) (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual\n' span_id:1872)
        )
      }
    )
    (C {(test_expect_success)} {(GPG)} 
      {(SQ (Token id:Id.Lit_Chars val:'setup signed branch' span_id:1881))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:1885) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest_when_finished "git reset --hard && git checkout master" &&\n'
            span_id: 1886
          ) (Token id:Id.Lit_Chars val:'\tgit checkout -b signed master &&\n' span_id:1887) 
          (Token id:Id.Lit_Chars val:'\techo foo >foo &&\n' span_id:1888) (Token id:Id.Lit_Chars val:'\tgit add foo &&\n' span_id:1889) 
          (Token id:Id.Lit_Chars val:'\tgit commit -S -m signed_commit\n' span_id:1890)
        )
      }
    )
    (C {(test_expect_success)} {(GPG)} 
      {(SQ (Token id:Id.Lit_Chars val:'log --graph --show-signature' span_id:1899))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:1903) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit log --graph --show-signature -n1 signed >actual &&\n'
            span_id: 1904
          ) (Token id:Id.Lit_Chars val:'\tgrep "^| gpg: Signature made" actual &&\n' span_id:1905) 
          (Token
            id: Id.Lit_Chars
            val: '\tgrep "^| gpg: Good signature" actual\n'
            span_id: 1906
          )
        )
      }
    )
    (C {(test_expect_success)} {(GPG)} 
      {(SQ (Token id:Id.Lit_Chars val:'log --graph --show-signature for merged tag' span_id:1915))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:1919) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest_when_finished "git reset --hard && git checkout master" &&\n'
            span_id: 1920
          ) (Token id:Id.Lit_Chars val:'\tgit checkout -b plain master &&\n' span_id:1921) 
          (Token id:Id.Lit_Chars val:'\techo aaa >bar &&\n' span_id:1922) (Token id:Id.Lit_Chars val:'\tgit add bar &&\n' span_id:1923) 
          (Token id:Id.Lit_Chars val:'\tgit commit -m bar_commit &&\n' span_id:1924) (Token id:Id.Lit_Chars val:'\tgit checkout -b tagged master &&\n' span_id:1925) 
          (Token id:Id.Lit_Chars val:'\techo bbb >baz &&\n' span_id:1926) (Token id:Id.Lit_Chars val:'\tgit add baz &&\n' span_id:1927) 
          (Token id:Id.Lit_Chars val:'\tgit commit -m baz_commit &&\n' span_id:1928) (Token id:Id.Lit_Chars val:'\tgit tag -s -m signed_tag_msg signed_tag &&\n' span_id:1929) 
          (Token id:Id.Lit_Chars val:'\tgit checkout plain &&\n' span_id:1930) (Token id:Id.Lit_Chars val:'\tgit merge --no-ff -m msg signed_tag &&\n' span_id:1931) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit log --graph --show-signature -n1 plain >actual &&\n'
            span_id: 1932
          ) (Token id:Id.Lit_Chars val:'\tgrep "^|\\\\\\  merged tag" actual &&\n' span_id:1933) 
          (Token
            id: Id.Lit_Chars
            val: '\tgrep "^| | gpg: Signature made" actual &&\n'
            span_id: 1934
          ) (Token id:Id.Lit_Chars val:'\tgrep "^| | gpg: Good signature" actual\n' span_id:1935)
        )
      }
    )
    (C {(test_expect_success)} {(GPG)} 
      {(SQ (Token id:Id.Lit_Chars val:'--no-show-signature overrides --show-signature' span_id:1944))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:1948) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit log -1 --show-signature --no-show-signature signed >actual &&\n'
            span_id: 1949
          ) (Token id:Id.Lit_Chars val:'\t! grep "^gpg:" actual\n' span_id:1950)
        )
      }
    )
    (C {(test_expect_success)} {(GPG)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: 'log.showsignature=true behaves like --show-signature'
            span_id: 1959
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:1963) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest_config log.showsignature true &&\n'
            span_id: 1964
          ) (Token id:Id.Lit_Chars val:'\tgit log -1 signed >actual &&\n' span_id:1965) 
          (Token
            id: Id.Lit_Chars
            val: '\tgrep "gpg: Signature made" actual &&\n'
            span_id: 1966
          ) (Token id:Id.Lit_Chars val:'\tgrep "gpg: Good signature" actual\n' span_id:1967)
        )
      }
    )
    (C {(test_expect_success)} {(GPG)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: '--no-show-signature overrides log.showsignature=true'
            span_id: 1976
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:1980) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest_config log.showsignature true &&\n'
            span_id: 1981
          ) (Token id:Id.Lit_Chars val:'\tgit log -1 --no-show-signature signed >actual &&\n' span_id:1982) 
          (Token id:Id.Lit_Chars val:'\t! grep "^gpg:" actual\n' span_id:1983)
        )
      }
    )
    (C {(test_expect_success)} {(GPG)} 
      {
        (SQ 
          (Token
            id: Id.Lit_Chars
            val: '--show-signature overrides log.showsignature=false'
            span_id: 1992
          )
        )
      } 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:1996) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest_config log.showsignature false &&\n'
            span_id: 1997
          ) (Token id:Id.Lit_Chars val:'\tgit log -1 --show-signature signed >actual &&\n' span_id:1998) 
          (Token
            id: Id.Lit_Chars
            val: '\tgrep "gpg: Signature made" actual &&\n'
            span_id: 1999
          ) (Token id:Id.Lit_Chars val:'\tgrep "gpg: Good signature" actual\n' span_id:2000)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'log --graph --no-walk is forbidden' span_id:2007))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:2011) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest_must_fail git log --graph --no-walk\n'
            span_id: 2012
          )
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'log diagnoses bogus HEAD' span_id:2019))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:2023) 
          (Token id:Id.Lit_Chars val:'\tgit init empty &&\n' span_id:2024) (Token id:Id.Lit_Chars val:'\ttest_must_fail git -C empty log 2>stderr &&\n' span_id:2025) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest_i18ngrep does.not.have.any.commits stderr &&\n'
            span_id: 2026
          ) (Token id:Id.Lit_Chars val:'\techo 1234abcd >empty/.git/refs/heads/master &&\n' span_id:2027) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest_must_fail git -C empty log 2>stderr &&\n'
            span_id: 2028
          ) (Token id:Id.Lit_Chars val:'\ttest_i18ngrep broken stderr &&\n' span_id:2029) 
          (Token
            id: Id.Lit_Chars
            val: '\techo "ref: refs/heads/invalid.lock" >empty/.git/HEAD &&\n'
            span_id: 2030
          ) (Token id:Id.Lit_Chars val:'\ttest_must_fail git -C empty log 2>stderr &&\n' span_id:2031) 
          (Token id:Id.Lit_Chars val:'\ttest_i18ngrep broken stderr &&\n' span_id:2032) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest_must_fail git -C empty log --default totally-bogus 2>stderr &&\n'
            span_id: 2033
          ) (Token id:Id.Lit_Chars val:'\ttest_i18ngrep broken stderr\n' span_id:2034)
        )
      }
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'set up --source tests' span_id:2041))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:2045) 
          (Token id:Id.Lit_Chars val:'\tgit checkout --orphan source-a &&\n' span_id:2046) (Token id:Id.Lit_Chars val:'\ttest_commit one &&\n' span_id:2047) 
          (Token id:Id.Lit_Chars val:'\ttest_commit two &&\n' span_id:2048) (Token id:Id.Lit_Chars val:'\tgit checkout -b source-b HEAD^ &&\n' span_id:2049) 
          (Token id:Id.Lit_Chars val:'\ttest_commit three\n' span_id:2050)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'log --source paints branch names' span_id:2057))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:2061) 
          (Token id:Id.Lit_Chars val:'\tcat >expect <<-\\EOF &&\n' span_id:2062) (Token id:Id.Lit_Chars val:'\t09e12a9\tsource-b three\n' span_id:2063) 
          (Token id:Id.Lit_Chars val:'\t8e393e1\tsource-a two\n' span_id:2064) (Token id:Id.Lit_Chars val:'\t1ac6c77\tsource-b one\n' span_id:2065) 
          (Token id:Id.Lit_Chars val:'\tEOF\n' span_id:2066) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit log --oneline --source source-a source-b >actual &&\n'
            span_id: 2067
          ) (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual\n' span_id:2068)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'log --source paints tag names' span_id:2075))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:2079) 
          (Token id:Id.Lit_Chars val:'\tgit tag -m tagged source-tag &&\n' span_id:2080) (Token id:Id.Lit_Chars val:'\tcat >expect <<-\\EOF &&\n' span_id:2081) 
          (Token id:Id.Lit_Chars val:'\t09e12a9\tsource-tag three\n' span_id:2082) (Token id:Id.Lit_Chars val:'\t8e393e1\tsource-a two\n' span_id:2083) 
          (Token id:Id.Lit_Chars val:'\t1ac6c77\tsource-tag one\n' span_id:2084) (Token id:Id.Lit_Chars val:'\tEOF\n' span_id:2085) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit log --oneline --source source-tag source-a >actual &&\n'
            span_id: 2086
          ) (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual\n' span_id:2087)
        )
      }
    )
    (C {(test_done)})
  ]
)