checkout: inform the user when removing branch state

After a successful switch, if a merge, cherry-pick or revert is ongoing,
it is canceled. This behavior has been with us from the very early
beginning, soon after git-merge was created but never actually
documented [1]. It may be a good idea to be transparent and tell the
user if some operation is canceled.

I consider this a better way of telling the user than just adding a
sentence or two in git-checkout.txt, which will be mostly ignored
anyway.

PS. Originally I wanted to print more details like

    warning: cancelling an in-progress merge from <SHA-1>

which may allow some level of undo if the user wants to. But that seems
a lot more work. Perhaps it can be improved later if people still want
that.

[1] ... and I will try not to argue whether it is a sensible behavior.
There is some more discussion here if people are interested:
CACsJy8Axa5WsLSjiscjnxVK6jQHkfs-gH959=YtUvQkWriAk5w@mail.gmail.com

Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Nguyễn Thái Ngọc Duy 2019-03-29 17:38:59 +07:00 committed by Junio C Hamano
parent af9ded5b70
commit f4a4b9aca3
7 changed files with 14 additions and 11 deletions

View File

@ -337,11 +337,14 @@ void create_branch(struct repository *r,
free(real_ref); free(real_ref);
} }
void remove_branch_state(struct repository *r) void remove_branch_state(struct repository *r, int verbose)
{ {
unlink(git_path_cherry_pick_head(r)); if (!unlink(git_path_cherry_pick_head(r)) && verbose)
unlink(git_path_revert_head(r)); warning(_("cancelling a cherry picking in progress"));
unlink(git_path_merge_head(r)); if (!unlink(git_path_revert_head(r)) && verbose)
warning(_("cancelling a revert in progress"));
if (!unlink(git_path_merge_head(r)) && verbose)
warning(_("cancelling a merge in progress"));
unlink(git_path_merge_rr(r)); unlink(git_path_merge_rr(r));
unlink(git_path_merge_msg(r)); unlink(git_path_merge_msg(r));
unlink(git_path_merge_mode(r)); unlink(git_path_merge_mode(r));

View File

@ -64,7 +64,7 @@ extern int validate_new_branchname(const char *name, struct strbuf *ref, int for
* Remove information about the state of working on the current * Remove information about the state of working on the current
* branch. (E.g., MERGE_HEAD) * branch. (E.g., MERGE_HEAD)
*/ */
void remove_branch_state(struct repository *r); void remove_branch_state(struct repository *r, int verbose);
/* /*
* Configure local branch "local" as downstream to branch "remote" * Configure local branch "local" as downstream to branch "remote"

View File

@ -1957,7 +1957,7 @@ static int clean_index(const struct object_id *head, const struct object_id *rem
if (merge_tree(remote_tree)) if (merge_tree(remote_tree))
return -1; return -1;
remove_branch_state(the_repository); remove_branch_state(the_repository, 0);
return 0; return 0;
} }

View File

@ -899,7 +899,7 @@ static void update_refs_for_switch(const struct checkout_opts *opts,
delete_reflog(old_branch_info->path); delete_reflog(old_branch_info->path);
} }
} }
remove_branch_state(the_repository); remove_branch_state(the_repository, !opts->quiet);
strbuf_release(&msg); strbuf_release(&msg);
if (!opts->quiet && if (!opts->quiet &&
(new_branch_info->path || (!opts->force_detach && !strcmp(new_branch_info->name, "HEAD")))) (new_branch_info->path || (!opts->force_detach && !strcmp(new_branch_info->name, "HEAD"))))

View File

@ -1272,7 +1272,7 @@ int cmd_rebase(int argc, const char **argv, const char *prefix)
if (reset_head(NULL, "reset", NULL, RESET_HEAD_HARD, if (reset_head(NULL, "reset", NULL, RESET_HEAD_HARD,
NULL, NULL) < 0) NULL, NULL) < 0)
die(_("could not discard worktree changes")); die(_("could not discard worktree changes"));
remove_branch_state(the_repository); remove_branch_state(the_repository, 0);
if (read_basic_state(&options)) if (read_basic_state(&options))
exit(1); exit(1);
goto run_rebase; goto run_rebase;
@ -1292,7 +1292,7 @@ int cmd_rebase(int argc, const char **argv, const char *prefix)
NULL, NULL) < 0) NULL, NULL) < 0)
die(_("could not move back to %s"), die(_("could not move back to %s"),
oid_to_hex(&options.orig_head)); oid_to_hex(&options.orig_head));
remove_branch_state(the_repository); remove_branch_state(the_repository, 0);
ret = finish_rebase(&options); ret = finish_rebase(&options);
goto cleanup; goto cleanup;
} }

View File

@ -420,7 +420,7 @@ int cmd_reset(int argc, const char **argv, const char *prefix)
print_new_head_line(lookup_commit_reference(the_repository, &oid)); print_new_head_line(lookup_commit_reference(the_repository, &oid));
} }
if (!pathspec.nr) if (!pathspec.nr)
remove_branch_state(the_repository); remove_branch_state(the_repository, 0);
return update_ref_status; return update_ref_status;
} }

View File

@ -196,7 +196,7 @@ static int run_sequencer(int argc, const char **argv, struct replay_opts *opts)
if (cmd == 'q') { if (cmd == 'q') {
int ret = sequencer_remove_state(opts); int ret = sequencer_remove_state(opts);
if (!ret) if (!ret)
remove_branch_state(the_repository); remove_branch_state(the_repository, 0);
return ret; return ret;
} }
if (cmd == 'c') if (cmd == 'c')