Subject: Re: [PATCH] Revert 'diff-merges: let "-m" imply "-p"'

From: Junio C Hamano <[email-masked]>
Date: Thu, 19 Aug 2021 11:50:41 -0700

Sergey Organov <[email-masked]> writes:

>> We need to note that the "-m" implied by "--first-parent" is "if we
>> were to show some comparison, do so also for merge commits", not the
>> "if the user says '-m', it must mean that the user wants to see
>> comparison, period, so make it imply '-p'".  The latter is what was
>> reverted.
>
> Yes, there is minor backward incompatibility indeed, and that was
> expected. This could be seen from the patch in the same series that
> fixes "git stash" by removing unneeded -m.
>
> The fix for the scripts is as simple as removing -m from "--first-parent
> -m". It's a one-time change.
> ...
>> I agree that we both (and if there were other reviewers, they too)
>> mistakenly thought that the change in behaviour was innocuous enough
>> when we queued the patch, but our mistakes were caught while the
>> topic was still cooking in 'next', and I have Jonathan to thank for
>> being extra careful.
>
> So, what would be the procedure to get this change back, as this minor
> backward incompatibility shouldn't be the show-stopper for the change
> that otherwise is an improvement?

Your repeating "minor" does not make it minor.  Anything you force
existing users and scripts to change is "fixing the scripts", but
"working around the breakage you brought to them", which is closer
to being a show-stopper.  I understand that you like this feature a
lot, but you'd need to be a bit more considerate to your users and
other people.

I think it is a design mistake to make a plain vanilla "-m" to imply
"-p" (or any "output of result of comparison"), simply because the
implication goes in the other direction, so there will never be "get
this change back", period, but see below.

"git log" when showing a commit and asked to "output result of
comparison" like patch, combined diff, raw diff, etc. would:

 - show the comparison for non-merge commits and when
   "--first-parent" is specified (the latter is natural since it
   makes us consistently pretend that the merges were squash
   merges).

 - shows the comparison for merge commits when -m is given.

but because "--cc" and "-c" (which are used to specify how the
result of comparison is shown; they are not about specifying if
"normally we show only non-merges" is disabled) do not make sense in
the context of non-merge commits (in other words, the user is better
off giving "-p" if merges are not to be shown), they are made to
imply "-m".  And that is a sensible design choice.  On the other
hand, "--raw" (which is used to specify how the result of comparison
is shown; it not about specifying if "normally we show only
non-merges" is disabled) does make sense in the context of non-merge
commits, so unlike "--cc"/"-c", it does not imply "-m".  And that
also is a sensible design choice.  "-p" falls into the same bucket
as "--raw", so it should not imply "-m".

But some folks may not like "log -p" to be silent about comparison
for merge commits (like you are).  To accomodate them, it might make
sense to have a configuration that says "I like -m, so when -p or
--raw or any 'how to show comparison result' option is given, please
make it imply '-m'", but it should not be the default.

Thanks.