Hi Peff, On Fri, 27 Mar 2020, Jeff King wrote: > 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. > > - 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. > > > 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