diff options
author | Junio C Hamano <gitster@pobox.com> | 2012-12-07 14:10:56 -0800 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2012-12-07 14:10:56 -0800 |
commit | fff26a68053022a2cbc39142c7c6f6d016837058 (patch) | |
tree | 1ad5a3cd1a135213b3694f11fdcb52bcddec51b9 | |
parent | 6a402843c2bc0a72fb70c8795aee523d7f1582d3 (diff) | |
parent | 0e18bcd5e937b9e5857892e7f5c80c3c5b1da5d4 (diff) | |
download | git-fff26a68053022a2cbc39142c7c6f6d016837058.tar.gz git-fff26a68053022a2cbc39142c7c6f6d016837058.tar.xz |
Merge branch 'jc/same-encoding' into maint
Various codepaths checked if two encoding names are the same using
ad-hoc code and some of them ended up asking iconv() to convert
between "utf8" and "UTF-8". The former is not a valid way to spell
the encoding name, but often people use it by mistake, and we
equated them in some but not all codepaths. Introduce a new helper
function to make these codepaths consistent.
* jc/same-encoding:
reencode_string(): introduce and use same_encoding()
-rw-r--r-- | builtin/mailinfo.c | 3 | ||||
-rw-r--r-- | notes.c | 2 | ||||
-rw-r--r-- | pretty.c | 2 | ||||
-rw-r--r-- | sequencer.c | 2 | ||||
-rw-r--r-- | utf8.c | 7 | ||||
-rw-r--r-- | utf8.h | 1 |
6 files changed, 13 insertions, 4 deletions
diff --git a/builtin/mailinfo.c b/builtin/mailinfo.c index da231400b..24a772d8e 100644 --- a/builtin/mailinfo.c +++ b/builtin/mailinfo.c @@ -483,7 +483,8 @@ static void convert_to_utf8(struct strbuf *line, const char *charset) if (!charset || !*charset) return; - if (!strcasecmp(metainfo_charset, charset)) + + if (same_encoding(metainfo_charset, charset)) return; out = reencode_string(line->buf, metainfo_charset, charset); if (!out) @@ -1231,7 +1231,7 @@ static 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) { free(msg); @@ -571,7 +571,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); else diff --git a/sequencer.c b/sequencer.c index e3723d209..73c396bd8 100644 --- a/sequencer.c +++ b/sequencer.c @@ -60,7 +60,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); |