From: Junio C Hamano Date: Fri, 5 Jan 2018 21:28:09 +0000 (-0800) Subject: Merge branch 'ew/empty-merge-with-dirty-index' X-Git-Tag: v2.16.0-rc1~7 X-Git-Url: https://git.lorimer.id.au/gitweb.git/diff_plain/843d94b3cd30e61c7c4879f9bc6d013021b9350a?ds=inline;hp=-c Merge branch 'ew/empty-merge-with-dirty-index' "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 --- 843d94b3cd30e61c7c4879f9bc6d013021b9350a diff --combined builtin/am.c index 06b824518f,a02d5186cb..acfe9d3c8c --- a/builtin/am.c +++ b/builtin/am.c @@@ -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"); @@@ -722,16 -721,13 +722,16 @@@ 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.