Re: [PATCH v2 3/5] tests: turn GPG, GPGSM and RFC1991 into lazy prereqs
- From
Johannes Schindelin <johannes.schindelin@gmx.de>
- Date
- Mar 30, 2020, 18:39 UTC
- Message-ID
- <nycvar.QRO.7.76.6.2003302027240.46@tvgsbejvaqbjf.bet>
- In-Reply-To
- <20200327091004.GA610157@coredump.intra.peff.net>
Hi Peff,
On Fri, 27 Mar 2020, Jeff King wrote:
Show 13 quoted lines
> On Thu, Mar 26, 2020 at 03:27:19PM +0100, Johannes Schindelin wrote: > > > > OK. This looks good, even if I cannot help feel that my earlier patch > > > was perfectly sufficient. ;) > > > > The mistake is all mine. I had totally missed that you turned GPG into a > > lazy prereq. So I had my patch finalized already before you pointed my > > nose at that fact. > > > > Sorry about that. > > No problem. And I hope my review didn't sound too passive-aggressive > with the "well, in MY version we did this...".
FWIW I failed to interpret anything in your reply as passive-aggressive, probably because I am just too used to receive competent, helpful and friendly replies from you.
> I focused on the differences because those were the parts that were new > (and therefore interesting) to me. But I don't think any of them are too > important either way.
To me, it all sounded like a constructive discussion we had, and since you already had a working patch that did something very similar to mine, it made sense to look at their differences.
Show 22 quoted lines
> > - Since this code is outside of a function, `return` felt like the wrong > > semantic concept to me. And indeed, I see this (rather scary) part in > > Bash's documentation of `return` (I did not even bother to look at the > > POSIX semantics, it scared me so much): > > > > The return status is non-zero if `return` is supplied a non-numeric > > argument, or is used outside a function and not during execution of > > a script by `.` or `source`. > > > > So: the `1` is totally ignored in this context. That alone is reason > > enough for me to completely avoid it, and use `exit` instead. > > I agree the portability rules there are scary, but none of that applies > because we _are_ in a function: test_eval_inner_(). This behavior is > intentional and due to a7c58f280a (test: cope better with use of return > for errors, 2011-08-08). I thought we specifically advertised this > feature in t/README, but I can't seem to find it. > > So my perspective was the opposite of yours: "return" is the officially > sanctioned way to exit early from a test snippet, and "exit" only > happens to work because of the undocumented fact that lazy prereqs > happen in a subshell. But it turns out neither was documented. :)
Can a subshell inside a function cause a `return` from said function? I don't think so, but let's put that to a test:
function return_from_a_subshell () {
echo before
(echo subshell; return; echo unreachable)
echo after $?
}Let's run that.
$ return_from_a_subshell before subshell after 0
To me, the fact that that `return` does not return from the function, but only exits the subshell, in my mind lends more credence to the idea that `exit` is more appropriate in this context than `return`.
For shiggles, I also added that `$?` because I really, _really_ wanted to know whether my reading of GNU Bash's documentation was correct, and it appears I was mistaken: apparently `return` used outside a function does _not_ cause a non-zero exit code.
Show 18 quoted lines
> > > In mine I put the test_have_prereq outside the lazy prereq. > > > > That makes it essentially a non-lazy prereq. > > > > > I don't think it really matters either way (when we later ask if GPGSM > > > is set, there is no difference between nobody having defined it, and > > > having a lazy definition that said "no"). > > > > The difference is when running a test with `--run=<n>` where `<n>` refers > > to a test case that requires neither GPG nor GPGSM or RFC1991. My version > > will not evaluate the GPG prereq, yours still will. > > Yes. Part of the reason I kept mine as it was is because it matched the > original behavior better (and I was really only using a lazy prereq > because we didn't have a non-lazy version). But there's really no reason > _not_ to be lazy, so as long as it isn't breaking anything I think > that's a better way forward. (And if it is breaking something, that > something should be fixed).
I'm glad you agree!
Thanks, Dscho