зеркало из https://github.com/microsoft/git.git
Export some email and pretty-printing functions
These will be used for generating the cover letter in addition to the patch emails. Signed-off-by: Daniel Barkalow <barkalow@iabervon.org> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Родитель
e1a3734621
Коммит
b02bd65f67
15
commit.h
15
commit.h
|
@ -71,6 +71,21 @@ extern void pretty_print_commit(enum cmit_fmt fmt, const struct commit*,
|
||||||
int abbrev, const char *subject,
|
int abbrev, const char *subject,
|
||||||
const char *after_subject, enum date_mode,
|
const char *after_subject, enum date_mode,
|
||||||
int non_ascii_present);
|
int non_ascii_present);
|
||||||
|
void pp_user_info(const char *what, enum cmit_fmt fmt, struct strbuf *sb,
|
||||||
|
const char *line, enum date_mode dmode,
|
||||||
|
const char *encoding);
|
||||||
|
void pp_title_line(enum cmit_fmt fmt,
|
||||||
|
const char **msg_p,
|
||||||
|
struct strbuf *sb,
|
||||||
|
const char *subject,
|
||||||
|
const char *after_subject,
|
||||||
|
const char *encoding,
|
||||||
|
int plain_non_ascii);
|
||||||
|
void pp_remainder(enum cmit_fmt fmt,
|
||||||
|
const char **msg_p,
|
||||||
|
struct strbuf *sb,
|
||||||
|
int indent);
|
||||||
|
|
||||||
|
|
||||||
/** Removes the first commit from a list sorted by date, and adds all
|
/** Removes the first commit from a list sorted by date, and adds all
|
||||||
* of its parents.
|
* of its parents.
|
||||||
|
|
126
log-tree.c
126
log-tree.c
|
@ -137,6 +137,72 @@ static int has_non_ascii(const char *s)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void log_write_email_headers(struct rev_info *opt, const char *name,
|
||||||
|
const char **subject_p, const char **extra_headers_p)
|
||||||
|
{
|
||||||
|
const char *subject = NULL;
|
||||||
|
const char *extra_headers = opt->extra_headers;
|
||||||
|
if (opt->total > 0) {
|
||||||
|
static char buffer[64];
|
||||||
|
snprintf(buffer, sizeof(buffer),
|
||||||
|
"Subject: [%s %0*d/%d] ",
|
||||||
|
opt->subject_prefix,
|
||||||
|
digits_in_number(opt->total),
|
||||||
|
opt->nr, opt->total);
|
||||||
|
subject = buffer;
|
||||||
|
} else if (opt->total == 0 && opt->subject_prefix && *opt->subject_prefix) {
|
||||||
|
static char buffer[256];
|
||||||
|
snprintf(buffer, sizeof(buffer),
|
||||||
|
"Subject: [%s] ",
|
||||||
|
opt->subject_prefix);
|
||||||
|
subject = buffer;
|
||||||
|
} else {
|
||||||
|
subject = "Subject: ";
|
||||||
|
}
|
||||||
|
|
||||||
|
printf("From %s Mon Sep 17 00:00:00 2001\n", name);
|
||||||
|
if (opt->message_id)
|
||||||
|
printf("Message-Id: <%s>\n", opt->message_id);
|
||||||
|
if (opt->ref_message_id)
|
||||||
|
printf("In-Reply-To: <%s>\nReferences: <%s>\n",
|
||||||
|
opt->ref_message_id, opt->ref_message_id);
|
||||||
|
if (opt->mime_boundary) {
|
||||||
|
static char subject_buffer[1024];
|
||||||
|
static char buffer[1024];
|
||||||
|
snprintf(subject_buffer, sizeof(subject_buffer) - 1,
|
||||||
|
"%s"
|
||||||
|
"MIME-Version: 1.0\n"
|
||||||
|
"Content-Type: multipart/mixed;"
|
||||||
|
" boundary=\"%s%s\"\n"
|
||||||
|
"\n"
|
||||||
|
"This is a multi-part message in MIME "
|
||||||
|
"format.\n"
|
||||||
|
"--%s%s\n"
|
||||||
|
"Content-Type: text/plain; "
|
||||||
|
"charset=UTF-8; format=fixed\n"
|
||||||
|
"Content-Transfer-Encoding: 8bit\n\n",
|
||||||
|
extra_headers ? extra_headers : "",
|
||||||
|
mime_boundary_leader, opt->mime_boundary,
|
||||||
|
mime_boundary_leader, opt->mime_boundary);
|
||||||
|
extra_headers = subject_buffer;
|
||||||
|
|
||||||
|
snprintf(buffer, sizeof(buffer) - 1,
|
||||||
|
"--%s%s\n"
|
||||||
|
"Content-Type: text/x-patch;"
|
||||||
|
" name=\"%s.diff\"\n"
|
||||||
|
"Content-Transfer-Encoding: 8bit\n"
|
||||||
|
"Content-Disposition: %s;"
|
||||||
|
" filename=\"%s.diff\"\n\n",
|
||||||
|
mime_boundary_leader, opt->mime_boundary,
|
||||||
|
name,
|
||||||
|
opt->no_inline ? "attachment" : "inline",
|
||||||
|
name);
|
||||||
|
opt->diffopt.stat_sep = buffer;
|
||||||
|
}
|
||||||
|
*subject_p = subject;
|
||||||
|
*extra_headers_p = extra_headers;
|
||||||
|
}
|
||||||
|
|
||||||
void show_log(struct rev_info *opt, const char *sep)
|
void show_log(struct rev_info *opt, const char *sep)
|
||||||
{
|
{
|
||||||
struct strbuf msgbuf;
|
struct strbuf msgbuf;
|
||||||
|
@ -186,64 +252,8 @@ void show_log(struct rev_info *opt, const char *sep)
|
||||||
*/
|
*/
|
||||||
|
|
||||||
if (opt->commit_format == CMIT_FMT_EMAIL) {
|
if (opt->commit_format == CMIT_FMT_EMAIL) {
|
||||||
char *sha1 = sha1_to_hex(commit->object.sha1);
|
log_write_email_headers(opt, sha1_to_hex(commit->object.sha1),
|
||||||
if (opt->total > 0) {
|
&subject, &extra_headers);
|
||||||
static char buffer[64];
|
|
||||||
snprintf(buffer, sizeof(buffer),
|
|
||||||
"Subject: [%s %0*d/%d] ",
|
|
||||||
opt->subject_prefix,
|
|
||||||
digits_in_number(opt->total),
|
|
||||||
opt->nr, opt->total);
|
|
||||||
subject = buffer;
|
|
||||||
} else if (opt->total == 0 && opt->subject_prefix && *opt->subject_prefix) {
|
|
||||||
static char buffer[256];
|
|
||||||
snprintf(buffer, sizeof(buffer),
|
|
||||||
"Subject: [%s] ",
|
|
||||||
opt->subject_prefix);
|
|
||||||
subject = buffer;
|
|
||||||
} else {
|
|
||||||
subject = "Subject: ";
|
|
||||||
}
|
|
||||||
|
|
||||||
printf("From %s Mon Sep 17 00:00:00 2001\n", sha1);
|
|
||||||
if (opt->message_id)
|
|
||||||
printf("Message-Id: <%s>\n", opt->message_id);
|
|
||||||
if (opt->ref_message_id)
|
|
||||||
printf("In-Reply-To: <%s>\nReferences: <%s>\n",
|
|
||||||
opt->ref_message_id, opt->ref_message_id);
|
|
||||||
if (opt->mime_boundary) {
|
|
||||||
static char subject_buffer[1024];
|
|
||||||
static char buffer[1024];
|
|
||||||
snprintf(subject_buffer, sizeof(subject_buffer) - 1,
|
|
||||||
"%s"
|
|
||||||
"MIME-Version: 1.0\n"
|
|
||||||
"Content-Type: multipart/mixed;"
|
|
||||||
" boundary=\"%s%s\"\n"
|
|
||||||
"\n"
|
|
||||||
"This is a multi-part message in MIME "
|
|
||||||
"format.\n"
|
|
||||||
"--%s%s\n"
|
|
||||||
"Content-Type: text/plain; "
|
|
||||||
"charset=UTF-8; format=fixed\n"
|
|
||||||
"Content-Transfer-Encoding: 8bit\n\n",
|
|
||||||
extra_headers ? extra_headers : "",
|
|
||||||
mime_boundary_leader, opt->mime_boundary,
|
|
||||||
mime_boundary_leader, opt->mime_boundary);
|
|
||||||
extra_headers = subject_buffer;
|
|
||||||
|
|
||||||
snprintf(buffer, sizeof(buffer) - 1,
|
|
||||||
"--%s%s\n"
|
|
||||||
"Content-Type: text/x-patch;"
|
|
||||||
" name=\"%s.diff\"\n"
|
|
||||||
"Content-Transfer-Encoding: 8bit\n"
|
|
||||||
"Content-Disposition: %s;"
|
|
||||||
" filename=\"%s.diff\"\n\n",
|
|
||||||
mime_boundary_leader, opt->mime_boundary,
|
|
||||||
sha1,
|
|
||||||
opt->no_inline ? "attachment" : "inline",
|
|
||||||
sha1);
|
|
||||||
opt->diffopt.stat_sep = buffer;
|
|
||||||
}
|
|
||||||
} else if (opt->commit_format != CMIT_FMT_USERFORMAT) {
|
} else if (opt->commit_format != CMIT_FMT_USERFORMAT) {
|
||||||
fputs(diff_get_color_opt(&opt->diffopt, DIFF_COMMIT), stdout);
|
fputs(diff_get_color_opt(&opt->diffopt, DIFF_COMMIT), stdout);
|
||||||
if (opt->commit_format != CMIT_FMT_ONELINE)
|
if (opt->commit_format != CMIT_FMT_ONELINE)
|
||||||
|
|
|
@ -13,5 +13,7 @@ int log_tree_commit(struct rev_info *, struct commit *);
|
||||||
int log_tree_opt_parse(struct rev_info *, const char **, int);
|
int log_tree_opt_parse(struct rev_info *, const char **, int);
|
||||||
void show_log(struct rev_info *opt, const char *sep);
|
void show_log(struct rev_info *opt, const char *sep);
|
||||||
void show_decorations(struct commit *commit);
|
void show_decorations(struct commit *commit);
|
||||||
|
void log_write_email_headers(struct rev_info *opt, const char *name,
|
||||||
|
const char **subject_p, const char **extra_headers_p);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
34
pretty.c
34
pretty.c
|
@ -110,9 +110,9 @@ needquote:
|
||||||
strbuf_addstr(sb, "?=");
|
strbuf_addstr(sb, "?=");
|
||||||
}
|
}
|
||||||
|
|
||||||
static void add_user_info(const char *what, enum cmit_fmt fmt, struct strbuf *sb,
|
void pp_user_info(const char *what, enum cmit_fmt fmt, struct strbuf *sb,
|
||||||
const char *line, enum date_mode dmode,
|
const char *line, enum date_mode dmode,
|
||||||
const char *encoding)
|
const char *encoding)
|
||||||
{
|
{
|
||||||
char *date;
|
char *date;
|
||||||
int namelen;
|
int namelen;
|
||||||
|
@ -295,7 +295,7 @@ static void format_person_part(struct strbuf *sb, char part,
|
||||||
/*
|
/*
|
||||||
* If it does not even have a '<' and '>', that is
|
* If it does not even have a '<' and '>', that is
|
||||||
* quite a bogus commit author and we discard it;
|
* quite a bogus commit author and we discard it;
|
||||||
* this is in line with add_user_info() that is used
|
* this is in line with pp_user_info() that is used
|
||||||
* in the normal codepath. When end points at the '<'
|
* in the normal codepath. When end points at the '<'
|
||||||
* that we found, it should have matching '>' later,
|
* that we found, it should have matching '>' later,
|
||||||
* which means start (beginning of email address) must
|
* which means start (beginning of email address) must
|
||||||
|
@ -643,23 +643,23 @@ static void pp_header(enum cmit_fmt fmt,
|
||||||
*/
|
*/
|
||||||
if (!memcmp(line, "author ", 7)) {
|
if (!memcmp(line, "author ", 7)) {
|
||||||
strbuf_grow(sb, linelen + 80);
|
strbuf_grow(sb, linelen + 80);
|
||||||
add_user_info("Author", fmt, sb, line + 7, dmode, encoding);
|
pp_user_info("Author", fmt, sb, line + 7, dmode, encoding);
|
||||||
}
|
}
|
||||||
if (!memcmp(line, "committer ", 10) &&
|
if (!memcmp(line, "committer ", 10) &&
|
||||||
(fmt == CMIT_FMT_FULL || fmt == CMIT_FMT_FULLER)) {
|
(fmt == CMIT_FMT_FULL || fmt == CMIT_FMT_FULLER)) {
|
||||||
strbuf_grow(sb, linelen + 80);
|
strbuf_grow(sb, linelen + 80);
|
||||||
add_user_info("Commit", fmt, sb, line + 10, dmode, encoding);
|
pp_user_info("Commit", fmt, sb, line + 10, dmode, encoding);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void pp_title_line(enum cmit_fmt fmt,
|
void pp_title_line(enum cmit_fmt fmt,
|
||||||
const char **msg_p,
|
const char **msg_p,
|
||||||
struct strbuf *sb,
|
struct strbuf *sb,
|
||||||
const char *subject,
|
const char *subject,
|
||||||
const char *after_subject,
|
const char *after_subject,
|
||||||
const char *encoding,
|
const char *encoding,
|
||||||
int plain_non_ascii)
|
int plain_non_ascii)
|
||||||
{
|
{
|
||||||
struct strbuf title;
|
struct strbuf title;
|
||||||
|
|
||||||
|
@ -708,10 +708,10 @@ static void pp_title_line(enum cmit_fmt fmt,
|
||||||
strbuf_release(&title);
|
strbuf_release(&title);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void pp_remainder(enum cmit_fmt fmt,
|
void pp_remainder(enum cmit_fmt fmt,
|
||||||
const char **msg_p,
|
const char **msg_p,
|
||||||
struct strbuf *sb,
|
struct strbuf *sb,
|
||||||
int indent)
|
int indent)
|
||||||
{
|
{
|
||||||
int first = 1;
|
int first = 1;
|
||||||
for (;;) {
|
for (;;) {
|
||||||
|
|
Загрузка…
Ссылка в новой задаче