Commit 0e18bcd5 authored by Junio C Hamano's avatar Junio C Hamano Committed by Jeff King

reencode_string(): introduce and use same_encoding()

Callers of reencode_string() that re-encodes a string from one
encoding to another all used ad-hoc way to bypass the case where the
input and the output encodings are the same.  Some did strcmp(),
some did strcasecmp(), yet some others when converting to UTF-8 used

Introduce same_encoding() helper function to make these callers use
the same logic.  Notably, is_encoding_utf8() has a work-around for
common misconfiguration to use "utf8" to name UTF-8 encoding, which
does not match "UTF-8" hence strcasecmp() would not consider the
same.  Make use of it in this helper function.
Signed-off-by: default avatarJunio C Hamano <>
parent 7e201053
......@@ -507,7 +507,7 @@ static void convert_to_utf8(struct strbuf *line, const char *charset)
if (!strcasecmp(metainfo_charset, charset))
if (same_encoding(metainfo_charset, charset))
out = reencode_string(line->buf, metainfo_charset, charset);
if (!out)
......@@ -1221,7 +1221,7 @@ void format_note(struct notes_tree *t, const unsigned char *object_sha1,
if (output_encoding && *output_encoding &&
strcmp(utf8, output_encoding)) {
!is_encoding_utf8(output_encoding)) {
char *reencoded = reencode_string(msg, output_encoding, utf8);
if (reencoded) {
......@@ -504,7 +504,7 @@ char *logmsg_reencode(const struct commit *commit,
return NULL;
encoding = get_header(commit, "encoding");
use_encoding = encoding ? encoding : utf8;
if (!strcmp(use_encoding, output_encoding))
if (same_encoding(use_encoding, output_encoding))
if (encoding) /* we'll strip encoding header later */
out = xstrdup(commit->buffer);
......@@ -58,7 +58,7 @@ static int get_message(struct commit *commit, struct commit_message *out)
out->reencoded_message = NULL;
out->message = commit->buffer;
if (strcmp(encoding, git_commit_encoding))
if (same_encoding(encoding, git_commit_encoding))
out->reencoded_message = reencode_string(commit->buffer,
git_commit_encoding, encoding);
if (out->reencoded_message)
......@@ -423,6 +423,13 @@ int is_encoding_utf8(const char *name)
return 0;
int same_encoding(const char *src, const char *dst)
if (is_encoding_utf8(src) && is_encoding_utf8(dst))
return 1;
return !strcasecmp(src, dst);
* Given a buffer and its encoding, return it re-encoded
* with iconv. If the conversion fails, returns NULL.
......@@ -7,6 +7,7 @@ int utf8_width(const char **start, size_t *remainder_p);
int utf8_strwidth(const char *string);
int is_utf8(const char *text);
int is_encoding_utf8(const char *name);
int same_encoding(const char *, const char *);
int strbuf_add_wrapped_text(struct strbuf *buf,
const char *text, int indent, int indent2, int width);
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment