Earlier, revert_or_cherry_pick only used to return a non-negative number or die. Change this so that it can return negative values too; postive return values indicate conflicts, while negative ones indicate other errors, and this return status is propogated updwards from do_pick_commit, to be finally handled in cmd_cherry_pick and cmd_revert. While revert_or_cherry_pick can still die due to several other reasons, this patches attempts to factor out some of the die calls. In the same spirit, also introduce a new function error_dirty_index, based on die_dirty_index which prints some hints and returns an error to its caller do_pick_commit. Mentored-by: Jonathan Nieder <jrnieder@xxxxxxxxx> Helped-by: Junio C Hamano <gitster@xxxxxxxxx> Signed-off-by: Ramkumar Ramachandra <artagnon@xxxxxxxxx> --- builtin/revert.c | 70 ++++++++++++++++++++++++++++------------------------- 1 files changed, 37 insertions(+), 33 deletions(-) diff --git a/builtin/revert.c b/builtin/revert.c index 2de2e75..26f39d1 100644 --- a/builtin/revert.c +++ b/builtin/revert.c @@ -250,25 +250,15 @@ static struct tree *empty_tree(void) return tree; } -static NORETURN void die_dirty_index(const char *me) +static int error_dirty_index(const char *me) { - if (read_cache_unmerged()) { - die_resolve_conflict(me); - } else { - if (advice_commit_before_merge) { - if (action == REVERT) - die(_("Your local changes would be overwritten by revert.\n" - "Please, commit your changes or stash them to proceed.")); - else - die(_("Your local changes would be overwritten by cherry-pick.\n" - "Please, commit your changes or stash them to proceed.")); - } else { - if (action == REVERT) - die(_("Your local changes would be overwritten by revert.\n")); - else - die(_("Your local changes would be overwritten by cherry-pick.\n")); - } - } + if (read_cache_unmerged()) + return error_resolve_conflict(me); + + error(_("Your local changes would be overwritten by %s.\n"), me); + if (advice_commit_before_merge) + advise(_("Please, commit your changes or stash them to proceed.")); + return -1; } static int fast_forward_to(const unsigned char *to, const unsigned char *from) @@ -382,12 +372,12 @@ static int do_pick_commit(void) * to work on. */ if (write_cache_as_tree(head, 0, NULL)) - die (_("Your index file is unmerged.")); + return error(_("Your index file is unmerged.")); } else { if (get_sha1("HEAD", head)) - die (_("You do not have a valid HEAD")); + return error(_("You do not have a valid HEAD")); if (index_differs_from("HEAD", 0)) - die_dirty_index(me); + return error_dirty_index(me); } discard_cache(); @@ -400,20 +390,20 @@ static int do_pick_commit(void) struct commit_list *p; if (!mainline) - die(_("Commit %s is a merge but no -m option was given."), - sha1_to_hex(commit->object.sha1)); + return error(_("Commit %s is a merge but no -m option was given."), + sha1_to_hex(commit->object.sha1)); for (cnt = 1, p = commit->parents; cnt != mainline && p; cnt++) p = p->next; if (cnt != mainline || !p) - die(_("Commit %s does not have parent %d"), - sha1_to_hex(commit->object.sha1), mainline); + return error(_("Commit %s does not have parent %d"), + sha1_to_hex(commit->object.sha1), mainline); parent = p->item; } else if (0 < mainline) - die(_("Mainline was specified but commit %s is not a merge."), - sha1_to_hex(commit->object.sha1)); + return error(_("Mainline was specified but commit %s is not a merge."), + sha1_to_hex(commit->object.sha1)); else parent = commit->parents->item; @@ -423,12 +413,12 @@ static int do_pick_commit(void) if (parent && parse_commit(parent) < 0) /* TRANSLATORS: The first %s will be "revert" or "cherry-pick", the second %s a SHA1 */ - die(_("%s: cannot parse parent commit %s"), - me, sha1_to_hex(parent->object.sha1)); + return error(_("%s: cannot parse parent commit %s"), + me, sha1_to_hex(parent->object.sha1)); if (get_message(commit->buffer, &msg) != 0) - die(_("Cannot get commit message for %s"), - sha1_to_hex(commit->object.sha1)); + return error(_("Cannot get commit message for %s"), + sha1_to_hex(commit->object.sha1)); /* * "commit" is an existing commit. We would want to apply @@ -582,14 +572,28 @@ static int revert_or_cherry_pick(int argc, const char **argv) int cmd_revert(int argc, const char **argv, const char *prefix) { + int res; if (isatty(0)) edit = 1; action = REVERT; - return revert_or_cherry_pick(argc, argv); + res = revert_or_cherry_pick(argc, argv); + if (res > 0) + /* Exit status from conflict */ + return res; + if (res < 0) + /* Other error */ + die(_("%s failed"), me); + return 0; } int cmd_cherry_pick(int argc, const char **argv, const char *prefix) { + int res; action = CHERRY_PICK; - return revert_or_cherry_pick(argc, argv); + res = revert_or_cherry_pick(argc, argv); + if (res > 0) + return res; + if (res < 0) + die(_("%s failed"), me); + return 0; } -- 1.7.5.GIT -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html