Merge branch 'mm/log-branch-desc-plug-leak'
authorJunio C Hamano <gitster@pobox.com>
Tue, 9 Sep 2014 19:53:59 +0000 (12:53 -0700)
committerJunio C Hamano <gitster@pobox.com>
Tue, 9 Sep 2014 19:53:59 +0000 (12:53 -0700)
* mm/log-branch-desc-plug-leak:
builtin/log.c: fix minor memory leak

1  2 
builtin/log.c
diff --combined builtin/log.c
index 4389722b4b1edffce8cd2a63dae52277e022ac99,308761693e4b87d0c0c61fc7d94d4148c8555b5e..e4d812208d8844b9155739acfd59ef840f24a4ae
@@@ -63,8 -63,6 +63,8 @@@ static int parse_decoration_style(cons
                return DECORATE_FULL_REFS;
        else if (!strcmp(value, "short"))
                return DECORATE_SHORT_REFS;
 +      else if (!strcmp(value, "auto"))
 +              return (isatty(1) || pager_in_use()) ? DECORATE_SHORT_REFS : 0;
        return -1;
  }
  
@@@ -160,9 -158,13 +160,9 @@@ static void cmd_log_init_finish(int arg
        if (rev->show_notes)
                init_display_notes(&rev->notes_opt);
  
 -      if (rev->diffopt.pickaxe || rev->diffopt.filter)
 +      if (rev->diffopt.pickaxe || rev->diffopt.filter ||
 +          DIFF_OPT_TST(&rev->diffopt, FOLLOW_RENAMES))
                rev->always_show_header = 0;
 -      if (DIFF_OPT_TST(&rev->diffopt, FOLLOW_RENAMES)) {
 -              rev->always_show_header = 0;
 -              if (rev->diffopt.pathspec.nr != 1)
 -                      usage("git logs can only follow renames on one pathname at a time");
 -      }
  
        if (source)
                rev->show_source = 1;
@@@ -347,7 -349,8 +347,7 @@@ static int cmd_log_walk(struct rev_inf
                        rev->max_count++;
                if (!rev->reflog_info) {
                        /* we allow cycles in reflog ancestry */
 -                      free(commit->buffer);
 -                      commit->buffer = NULL;
 +                      free_commit_buffer(commit);
                }
                free_commit_list(commit->parents);
                commit->parents = NULL;
@@@ -670,7 -673,6 +670,7 @@@ static void add_header(const char *valu
  static int thread;
  static int do_signoff;
  static const char *signature = git_version_string;
 +static const char *signature_file;
  static int config_cover_letter;
  
  enum {
@@@ -740,8 -742,6 +740,8 @@@ static int git_format_config(const cha
        }
        if (!strcmp(var, "format.signature"))
                return git_config_string(&signature, var, value);
 +      if (!strcmp(var, "format.signaturefile"))
 +              return git_config_pathname(&signature_file, var, value);
        if (!strcmp(var, "format.coverletter")) {
                if (value && !strcasecmp(value, "auto")) {
                        config_cover_letter = COVER_AUTO;
@@@ -844,13 -844,8 +844,13 @@@ static void gen_message_id(struct rev_i
  
  static void print_signature(void)
  {
 -      if (signature && *signature)
 -              printf("-- \n%s\n\n", signature);
 +      if (!signature || !*signature)
 +              return;
 +
 +      printf("-- \n%s", signature);
 +      if (signature[strlen(signature)-1] != '\n')
 +              putchar('\n');
 +      putchar('\n');
  }
  
  static void add_branch_description(struct strbuf *buf, const char *branch_name)
        read_branch_desc(&desc, branch_name);
        if (desc.len) {
                strbuf_addch(buf, '\n');
 -              strbuf_add(buf, desc.buf, desc.len);
 +              strbuf_addbuf(buf, &desc);
                strbuf_addch(buf, '\n');
        }
+       strbuf_release(&desc);
  }
  
  static char *find_branch_name(struct rev_info *rev)
        int i, positive = -1;
        unsigned char branch_sha1[20];
        const unsigned char *tip_sha1;
 -      const char *ref;
 +      const char *ref, *v;
        char *full_ref, *branch = NULL;
  
        for (i = 0; i < rev->cmdline.nr; i++) {
        ref = rev->cmdline.rev[positive].name;
        tip_sha1 = rev->cmdline.rev[positive].item->sha1;
        if (dwim_ref(ref, strlen(ref), branch_sha1, &full_ref) &&
 -          starts_with(full_ref, "refs/heads/") &&
 +          skip_prefix(full_ref, "refs/heads/", &v) &&
            !hashcmp(tip_sha1, branch_sha1))
 -              branch = xstrdup(full_ref + strlen("refs/heads/"));
 +              branch = xstrdup(v);
        free(full_ref);
        return branch;
  }
@@@ -924,12 -920,9 +925,12 @@@ static void make_cover_letter(struct re
        log_write_email_headers(rev, head, &pp.subject, &pp.after_subject,
                                &need_8bit_cte);
  
 -      for (i = 0; !need_8bit_cte && i < nr; i++)
 -              if (has_non_ascii(list[i]->buffer))
 +      for (i = 0; !need_8bit_cte && i < nr; i++) {
 +              const char *buf = get_commit_buffer(list[i], NULL);
 +              if (has_non_ascii(buf))
                        need_8bit_cte = 1;
 +              unuse_commit_buffer(list[i], buf);
 +      }
  
        if (!branch_name)
                branch_name = find_branch_name(rev);
@@@ -1238,8 -1231,6 +1239,8 @@@ int cmd_format_patch(int argc, const ch
                            PARSE_OPT_OPTARG, thread_callback },
                OPT_STRING(0, "signature", &signature, N_("signature"),
                            N_("add a signature")),
 +              OPT_FILENAME(0, "signature-file", &signature_file,
 +                              N_("add a signature from a file")),
                OPT__QUIET(&quiet, N_("don't print the patch filenames")),
                OPT_END()
        };
  
                if (check_head) {
                        unsigned char sha1[20];
 -                      const char *ref;
 +                      const char *ref, *v;
                        ref = resolve_ref_unsafe("HEAD", sha1, 1, NULL);
 -                      if (ref && starts_with(ref, "refs/heads/"))
 -                              branch_name = xstrdup(ref + strlen("refs/heads/"));
 +                      if (ref && skip_prefix(ref, "refs/heads/", &v))
 +                              branch_name = xstrdup(v);
                        else
                                branch_name = xstrdup(""); /* no branch */
                }
                        cover_letter = (config_cover_letter == COVER_ON);
        }
  
 +      if (!signature) {
 +              ; /* --no-signature inhibits all signatures */
 +      } else if (signature && signature != git_version_string) {
 +              ; /* non-default signature already set */
 +      } else if (signature_file) {
 +              struct strbuf buf = STRBUF_INIT;
 +
 +              if (strbuf_read_file(&buf, signature_file, 128) < 0)
 +                      die_errno(_("unable to read signature file '%s'"), signature_file);
 +              signature = strbuf_detach(&buf, NULL);
 +      }
 +
        if (in_reply_to || thread || cover_letter)
                rev.ref_message_ids = xcalloc(1, sizeof(struct string_list));
        if (in_reply_to) {
                    reopen_stdout(rev.numbered_files ? NULL : commit, NULL, &rev, quiet))
                        die(_("Failed to create output files"));
                shown = log_tree_commit(&rev, commit);
 -              free(commit->buffer);
 -              commit->buffer = NULL;
 +              free_commit_buffer(commit);
  
                /* We put one extra blank line between formatted
                 * patches and this flag is used by log-tree code