From: Junio C Hamano <gitster@pobox.com>
To: git@vger.kernel.org
Subject: [PATCH v3 17/17] pretty: %G[?GS] placeholders
Date: Tue, 8 Nov 2011 17:02:03 -0800 [thread overview]
Message-ID: <1320800523-5407-18-git-send-email-gitster@pobox.com> (raw)
In-Reply-To: <1320800523-5407-1-git-send-email-gitster@pobox.com>
Add new placeholders related to the GPG signature on signed commits.
- %GG to show the raw verification message from GPG;
- %G? to show either "G" for Good, "B" for Bad;
- %GS to show the name of the signer.
Signed-off-by: Junio C Hamano <gitster@pobox.com>
---
pretty.c | 86 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 86 insertions(+), 0 deletions(-)
diff --git a/pretty.c b/pretty.c
index f45eb54..392d656 100644
--- a/pretty.c
+++ b/pretty.c
@@ -9,6 +9,7 @@
#include "notes.h"
#include "color.h"
#include "reflog-walk.h"
+#include "gpg-interface.h"
static char *user_format;
static struct cmt_fmt_map {
@@ -640,6 +641,12 @@ struct format_commit_context {
const struct pretty_print_context *pretty_ctx;
unsigned commit_header_parsed:1;
unsigned commit_message_parsed:1;
+ unsigned commit_signature_parsed:1;
+ struct {
+ char *gpg_output;
+ char good_bad;
+ char *signer;
+ } signature;
char *message;
size_t width, indent1, indent2;
@@ -822,6 +829,59 @@ static void rewrap_message_tail(struct strbuf *sb,
c->indent2 = new_indent2;
}
+static struct {
+ char result;
+ const char *check;
+} signature_check[] = {
+ { 'G', ": Good signature from " },
+ { 'B', ": BAD signature from " },
+};
+
+static void parse_signature_lines(struct format_commit_context *ctx)
+{
+ const char *buf = ctx->signature.gpg_output;
+ int i;
+
+ for (i = 0; i < ARRAY_SIZE(signature_check); i++) {
+ const char *found = strstr(buf, signature_check[i].check);
+ const char *next;
+ if (!found)
+ continue;
+ ctx->signature.good_bad = signature_check[i].result;
+ found += strlen(signature_check[i].check);
+ next = strchrnul(found, '\n');
+ ctx->signature.signer = xmemdupz(found, next - found);
+ break;
+ }
+}
+
+static void parse_commit_signature(struct format_commit_context *ctx)
+{
+ struct strbuf payload = STRBUF_INIT;
+ struct strbuf signature = STRBUF_INIT;
+ struct strbuf gpg_output = STRBUF_INIT;
+ int status;
+
+ ctx->commit_signature_parsed = 1;
+
+ if (parse_signed_commit(ctx->commit->object.sha1,
+ &payload, &signature) <= 0)
+ goto out;
+ status = verify_signed_buffer(payload.buf, payload.len,
+ signature.buf, signature.len,
+ &gpg_output);
+ if (status && !gpg_output.len)
+ goto out;
+ ctx->signature.gpg_output = strbuf_detach(&gpg_output, NULL);
+ parse_signature_lines(ctx);
+
+ out:
+ strbuf_release(&gpg_output);
+ strbuf_release(&payload);
+ strbuf_release(&signature);
+}
+
+
static size_t format_commit_one(struct strbuf *sb, const char *placeholder,
void *context)
{
@@ -974,6 +1034,30 @@ static size_t format_commit_one(struct strbuf *sb, const char *placeholder,
return 0;
}
+ if (placeholder[0] == 'G') {
+ if (!c->commit_signature_parsed)
+ parse_commit_signature(c);
+ switch (placeholder[1]) {
+ case 'G':
+ if (c->signature.gpg_output)
+ strbuf_addstr(sb, c->signature.gpg_output);
+ break;
+ case '?':
+ switch (c->signature.good_bad) {
+ case 'G':
+ case 'B':
+ strbuf_addch(sb, c->signature.good_bad);
+ }
+ break;
+ case 'S':
+ if (c->signature.signer)
+ strbuf_addstr(sb, c->signature.signer);
+ break;
+ }
+ return 2;
+ }
+
+
/* For the rest we have to parse the commit header. */
if (!c->commit_header_parsed)
parse_commit_header(c);
@@ -1114,6 +1198,8 @@ void format_commit_message(const struct commit *commit,
if (context.message != commit->buffer)
free(context.message);
+ free(context.signature.gpg_output);
+ free(context.signature.signer);
}
static void pp_header(const struct pretty_print_context *pp,
--
1.7.8.rc1.82.g90e080
next prev parent reply other threads:[~2011-11-09 1:02 UTC|newest]
Thread overview: 21+ messages / expand[flat|nested] mbox.gz Atom feed top
2011-11-09 1:01 [PATCH v3 00/17] Pulling signed tags Junio C Hamano
2011-11-09 1:01 ` [PATCH v3 01/17] Split GPG interface into its own helper library Junio C Hamano
2011-11-09 1:01 ` [PATCH v3 02/17] fetch: do not store peeled tag object names in FETCH_HEAD Junio C Hamano
2011-11-09 1:01 ` [PATCH v3 03/17] merge: notice local merging of tags and keep it unwrapped Junio C Hamano
2011-11-09 1:01 ` [PATCH v3 04/17] fetch: allow "git fetch $there v1.0" to fetch a tag Junio C Hamano
2011-11-09 1:01 ` [PATCH v3 05/17] refs DWIMmery: use the same rule for both "git fetch" and others Junio C Hamano
2011-11-09 1:01 ` [PATCH v3 06/17] fmt-merge-msg: avoid early returns Junio C Hamano
2011-11-09 1:01 ` [PATCH v3 07/17] fmt-merge-msg: package options into a structure Junio C Hamano
2011-11-09 1:01 ` [PATCH v3 08/17] fmt-merge-msg: Add contents of merged tag in the merge message Junio C Hamano
2011-11-09 1:01 ` [PATCH v3 09/17] merge: make usage of commit->util more extensible Junio C Hamano
2011-11-09 1:01 ` [PATCH v3 10/17] merge: record tag objects without peeling in MERGE_HEAD Junio C Hamano
2011-11-09 1:01 ` [PATCH v3 11/17] commit: copy merged signed tags to headers of merge commit Junio C Hamano
2011-11-09 1:01 ` [PATCH v3 12/17] merge: force edit mode when merging a tag object Junio C Hamano
2011-11-09 1:01 ` [PATCH v3 13/17] commit: teach --amend to carry forward extra headers Junio C Hamano
2011-11-09 1:02 ` [PATCH v3 14/17] commit: teach --gpg-sign option Junio C Hamano
2011-11-09 1:02 ` [PATCH v3 15/17] log: --show-signature Junio C Hamano
2011-11-09 1:02 ` [PATCH v3 16/17] test "commit -S" and "log --show-signature" Junio C Hamano
2011-11-09 1:02 ` Junio C Hamano [this message]
2011-11-09 10:32 ` [PATCH v3 00/17] Pulling signed tags Robin H. Johnson
2011-11-09 13:20 ` [PATCH 18/17] request-pull: use the annotated tag contents Junio C Hamano
2011-11-09 13:39 ` [PATCH 19/17] merge: do not fast-forward when merging a tag Junio C Hamano
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1320800523-5407-18-git-send-email-gitster@pobox.com \
--to=gitster@pobox.com \
--cc=git@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).