From: Jonathan Nieder <jrnieder@gmail.com>
To: Ramkumar Ramachandra <artagnon@gmail.com>
Cc: Git List <git@vger.kernel.org>,
Christian Couder <chriscool@tuxfamily.org>,
Daniel Barkalow <barkalow@iabervon.org>
Subject: Re: [PATCH 01/11] revert: Avoid calling die; return error instead
Date: Sun, 10 Apr 2011 14:14:58 -0500 [thread overview]
Message-ID: <20110410191458.GA28163@elie> (raw)
In-Reply-To: <1302448317-32387-2-git-send-email-artagnon@gmail.com>
Ramkumar Ramachandra wrote:
> [Subject: revert: Avoid calling die; return error instead]
>
> Signed-off-by: Ramkumar Ramachandra <artagnon@gmail.com>
Presumably this is because the sequencer is going to pick up after the
error and clean up a little (why doesn't the change description say
so?). Will it be resuming after that or just performing a little
cleanup before the exit?
Might make sense, but:
> --- a/builtin/revert.c
> +++ b/builtin/revert.c
> @@ -265,23 +265,23 @@ 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);
Won't that exit?
> } else {
This "else" could be removed (decreasing the indent of the rest by
one tab stop) since the "if" case has already returned or exited.
Not the subject of this patch, just an idea for earlier or later. ;-)
[...]
> @@ -331,7 +331,7 @@ static int do_recursive_merge(struct commit *base, struct commit *next,
> (write_cache(index_fd, active_cache, active_nr) ||
> commit_locked_index(&index_lock)))
> /* TRANSLATORS: %s will be "revert" or "cherry-pick" */
> - die(_("%s: Unable to write new index file"), me);
> + return error(_("%s: Unable to write new index file"), me);
> rollback_lock_file(&index_lock);
What happens to index_lock in the error case?
[...]
> @@ -533,34 +533,39 @@ static void prepare_revs(struct rev_info *revs)
> revs->reverse = 1;
>
> argc = setup_revisions(commit_argc, commit_argv, revs, NULL);
> - if (argc > 1)
> - usage(*revert_or_cherry_pick_usage());
> + if (argc > 1) {
> + fprintf(stderr, "usage: %s", _(*revert_or_cherry_pick_usage()));
> + return 129;
> + }
Yuck. Maybe the error can be returned to the caller somehow, but
that seems somehow ambitious given that setup_revisions has all sorts
of ways to die anyway.
So you are bending the assumptions of many existing git functions (in
a good way).
I can think of at least three ways to go:
1) Come up with a convention to give more information about the nature
of returned errors in the functions you are touching. For
example, make sure errno is valid after the relevant functions, or
use multiple negative values to express the nature of the error.
So a caller could do:
if (prepare_revs(...)) {
if (errno == EINVAL)
usage(*revert_or_cherry_pick_usage());
die("BUG: unexpected error from prepare_revs");
}
Or:
2) Use set_die_routine or sigchain_push + atexit to declare what cleanup
has to happen before exiting. Keep using die().
3) Provide a new facility to register cleanup handlers that will free
resources and otherwise return to a consistent state before
unwinding the stack. This way, you'd still have to audit die()
calls to look for missing cleanup handlers, but they could stay as
die() rather than changing to "return error" and the worried
caller could use
set_die_routine(longjmp_to_here);
to keep git alive. I don't suggest doing this. It is a pain to
get right and not obviously cleaner than "return error", and some
errors really are unrecoverable (rather than just being a symptom
of programmers to lazy to write error recovery code :)).
Okay, I'm stopping here. Hope that helps.
Thanks,
Jonathan
next prev parent reply other threads:[~2011-04-10 19:15 UTC|newest]
Thread overview: 36+ messages / expand[flat|nested] mbox.gz Atom feed top
2011-04-10 15:11 [RFC PATCH 00/11] Sequencer Foundations Ramkumar Ramachandra
2011-04-10 15:11 ` [PATCH 01/11] revert: Avoid calling die; return error instead Ramkumar Ramachandra
2011-04-10 19:14 ` Jonathan Nieder [this message]
2011-05-08 12:04 ` Ramkumar Ramachandra
2011-04-11 20:26 ` Junio C Hamano
2011-04-10 15:11 ` [PATCH 02/11] revert: Lose global variables "commit" and "me" Ramkumar Ramachandra
2011-04-11 3:24 ` Christian Couder
2011-04-11 8:57 ` Ramkumar Ramachandra
2011-04-10 15:11 ` [PATCH 03/11] revert: Introduce a struct to parse command-line options into Ramkumar Ramachandra
2011-04-10 19:21 ` Jonathan Nieder
2011-05-08 12:18 ` Ramkumar Ramachandra
2011-04-11 21:41 ` Junio C Hamano
2011-05-08 12:09 ` Ramkumar Ramachandra
2011-04-10 15:11 ` [PATCH 04/11] revert: Separate cmdline argument handling from the functional code Ramkumar Ramachandra
2011-04-10 15:11 ` [PATCH 05/11] revert: Catch incompatible command-line options early Ramkumar Ramachandra
2011-04-11 21:44 ` Junio C Hamano
2011-05-08 11:47 ` Ramkumar Ramachandra
2011-04-10 15:11 ` [PATCH 06/11] revert: Implement parsing --continue, --abort and --skip Ramkumar Ramachandra
2011-04-10 15:11 ` [PATCH 07/11] revert: Handle conflict resolutions more elegantly Ramkumar Ramachandra
2011-04-10 15:11 ` [PATCH 08/11] usage: Introduce error_errno correspoding to die_errno Ramkumar Ramachandra
2011-04-10 15:11 ` [PATCH 09/11] revert: Write head, todo, done files Ramkumar Ramachandra
2011-04-10 15:11 ` [PATCH 10/11] revert: Give noop a default value while argument parsing Ramkumar Ramachandra
2011-04-10 15:11 ` [PATCH 11/11] revert: Implement --abort processing Ramkumar Ramachandra
2011-04-10 19:33 ` [RFC PATCH 00/11] Sequencer Foundations Daniel Barkalow
2011-04-11 8:55 ` Ramkumar Ramachandra
2011-04-10 19:47 ` Jonathan Nieder
2011-04-11 1:16 ` Daniel Barkalow
2011-04-11 6:42 ` Jonathan Nieder
2011-04-11 9:07 ` Ramkumar Ramachandra
2011-04-11 3:18 ` Christian Couder
2011-04-11 4:49 ` Ramkumar Ramachandra
2011-04-11 6:20 ` Christian Couder
2011-04-11 10:48 ` Ramkumar Ramachandra
2011-04-11 5:30 ` Daniel Barkalow
2011-04-11 5:38 ` Jonathan Nieder
2011-04-11 6:34 ` Daniel Barkalow
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=20110410191458.GA28163@elie \
--to=jrnieder@gmail.com \
--cc=artagnon@gmail.com \
--cc=barkalow@iabervon.org \
--cc=chriscool@tuxfamily.org \
--cc=git@vger.kernel.org \
/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).