зеркало из https://github.com/microsoft/git.git
mailinfo: allow -u to fall back on latin1 to utf8 conversion.
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>
This commit is contained in:
Родитель
4e72dcec89
Коммит
650e4be59b
57
mailinfo.c
57
mailinfo.c
|
@ -16,7 +16,7 @@ extern char *gitstrcasestr(const char *haystack, const char *needle);
|
||||||
static FILE *cmitmsg, *patchfile;
|
static FILE *cmitmsg, *patchfile;
|
||||||
|
|
||||||
static int keep_subject = 0;
|
static int keep_subject = 0;
|
||||||
static int metainfo_utf8 = 0;
|
static char *metainfo_charset = NULL;
|
||||||
static char line[1000];
|
static char line[1000];
|
||||||
static char date[1000];
|
static char date[1000];
|
||||||
static char name[1000];
|
static char name[1000];
|
||||||
|
@ -441,29 +441,38 @@ static int decode_b_segment(char *in, char *ot, char *ep)
|
||||||
|
|
||||||
static void convert_to_utf8(char *line, char *charset)
|
static void convert_to_utf8(char *line, char *charset)
|
||||||
{
|
{
|
||||||
if (*charset) {
|
char *in, *out;
|
||||||
char *in, *out;
|
size_t insize, outsize, nrc;
|
||||||
size_t insize, outsize, nrc;
|
char outbuf[4096]; /* cheat */
|
||||||
char outbuf[4096]; /* cheat */
|
static char latin_one[] = "latin-1";
|
||||||
iconv_t conv = iconv_open("utf-8", charset);
|
char *input_charset = *charset ? charset : latin_one;
|
||||||
|
iconv_t conv = iconv_open(metainfo_charset, input_charset);
|
||||||
|
|
||||||
if (conv == (iconv_t) -1) {
|
if (conv == (iconv_t) -1) {
|
||||||
fprintf(stderr, "cannot convert from %s to utf-8\n",
|
static int warned_latin1_once = 0;
|
||||||
charset);
|
if (input_charset != latin_one) {
|
||||||
|
fprintf(stderr, "cannot convert from %s to %s\n",
|
||||||
|
input_charset, metainfo_charset);
|
||||||
*charset = 0;
|
*charset = 0;
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
in = line;
|
else if (!warned_latin1_once) {
|
||||||
insize = strlen(in);
|
warned_latin1_once = 1;
|
||||||
out = outbuf;
|
fprintf(stderr, "tried to convert from %s to %s, "
|
||||||
outsize = sizeof(outbuf);
|
"but your iconv does not work with it.\n",
|
||||||
nrc = iconv(conv, &in, &insize, &out, &outsize);
|
input_charset, metainfo_charset);
|
||||||
iconv_close(conv);
|
}
|
||||||
if (nrc == (size_t) -1)
|
return;
|
||||||
return;
|
|
||||||
*out = 0;
|
|
||||||
strcpy(line, outbuf);
|
|
||||||
}
|
}
|
||||||
|
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)
|
static void decode_header_bq(char *it)
|
||||||
|
@ -511,7 +520,7 @@ static void decode_header_bq(char *it)
|
||||||
}
|
}
|
||||||
if (sz < 0)
|
if (sz < 0)
|
||||||
return;
|
return;
|
||||||
if (metainfo_utf8)
|
if (metainfo_charset)
|
||||||
convert_to_utf8(piecebuf, charset_q);
|
convert_to_utf8(piecebuf, charset_q);
|
||||||
strcpy(out, piecebuf);
|
strcpy(out, piecebuf);
|
||||||
out += strlen(out);
|
out += strlen(out);
|
||||||
|
@ -590,7 +599,7 @@ static int handle_commit_msg(void)
|
||||||
* normalize the log message to UTF-8.
|
* normalize the log message to UTF-8.
|
||||||
*/
|
*/
|
||||||
decode_transfer_encoding(line);
|
decode_transfer_encoding(line);
|
||||||
if (metainfo_utf8)
|
if (metainfo_charset)
|
||||||
convert_to_utf8(line, charset);
|
convert_to_utf8(line, charset);
|
||||||
fputs(line, cmitmsg);
|
fputs(line, cmitmsg);
|
||||||
} while (fgets(line, sizeof(line), stdin) != NULL);
|
} while (fgets(line, sizeof(line), stdin) != NULL);
|
||||||
|
@ -720,7 +729,9 @@ int main(int argc, char **argv)
|
||||||
if (!strcmp(argv[1], "-k"))
|
if (!strcmp(argv[1], "-k"))
|
||||||
keep_subject = 1;
|
keep_subject = 1;
|
||||||
else if (!strcmp(argv[1], "-u"))
|
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
|
else
|
||||||
usage();
|
usage();
|
||||||
argc--; argv++;
|
argc--; argv++;
|
||||||
|
|
Загрузка…
Ссылка в новой задаче