From: Ramkumar Ramachandra <artagnon@gmail.com>
To: Junio C Hamano <gitster@pobox.com>
Cc: Git List <git@vger.kernel.org>,
Jonathan Nieder <jrnieder@gmail.com>,
Christian Couder <chriscool@tuxfamily.org>,
Daniel Barkalow <barkalow@iabervon.org>,
Jeff King <peff@peff.net>
Subject: [PATCH 18/18] revert: Propagate errors upwards from do_pick_commit
Date: Thu, 4 Aug 2011 16:09:16 +0530 [thread overview]
Message-ID: <1312454356-3070-19-git-send-email-artagnon@gmail.com> (raw)
In-Reply-To: <1312454356-3070-1-git-send-email-artagnon@gmail.com>
Currently, revert_or_cherry_pick can fail in two ways. If it
encounters a conflict, it returns a positive number indicating the
intended exit status for the git wrapper to pass on; for all other
errors, it calls die(). The latter behavior is inconsiderate towards
callers, as it denies them the opportunity to recover from errors and
do other things.
After this patch, revert_or_cherry_pick will still return a positive
return value to indicate an exit status for conflicts as before, while
for some other errors, it will print an error message and return -1
instead of die()-ing. The cmd_revert and cmd_cherry_pick are adjusted
to handle the fatal errors by die()-ing themselves.
While the full benefits of this patch will only be seen once all the
"die" calls are replaced with calls to "error", its immediate impact
is to change some "fatal:" messages to say "error:" and to add a new
"fatal: cherry-pick failed" message at the end when the operation
fails.
Inspired-by: Christian Couder <chriscool@tuxfamily.org>
Mentored-by: Jonathan Nieder <jrnieder@gmail.com>
Helped-by: Junio C Hamano <gitster@pobox.com>
Signed-off-by: Ramkumar Ramachandra <artagnon@gmail.com>
Signed-off-by: Jonathan Nieder <jrnieder@gmail.com>
---
builtin/revert.c | 86 +++++++++++++++++++++++++-----------------------------
1 files changed, 40 insertions(+), 46 deletions(-)
diff --git a/builtin/revert.c b/builtin/revert.c
index 4f0d8f1..8b452e8 100644
--- a/builtin/revert.c
+++ b/builtin/revert.c
@@ -66,15 +66,6 @@ struct replay_opts {
#define GIT_REFLOG_ACTION "GIT_REFLOG_ACTION"
-static void fatal(const char *advice, ...)
-{
- va_list params;
-
- va_start(params, advice);
- vreportf("fatal: ", advice, params);
- va_end(params);
-}
-
static const char *action_name(const struct replay_opts *opts)
{
return opts->action == REVERT ? "revert" : "cherry-pick";
@@ -356,25 +347,20 @@ static struct tree *empty_tree(void)
return tree;
}
-static NORETURN void die_dirty_index(struct replay_opts *opts)
+static int error_dirty_index(struct replay_opts *opts)
{
- if (read_cache_unmerged()) {
- die_resolve_conflict(action_name(opts));
- } else {
- if (advice_commit_before_merge) {
- if (opts->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 (opts->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(action_name(opts));
+
+ /* Different translation strings for cherry-pick and revert */
+ if (opts->action == CHERRY_PICK)
+ error(_("Your local changes would be overwritten by cherry-pick."));
+ else
+ error(_("Your local changes would be overwritten by revert."));
+
+ if (advice_commit_before_merge)
+ advise(_("Commit your changes or stash them to proceed."));
+ return -1;
}
static int fast_forward_to(const unsigned char *to, const unsigned char *from)
@@ -492,9 +478,9 @@ static int do_pick_commit(struct commit *commit, struct replay_opts *opts)
die (_("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(opts);
+ return error_dirty_index(opts);
}
discard_cache();
@@ -507,20 +493,20 @@ static int do_pick_commit(struct commit *commit, struct replay_opts *opts)
struct commit_list *p;
if (!opts->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 != opts->mainline && p;
cnt++)
p = p->next;
if (cnt != opts->mainline || !p)
- die(_("Commit %s does not have parent %d"),
- sha1_to_hex(commit->object.sha1), opts->mainline);
+ return error(_("Commit %s does not have parent %d"),
+ sha1_to_hex(commit->object.sha1), opts->mainline);
parent = p->item;
} else if (0 < opts->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;
@@ -530,12 +516,12 @@ static int do_pick_commit(struct commit *commit, struct replay_opts *opts)
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"),
- action_name(opts), sha1_to_hex(parent->object.sha1));
+ return error(_("%s: cannot parse parent commit %s"),
+ action_name(opts), sha1_to_hex(parent->object.sha1));
if (get_message(commit, &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
@@ -997,27 +983,28 @@ static int pick_revisions(struct replay_opts *opts)
walk_revs_populate_todo(&todo_list, opts);
if (create_seq_dir() < 0) {
- fatal(_("A cherry-pick or revert is in progress."));
+ error(_("A cherry-pick or revert is in progress."));
advise(_("Use --continue to continue the operation"));
advise(_("or --reset to forget about it"));
- exit(128);
+ return -1;
}
if (get_sha1("HEAD", sha1)) {
if (opts->action == REVERT)
- die(_("Can't revert as initial commit"));
- die(_("Can't cherry-pick into empty head"));
+ return error(_("Can't revert as initial commit"));
+ return error(_("Can't cherry-pick into empty head"));
}
save_head(sha1_to_hex(sha1));
save_opts(opts);
}
return pick_commits(todo_list, opts);
error:
- die(_("No %s in progress"), action_name(opts));
+ return error(_("No %s in progress"), action_name(opts));
}
int cmd_revert(int argc, const char **argv, const char *prefix)
{
struct replay_opts opts;
+ int res;
memset(&opts, 0, sizeof(opts));
if (isatty(0))
@@ -1025,16 +1012,23 @@ int cmd_revert(int argc, const char **argv, const char *prefix)
opts.action = REVERT;
git_config(git_default_config, NULL);
parse_args(argc, argv, &opts);
- return pick_revisions(&opts);
+ res = pick_revisions(&opts);
+ if (res < 0)
+ die(_("revert failed"));
+ return res;
}
int cmd_cherry_pick(int argc, const char **argv, const char *prefix)
{
struct replay_opts opts;
+ int res;
memset(&opts, 0, sizeof(opts));
opts.action = CHERRY_PICK;
git_config(git_default_config, NULL);
parse_args(argc, argv, &opts);
- return pick_revisions(&opts);
+ res = pick_revisions(&opts);
+ if (res < 0)
+ die(_("cherry-pick failed"));
+ return res;
}
--
1.7.6.351.gb35ac.dirty
next prev parent reply other threads:[~2011-08-04 10:43 UTC|newest]
Thread overview: 26+ messages / expand[flat|nested] mbox.gz Atom feed top
2011-08-04 10:38 [PATCH 00/18] Sequencer for inclusion v6 Ramkumar Ramachandra
2011-08-04 10:38 ` [PATCH 01/18] advice: Introduce error_resolve_conflict Ramkumar Ramachandra
2011-08-04 10:39 ` [PATCH 02/18] config: Introduce functions to write non-standard file Ramkumar Ramachandra
2011-08-04 10:39 ` [PATCH 03/18] revert: Simplify and inline add_message_to_msg Ramkumar Ramachandra
2011-08-04 10:39 ` [PATCH 04/18] revert: Don't check lone argument in get_encoding Ramkumar Ramachandra
2011-08-04 10:39 ` [PATCH 05/18] revert: Rename no_replay to record_origin Ramkumar Ramachandra
2011-08-04 10:39 ` [PATCH 06/18] revert: Eliminate global "commit" variable Ramkumar Ramachandra
2011-08-04 10:39 ` [PATCH 07/18] revert: Introduce struct to keep command-line options Ramkumar Ramachandra
2011-08-04 10:39 ` [PATCH 08/18] revert: Separate cmdline parsing from functional code Ramkumar Ramachandra
2011-08-04 10:39 ` [PATCH 09/18] revert: Don't create invalid replay_opts in parse_args Ramkumar Ramachandra
2011-08-04 10:39 ` [PATCH 10/18] revert: Save data for continuing after conflict resolution Ramkumar Ramachandra
2011-08-04 10:39 ` [PATCH 11/18] revert: Save command-line options for continuing operation Ramkumar Ramachandra
2011-08-04 10:39 ` [PATCH 12/18] revert: Make pick_commits functionally act on a commit list Ramkumar Ramachandra
2011-08-04 10:39 ` [PATCH 13/18] revert: Introduce --reset to remove sequencer state Ramkumar Ramachandra
2011-08-04 10:39 ` [PATCH 14/18] reset: Make reset remove the " Ramkumar Ramachandra
2011-08-08 7:27 ` Christian Couder
2011-08-08 8:20 ` Ramkumar Ramachandra
2011-08-04 10:39 ` [PATCH 15/18] revert: Remove sequencer state when no commits are pending Ramkumar Ramachandra
2011-08-04 10:39 ` [PATCH 16/18] revert: Don't implicitly stomp pending sequencer operation Ramkumar Ramachandra
2011-08-04 10:39 ` [PATCH 17/18] revert: Introduce --continue to continue the operation Ramkumar Ramachandra
2011-08-08 7:31 ` Christian Couder
2011-08-08 8:24 ` Ramkumar Ramachandra
2011-08-08 16:28 ` Junio C Hamano
2011-08-09 5:26 ` Ramkumar Ramachandra
2011-08-04 10:39 ` Ramkumar Ramachandra [this message]
-- strict thread matches above, loose matches on Subject: below --
2011-08-01 18:06 [PATCH v5 00/18] Sequencer for inclusion Ramkumar Ramachandra
2011-08-01 18:07 ` [PATCH 18/18] revert: Propagate errors upwards from do_pick_commit Ramkumar Ramachandra
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1312454356-3070-19-git-send-email-artagnon@gmail.com \
--to=artagnon@gmail.com \
--cc=barkalow@iabervon.org \
--cc=chriscool@tuxfamily.org \
--cc=git@vger.kernel.org \
--cc=gitster@pobox.com \
--cc=jrnieder@gmail.com \
--cc=peff@peff.net \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).