Here's a first try at something like what was discussed. Various notes:
* I didn't try to implement --confirm for rsync and http pushes; it would
require completely different code and it sounds like they will eventually
be switched to the "push_refs" code path as well.
* I picked the name --show-subjects for the that option because
--show-commits/--log-commits implied a closer connection to 'git show'
or 'git log'. --show-subjects implies (to me) something more free-form.
* --show-subjects might actually benefit from having a short option
but I omitted that for now.
* I ripped off a big hunk of code from builtin-fmt-merge-msg.c to do the
commit synopsis without completely understanding it. There are quite
a few differences from the original and it was beyond my knowledge of
the git code base to figure out whether some shared utility could be
added.
Along with differences in the input parameters and the output, there's
one "bug fix" I made to the code - in the orginal, if you have exactly
21 commits it will show:
(21 commits):
<commit 1>
<commit 2>
[...]
<commit 20>
... So the last commit is pointlessly substituted with '...'; that's more
annoying if you are showing just a few commits, so I fixed it in the
adapted code.
* Passing three booleans 'int verbose, int show_subjects, int porcelain'
between functions in transport.c is somewhat error-prone, but I didn't
want to switch to flags, since it would have made the patches here
less incremental.
* The interaction between --confirm and --show-subjects and --porcelain
is a bit tricky, but I think what I ended up with right - the basic
idea is that that '--confirm --porcelain' should let the user confirm
then output what actually got done to the wrapper script on stdout in
porcelain format. Didn't try to describe the details in the docs.
* My first attempt at changing the git code, so probably some stupidity
in there somewhere :-)