зеркало из https://github.com/microsoft/git.git
pretty: get the correct encoding for --pretty:format=%e
parse_commit_header() provides the commit encoding for '%e' and it reads it from the re-encoded message, which contains the new encoding, not the original one in the commit object. This never happens because --pretty=format:xxx never respects i18n.logoutputencoding. But that's a different story. Get the commit encoding from logmsg_reencode() instead. Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Родитель
5a10d23658
Коммит
0940a76db6
13
pretty.c
13
pretty.c
|
@ -776,12 +776,12 @@ struct format_commit_context {
|
||||||
unsigned commit_message_parsed:1;
|
unsigned commit_message_parsed:1;
|
||||||
struct signature_check signature_check;
|
struct signature_check signature_check;
|
||||||
char *message;
|
char *message;
|
||||||
|
char *commit_encoding;
|
||||||
size_t width, indent1, indent2;
|
size_t width, indent1, indent2;
|
||||||
|
|
||||||
/* These offsets are relative to the start of the commit message. */
|
/* These offsets are relative to the start of the commit message. */
|
||||||
struct chunk author;
|
struct chunk author;
|
||||||
struct chunk committer;
|
struct chunk committer;
|
||||||
struct chunk encoding;
|
|
||||||
size_t message_off;
|
size_t message_off;
|
||||||
size_t subject_off;
|
size_t subject_off;
|
||||||
size_t body_off;
|
size_t body_off;
|
||||||
|
@ -828,9 +828,6 @@ static void parse_commit_header(struct format_commit_context *context)
|
||||||
} else if (!prefixcmp(msg + i, "committer ")) {
|
} else if (!prefixcmp(msg + i, "committer ")) {
|
||||||
context->committer.off = i + 10;
|
context->committer.off = i + 10;
|
||||||
context->committer.len = eol - i - 10;
|
context->committer.len = eol - i - 10;
|
||||||
} else if (!prefixcmp(msg + i, "encoding ")) {
|
|
||||||
context->encoding.off = i + 9;
|
|
||||||
context->encoding.len = eol - i - 9;
|
|
||||||
}
|
}
|
||||||
i = eol;
|
i = eol;
|
||||||
}
|
}
|
||||||
|
@ -1185,7 +1182,8 @@ static size_t format_commit_one(struct strbuf *sb, const char *placeholder,
|
||||||
msg + c->committer.off, c->committer.len,
|
msg + c->committer.off, c->committer.len,
|
||||||
c->pretty_ctx->date_mode);
|
c->pretty_ctx->date_mode);
|
||||||
case 'e': /* encoding */
|
case 'e': /* encoding */
|
||||||
strbuf_add(sb, msg + c->encoding.off, c->encoding.len);
|
if (c->commit_encoding)
|
||||||
|
strbuf_addstr(sb, c->commit_encoding);
|
||||||
return 1;
|
return 1;
|
||||||
case 'B': /* raw body */
|
case 'B': /* raw body */
|
||||||
/* message_off is always left at the initial newline */
|
/* message_off is always left at the initial newline */
|
||||||
|
@ -1296,11 +1294,14 @@ void format_commit_message(const struct commit *commit,
|
||||||
context.commit = commit;
|
context.commit = commit;
|
||||||
context.pretty_ctx = pretty_ctx;
|
context.pretty_ctx = pretty_ctx;
|
||||||
context.wrap_start = sb->len;
|
context.wrap_start = sb->len;
|
||||||
context.message = logmsg_reencode(commit, NULL, output_enc);
|
context.message = logmsg_reencode(commit,
|
||||||
|
&context.commit_encoding,
|
||||||
|
output_enc);
|
||||||
|
|
||||||
strbuf_expand(sb, format, format_commit_item, &context);
|
strbuf_expand(sb, format, format_commit_item, &context);
|
||||||
rewrap_message_tail(sb, &context, 0, 0, 0);
|
rewrap_message_tail(sb, &context, 0, 0, 0);
|
||||||
|
|
||||||
|
free(context.commit_encoding);
|
||||||
logmsg_free(context.message, commit);
|
logmsg_free(context.message, commit);
|
||||||
free(context.signature_check.gpg_output);
|
free(context.signature_check.gpg_output);
|
||||||
free(context.signature_check.signer);
|
free(context.signature_check.signer);
|
||||||
|
|
Загрузка…
Ссылка в новой задаче