Merge branch 'ew/empty-merge-with-dirty-index'
authorJunio C Hamano <gitster@pobox.com>
Fri, 5 Jan 2018 21:28:09 +0000 (13:28 -0800)
committerJunio C Hamano <gitster@pobox.com>
Fri, 5 Jan 2018 21:28:09 +0000 (13:28 -0800)
"git merge -s recursive" did not correctly abort when the index is
dirty, if the merged tree happened to be the same as the current
HEAD, which has been fixed.

* ew/empty-merge-with-dirty-index:
merge-recursive: avoid incorporating uncommitted changes in a merge
move index_has_changes() from builtin/am.c to merge.c for reuse
t6044: recursive can silently incorporate dirty changes in a merge

1  2 
builtin/am.c
diff --combined builtin/am.c
index 06b824518fbdfd883e1905eaafdb0001b87f91a0,a02d5186cb9fabe4472ab1022fe00ec89349f5af..acfe9d3c8cd6dbd8362c17d55dc036ce6682ce8a
@@@ -708,7 -708,6 +708,7 @@@ static int split_mail_mbox(struct am_st
  {
        struct child_process cp = CHILD_PROCESS_INIT;
        struct strbuf last = STRBUF_INIT;
 +      int ret;
  
        cp.git_cmd = 1;
        argv_array_push(&cp.args, "mailsplit");
        argv_array_push(&cp.args, "--");
        argv_array_pushv(&cp.args, paths);
  
 -      if (capture_command(&cp, &last, 8))
 -              return -1;
 +      ret = capture_command(&cp, &last, 8);
 +      if (ret)
 +              goto exit;
  
        state->cur = 1;
        state->last = strtol(last.buf, NULL, 10);
  
 -      return 0;
 +exit:
 +      strbuf_release(&last);
 +      return ret ? -1 : 0;
  }
  
  /**
@@@ -1146,43 -1142,6 +1146,6 @@@ static void refresh_and_write_cache(voi
                die(_("unable to write index file"));
  }
  
- /**
-  * Returns 1 if the index differs from HEAD, 0 otherwise. When on an unborn
-  * branch, returns 1 if there are entries in the index, 0 otherwise. If an
-  * strbuf is provided, the space-separated list of files that differ will be
-  * appended to it.
-  */
- static int index_has_changes(struct strbuf *sb)
- {
-       struct object_id head;
-       int i;
-       if (!get_oid_tree("HEAD", &head)) {
-               struct diff_options opt;
-               diff_setup(&opt);
-               opt.flags.exit_with_status = 1;
-               if (!sb)
-                       opt.flags.quick = 1;
-               do_diff_cache(&head, &opt);
-               diffcore_std(&opt);
-               for (i = 0; sb && i < diff_queued_diff.nr; i++) {
-                       if (i)
-                               strbuf_addch(sb, ' ');
-                       strbuf_addstr(sb, diff_queued_diff.queue[i]->two->path);
-               }
-               diff_flush(&opt);
-               return opt.flags.has_changes != 0;
-       } else {
-               for (i = 0; sb && i < active_nr; i++) {
-                       if (i)
-                               strbuf_addch(sb, ' ');
-                       strbuf_addstr(sb, active_cache[i]->name);
-               }
-               return !!active_nr;
-       }
- }
  /**
   * Dies with a user-friendly message on how to proceed after resolving the
   * problem. This message can be overridden with state->resolvemsg.