Merge branch 'ap/merge-stop-at-prepare-commit-msg-failure'
authorJunio C Hamano <gitster@pobox.com>
Wed, 9 Jan 2013 16:26:33 +0000 (08:26 -0800)
committerJunio C Hamano <gitster@pobox.com>
Wed, 9 Jan 2013 16:26:33 +0000 (08:26 -0800)
"git merge" started calling prepare-commit-msg hook like "git
commit" does some time ago, but forgot to pay attention to the exit
status of the hook. t7505 may want a general clean-up but that is
a different topic.

* ap/merge-stop-at-prepare-commit-msg-failure:
merge: Honor prepare-commit-msg return code

1  2 
builtin/merge.c
diff --combined builtin/merge.c
index a96e8eac19911c710f0f6870a53bda480b09747b,1aef5ea9ab757a92d2056c8c6a8e8fa4c0617984..3a31c4bc259a3169d815b9a3966675d9faab7ab7
@@@ -628,6 -628,59 +628,6 @@@ static void write_tree_trivial(unsigne
                die(_("git write-tree failed to write a tree"));
  }
  
 -static const char *merge_argument(struct commit *commit)
 -{
 -      if (commit)
 -              return sha1_to_hex(commit->object.sha1);
 -      else
 -              return EMPTY_TREE_SHA1_HEX;
 -}
 -
 -int try_merge_command(const char *strategy, size_t xopts_nr,
 -                    const char **xopts, struct commit_list *common,
 -                    const char *head_arg, struct commit_list *remotes)
 -{
 -      const char **args;
 -      int i = 0, x = 0, ret;
 -      struct commit_list *j;
 -      struct strbuf buf = STRBUF_INIT;
 -
 -      args = xmalloc((4 + xopts_nr + commit_list_count(common) +
 -                      commit_list_count(remotes)) * sizeof(char *));
 -      strbuf_addf(&buf, "merge-%s", strategy);
 -      args[i++] = buf.buf;
 -      for (x = 0; x < xopts_nr; x++) {
 -              char *s = xmalloc(strlen(xopts[x])+2+1);
 -              strcpy(s, "--");
 -              strcpy(s+2, xopts[x]);
 -              args[i++] = s;
 -      }
 -      for (j = common; j; j = j->next)
 -              args[i++] = xstrdup(merge_argument(j->item));
 -      args[i++] = "--";
 -      args[i++] = head_arg;
 -      for (j = remotes; j; j = j->next)
 -              args[i++] = xstrdup(merge_argument(j->item));
 -      args[i] = NULL;
 -      ret = run_command_v_opt(args, RUN_GIT_CMD);
 -      strbuf_release(&buf);
 -      i = 1;
 -      for (x = 0; x < xopts_nr; x++)
 -              free((void *)args[i++]);
 -      for (j = common; j; j = j->next)
 -              free((void *)args[i++]);
 -      i += 2;
 -      for (j = remotes; j; j = j->next)
 -              free((void *)args[i++]);
 -      free(args);
 -      discard_cache();
 -      if (read_cache() < 0)
 -              die(_("failed to read the cache"));
 -      resolve_undo_clear();
 -
 -      return ret;
 -}
 -
  static int try_merge_strategy(const char *strategy, struct commit_list *common,
                              struct commit_list *remoteheads,
                              struct commit *head, const char *head_arg)
@@@ -709,6 -762,56 +709,6 @@@ static int count_unmerged_entries(void
        return ret;
  }
  
 -int checkout_fast_forward(const unsigned char *head, const unsigned char *remote)
 -{
 -      struct tree *trees[MAX_UNPACK_TREES];
 -      struct unpack_trees_options opts;
 -      struct tree_desc t[MAX_UNPACK_TREES];
 -      int i, fd, nr_trees = 0;
 -      struct dir_struct dir;
 -      struct lock_file *lock_file = xcalloc(1, sizeof(struct lock_file));
 -
 -      refresh_cache(REFRESH_QUIET);
 -
 -      fd = hold_locked_index(lock_file, 1);
 -
 -      memset(&trees, 0, sizeof(trees));
 -      memset(&opts, 0, sizeof(opts));
 -      memset(&t, 0, sizeof(t));
 -      if (overwrite_ignore) {
 -              memset(&dir, 0, sizeof(dir));
 -              dir.flags |= DIR_SHOW_IGNORED;
 -              setup_standard_excludes(&dir);
 -              opts.dir = &dir;
 -      }
 -
 -      opts.head_idx = 1;
 -      opts.src_index = &the_index;
 -      opts.dst_index = &the_index;
 -      opts.update = 1;
 -      opts.verbose_update = 1;
 -      opts.merge = 1;
 -      opts.fn = twoway_merge;
 -      setup_unpack_trees_porcelain(&opts, "merge");
 -
 -      trees[nr_trees] = parse_tree_indirect(head);
 -      if (!trees[nr_trees++])
 -              return -1;
 -      trees[nr_trees] = parse_tree_indirect(remote);
 -      if (!trees[nr_trees++])
 -              return -1;
 -      for (i = 0; i < nr_trees; i++) {
 -              parse_tree(trees[i]);
 -              init_tree_desc(t+i, trees[i]->buffer, trees[i]->size);
 -      }
 -      if (unpack_trees(nr_trees, t, &opts))
 -              return -1;
 -      if (write_cache(fd, active_cache, active_nr) ||
 -              commit_locked_index(lock_file))
 -              die(_("unable to write new index file"));
 -      return 0;
 -}
 -
  static void split_merge_strategies(const char *string, struct strategy **list,
                                   int *nr, int *alloc)
  {
@@@ -800,8 -903,9 +800,9 @@@ static void prepare_to_commit(struct co
        if (0 < option_edit)
                strbuf_add_lines(&msg, "# ", comment, strlen(comment));
        write_merge_msg(&msg);
-       run_hook(get_index_file(), "prepare-commit-msg",
-                git_path("MERGE_MSG"), "merge", NULL, NULL);
+       if (run_hook(get_index_file(), "prepare-commit-msg",
+                    git_path("MERGE_MSG"), "merge", NULL, NULL))
+               abort_commit(remoteheads, NULL);
        if (0 < option_edit) {
                if (launch_editor(git_path("MERGE_MSG"), NULL, NULL))
                        abort_commit(remoteheads, NULL);
@@@ -1321,8 -1425,7 +1322,8 @@@ int cmd_merge(int argc, const char **ar
                }
  
                if (checkout_fast_forward(head_commit->object.sha1,
 -                                        commit->object.sha1)) {
 +                                        commit->object.sha1,
 +                                        overwrite_ignore)) {
                        ret = 1;
                        goto done;
                }