Merge branch 'ta/pretty-parse-config'
authorJunio C Hamano <gitster@pobox.com>
Tue, 2 Sep 2014 20:27:39 +0000 (13:27 -0700)
committerJunio C Hamano <gitster@pobox.com>
Tue, 2 Sep 2014 20:27:40 +0000 (13:27 -0700)
* ta/pretty-parse-config:
pretty.c: make git_pretty_formats_config return -1 on git_config_string failure

1  2 
pretty.c
diff --combined pretty.c
index 31fc76b2fde8297298a7d9ffd38ea7f00eede2fa,d3c2224de61a8c520e37e40dcffae1bd1edc7bf7..44b9f643725c68325a9caf92dff819e22e38e3ad
+++ b/pretty.c
@@@ -24,11 -24,6 +24,11 @@@ static size_t commit_formats_len
  static size_t commit_formats_alloc;
  static struct cmt_fmt_map *find_commit_format(const char *sought);
  
 +int commit_format_is_empty(enum cmit_fmt fmt)
 +{
 +      return fmt == CMIT_FMT_USERFORMAT && !*user_format;
 +}
 +
  static void save_user_format(struct rev_info *rev, const char *cp, int is_tformat)
  {
        free(user_format);
@@@ -45,9 -40,10 +45,9 @@@ static int git_pretty_formats_config(co
        const char *fmt;
        int i;
  
 -      if (!starts_with(var, "pretty."))
 +      if (!skip_prefix(var, "pretty.", &name))
                return 0;
  
 -      name = var + strlen("pretty.");
        for (i = 0; i < builtin_formats_len; i++) {
                if (!strcmp(commit_formats[i].name, name))
                        return 0;
@@@ -70,7 -66,9 +70,9 @@@
  
        commit_format->name = xstrdup(name);
        commit_format->format = CMIT_FMT_USERFORMAT;
-       git_config_string(&fmt, var, value);
+       if (git_config_string(&fmt, var, value))
+               return -1;
        if (starts_with(fmt, "format:") || starts_with(fmt, "tformat:")) {
                commit_format->is_tformat = fmt[0] == 't';
                fmt = strchr(fmt, ':') + 1;
@@@ -151,7 -149,7 +153,7 @@@ void get_commit_format(const char *arg
        struct cmt_fmt_map *commit_format;
  
        rev->use_terminator = 0;
 -      if (!arg || !*arg) {
 +      if (!arg) {
                rev->commit_format = CMIT_FMT_DEFAULT;
                return;
        }
                return;
        }
  
 -      if (strchr(arg, '%')) {
 +      if (!*arg || strchr(arg, '%')) {
                save_user_format(rev, arg, 1);
                return;
        }
@@@ -397,8 -395,8 +399,8 @@@ static void add_rfc2047(struct strbuf *
        strbuf_addstr(sb, "?=");
  }
  
 -static const char *show_ident_date(const struct ident_split *ident,
 -                                 enum date_mode mode)
 +const char *show_ident_date(const struct ident_split *ident,
 +                          enum date_mode mode)
  {
        unsigned long date = 0;
        long tz = 0;
@@@ -559,13 -557,14 +561,13 @@@ static char *get_header(const struct co
        const char *line = msg;
  
        while (line) {
 -              const char *eol = strchr(line, '\n'), *next;
 +              const char *eol = strchrnul(line, '\n'), *next;
  
                if (line == eol)
                        return NULL;
 -              if (!eol) {
 +              if (!*eol) {
                        warning("malformed commit (header is missing newline): %s",
                                sha1_to_hex(commit->object.sha1));
 -                      eol = line + strlen(line);
                        next = NULL;
                } else
                        next = eol + 1;
@@@ -610,16 -609,29 +612,16 @@@ static char *replace_encoding_header(ch
        return strbuf_detach(&tmp, NULL);
  }
  
 -char *logmsg_reencode(const struct commit *commit,
 -                    char **commit_encoding,
 -                    const char *output_encoding)
 +const char *logmsg_reencode(const struct commit *commit,
 +                          char **commit_encoding,
 +                          const char *output_encoding)
  {
        static const char *utf8 = "UTF-8";
        const char *use_encoding;
        char *encoding;
 -      char *msg = commit->buffer;
 +      const char *msg = get_commit_buffer(commit, NULL);
        char *out;
  
 -      if (!msg) {
 -              enum object_type type;
 -              unsigned long size;
 -
 -              msg = read_sha1_file(commit->object.sha1, &type, &size);
 -              if (!msg)
 -                      die("Cannot read commit object %s",
 -                          sha1_to_hex(commit->object.sha1));
 -              if (type != OBJ_COMMIT)
 -                      die("Expected commit for '%s', got %s",
 -                          sha1_to_hex(commit->object.sha1), typename(type));
 -      }
 -
        if (!output_encoding || !*output_encoding) {
                if (commit_encoding)
                        *commit_encoding =
                 * Otherwise, we still want to munge the encoding header in the
                 * result, which will be done by modifying the buffer. If we
                 * are using a fresh copy, we can reuse it. But if we are using
 -               * the cached copy from commit->buffer, we need to duplicate it
 -               * to avoid munging commit->buffer.
 +               * the cached copy from get_commit_buffer, we need to duplicate it
 +               * to avoid munging the cached copy.
                 */
 -              out = msg;
 -              if (out == commit->buffer)
 -                      out = xstrdup(out);
 +              if (msg == get_cached_commit_buffer(commit, NULL))
 +                      out = xstrdup(msg);
 +              else
 +                      out = (char *)msg;
        }
        else {
                /*
                 * copy, we can free it.
                 */
                out = reencode_string(msg, output_encoding, use_encoding);
 -              if (out && msg != commit->buffer)
 -                      free(msg);
 +              if (out)
 +                      unuse_commit_buffer(commit, msg);
        }
  
        /*
        return out ? out : msg;
  }
  
 -void logmsg_free(char *msg, const struct commit *commit)
 -{
 -      if (msg != commit->buffer)
 -              free(msg);
 -}
 -
  static int mailmap_name(const char **email, size_t *email_len,
                        const char **name, size_t *name_len)
  {
@@@ -782,7 -799,7 +784,7 @@@ struct format_commit_context 
        struct signature_check signature_check;
        enum flush_type flush_type;
        enum trunc_type truncate;
 -      char *message;
 +      const char *message;
        char *commit_encoding;
        size_t width, indent1, indent2;
        int auto_color;
@@@ -1253,8 -1270,6 +1255,8 @@@ static size_t format_commit_one(struct 
                        if (c->signature_check.key)
                                strbuf_addstr(sb, c->signature_check.key);
                        break;
 +              default:
 +                      return 0;
                }
                return 2;
        }
@@@ -1381,7 -1396,7 +1383,7 @@@ static size_t format_and_pad_commit(str
                case trunc_none:
                        break;
                }
 -              strbuf_addstr(sb, local_sb.buf);
 +              strbuf_addbuf(sb, &local_sb);
        } else {
                int sb_len = sb->len, offset = 0;
                if (c->flush_type == flush_left)
@@@ -1494,18 -1509,13 +1496,18 @@@ void format_commit_message(const struc
        context.commit = commit;
        context.pretty_ctx = pretty_ctx;
        context.wrap_start = sb->len;
 +      /*
 +       * convert a commit message to UTF-8 first
 +       * as far as 'format_commit_item' assumes it in UTF-8
 +       */
        context.message = logmsg_reencode(commit,
                                          &context.commit_encoding,
 -                                        output_enc);
 +                                        utf8);
  
        strbuf_expand(sb, format, format_commit_item, &context);
        rewrap_message_tail(sb, &context, 0, 0, 0);
  
 +      /* then convert a commit message to an actual output encoding */
        if (output_enc) {
                if (same_encoding(utf8, output_enc))
                        output_enc = NULL;
        }
  
        free(context.commit_encoding);
 -      logmsg_free(context.message, commit);
 -      free(context.signature_check.gpg_output);
 -      free(context.signature_check.signer);
 +      unuse_commit_buffer(commit, context.message);
  }
  
  static void pp_header(struct pretty_print_context *pp,
                }
  
                if (!parents_shown) {
 -                      struct commit_list *parent;
 -                      int num;
 -                      for (parent = commit->parents, num = 0;
 -                           parent;
 -                           parent = parent->next, num++)
 -                              ;
 +                      unsigned num = commit_list_count(commit->parents);
                        /* with enough slop */
                        strbuf_grow(sb, num * 50 + 20);
                        add_merge_info(pp, sb, commit);
@@@ -1686,7 -1703,7 +1688,7 @@@ void pretty_print_commit(struct pretty_
        unsigned long beginning_of_body;
        int indent = 4;
        const char *msg;
 -      char *reencoded;
 +      const char *reencoded;
        const char *encoding;
        int need_8bit_cte = pp->need_8bit_cte;
  
        if (pp->fmt == CMIT_FMT_EMAIL && sb->len <= beginning_of_body)
                strbuf_addch(sb, '\n');
  
 -      logmsg_free(reencoded, commit);
 +      unuse_commit_buffer(commit, reencoded);
  }
  
  void pp_commit_easy(enum cmit_fmt fmt, const struct commit *commit,