@ -1,6 +1,7 @@
#include "cache.h"
#include "cache.h"
#include "tag.h"
#include "tag.h"
#include "commit.h"
#include "commit.h"
#include "utf8.h"
int save_commit_buffer = 1;
int save_commit_buffer = 1;
@ -563,10 +564,53 @@ static int add_merge_info(enum cmit_fmt fmt, char *buf, const struct commit *com
return offset;
return offset;
}
}
unsigned long pretty_print_commit(enum cmit_fmt fmt, const struct commit *commit,
static char *get_header(const struct commit *commit, const char *key)
unsigned long len, char *buf, unsigned long space,
{
int key_len = strlen(key);
const char *line = commit->buffer;
for (;;) {
const char *eol = strchr(line, '\n'), *next;
if (line == eol)
return NULL;
if (!eol) {
eol = line + strlen(line);
next = NULL;
} else
next = eol + 1;
if (!strncmp(line, key, key_len) && line[key_len] == ' ') {
int len = eol - line - key_len;
char *ret = xmalloc(len);
memcpy(ret, line + key_len + 1, len - 1);
ret[len - 1] = '\0';
return ret;
}
line = next;
}
}
static char *logmsg_reencode(const struct commit *commit)
{
char *encoding = get_header(commit, "encoding");
char *out;
if (!encoding || !strcmp(encoding, git_commit_encoding))
return NULL;
out = reencode_string(commit->buffer, git_commit_encoding, encoding);
free(encoding);
if (!out)
return NULL;
return out;
}
unsigned long pretty_print_commit(enum cmit_fmt fmt,
const struct commit *commit,
unsigned long len,
char *buf, unsigned long space,
int abbrev, const char *subject,
int abbrev, const char *subject,
const char *after_subject, int relative_date)
const char *after_subject,
int relative_date)
{
{
int hdr = 1, body = 0;
int hdr = 1, body = 0;
unsigned long offset = 0;
unsigned long offset = 0;
@ -574,6 +618,15 @@ unsigned long pretty_print_commit(enum cmit_fmt fmt, const struct commit *commit
int parents_shown = 0;
int parents_shown = 0;
const char *msg = commit->buffer;
const char *msg = commit->buffer;
int plain_non_ascii = 0;
int plain_non_ascii = 0;
char *reencoded = NULL;
if (*git_commit_encoding) {
reencoded = logmsg_reencode(commit);
if (reencoded) {
msg = reencoded;
len = strlen(msg);
}
}
if (fmt == CMIT_FMT_ONELINE || fmt == CMIT_FMT_EMAIL)
if (fmt == CMIT_FMT_ONELINE || fmt == CMIT_FMT_EMAIL)
indent = 0;
indent = 0;
@ -721,6 +774,8 @@ unsigned long pretty_print_commit(enum cmit_fmt fmt, const struct commit *commit
if (fmt == CMIT_FMT_EMAIL && !body)
if (fmt == CMIT_FMT_EMAIL && !body)
buf[offset++] = '\n';
buf[offset++] = '\n';
buf[offset] = '\0';
buf[offset] = '\0';
free(reencoded);
return offset;
return offset;
}
}