Merge branch 'bg/xcalloc-nmemb-then-size' into maint
authorJunio C Hamano <gitster@pobox.com>
Tue, 22 Jul 2014 17:25:17 +0000 (10:25 -0700)
committerJunio C Hamano <gitster@pobox.com>
Tue, 22 Jul 2014 17:25:17 +0000 (10:25 -0700)
* bg/xcalloc-nmemb-then-size:
transport-helper.c: rearrange xcalloc arguments
remote.c: rearrange xcalloc arguments
reflog-walk.c: rearrange xcalloc arguments
pack-revindex.c: rearrange xcalloc arguments
notes.c: rearrange xcalloc arguments
imap-send.c: rearrange xcalloc arguments
http-push.c: rearrange xcalloc arguments
diff.c: rearrange xcalloc arguments
config.c: rearrange xcalloc arguments
commit.c: rearrange xcalloc arguments
builtin/remote.c: rearrange xcalloc arguments
builtin/ls-remote.c: rearrange xcalloc arguments

1  2 
builtin/remote.c
commit.c
config.c
diff.c
diff --combined builtin/remote.c
index 9b3e368983570be72a5c4b8476f69dc39522d192,9f6202167a64b72420e24895171eea1c3c67ae8e..c9102e8fe94b41af5136a9cc23db939effae147a
@@@ -282,7 -282,7 +282,7 @@@ static int config_read_branches(const c
                item = string_list_insert(&branch_list, name);
  
                if (!item->util)
-                       item->util = xcalloc(sizeof(struct branch_info), 1);
+                       item->util = xcalloc(1, sizeof(struct branch_info));
                info = item->util;
                if (type == REMOTE) {
                        if (info->remote_name)
@@@ -398,7 -398,7 +398,7 @@@ static int get_push_ref_states(const st
  
                item = string_list_append(&states->push,
                                          abbrev_branch(ref->peer_ref->name));
-               item->util = xcalloc(sizeof(struct push_info), 1);
+               item->util = xcalloc(1, sizeof(struct push_info));
                info = item->util;
                info->forced = ref->force;
                info->dest = xstrdup(abbrev_branch(ref->name));
@@@ -433,7 -433,7 +433,7 @@@ static int get_push_ref_states_noquery(
        states->push.strdup_strings = 1;
        if (!remote->push_refspec_nr) {
                item = string_list_append(&states->push, _("(matching)"));
-               info = item->util = xcalloc(sizeof(struct push_info), 1);
+               info = item->util = xcalloc(1, sizeof(struct push_info));
                info->status = PUSH_STATUS_NOTQUERIED;
                info->dest = xstrdup(item->string);
        }
                else
                        item = string_list_append(&states->push, _("(delete)"));
  
-               info = item->util = xcalloc(sizeof(struct push_info), 1);
+               info = item->util = xcalloc(1, sizeof(struct push_info));
                info->forced = spec->force;
                info->status = PUSH_STATUS_NOTQUERIED;
                info->dest = xstrdup(spec->dst ? spec->dst : item->string);
@@@ -749,23 -749,15 +749,23 @@@ static int mv(int argc, const char **ar
  
  static int remove_branches(struct string_list *branches)
  {
 +      const char **branch_names;
        int i, result = 0;
 +
 +      branch_names = xmalloc(branches->nr * sizeof(*branch_names));
 +      for (i = 0; i < branches->nr; i++)
 +              branch_names[i] = branches->items[i].string;
 +      result |= repack_without_refs(branch_names, branches->nr);
 +      free(branch_names);
 +
        for (i = 0; i < branches->nr; i++) {
                struct string_list_item *item = branches->items + i;
                const char *refname = item->string;
 -              unsigned char *sha1 = item->util;
  
 -              if (delete_ref(refname, sha1, 0))
 +              if (delete_ref(refname, NULL, 0))
                        result |= error(_("Could not remove branch %s"), refname);
        }
 +
        return result;
  }
  
@@@ -797,6 -789,10 +797,6 @@@ static int rm(int argc, const char **ar
        known_remotes.to_delete = remote;
        for_each_remote(add_known_remote, &known_remotes);
  
 -      strbuf_addf(&buf, "remote.%s", remote->name);
 -      if (git_config_rename_section(buf.buf, NULL) < 1)
 -              return error(_("Could not remove config section '%s'"), buf.buf);
 -
        read_branches();
        for (i = 0; i < branch_list.nr; i++) {
                struct string_list_item *item = branch_list.items + i;
        }
        string_list_clear(&skipped, 0);
  
 +      if (!result) {
 +              strbuf_addf(&buf, "remote.%s", remote->name);
 +              if (git_config_rename_section(buf.buf, NULL) < 1)
 +                      return error(_("Could not remove config section '%s'"), buf.buf);
 +      }
 +
        return result;
  }
  
@@@ -1313,8 -1303,6 +1313,8 @@@ static int prune_remote(const char *rem
  {
        int result = 0, i;
        struct ref_states states;
 +      struct string_list delete_refs_list = STRING_LIST_INIT_NODUP;
 +      const char **delete_refs;
        const char *dangling_msg = dry_run
                ? _(" %s will become dangling!")
                : _(" %s has become dangling!");
                       states.remote->url_nr
                       ? states.remote->url[0]
                       : _("(no URL)"));
 +
 +              delete_refs = xmalloc(states.stale.nr * sizeof(*delete_refs));
 +              for (i = 0; i < states.stale.nr; i++)
 +                      delete_refs[i] = states.stale.items[i].util;
 +              if (!dry_run)
 +                      result |= repack_without_refs(delete_refs, states.stale.nr);
 +              free(delete_refs);
        }
  
        for (i = 0; i < states.stale.nr; i++) {
                const char *refname = states.stale.items[i].util;
  
 +              string_list_insert(&delete_refs_list, refname);
 +
                if (!dry_run)
                        result |= delete_ref(refname, NULL, 0);
  
                else
                        printf_ln(_(" * [pruned] %s"),
                               abbrev_ref(refname, "refs/remotes/"));
 -              warn_dangling_symref(stdout, dangling_msg, refname);
        }
  
 +      warn_dangling_symrefs(stdout, dangling_msg, &delete_refs_list);
 +      string_list_clear(&delete_refs_list, 0);
 +
        free_remote_ref_states(&states);
        return result;
  }
diff --combined commit.c
index ebd7ad8465672004c56386de686d9ba7ff0eccdb,881be3baa3ccc70afab916331588afb9330258ed..4ff8077dbfbc6cdd6c14728a3d33a78d075c236f
+++ b/commit.c
@@@ -17,6 -17,7 +17,6 @@@ static struct commit_extra_header *read
  int save_commit_buffer = 1;
  
  const char *commit_type = "commit";
 -static int commit_count;
  
  static struct commit *check_commit(struct object *obj,
                                   const unsigned char *sha1,
@@@ -63,6 -64,7 +63,6 @@@ struct commit *lookup_commit(const unsi
        struct object *obj = lookup_object(sha1);
        if (!obj) {
                struct commit *c = alloc_commit_node();
 -              c->index = commit_count++;
                return create_object(sha1, OBJ_COMMIT, c);
        }
        if (!obj->type)
@@@ -245,76 -247,6 +245,76 @@@ int unregister_shallow(const unsigned c
        return 0;
  }
  
 +struct commit_buffer {
 +      void *buffer;
 +      unsigned long size;
 +};
 +define_commit_slab(buffer_slab, struct commit_buffer);
 +static struct buffer_slab buffer_slab = COMMIT_SLAB_INIT(1, buffer_slab);
 +
 +void set_commit_buffer(struct commit *commit, void *buffer, unsigned long size)
 +{
 +      struct commit_buffer *v = buffer_slab_at(&buffer_slab, commit);
 +      v->buffer = buffer;
 +      v->size = size;
 +}
 +
 +const void *get_cached_commit_buffer(const struct commit *commit, unsigned long *sizep)
 +{
 +      struct commit_buffer *v = buffer_slab_at(&buffer_slab, commit);
 +      if (sizep)
 +              *sizep = v->size;
 +      return v->buffer;
 +}
 +
 +const void *get_commit_buffer(const struct commit *commit, unsigned long *sizep)
 +{
 +      const void *ret = get_cached_commit_buffer(commit, sizep);
 +      if (!ret) {
 +              enum object_type type;
 +              unsigned long size;
 +              ret = read_sha1_file(commit->object.sha1, &type, &size);
 +              if (!ret)
 +                      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 (sizep)
 +                      *sizep = size;
 +      }
 +      return ret;
 +}
 +
 +void unuse_commit_buffer(const struct commit *commit, const void *buffer)
 +{
 +      struct commit_buffer *v = buffer_slab_at(&buffer_slab, commit);
 +      if (v->buffer != buffer)
 +              free((void *)buffer);
 +}
 +
 +void free_commit_buffer(struct commit *commit)
 +{
 +      struct commit_buffer *v = buffer_slab_at(&buffer_slab, commit);
 +      free(v->buffer);
 +      v->buffer = NULL;
 +      v->size = 0;
 +}
 +
 +const void *detach_commit_buffer(struct commit *commit, unsigned long *sizep)
 +{
 +      struct commit_buffer *v = buffer_slab_at(&buffer_slab, commit);
 +      void *ret;
 +
 +      ret = v->buffer;
 +      if (sizep)
 +              *sizep = v->size;
 +
 +      v->buffer = NULL;
 +      v->size = 0;
 +      return ret;
 +}
 +
  int parse_commit_buffer(struct commit *item, const void *buffer, unsigned long size)
  {
        const char *tail = buffer;
@@@ -392,7 -324,7 +392,7 @@@ int parse_commit(struct commit *item
        }
        ret = parse_commit_buffer(item, buffer, size);
        if (save_commit_buffer && !ret) {
 -              item->buffer = buffer;
 +              set_commit_buffer(item, buffer, size);
                return 0;
        }
        free(buffer);
@@@ -607,12 -539,22 +607,12 @@@ static void record_author_date(struct a
                               struct commit *commit)
  {
        const char *buf, *line_end, *ident_line;
 -      char *buffer = NULL;
 +      const char *buffer = get_commit_buffer(commit, NULL);
        struct ident_split ident;
        char *date_end;
        unsigned long date;
  
 -      if (!commit->buffer) {
 -              unsigned long size;
 -              enum object_type type;
 -              buffer = read_sha1_file(commit->object.sha1, &type, &size);
 -              if (!buffer)
 -                      return;
 -      }
 -
 -      for (buf = commit->buffer ? commit->buffer : buffer;
 -           buf;
 -           buf = line_end + 1) {
 +      for (buf = buffer; buf; buf = line_end + 1) {
                line_end = strchrnul(buf, '\n');
                ident_line = skip_prefix(buf, "author ");
                if (!ident_line) {
        *(author_date_slab_at(author_date, commit)) = date;
  
  fail_exit:
 -      free(buffer);
 +      unuse_commit_buffer(commit, buffer);
  }
  
  static int compare_commits_by_author_date(const void *a_, const void *b_,
@@@ -1089,7 -1031,7 +1089,7 @@@ struct commit_list *reduce_heads(struc
                p->item->object.flags |= STALE;
                num_head++;
        }
-       array = xcalloc(sizeof(*array), num_head);
+       array = xcalloc(num_head, sizeof(*array));
        for (p = heads, i = 0; p; p = p->next) {
                if (p->item->object.flags & STALE) {
                        array[i++] = p->item;
@@@ -1138,14 -1080,17 +1138,14 @@@ static int do_sign_commit(struct strbu
        return 0;
  }
  
 -int parse_signed_commit(const unsigned char *sha1,
 +int parse_signed_commit(const struct commit *commit,
                        struct strbuf *payload, struct strbuf *signature)
  {
 +
        unsigned long size;
 -      enum object_type type;
 -      char *buffer = read_sha1_file(sha1, &type, &size);
 +      const char *buffer = get_commit_buffer(commit, &size);
        int in_signature, saw_signature = -1;
 -      char *line, *tail;
 -
 -      if (!buffer || type != OBJ_COMMIT)
 -              goto cleanup;
 +      const char *line, *tail;
  
        line = buffer;
        tail = buffer + size;
        saw_signature = 0;
        while (line < tail) {
                const char *sig = NULL;
 -              char *next = memchr(line, '\n', tail - line);
 +              const char *next = memchr(line, '\n', tail - line);
  
                next = next ? next + 1 : tail;
                if (in_signature && line[0] == ' ')
                }
                line = next;
        }
 - cleanup:
 -      free(buffer);
 +      unuse_commit_buffer(commit, buffer);
        return saw_signature;
  }
  
@@@ -1265,7 -1211,8 +1265,7 @@@ void check_commit_signature(const struc
  
        sigc->result = 'N';
  
 -      if (parse_signed_commit(commit->object.sha1,
 -                              &payload, &signature) <= 0)
 +      if (parse_signed_commit(commit, &payload, &signature) <= 0)
                goto out;
        status = verify_signed_buffer(payload.buf, payload.len,
                                      signature.buf, signature.len,
@@@ -1310,9 -1257,11 +1310,9 @@@ struct commit_extra_header *read_commit
  {
        struct commit_extra_header *extra = NULL;
        unsigned long size;
 -      enum object_type type;
 -      char *buffer = read_sha1_file(commit->object.sha1, &type, &size);
 -      if (buffer && type == OBJ_COMMIT)
 -              extra = read_commit_extra_header_lines(buffer, size, exclude);
 -      free(buffer);
 +      const char *buffer = get_commit_buffer(commit, &size);
 +      extra = read_commit_extra_header_lines(buffer, size, exclude);
 +      unuse_commit_buffer(commit, buffer);
        return extra;
  }
  
@@@ -1395,8 -1344,7 +1395,8 @@@ void free_commit_extra_headers(struct c
        }
  }
  
 -int commit_tree(const struct strbuf *msg, const unsigned char *tree,
 +int commit_tree(const char *msg, size_t msg_len,
 +              const unsigned char *tree,
                struct commit_list *parents, unsigned char *ret,
                const char *author, const char *sign_commit)
  {
        int result;
  
        append_merge_tag_headers(parents, &tail);
 -      result = commit_tree_extended(msg, tree, parents, ret,
 +      result = commit_tree_extended(msg, msg_len, tree, parents, ret,
                                      author, sign_commit, extra);
        free_commit_extra_headers(extra);
        return result;
@@@ -1525,8 -1473,7 +1525,8 @@@ static const char commit_utf8_warn[] 
  "You may want to amend it after fixing the message, or set the config\n"
  "variable i18n.commitencoding to the encoding your project uses.\n";
  
 -int commit_tree_extended(const struct strbuf *msg, const unsigned char *tree,
 +int commit_tree_extended(const char *msg, size_t msg_len,
 +                       const unsigned char *tree,
                         struct commit_list *parents, unsigned char *ret,
                         const char *author, const char *sign_commit,
                         struct commit_extra_header *extra)
  
        assert_sha1_type(tree, OBJ_TREE);
  
 -      if (memchr(msg->buf, '\0', msg->len))
 +      if (memchr(msg, '\0', msg_len))
                return error("a NUL byte in commit log message not allowed.");
  
        /* Not having i18n.commitencoding is the same as having utf-8 */
        strbuf_addch(&buffer, '\n');
  
        /* And add the comment */
 -      strbuf_addbuf(&buffer, msg);
 +      strbuf_add(&buffer, msg, msg_len);
  
        /* And check the encoding */
        if (encoding_is_utf8 && !verify_utf8(&buffer))
diff --combined config.c
index 5272fc6f0b0c3825650c8b0fcca91415af62f43e,6bd3575c118dc8582ab2bf59a47998d239da7a7f..2634457f6b07ca55b69f3b4a22b8a9e4339fd121
+++ b/config.c
@@@ -952,7 -952,7 +952,7 @@@ static int git_default_push_config(cons
  static int git_default_mailmap_config(const char *var, const char *value)
  {
        if (!strcmp(var, "mailmap.file"))
 -              return git_config_string(&git_mailmap_file, var, value);
 +              return git_config_pathname(&git_mailmap_file, var, value);
        if (!strcmp(var, "mailmap.blob"))
                return git_config_string(&git_mailmap_blob, var, value);
  
@@@ -1538,7 -1538,7 +1538,7 @@@ int git_config_set_multivar_in_file(con
         * The lock serves a purpose in addition to locking: the new
         * contents of .git/config will be written into it.
         */
-       lock = xcalloc(sizeof(struct lock_file), 1);
+       lock = xcalloc(1, sizeof(struct lock_file));
        fd = hold_lock_file_for_update(lock, config_filename, 0);
        if (fd < 0) {
                error("could not lock config file %s: %s", config_filename, strerror(errno));
@@@ -1793,7 -1793,7 +1793,7 @@@ int git_config_rename_section_in_file(c
        if (!config_filename)
                config_filename = filename_buf = git_pathdup("config");
  
-       lock = xcalloc(sizeof(struct lock_file), 1);
+       lock = xcalloc(1, sizeof(struct lock_file));
        out_fd = hold_lock_file_for_update(lock, config_filename, 0);
        if (out_fd < 0) {
                ret = error("could not lock config file %s", config_filename);
diff --combined diff.c
index 68bb8c5a8493500b127ccac7327133d09acdcdcb,146521e1947e36d010524dece848bfb03edfac24..3f1f08f9fd28173e10440c8436d57c14215c342c
--- 1/diff.c
--- 2/diff.c
+++ b/diff.c
@@@ -1361,7 -1361,7 +1361,7 @@@ static struct diffstat_file *diffstat_a
                                          const char *name_b)
  {
        struct diffstat_file *x;
-       x = xcalloc(sizeof (*x), 1);
+       x = xcalloc(1, sizeof(*x));
        ALLOC_GROW(diffstat->files, diffstat->nr + 1, diffstat->alloc);
        diffstat->files[diffstat->nr++] = x;
        if (name_b) {
@@@ -3325,9 -3325,6 +3325,9 @@@ void diff_setup_done(struct diff_option
        }
  
        options->diff_path_counter = 0;
 +
 +      if (DIFF_OPT_TST(options, FOLLOW_RENAMES) && options->pathspec.nr != 1)
 +              die(_("--follow requires exactly one pathspec"));
  }
  
  static int opt_arg(const char *arg, int arg_short, const char *arg_long, int *val)