Code

format-patch -s: add MIME encoding header if signer's name requires so
authorJunio C Hamano <gitster@pobox.com>
Wed, 31 Oct 2007 21:55:17 +0000 (14:55 -0700)
committerJunio C Hamano <gitster@pobox.com>
Thu, 8 Nov 2007 02:37:27 +0000 (18:37 -0800)
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 <gitster@pobox.com>
builtin-branch.c
builtin-log.c
builtin-rev-list.c
builtin-show-branch.c
commit.c
commit.h
log-tree.c

index 5f5c1823cb27cf1173c87f43bd0d2de95a06bf46..c1e9a61ea5642786b9e71fe437853a8ccc532b09 100644 (file)
@@ -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),
index c6cc3aef5270fe64821146376354239d54de5a26..070886ae578257c65d5716d608b61eacd5a535f2 100644 (file)
@@ -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);
index ac551d59f3f6cb209a645ad708c46e4e88791295..9dbfae416c2ed563960e69cc6286891d37d576e0 100644 (file)
@@ -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);
        }
index 4fa87f6081f74fa667a415038ca64c5f4a7cf775..b9cf1b379f60d42408eb75009e57030173448d8c 100644 (file)
@@ -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] "))
index 1fbdd2d51b8e798ac73c4b020f8fa47b1d6fb168..10f7b14e763feab4b86d3a8fb1f011cb918312c8 100644 (file)
--- 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;
index 467872eecabf05ccedbb9bf8247b6de244416b8f..b897b5730d9b9c220362b0b6a9df7be5d6803df3 100644 (file)
--- 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.
index b509c0c7ec239d4f426807406d94c34feeecf009..9ebc24b68754a422a53270028b032395ad7c754a 100644 (file)
@@ -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,