OSDN Git Service

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 5f5c182..c1e9a61 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 c6cc3ae..070886a 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 ac551d5..9dbfae4 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 4fa87f6..b9cf1b3 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 1fbdd2d..10f7b14 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 467872e..b897b57 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 b509c0c..9ebc24b 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,