(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:'Test git notes prune' span_id:6))}
          spids: [4]
        )
      ]
    )
    (C {(.)} {(./test-lib.sh)})
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'setup: create a few commits with notes' span_id:18))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:22) (Token id:Id.Lit_Chars val:'\n' span_id:23) 
          (Token id:Id.Lit_Chars val:'\t: > file1 &&\n' span_id:24) (Token id:Id.Lit_Chars val:'\tgit add file1 &&\n' span_id:25) 
          (Token id:Id.Lit_Chars val:'\ttest_tick &&\n' span_id:26) (Token id:Id.Lit_Chars val:'\tgit commit -m 1st &&\n' span_id:27) 
          (Token id:Id.Lit_Chars val:'\tgit notes add -m "Note #1" &&\n' span_id:28) (Token id:Id.Lit_Chars val:'\t: > file2 &&\n' span_id:29) 
          (Token id:Id.Lit_Chars val:'\tgit add file2 &&\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 2nd &&\n' span_id:32) (Token id:Id.Lit_Chars val:'\tgit notes add -m "Note #2" &&\n' span_id:33) 
          (Token id:Id.Lit_Chars val:'\t: > file3 &&\n' span_id:34) (Token id:Id.Lit_Chars val:'\tgit add file3 &&\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 3rd &&\n' span_id:37) 
          (Token
            id: Id.Lit_Chars
            val: '\tCOMMIT_FILE=.git/objects/5e/e1c35e83ea47cd3cc4f8cbee0568915fbbbd29 &&\n'
            span_id: 38
          ) (Token id:Id.Lit_Chars val:'\ttest -f $COMMIT_FILE &&\n' span_id:39) 
          (Token id:Id.Lit_Chars val:'\ttest-chmtime =+0 $COMMIT_FILE &&\n' span_id:40) (Token id:Id.Lit_Chars val:'\tgit notes add -m "Note #3"\n' span_id:41)
        )
      }
    )
    (command.Simple
      words: [{(cat)}]
      redirects: [
        (redir.Redir op:(Token id:Id.Redir_Great val:'>' span_id:47) fd:-1 arg_word:{(expect)})
        (redir.HereDoc
          op: (Token id:Id.Redir_DLess val:'<<' span_id:51)
          fd: -1
          here_begin: {(END_OF_LOG)}
          here_end_span_id: 81
          stdin_parts: [
            ('commit 5ee1c35e83ea47cd3cc4f8cbee0568915fbbbd29\n')
            ('Author: A U Thor <author@example.com>\n')
            ('Date:   Thu Apr 7 15:15:13 2005 -0700\n')
            ('\n')
            ('    3rd\n')
            ('\n')
            ('Notes:\n')
            ('    Note #3\n')
            ('\n')
            ('commit 08341ad9e94faa089d60fd3f523affb25c6da189\n')
            ('Author: A U Thor <author@example.com>\n')
            ('Date:   Thu Apr 7 15:14:13 2005 -0700\n')
            ('\n')
            ('    2nd\n')
            ('\n')
            ('Notes:\n')
            ('    Note #2\n')
            ('\n')
            ('commit ab5f302035f2e7aaf04265f08b42034c23256e1f\n')
            ('Author: A U Thor <author@example.com>\n')
            ('Date:   Thu Apr 7 15:13:13 2005 -0700\n')
            ('\n')
            ('    1st\n')
            ('\n')
            ('Notes:\n')
            ('    Note #1\n')
          ]
        )
      ]
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'verify commits and notes' span_id:86))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:90) (Token id:Id.Lit_Chars val:'\n' span_id:91) 
          (Token id:Id.Lit_Chars val:'\tgit log > actual &&\n' span_id:92) (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual\n' span_id:93)
        )
      }
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'remove some commits' span_id:100))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:104) (Token id:Id.Lit_Chars val:'\n' span_id:105) 
          (Token id:Id.Lit_Chars val:'\tgit reset --hard HEAD~1 &&\n' span_id:106) (Token id:Id.Lit_Chars val:'\tgit reflog expire --expire=now HEAD &&\n' span_id:107) 
          (Token id:Id.Lit_Chars val:'\tgit gc --prune=now\n' span_id:108)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'verify that commits are gone' span_id:115))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:119) (Token id:Id.Lit_Chars val:'\n' span_id:120) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest_must_fail git cat-file -p 5ee1c35e83ea47cd3cc4f8cbee0568915fbbbd29 &&\n'
            span_id: 121
          ) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit cat-file -p 08341ad9e94faa089d60fd3f523affb25c6da189 &&\n'
            span_id: 122
          ) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit cat-file -p ab5f302035f2e7aaf04265f08b42034c23256e1f\n'
            span_id: 123
          )
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'verify that notes are still present' span_id:130))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:134) (Token id:Id.Lit_Chars val:'\n' span_id:135) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit notes show 5ee1c35e83ea47cd3cc4f8cbee0568915fbbbd29 &&\n'
            span_id: 136
          ) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit notes show 08341ad9e94faa089d60fd3f523affb25c6da189 &&\n'
            span_id: 137
          ) (Token id:Id.Lit_Chars val:'\tgit notes show ab5f302035f2e7aaf04265f08b42034c23256e1f\n' span_id:138)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'prune -n does not remove notes' span_id:145))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:149) (Token id:Id.Lit_Chars val:'\n' span_id:150) 
          (Token id:Id.Lit_Chars val:'\tgit notes list > expect &&\n' span_id:151) (Token id:Id.Lit_Chars val:'\tgit notes prune -n &&\n' span_id:152) 
          (Token id:Id.Lit_Chars val:'\tgit notes list > actual &&\n' span_id:153) (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual\n' span_id:154)
        )
      }
    )
    (command.Simple
      words: [{(cat)}]
      redirects: [
        (redir.Redir
          op: (Token id:Id.Redir_Great val:'>' span_id:160)
          fd: -1
          arg_word: {(expect)}
        )
        (redir.HereDoc
          op: (Token id:Id.Redir_DLess val:'<<' span_id:164)
          fd: -1
          here_begin: {(EOF)}
          here_end_span_id: 169
          stdin_parts: [('5ee1c35e83ea47cd3cc4f8cbee0568915fbbbd29\n')]
        )
      ]
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'prune -n lists prunable notes' span_id:174))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:178) (Token id:Id.Lit_Chars val:'\n' span_id:179) 
          (Token id:Id.Lit_Chars val:'\n' span_id:180) (Token id:Id.Lit_Chars val:'\tgit notes prune -n > actual &&\n' span_id:181) 
          (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual\n' span_id:182)
        )
      }
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'prune notes' span_id:190))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:194) (Token id:Id.Lit_Chars val:'\n' span_id:195) 
          (Token id:Id.Lit_Chars val:'\tgit notes prune\n' span_id:196)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'verify that notes are gone' span_id:203))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:207) (Token id:Id.Lit_Chars val:'\n' span_id:208) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest_must_fail git notes show 5ee1c35e83ea47cd3cc4f8cbee0568915fbbbd29 &&\n'
            span_id: 209
          ) 
          (Token
            id: Id.Lit_Chars
            val: '\tgit notes show 08341ad9e94faa089d60fd3f523affb25c6da189 &&\n'
            span_id: 210
          ) (Token id:Id.Lit_Chars val:'\tgit notes show ab5f302035f2e7aaf04265f08b42034c23256e1f\n' span_id:211)
        )
      }
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'remove some commits' span_id:218))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:222) (Token id:Id.Lit_Chars val:'\n' span_id:223) 
          (Token id:Id.Lit_Chars val:'\tgit reset --hard HEAD~1 &&\n' span_id:224) (Token id:Id.Lit_Chars val:'\tgit reflog expire --expire=now HEAD &&\n' span_id:225) 
          (Token id:Id.Lit_Chars val:'\tgit gc --prune=now\n' span_id:226)
        )
      }
    )
    (command.Simple
      words: [{(cat)}]
      redirects: [
        (redir.Redir
          op: (Token id:Id.Redir_Great val:'>' span_id:232)
          fd: -1
          arg_word: {(expect)}
        )
        (redir.HereDoc
          op: (Token id:Id.Redir_DLess val:'<<' span_id:236)
          fd: -1
          here_begin: {(EOF)}
          here_end_span_id: 241
          stdin_parts: [('08341ad9e94faa089d60fd3f523affb25c6da189\n')]
        )
      ]
    )
    (C {(test_expect_success)} {(SQ (Token id:Id.Lit_Chars val:'prune -v notes' span_id:246))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:250) (Token id:Id.Lit_Chars val:'\n' span_id:251) 
          (Token id:Id.Lit_Chars val:'\tgit notes prune -v > actual &&\n' span_id:252) (Token id:Id.Lit_Chars val:'\ttest_cmp expect actual\n' span_id:253)
        )
      }
    )
    (C {(test_expect_success)} 
      {(SQ (Token id:Id.Lit_Chars val:'verify that notes are gone' span_id:260))} 
      {
        (SQ (Token id:Id.Lit_Chars val:'\n' span_id:264) (Token id:Id.Lit_Chars val:'\n' span_id:265) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest_must_fail git notes show 5ee1c35e83ea47cd3cc4f8cbee0568915fbbbd29 &&\n'
            span_id: 266
          ) 
          (Token
            id: Id.Lit_Chars
            val: '\ttest_must_fail git notes show 08341ad9e94faa089d60fd3f523affb25c6da189 &&\n'
            span_id: 267
          ) (Token id:Id.Lit_Chars val:'\tgit notes show ab5f302035f2e7aaf04265f08b42034c23256e1f\n' span_id:268)
        )
      }
    )
    (C {(test_done)})
  ]
)