Martin von Zweigbergk <martinvonz@xxxxxxxxx> writes: > On Thu, Jun 13, 2013 at 3:29 PM, Junio C Hamano <gitster@xxxxxxxxx> wrote: >> Ramkumar Ramachandra <artagnon@xxxxxxxxx> writes: >> >> A more troublesome is that nobody seems to check the return value of >> this function. If head-name, onto or orig-head is missing, is that >> an error condition that should make the callers of read_basic_state >> stop and refuse to proceed? > > Since we unconditionally write those three (and 'quiet'), it seems > reasonable to require all of them to be there when continuing, so I > think you're right that we should fail fast. > >> The way the && cascade is used seems to indicate that, but up to the >> point where it sents $verbose. If and only if head-name, onto, orig-head >> and quiet can be read in state-dir, verbose in state-dir is checked >> and only then $verbose is set. >> >> Martin, this seems to be from your series around early Feburary >> 2011. Do you recall why these checks are cascaded this way? >> I do not offhand think of a good reason. > > Neither do I. I think the cascading after 'quiet' is just a mistake on > my part. The consequences are probably close to none, since if one of > earlier commands fail, the other files will probably not be there > either. (Not defending it; I'm happy if it gets fixed, e.g. by making > it fail fast.) I think this is probably the right thing to do, if we want to honor the original intention of the earlier part of && cascade. Everything before this new "|| die" reads from a file that should always exist (e.g. even when not asked to be quiet, that state is not signaled by the lack of $state_dir/quiet, but by having an empty string in it), while everything after check optional state variable files (e.g. if $state_dir/verbose does not exist, it is not an error, but signals that the user did not ask us to be verbose). Note that applying this patch _could_ uncover latent bug that was masked by the lack of "die" here (maybe later codepath may depended on not having orig_head at all and the only observable effect was that in such a case, both quiet and verbose were silently ignored, because the control did not reach the GIT_QUIET=... and verbose=t assignments. git-rebase.sh | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/git-rebase.sh b/git-rebase.sh index d0c11a9..90506ba 100755 --- a/git-rebase.sh +++ b/git-rebase.sh @@ -95,7 +95,9 @@ read_basic_state () { else orig_head=$(cat "$state_dir"/head) fi && - GIT_QUIET=$(cat "$state_dir"/quiet) && + GIT_QUIET=$(cat "$state_dir"/quiet) || + die "failed to read basic rebase state from $state_dir" + test -f "$state_dir"/verbose && verbose=t test -f "$state_dir"/strategy && strategy="$(cat "$state_dir"/strategy)" test -f "$state_dir"/strategy_opts && -- 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