On Thu, Jun 01, 2017 at 01:17:55PM +0900, Junio C Hamano wrote: > Jeff King <peff@xxxxxxxx> writes: > > > Anyway, the problem is sk/dash-is-previous, specifically fc5684b47 > > (revision.c: args starting with "-" might be a revision, 2017-02-25). It > > looks like the revision parser used to just bail on "-h", because > > revision.c would say "I don't recognize this" and then cmd_rev_list() > > would similarly say "I don't recognize this" and call usage(). But now > > we actually try to read it as a ref, which obviously requires being > > inside a repository. > > Heh, I found another ;-) > > 95e98cd9 ("revision.c: use refs_for_each*() instead of > for_each_*_submodule()", 2017-04-19), which is in the middle of > Duy's nd/prune-in-worktree series, does this: Hrm, yeah. The problem is that handle_revision_pseudo_opt() initializes the ref store at the top of the function, even if we don't see any arguments that require us to use it (and obviously in the "-h" case, we don't). That's an implementation detail that we could fix, but I do think in general that we should probably just declare it forbidden to call setup_revisions() when the repo hasn't been discovered. > I guess anything that calls setup_revisions() from the "git cmd -h" > bypass need to be prepared with that > > check_help_option(argc, argv, usage, options); > > thing. Which is a bit sad, but I tend to agree with you that > restructuring to make usage[] of everybody available to git.c > is probably too noisy for the benefit it would give us. The other options are: - reverting the "-h" magic in git.c. It really is the source of most of this confusion, I think, because functions which assume RUN_SETUP are having that assumption broken. But at the same time I do think it makes "-h" a lot friendlier, and I'd prefer to keep it. - reverting the BUG() in setup_git_env(); this has been flushing out a lot of bugs, and I think is worth keeping I did look at writing something like check_help_option(). One of the annoyances is that we have two different usage formats: one that's a straight string for usage(), and one that's an array-of-strings for parse_options(). We could probably unify those. It doesn't actually save that much code, though. The real value is that it abstracts the "did git.c decide to skip RUN_SETUP?" logic. -Peff