|
|
|
@ -766,14 +766,7 @@ struct format_commit_context {
@@ -766,14 +766,7 @@ 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 *gpg_status; |
|
|
|
|
char good_bad; |
|
|
|
|
char *signer; |
|
|
|
|
char *key; |
|
|
|
|
} signature; |
|
|
|
|
struct signature_check signature_check; |
|
|
|
|
char *message; |
|
|
|
|
size_t width, indent1, indent2; |
|
|
|
|
|
|
|
|
@ -956,64 +949,6 @@ static void rewrap_message_tail(struct strbuf *sb,
@@ -956,64 +949,6 @@ static void rewrap_message_tail(struct strbuf *sb,
|
|
|
|
|
c->indent2 = new_indent2; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static struct { |
|
|
|
|
char result; |
|
|
|
|
const char *check; |
|
|
|
|
} signature_check[] = { |
|
|
|
|
{ 'G', "\n[GNUPG:] GOODSIG " }, |
|
|
|
|
{ 'B', "\n[GNUPG:] BADSIG " }, |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
static void parse_signature_lines(struct format_commit_context *ctx) |
|
|
|
|
{ |
|
|
|
|
const char *buf = ctx->signature.gpg_status; |
|
|
|
|
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); |
|
|
|
|
ctx->signature.key = xmemdupz(found, 16); |
|
|
|
|
found += 17; |
|
|
|
|
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; |
|
|
|
|
struct strbuf gpg_status = 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, &gpg_status); |
|
|
|
|
if (status && !gpg_output.len) |
|
|
|
|
goto out; |
|
|
|
|
ctx->signature.gpg_output = strbuf_detach(&gpg_output, NULL); |
|
|
|
|
ctx->signature.gpg_status = strbuf_detach(&gpg_status, NULL); |
|
|
|
|
parse_signature_lines(ctx); |
|
|
|
|
|
|
|
|
|
out: |
|
|
|
|
strbuf_release(&gpg_status); |
|
|
|
|
strbuf_release(&gpg_output); |
|
|
|
|
strbuf_release(&payload); |
|
|
|
|
strbuf_release(&signature); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
static int format_reflog_person(struct strbuf *sb, |
|
|
|
|
char part, |
|
|
|
|
struct reflog_walk_info *log, |
|
|
|
@ -1199,27 +1134,27 @@ static size_t format_commit_one(struct strbuf *sb, const char *placeholder,
@@ -1199,27 +1134,27 @@ static size_t format_commit_one(struct strbuf *sb, const char *placeholder,
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (placeholder[0] == 'G') { |
|
|
|
|
if (!c->commit_signature_parsed) |
|
|
|
|
parse_commit_signature(c); |
|
|
|
|
if (!c->signature_check.result) |
|
|
|
|
check_commit_signature(c->commit, &(c->signature_check)); |
|
|
|
|
switch (placeholder[1]) { |
|
|
|
|
case 'G': |
|
|
|
|
if (c->signature.gpg_output) |
|
|
|
|
strbuf_addstr(sb, c->signature.gpg_output); |
|
|
|
|
if (c->signature_check.gpg_output) |
|
|
|
|
strbuf_addstr(sb, c->signature_check.gpg_output); |
|
|
|
|
break; |
|
|
|
|
case '?': |
|
|
|
|
switch (c->signature.good_bad) { |
|
|
|
|
switch (c->signature_check.result) { |
|
|
|
|
case 'G': |
|
|
|
|
case 'B': |
|
|
|
|
strbuf_addch(sb, c->signature.good_bad); |
|
|
|
|
strbuf_addch(sb, c->signature_check.result); |
|
|
|
|
} |
|
|
|
|
break; |
|
|
|
|
case 'S': |
|
|
|
|
if (c->signature.signer) |
|
|
|
|
strbuf_addstr(sb, c->signature.signer); |
|
|
|
|
if (c->signature_check.signer) |
|
|
|
|
strbuf_addstr(sb, c->signature_check.signer); |
|
|
|
|
break; |
|
|
|
|
case 'K': |
|
|
|
|
if (c->signature.key) |
|
|
|
|
strbuf_addstr(sb, c->signature.key); |
|
|
|
|
if (c->signature_check.key) |
|
|
|
|
strbuf_addstr(sb, c->signature_check.key); |
|
|
|
|
break; |
|
|
|
|
} |
|
|
|
|
return 2; |
|
|
|
@ -1357,8 +1292,8 @@ void format_commit_message(const struct commit *commit,
@@ -1357,8 +1292,8 @@ void format_commit_message(const struct commit *commit,
|
|
|
|
|
rewrap_message_tail(sb, &context, 0, 0, 0); |
|
|
|
|
|
|
|
|
|
logmsg_free(context.message, commit); |
|
|
|
|
free(context.signature.gpg_output); |
|
|
|
|
free(context.signature.signer); |
|
|
|
|
free(context.signature_check.gpg_output); |
|
|
|
|
free(context.signature_check.signer); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static void pp_header(const struct pretty_print_context *pp, |
|
|
|
|