Subject: Re: What are cherry-pick's exit codes?

From: Sean Allred <[email-masked]>
Date: Thu, 01 Dec 2022 07:38:42 -0600

Ævar Arnfjörð Bjarmason <[email-masked]> writes:
> In general I think you'd do well to follow the template of what I did in
> 9144ba4cf52 (remote: add meaningful exit code on missing/existing,
> 2020-10-27).
>
> In particular, I don't think we should exhaustively document exit codes
> for a given command, as we really have a hard time controlling all the
> possible values.
>
> Rather, we should define specific non-zero values as having specific
> meanings, as I did with "git remote" in that commit.

Definitely agree (this is roughly what I've had in my WIP patch), and
I'm glad to see precedent for an explicit 'exit status' section.

> We'd also ideally leave "exit(1)" alone, and if we need to disambiguate
> it start with "exit(2)", but maybe it's easy to make it unambiguous in
> this case, or it's already unambiguous...

I'm not 100% sure what you mean here, though. Do you mean that if
something returns an exit code of '1', we shouldn't touch it without
more specific review since it's more likely someone will be depending on
that value?

I think in my case, at least for what I see right now, the more urgent
need is getting exit codes documented -- but I can see where doing so
might create a situation where we can't improve the exit codes in the
future -- thus implying that the 'improving' and the 'documenting' may
need to be done in one go.

>>   - 127: fatal -- lots of reasons -- I'm guessing this is value for the
>>     'return -1' and 'return error(...)' statements speckled throughout
>>     the code, but it's been a long time since I cared about two's
>>     complement so I may be wrong here.
>
> If it's "return -1" you generally end up with 255 in your shell,
> although that's unportable both for the C language, and for POSIX.
>
> See 19d75948ef7 (common-main.c: move non-trace2 exit() behavior out of
> trace2.c, 2022-06-02) for some code dealing with that (where we fake up
> the -1 to 255, for logging).
>
> But from looking at cmd_cherry_pick() we catch any <0 return values and
> die() on them, but maybe we exit() elsewhere? Do you have an example of
> these.

No, I don't think so -- at least not by the point we hit
'run_git_command()'.

>>   - 128: fatal -- sequence is interrupted, possibly due to some other
>>     fatal error, e.g., 'commit doesn't exist' or 'mainline parent number
>>     doesn't exist'
>>
>>   - 129: fatal -- there was nothing to cherry-pick at all (e.g. empty
>>     range)
>
> I think as in 9144ba4cf52 (remote: add meaningful exit code on
> missing/existing, 2020-10-27) it's good to just leave these
> undocumented.
>
> We typically return these when we invoke die() or usage_with_options()
> (or similar).
>
> So, if we are documenting them (which would be a good change, as an
> aside) that probably belongs in gitcli(7), we could then reference that
> from other man pages.

Ah, gitcli(7) makes sense for these statuses. I'll see about submitting
a patch for review later tonight / this week; I'm cautiously optimistic
that it will be straightforward.

>>   2. If not, is the above listing the exit codes accurate and complete?
>
> I don't know, but skimming the code I don't see the "return 1", unless
> by the above " - 1" you mean "minus one", i.e. 255.

I do indeed mean 'negative one'.

> I.e. cmd_cherry_pick() calls run_sequencer(), which on error seems to
> return -1 for most things, which we then coerce to that die().
>
> But I haven't looked in much detail, so...

Seems like I (or someone) has some pretty 'fun' code tracing in my
future...

What's the next step here? Submit a patch with my best effort and suss
out the problems during review?

--
Sean Allred