(command.CommandList
  children: [
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:test_description)
          op: assign_op.Equal
          rhs: {(SQ <'signed commit tests'>)}
          spids: [4]
        )
      ]
    )
    (C {<.>} {<'./test-lib.sh'>})
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:GNUPGHOME_NOT_USED)
          op: assign_op.Equal
          rhs: {($ Id.VSub_DollarName '$GNUPGHOME')}
          spids: [13]
        )
      ]
    )
    (C {<.>} {(DQ ($ Id.VSub_DollarName '$TEST_DIRECTORY') <'/lib-gpg.sh'>)})
    (C {<test_expect_success>} {<GPG>} {(SQ <'create signed commits'>)} 
      {
        (SQ <'\n'> <'\ttest_when_finished "test_unconfig commit.gpgsign" &&\n'> <'\n'> 
          <'\techo 1 >file && git add file &&\n'> <'\ttest_tick && git commit -S -m initial &&\n'> <'\tgit tag initial &&\n'> <'\tgit branch side &&\n'> 
          <'\n'> <'\techo 2 >file && test_tick && git commit -a -S -m second &&\n'> <'\tgit tag second &&\n'> <'\n'> 
          <'\tgit checkout side &&\n'> <'\techo 3 >elif && git add elif &&\n'> <'\ttest_tick && git commit -m "third on side" &&\n'> <'\n'> 
          <'\tgit checkout master &&\n'> <'\ttest_tick && git merge -S side &&\n'> <'\tgit tag merge &&\n'> <'\n'> 
          <'\techo 4 >file && test_tick && git commit -a -m "fourth unsigned" &&\n'> <'\tgit tag fourth-unsigned &&\n'> <'\n'> 
          <'\ttest_tick && git commit --amend -S -m "fourth signed" &&\n'> <'\tgit tag fourth-signed &&\n'> <'\n'> <'\tgit config commit.gpgsign true &&\n'> 
          <'\techo 5 >file && test_tick && git commit -a -m "fifth signed" &&\n'> <'\tgit tag fifth-signed &&\n'> <'\n'> <'\tgit config commit.gpgsign false &&\n'> 
          <'\techo 6 >file && test_tick && git commit -a -m "sixth" &&\n'> <'\tgit tag sixth-unsigned &&\n'> <'\n'> <'\tgit config commit.gpgsign true &&\n'> 
          <'\techo 7 >file && test_tick && git commit -a -m "seventh" --no-gpg-sign &&\n'> <'\tgit tag seventh-unsigned &&\n'> <'\n'> 
          <'\ttest_tick && git rebase -f HEAD^^ && git tag sixth-signed HEAD^ &&\n'> <'\tgit tag seventh-signed &&\n'> <'\n'> 
          <'\techo 8 >file && test_tick && git commit -a -m eighth -SB7227189 &&\n'> <'\tgit tag eighth-signed-alt &&\n'> <'\n'> 
          <'\t# commit.gpgsign is still on but this must not be signed\n'> <'\tgit tag ninth-unsigned $(echo 9 | git commit-tree HEAD^{tree}) &&\n'> 
          <'\t# explicit -S of course must sign.\n'> <'\tgit tag tenth-signed $(echo 9 | git commit-tree -S HEAD^{tree})\n'>
        )
      }
    )
    (C {<test_expect_success>} {<GPG>} {(SQ <'verify and show signatures'>)} 
      {
        (SQ <'\n'> <'\t(\n'> <'\t\tfor commit in initial second merge fourth-signed \\\n'> 
          <'\t\t\tfifth-signed sixth-signed seventh-signed tenth-signed\n'> <'\t\tdo\n'> <'\t\t\tgit verify-commit $commit &&\n'> 
          <'\t\t\tgit show --pretty=short --show-signature $commit >actual &&\n'> <'\t\t\tgrep "Good signature from" actual &&\n'> <'\t\t\t! grep "BAD signature from" actual &&\n'> 
          <'\t\t\techo $commit OK || exit 1\n'> <'\t\tdone\n'> <'\t) &&\n'> <'\t(\n'> <'\t\tfor commit in merge^2 fourth-unsigned sixth-unsigned \\\n'> 
          <'\t\t\tseventh-unsigned ninth-unsigned\n'> <'\t\tdo\n'> <'\t\t\ttest_must_fail git verify-commit $commit &&\n'> 
          <'\t\t\tgit show --pretty=short --show-signature $commit >actual &&\n'> <'\t\t\t! grep "Good signature from" actual &&\n'> <'\t\t\t! grep "BAD signature from" actual &&\n'> 
          <'\t\t\techo $commit OK || exit 1\n'> <'\t\tdone\n'> <'\t) &&\n'> <'\t(\n'> <'\t\tfor commit in eighth-signed-alt\n'> <'\t\tdo\n'> 
          <'\t\t\tgit show --pretty=short --show-signature $commit >actual &&\n'> <'\t\t\tgrep "Good signature from" actual &&\n'> <'\t\t\t! grep "BAD signature from" actual &&\n'> 
          <'\t\t\tgrep "not certified" actual &&\n'> <'\t\t\techo $commit OK || exit 1\n'> <'\t\tdone\n'> <'\t)\n'>
        )
      }
    )
    (C {<test_expect_success>} {<GPG>} {(SQ <'verify-commit exits success on untrusted signature'>)} 
      {
        (SQ <'\n'> <'\tgit verify-commit eighth-signed-alt 2>actual &&\n'> 
          <'\tgrep "Good signature from" actual &&\n'> <'\t! grep "BAD signature from" actual &&\n'> <'\tgrep "not certified" actual\n'>
        )
      }
    )
    (C {<test_expect_success>} {<GPG>} {(SQ <'verify signatures with --raw'>)} 
      {
        (SQ <'\n'> <'\t(\n'> 
          <
'\t\tfor commit in initial second merge fourth-signed fifth-signed sixth-signed seventh-signed\n'
          > <'\t\tdo\n'> <'\t\t\tgit verify-commit --raw $commit 2>actual &&\n'> 
          <'\t\t\tgrep "GOODSIG" actual &&\n'> <'\t\t\t! grep "BADSIG" actual &&\n'> <'\t\t\techo $commit OK || exit 1\n'> <'\t\tdone\n'> <'\t) &&\n'> 
          <'\t(\n'> <'\t\tfor commit in merge^2 fourth-unsigned sixth-unsigned seventh-unsigned\n'> <'\t\tdo\n'> 
          <'\t\t\ttest_must_fail git verify-commit --raw $commit 2>actual &&\n'> <'\t\t\t! grep "GOODSIG" actual &&\n'> <'\t\t\t! grep "BADSIG" actual &&\n'> 
          <'\t\t\techo $commit OK || exit 1\n'> <'\t\tdone\n'> <'\t) &&\n'> <'\t(\n'> <'\t\tfor commit in eighth-signed-alt\n'> <'\t\tdo\n'> 
          <'\t\t\tgit verify-commit --raw $commit 2>actual &&\n'> <'\t\t\tgrep "GOODSIG" actual &&\n'> <'\t\t\t! grep "BADSIG" actual &&\n'> 
          <'\t\t\tgrep "TRUST_UNDEFINED" actual &&\n'> <'\t\t\techo $commit OK || exit 1\n'> <'\t\tdone\n'> <'\t)\n'>
        )
      }
    )
    (C {<test_expect_success>} {<GPG>} {(SQ <'show signed commit with signature'>)} 
      {
        (SQ <'\n'> <'\tgit show -s initial >commit &&\n'> 
          <'\tgit show -s --show-signature initial >show &&\n'> <'\tgit verify-commit -v initial >verify.1 2>verify.2 &&\n'> 
          <'\tgit cat-file commit initial >cat &&\n'> <'\tgrep -v -e "gpg: " -e "Warning: " show >show.commit &&\n'> 
          <'\tgrep -e "gpg: " -e "Warning: " show >show.gpg &&\n'> <'\tgrep -v "^ " cat | grep -v "^gpgsig " >cat.commit &&\n'> <'\ttest_cmp show.commit commit &&\n'> 
          <'\ttest_cmp show.gpg verify.2 &&\n'> <'\ttest_cmp cat.commit verify.1\n'>
        )
      }
    )
    (C {<test_expect_success>} {<GPG>} {(SQ <'detect fudged signature'>)} 
      {
        (SQ <'\n'> <'\tgit cat-file commit seventh-signed >raw &&\n'> <'\n'> 
          <'\tsed -e "s/seventh/7th forged/" raw >forged1 &&\n'> <'\tgit hash-object -w -t commit forged1 >forged1.commit &&\n'> 
          <'\t! git verify-commit $(cat forged1.commit) &&\n'> <'\tgit show --pretty=short --show-signature $(cat forged1.commit) >actual1 &&\n'> 
          <'\tgrep "BAD signature from" actual1 &&\n'> <'\t! grep "Good signature from" actual1\n'>
        )
      }
    )
    (C {<test_expect_success>} {<GPG>} {(SQ <'detect fudged signature with NUL'>)} 
      {
        (SQ <'\n'> <'\tgit cat-file commit seventh-signed >raw &&\n'> <'\tcat raw >forged2 &&\n'> 
          <'\techo Qwik | tr "Q" "\\000" >>forged2 &&\n'> <'\tgit hash-object -w -t commit forged2 >forged2.commit &&\n'> 
          <'\t! git verify-commit $(cat forged2.commit) &&\n'> <'\tgit show --pretty=short --show-signature $(cat forged2.commit) >actual2 &&\n'> 
          <'\tgrep "BAD signature from" actual2 &&\n'> <'\t! grep "Good signature from" actual2\n'>
        )
      }
    )
    (C {<test_expect_success>} {<GPG>} {(SQ <'amending already signed commit'>)} 
      {
        (SQ <'\n'> <'\tgit checkout fourth-signed^0 &&\n'> <'\tgit commit --amend -S --no-edit &&\n'> 
          <'\tgit verify-commit HEAD &&\n'> <'\tgit show -s --show-signature HEAD >actual &&\n'> <'\tgrep "Good signature from" actual &&\n'> 
          <'\t! grep "BAD signature from" actual\n'>
        )
      }
    )
    (C {<test_expect_success>} {<GPG>} {(SQ <'show good signature with custom format'>)} 
      {
        (SQ <'\n'> <'\tcat >expect <<-\\EOF &&\n'> <'\tG\n'> <'\t13B6F51ECDDE430D\n'> 
          <'\tC O Mitter <committer@example.com>\n'> <'\tEOF\n'> <'\tgit log -1 --format="%G?%n%GK%n%GS" sixth-signed >actual &&\n'> 
          <'\ttest_cmp expect actual\n'>
        )
      }
    )
    (C {<test_expect_success>} {<GPG>} {(SQ <'show bad signature with custom format'>)} 
      {
        (SQ <'\n'> <'\tcat >expect <<-\\EOF &&\n'> <'\tB\n'> <'\t13B6F51ECDDE430D\n'> 
          <'\tC O Mitter <committer@example.com>\n'> <'\tEOF\n'> <'\tgit log -1 --format="%G?%n%GK%n%GS" $(cat forged1.commit) >actual &&\n'> 
          <'\ttest_cmp expect actual\n'>
        )
      }
    )
    (C {<test_expect_success>} {<GPG>} {(SQ <'show untrusted signature with custom format'>)} 
      {
        (SQ <'\n'> <'\tcat >expect <<-\\EOF &&\n'> <'\tU\n'> <'\t61092E85B7227189\n'> 
          <'\tEris Discordia <discord@example.net>\n'> <'\tEOF\n'> <'\tgit log -1 --format="%G?%n%GK%n%GS" eighth-signed-alt >actual &&\n'> 
          <'\ttest_cmp expect actual\n'>
        )
      }
    )
    (C {<test_expect_success>} {<GPG>} {(SQ <'show unknown signature with custom format'>)} 
      {
        (SQ <'\n'> <'\tcat >expect <<-\\EOF &&\n'> <'\tE\n'> <'\t61092E85B7227189\n'> <'\n'> <'\tEOF\n'> 
          <
'\tGNUPGHOME="$GNUPGHOME_NOT_USED" git log -1 --format="%G?%n%GK%n%GS" eighth-signed-alt >actual &&\n'
          > <'\ttest_cmp expect actual\n'>
        )
      }
    )
    (C {<test_expect_success>} {<GPG>} {(SQ <'show lack of signature with custom format'>)} 
      {
        (SQ <'\n'> <'\tcat >expect <<-\\EOF &&\n'> <'\tN\n'> <'\n'> <'\n'> <'\tEOF\n'> 
          <'\tgit log -1 --format="%G?%n%GK%n%GS" seventh-unsigned >actual &&\n'> <'\ttest_cmp expect actual\n'>
        )
      }
    )
    (C {<test_expect_success>} {<GPG>} {(SQ <'log.showsignature behaves like --show-signature'>)} 
      {
        (SQ <'\n'> <'\ttest_config log.showsignature true &&\n'> <'\tgit show initial >actual &&\n'> 
          <'\tgrep "gpg: Signature made" actual &&\n'> <'\tgrep "gpg: Good signature" actual\n'>
        )
      }
    )
    (C {<test_done>})
  ]
)