From acef41c9db33f2261e46e17cca098df3403dd745 Mon Sep 17 00:00:00 2001 From: Junio C Hamano Date: Wed, 31 Oct 2007 14:55:17 -0700 Subject: format-patch -s: add MIME encoding header if signer's name requires so When the body of the commit log message contains a non-ASCII character, format-patch correctly emitted the encoding header to mark the resulting message as such. However, if the original message was fully ASCII, the command line switch "-s" was given to add a new sign-off, and the signer's name was not ASCII only, the resulting message would have contained non-ASCII character but was not marked as such. This was cherry-picked from the fix in 'master' Signed-off-by: Junio C Hamano --- builtin-branch.c | 2 +- builtin-log.c | 2 +- builtin-rev-list.c | 2 +- builtin-show-branch.c | 2 +- commit.c | 6 +++--- commit.h | 3 ++- log-tree.c | 15 ++++++++++++++- 7 files changed, 23 insertions(+), 9 deletions(-) diff --git a/builtin-branch.c b/builtin-branch.c index 5f5c1823c..c1e9a61ea 100644 --- a/builtin-branch.c +++ b/builtin-branch.c @@ -276,7 +276,7 @@ static void print_ref_item(struct ref_item *item, int maxwidth, int verbose, if (commit && !parse_commit(commit)) { pretty_print_commit(CMIT_FMT_ONELINE, commit, ~0, &subject, &subject_len, 0, - NULL, NULL, 0); + NULL, NULL, 0, 0); sub = subject; } printf("%c %s%-*s%s %s %s\n", c, branch_get_color(color), diff --git a/builtin-log.c b/builtin-log.c index c6cc3aef5..070886ae5 100644 --- a/builtin-log.c +++ b/builtin-log.c @@ -795,7 +795,7 @@ int cmd_cherry(int argc, const char **argv, const char *prefix) char *buf = NULL; unsigned long buflen = 0; pretty_print_commit(CMIT_FMT_ONELINE, commit, ~0, - &buf, &buflen, 0, NULL, NULL, 0); + &buf, &buflen, 0, NULL, NULL, 0, 0); printf("%c %s %s\n", sign, sha1_to_hex(commit->object.sha1), buf); free(buf); diff --git a/builtin-rev-list.c b/builtin-rev-list.c index ac551d59f..9dbfae416 100644 --- a/builtin-rev-list.c +++ b/builtin-rev-list.c @@ -84,7 +84,7 @@ static void show_commit(struct commit *commit) unsigned long buflen = 0; pretty_print_commit(revs.commit_format, commit, ~0, &buf, &buflen, - revs.abbrev, NULL, NULL, revs.date_mode); + revs.abbrev, NULL, NULL, revs.date_mode, 0); printf("%s%c", buf, hdr_termination); free(buf); } diff --git a/builtin-show-branch.c b/builtin-show-branch.c index 4fa87f608..b9cf1b379 100644 --- a/builtin-show-branch.c +++ b/builtin-show-branch.c @@ -267,7 +267,7 @@ static void show_one_commit(struct commit *commit, int no_name) if (commit->object.parsed) { pretty_print_commit(CMIT_FMT_ONELINE, commit, ~0, &pretty, &pretty_len, - 0, NULL, NULL, 0); + 0, NULL, NULL, 0, 0); pretty_str = pretty; } if (!prefixcmp(pretty_str, "[PATCH] ")) diff --git a/commit.c b/commit.c index 1fbdd2d51..10f7b14e7 100644 --- a/commit.c +++ b/commit.c @@ -479,7 +479,7 @@ static int get_one_line(const char *msg, unsigned long len) } /* High bit set, or ISO-2022-INT */ -static int non_ascii(int ch) +int non_ascii(int ch) { ch = (ch & 0xff); return ((ch & 0x80) || (ch == 0x1b)); @@ -1158,13 +1158,13 @@ unsigned long pretty_print_commit(enum cmit_fmt fmt, char **buf_p, unsigned long *space_p, int abbrev, const char *subject, const char *after_subject, - enum date_mode dmode) + enum date_mode dmode, + int plain_non_ascii) { unsigned long offset = 0; unsigned long beginning_of_body; int indent = 4; const char *msg = commit->buffer; - int plain_non_ascii = 0; char *reencoded; const char *encoding; char *buf; diff --git a/commit.h b/commit.h index 467872eec..b897b5730 100644 --- a/commit.h +++ b/commit.h @@ -60,8 +60,9 @@ enum cmit_fmt { CMIT_FMT_UNSPECIFIED, }; +extern int non_ascii(int); extern enum cmit_fmt get_commit_format(const char *arg); -extern unsigned long pretty_print_commit(enum cmit_fmt fmt, const struct commit *, unsigned long len, char **buf_p, unsigned long *space_p, int abbrev, const char *subject, const char *after_subject, enum date_mode dmode); +extern unsigned long pretty_print_commit(enum cmit_fmt fmt, const struct commit *, unsigned long len, char **buf_p, unsigned long *space_p, int abbrev, const char *subject, const char *after_subject, enum date_mode dmode, int non_ascii_present); /** Removes the first commit from a list sorted by date, and adds all * of its parents. diff --git a/log-tree.c b/log-tree.c index b509c0c7e..9ebc24b68 100644 --- a/log-tree.c +++ b/log-tree.c @@ -140,6 +140,18 @@ static unsigned int digits_in_number(unsigned int number) return result; } +static int has_non_ascii(const char *s) +{ + int ch; + if (!s) + return 0; + while ((ch = *s++) != '\0') { + if (non_ascii(ch)) + return 1; + } + return 0; +} + void show_log(struct rev_info *opt, const char *sep) { char *msgbuf = NULL; @@ -290,7 +302,8 @@ void show_log(struct rev_info *opt, const char *sep) */ len = pretty_print_commit(opt->commit_format, commit, ~0u, &msgbuf, &msgbuf_len, abbrev, subject, - extra_headers, opt->date_mode); + extra_headers, opt->date_mode, + has_non_ascii(opt->add_signoff)); if (opt->add_signoff) len = append_signoff(&msgbuf, &msgbuf_len, len, -- cgit v1.2.1