From 9fa8aecdebf6339ad4f897ee45f36192fd75325e Mon Sep 17 00:00:00 2001 From: Jay Soffian Date: Thu, 6 Oct 2011 13:48:35 -0400 Subject: revert.c: defer writing CHERRY_PICK_HEAD till it is safe to do so do_pick_commit() writes out CHERRY_PICK_HEAD before invoking merge (either via do_recursive_merge() or try_merge_command()) on the assumption that if the merge fails it is due to conflict. However, if the tree is dirty, the merge may not even start, aborting before do_pick_commit() can remove CHERRY_PICK_HEAD. Instead, defer writing CHERRY_PICK_HEAD till after merge has returned. At this point we know the merge has either succeeded or failed due to conflict. In either case, we want CHERRY_PICK_HEAD to be written so that it may be picked up by the subsequent invocation of commit. Note that do_recursive_merge() aborts if the merge cannot start, while try_merge_command() returns a non-zero value other than 1. Signed-off-by: Jay Soffian Signed-off-by: Junio C Hamano --- builtin/revert.c | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) (limited to 'builtin') diff --git a/builtin/revert.c b/builtin/revert.c index 1f27c63343..5f9fa44db4 100644 --- a/builtin/revert.c +++ b/builtin/revert.c @@ -481,8 +481,6 @@ static int do_pick_commit(void) strbuf_addstr(&msgbuf, sha1_to_hex(commit->object.sha1)); strbuf_addstr(&msgbuf, ")\n"); } - if (!no_commit) - write_cherry_pick_head(); } if (!strategy || !strcmp(strategy, "recursive") || action == REVERT) { @@ -503,6 +501,15 @@ static int do_pick_commit(void) free_commit_list(remotes); } + /* + * If the merge was clean or if it failed due to conflict, we write + * CHERRY_PICK_HEAD for the subsequent invocation of commit to use. + * However, if the merge did not even start, then we don't want to + * write it at all. + */ + if (action == CHERRY_PICK && !no_commit && (res == 0 || res == 1)) + write_cherry_pick_head(); + if (res) { error(action == REVERT ? _("could not revert %s... %s") -- cgit v1.2.1 From 82352cb633f30fef9dd837235c328890da12930e Mon Sep 17 00:00:00 2001 From: Jay Soffian Date: Thu, 6 Oct 2011 13:58:01 -0400 Subject: cherry-pick: do not give irrelevant advice when cherry-pick punted If a cherry-pick did not even start because the working tree had local changes that would overlap with the operation, we shouldn't be advising the users to resolve conflicts nor to conclude it with "git commit". Signed-off-by: Jay Soffian Signed-off-by: Junio C Hamano --- builtin/revert.c | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) (limited to 'builtin') diff --git a/builtin/revert.c b/builtin/revert.c index 5f9fa44db4..e38fe0ce7a 100644 --- a/builtin/revert.c +++ b/builtin/revert.c @@ -223,7 +223,7 @@ static void advise(const char *advice, ...) va_end(params); } -static void print_advice(void) +static void print_advice(int show_hint) { char *msg = getenv("GIT_CHERRY_PICK_HELP"); @@ -238,9 +238,11 @@ static void print_advice(void) return; } - advise("after resolving the conflicts, mark the corrected paths"); - advise("with 'git add ' or 'git rm '"); - advise("and commit the result with 'git commit'"); + if (show_hint) { + advise("after resolving the conflicts, mark the corrected paths"); + advise("with 'git add ' or 'git rm '"); + advise("and commit the result with 'git commit'"); + } } static void write_message(struct strbuf *msgbuf, const char *filename) @@ -516,7 +518,7 @@ static int do_pick_commit(void) : _("could not apply %s... %s"), find_unique_abbrev(commit->object.sha1, DEFAULT_ABBREV), msg.subject); - print_advice(); + print_advice(res == 1); rerere(allow_rerere_auto); } else { if (!no_commit) -- cgit v1.2.1