On 02/13, Jeff King wrote: > On Mon, Feb 13, 2017 at 10:35:31PM +0100, Matthieu Moy wrote: > > > > Is it really that dangerous, though? The likely outcome is Git saying > > > "nope, you don't have any changes to the file named drop". Of course the > > > user may have meant something different, but I feel like "-p" is a good > > > indicator that they are interested in making an actual stash. > > > > Indeed -p is not the best example. In the old thread, I used -q which is > > much more problematic: > > > > git stash -q drop => interpreted as: git stash push -q drop > > git stash drop -q => drop with option -q > > Yeah, I'd agree with that. I wouldn't propose to loosen it entirely, but > rather to treat "-p" specially. > > > It's not really "dangerous" at least in this case, since we misinterpret > > a destructive command for a less destructive one, but it is rather > > confusing that changing the order between command and options change the > > behavior. > > > > I actually find it a reasonable expectation to allow swapping commands > > and options, some programs other than git allow it. > > I think we may have already crossed that bridge with "git -p stash". > > Not to mention that the ordering already _is_ relevant (we disallow one > order but not the other). If we really wanted to allow swapping, it > would mean making: > > git stash -p drop > > the same as: > > git stash drop -p > > I actually find _that_ more confusing. It would perhaps make more sense > with something like "-q", which is more of a "global" option than a > command-specific one. But I think we'd want to whitelist such global > options (and "-p" would not be on that list). > > > > The complexity is that right now, the first-level decision of "which > > > stash sub-command am I running?" doesn't know about any options. So "git > > > stash -m foo" would be rejected in the name of typo prevention, unless > > > that outer decision learns about "-m" as an option. > > > > Ah, OK. But that's not really hard to implement: when going through the > > option list looking for non-option, shift one more time when finding -m. > > No, it's not hard conceptually. It just means implementing the > option-parsing policy in two places. That's not too bad now, but if we > started using rev-parse's options helper, then I think you have corner > cases like "git stash -km foo". > > My "-p" suggestion suffers from a similar problem if you treat it as > "you can omit the 'push' if you say "-p", rather than "if -p is the > first option, it is a synonym for 'push -p'". I'm almost convinced of special casing "-p". (Maybe I'm easy to convince as well, because it would be convenient ;) ) However it's a bit weird that now "git stash -p file" would work, but "git stash -m message" wouldn't. Maybe we should do it the other way around, and only special case "-q", and see if there is an non option argument after that? From a glance at the options that's the only one where "git stash -<option> <verb>" could make sense to the user.