summary | shortlog | log | commit | commitdiff | tree
raw | patch | inline | side by side (parent: 4e72dce)
raw | patch | inline | side by side (parent: 4e72dce)
author | Junio C Hamano <junkio@cox.net> | |
Mon, 28 Nov 2005 00:22:16 +0000 (16:22 -0800) | ||
committer | Junio C Hamano <junkio@cox.net> | |
Mon, 28 Nov 2005 00:26:50 +0000 (16:26 -0800) |
When the message body does not identify what encoding it is in,
-u assumes it is in latin-1 and converts it to utf8, which is
the recommended encoding for git commit log messages.
With -u=<encoding>, the conversion is made into the specified
one, instead of utf8, to allow project-local policies.
Signed-off-by: Junio C Hamano <junkio@cox.net>
-u assumes it is in latin-1 and converts it to utf8, which is
the recommended encoding for git commit log messages.
With -u=<encoding>, the conversion is made into the specified
one, instead of utf8, to allow project-local policies.
Signed-off-by: Junio C Hamano <junkio@cox.net>
mailinfo.c | patch | blob | history |
diff --git a/mailinfo.c b/mailinfo.c
index cb853df993f37d74576e308008379d709361a447..6d8c93360fe084a4209277312a99fbb40d1c04bc 100644 (file)
--- a/mailinfo.c
+++ b/mailinfo.c
static FILE *cmitmsg, *patchfile;
static int keep_subject = 0;
-static int metainfo_utf8 = 0;
+static char *metainfo_charset = NULL;
static char line[1000];
static char date[1000];
static char name[1000];
static void convert_to_utf8(char *line, char *charset)
{
- if (*charset) {
- char *in, *out;
- size_t insize, outsize, nrc;
- char outbuf[4096]; /* cheat */
- iconv_t conv = iconv_open("utf-8", charset);
-
- if (conv == (iconv_t) -1) {
- fprintf(stderr, "cannot convert from %s to utf-8\n",
- charset);
+ char *in, *out;
+ size_t insize, outsize, nrc;
+ char outbuf[4096]; /* cheat */
+ static char latin_one[] = "latin-1";
+ char *input_charset = *charset ? charset : latin_one;
+ iconv_t conv = iconv_open(metainfo_charset, input_charset);
+
+ if (conv == (iconv_t) -1) {
+ static int warned_latin1_once = 0;
+ if (input_charset != latin_one) {
+ fprintf(stderr, "cannot convert from %s to %s\n",
+ input_charset, metainfo_charset);
*charset = 0;
- return;
}
- in = line;
- insize = strlen(in);
- out = outbuf;
- outsize = sizeof(outbuf);
- nrc = iconv(conv, &in, &insize, &out, &outsize);
- iconv_close(conv);
- if (nrc == (size_t) -1)
- return;
- *out = 0;
- strcpy(line, outbuf);
+ else if (!warned_latin1_once) {
+ warned_latin1_once = 1;
+ fprintf(stderr, "tried to convert from %s to %s, "
+ "but your iconv does not work with it.\n",
+ input_charset, metainfo_charset);
+ }
+ return;
}
+ in = line;
+ insize = strlen(in);
+ out = outbuf;
+ outsize = sizeof(outbuf);
+ nrc = iconv(conv, &in, &insize, &out, &outsize);
+ iconv_close(conv);
+ if (nrc == (size_t) -1)
+ return;
+ *out = 0;
+ strcpy(line, outbuf);
}
static void decode_header_bq(char *it)
}
if (sz < 0)
return;
- if (metainfo_utf8)
+ if (metainfo_charset)
convert_to_utf8(piecebuf, charset_q);
strcpy(out, piecebuf);
out += strlen(out);
* normalize the log message to UTF-8.
*/
decode_transfer_encoding(line);
- if (metainfo_utf8)
+ if (metainfo_charset)
convert_to_utf8(line, charset);
fputs(line, cmitmsg);
} while (fgets(line, sizeof(line), stdin) != NULL);
if (!strcmp(argv[1], "-k"))
keep_subject = 1;
else if (!strcmp(argv[1], "-u"))
- metainfo_utf8 = 1;
+ metainfo_charset = "utf-8";
+ else if (!strncmp(argv[1], "-u=", 3))
+ metainfo_charset = argv[1] + 3;
else
usage();
argc--; argv++;