diff options
author | Junio C Hamano <junkio@cox.net> | 2006-12-30 15:49:32 -0800 |
---|---|---|
committer | Junio C Hamano <junkio@cox.net> | 2006-12-30 16:35:57 -0800 |
commit | 53af9816bcb1d441fef76c3adaf0c4cb858768ac (patch) | |
tree | 3f342ba33e9c455dedce0e5d1e1dac3307dbb11e | |
parent | 677cfed56ac530878b746ee4cca3ada8af384a81 (diff) | |
download | git-53af9816bcb1d441fef76c3adaf0c4cb858768ac.tar.gz git-53af9816bcb1d441fef76c3adaf0c4cb858768ac.tar.xz |
i18n: drop "encoding" header in the output after re-coding.
After re-coding the commit message into the encoding the user
specified (either with core.logoutputencidng or --encoding
option), this drops the "encoding" header altogether. The
output is after re-coding as the user asked (either with the
config or --encoding=<encoding> option), and the extra header
becomes redundant information.
Signed-off-by: Junio C Hamano <junkio@cox.net>
-rw-r--r-- | commit.c | 45 |
1 files changed, 45 insertions, 0 deletions
@@ -624,6 +624,48 @@ static char *get_header(const struct commit *commit, const char *key) } } +static char *replace_encoding_header(char *buf, char *encoding) +{ + char *encoding_header = strstr(buf, "\nencoding "); + char *end_of_encoding_header; + int encoding_header_pos; + int encoding_header_len; + int new_len; + int need_len; + int buflen = strlen(buf) + 1; + + if (!encoding_header) + return buf; /* should not happen but be defensive */ + encoding_header++; + end_of_encoding_header = strchr(encoding_header, '\n'); + if (!end_of_encoding_header) + return buf; /* should not happen but be defensive */ + end_of_encoding_header++; + + encoding_header_len = end_of_encoding_header - encoding_header; + encoding_header_pos = encoding_header - buf; + + if (is_encoding_utf8(encoding)) { + /* we have re-coded to UTF-8; drop the header */ + memmove(encoding_header, end_of_encoding_header, + buflen - (encoding_header_pos + encoding_header_len)); + return buf; + } + new_len = strlen(encoding); + need_len = new_len + strlen("encoding \n"); + if (encoding_header_len < need_len) { + buf = xrealloc(buf, buflen + (need_len - encoding_header_len)); + encoding_header = buf + encoding_header_pos; + end_of_encoding_header = encoding_header + encoding_header_len; + } + memmove(end_of_encoding_header + (need_len - encoding_header_len), + end_of_encoding_header, + buflen - (encoding_header_pos + encoding_header_len)); + memcpy(encoding_header + 9, encoding, strlen(encoding)); + encoding_header[9 + new_len] = '\n'; + return buf; +} + static char *logmsg_reencode(const struct commit *commit) { char *encoding; @@ -642,6 +684,9 @@ static char *logmsg_reencode(const struct commit *commit) return NULL; } out = reencode_string(commit->buffer, output_encoding, encoding); + if (out) + out = replace_encoding_header(out, output_encoding); + free(encoding); if (!out) return NULL; |