Subject: Re: Multiple user questions

From: Jakub Narebski <[email-masked]>
Date: Tue, 27 May 2008 10:24:08 +0200

Dnia niedziela 25. maja 2008 10:49, Dennis Schridde napisał:
> Am Samstag, 24. Mai 2008 14:33:42 schrieb Jakub Narebski:
>> Dnia sobota 24. maja 2008 11:13, Dennis Schridde napisał:
>>> Am Samstag, 24. Mai 2008 03:30:43 schrieb Jakub Narebski:
>>>> Dennis Schridde <[email-masked]> writes:
>>>>>
>>>>> 2) Can I make format-patch include the full commit message, date,
>>>>> author, stats in the patches? (To mimic what git-show would show me.)
>>>>> Will this be sent via send-email, too?
>>>>
>>>> Errr... git-format-patch output _does_ include full commit message,
>>>> author, author date and diffstat.
>>>
>>> For me only the first line of the commit message is printed in the
>>> subject, all other lines are missing.
>>
>> What version of git do you use? If I remember correctly this area
>> was worked on some time ago, so git-format-patch takes now whole first
>> paragraph as a subject of email, folding it using appropriate RFC
>> style.

It does, and does not help, see below for details.

> Then that multiline subject must have been lost somewhere along the way. Maybe 
> some mailserver in between striped it down to one line...

Actually, after some testing it looks like while git-format-patch
generates correct patches for commit messages which do not follow
git convention of single line summary followed (optionally) by longer
description and (optionally) signoff, git-am doesn't correctly apply
them.

It is easy to understand why it is this way: git-format-patch uses
RFC 2822 (I think) folding of mail headers, so the subject looks like
below:

   Subject: <prefix> <first line of commit message> LF
   SP <second line of commit message> ...

where <prefix> is for example "[PATCH]" or "[PATCH m/n]".  Now git-am
doesn't know if the patch was generated by git-format-patch, or does
it have subject line wrapped by MUA / MTA as to, for example, do not
cross line length limit for email headers.

Now git-rebase, which by default in non-interactive mode uses
git-format-patch | git-am pipeline, _doesn't_ munge commit messages,
even if they do not follow git commit message convention.

It does it by using undocumented (at least not mentioned in git-am(1)
manpage, even if it is shown in "git am -h" output (long usage)) option
to git-am, namely '--rebasing'.  Unfortunately, at least if you want
to apply patches send by email, it imples '--keep', so
"git am --rebasing" won't strip "[PATCH]" or "[PATCH m/n]" prefix.

>>> If I want a message to appear in the body at all, I need a special way to
>>> format my commit messages: 1 line summary, 1 empty line, description.
>>> Only the description is then shown in the email.
>>> This seems inconvenient, especially for smaller changes.
>>
>> What do you think this commit message convention git uses is from?
>> It stems from exchanging patches by email, where you had to put short,
>> single line description in the email subject, and describe change in
>> more detail in message (email) body.  If you don't follow this
>> commit message convention many git tools (tig, gitk, git-shortlog, etc.)
>> will not work as expected.
>>
> I guess this is then a feature request?
> To use first line for subject, and repeat the whole commit-message in the 
> body?

IIRC you can always repeat "Subject:" in the body of email, and it
would be used as first line (first paragraph with '--rebasing', see
above) of commit message instead of _email_ subject.

>>> Further, attachments do not at all contain any information like that.
>>> See the attached example.
>>
>> Errr... I just tried "git format-patch --attach"[1] and it creates by
>> default multi-part attachement, first part is commit message, second
>> is patch itself.  The commit message contains diffstat.
>>
> I wanted to know whether I could make that 2nd part ("patch itself") also 
> contain the whole commit message, date, author (so it looks like what 
> git-show gives me).

I don't see why not.  You can easy distinguish old format (with first
line / first paragraph given by subject of email) from new format (with
whole commit message as first MIME-attachement part) by the fact that
old format part begins with an empty line... well, beside the fact that
you would have be careful and use old format for commit messages which
begins with empty line (git-commit wouldn't create such messages, so
they have to come for example from misconversion from other SCM).

I have CC-ed Dscho and Mike McCormack, authors of --attach option to
git-format-patch.

>>>>> 4) Can I make format-patch output one deletion and one insertion for a
>>>>> complete rewrite of a function, instead of multiple deletes/inserts?
>>>>
>>>> Try git-format-patch with -B option, or -B<num>.
>>>
>>> I tried that already.  Whether I specified -B or not, it always gave
>>> the exact same output (says diff).
>>
>> Ah, I'm sorry.  The -B is to recognize total rewrite, i.e. such a change
>> that is best represent as delete old contents and create new one.
>>
> Total rewrite of a file? So not appropriate for the total rewrite of just a 
> function?

It is not.

But if I remember correctly some time ago either Linus or Junio
modified diff output to concatenate chunks if they are separated by
less than 2*context+2 lines, or something like that.  Unfortunately
I cannot find either thread on git mailing list, or commit adding this
feature...

-- 
Jakub Narebski
Poland