On Thu, Aug 02, 2018 at 08:31:57AM -0700, Junio C Hamano wrote: > > diff --git a/parse-options.c b/parse-options.c > > index 7db84227ab..fadfc6a833 100644 > > --- a/parse-options.c > > +++ b/parse-options.c > > @@ -660,7 +660,8 @@ int parse_options(int argc, const char **argv, const char *prefix, > > static int usage_argh(const struct option *opts, FILE *outfile) > > { > > const char *s; > > - int literal = (opts->flags & PARSE_OPT_LITERAL_ARGHELP) || !opts->argh; > > + int literal = (opts->flags & PARSE_OPT_LITERAL_ARGHELP) || !opts->argh || > > + (opts->argh[0] == '<' && strchr(opts->argh, '>')); > > You are greedier than what I thought ;-) I would have limited this > magic to the case where argh is surrounded by "<>", but you allow > one closing ">" anywhere, which allows us to grab more complex cases. > > The lack of escape hatch to decline this auto-literal magic makes me > somewhat nervous, but I do not offhand think of a reason why I do > want an arg-help string that _begins_ with '<' to be enclosed by > another set of "<>", so perhaps this is a good kind of magic. I think that case is actually easy; once the caller provides a "<>", they are in "literal" mode, so they are free to add extra brackets if you want. I.e., any "<foo>bar" that you do want enclosed could be spelled "<<foo>bar>". It's the opposite that becomes impossible: you do not have an opening bracket and nor do you want one. But as long as we retain LITERAL_ARGHELP for that case, we have an escape hatch. I was going to suggest that this conversion has the downside of being somewhat one-way. That is, it is easy for us to find affected sites now since they contain the string LITERAL_ARGHELP. Whereas if we wanted to back it out in the future, it is hard to know which sites are depending on this new behavior. But I am having trouble thinking of a reason we would want to back it out. This makes most cases easier, and has a good escape hatch. -Peff PS I actually would have made the rule simply "does it begin with a '<'", which seems simpler still. If people accidentally write "<foo", forgetting to close their brackets, that is a bug under both the old and new behavior (just with slightly different outcomes).