Documentation / SubmittingPatcheson commit Merge branch 'maint' (6fb8e8f)
   1Checklist (and a short version for the impatient):
   2
   3        - make commits of logical units
   4        - check for unnecessary whitespace with "git diff --check"
   5          before committing
   6        - do not check in commented out code or unneeded files
   7        - provide a meaningful commit message
   8        - the first line of the commit message should be a short
   9          description and should skip the full stop
  10        - if you want your work included in git.git, add a
  11          "Signed-off-by: Your Name <your@email.com>" line to the
  12          commit message (or just use the option "-s" when
  13          committing) to confirm that you agree to the Developer's
  14          Certificate of Origin
  15        - do not PGP sign your patch
  16        - use "git format-patch -M" to create the patch
  17        - do not attach your patch, but read in the mail
  18          body, unless you cannot teach your mailer to
  19          leave the formatting of the patch alone.
  20        - be careful doing cut & paste into your mailer, not to
  21          corrupt whitespaces.
  22        - provide additional information (which is unsuitable for
  23          the commit message) between the "---" and the diffstat
  24        - send the patch to the list _and_ the maintainer
  25        - if you change, add, or remove a command line option or
  26          make some other user interface change, the associated
  27          documentation should be updated as well.
  28
  29Long version:
  30
  31I started reading over the SubmittingPatches document for Linux
  32kernel, primarily because I wanted to have a document similar to
  33it for the core GIT to make sure people understand what they are
  34doing when they write "Signed-off-by" line.
  35
  36But the patch submission requirements are a lot more relaxed
  37here on the technical/contents front, because the core GIT is
  38thousand times smaller ;-).  So here is only the relevant bits.
  39
  40
  41(1) Make separate commits for logically separate changes.
  42
  43Unless your patch is really trivial, you should not be sending
  44out a patch that was generated between your working tree and
  45your commit head.  Instead, always make a commit with complete
  46commit message and generate a series of patches from your
  47repository.  It is a good discipline.
  48
  49Describe the technical detail of the change(s).
  50
  51If your description starts to get too long, that's a sign that you
  52probably need to split up your commit to finer grained pieces.
  53
  54Oh, another thing.  I am picky about whitespaces.  Make sure your
  55changes do not trigger errors with the sample pre-commit hook shipped
  56in templates/hooks--pre-commit.  To help ensure this does not happen,
  57run git diff --check on your changes before you commit.
  58
  59
  60(2) Generate your patch using git tools out of your commits.
  61
  62git based diff tools (git, Cogito, and StGIT included) generate
  63unidiff which is the preferred format.
  64
  65You do not have to be afraid to use -M option to "git diff" or
  66"git format-patch", if your patch involves file renames.  The
  67receiving end can handle them just fine.
  68
  69Please make sure your patch does not include any extra files
  70which do not belong in a patch submission.  Make sure to review
  71your patch after generating it, to ensure accuracy.  Before
  72sending out, please make sure it cleanly applies to the "master"
  73branch head.  If you are preparing a work based on "next" branch,
  74that is fine, but please mark it as such.
  75
  76
  77(3) Sending your patches.
  78
  79People on the git mailing list need to be able to read and
  80comment on the changes you are submitting.  It is important for
  81a developer to be able to "quote" your changes, using standard
  82e-mail tools, so that they may comment on specific portions of
  83your code.  For this reason, all patches should be submitted
  84"inline".  WARNING: Be wary of your MUAs word-wrap
  85corrupting your patch.  Do not cut-n-paste your patch; you can
  86lose tabs that way if you are not careful.
  87
  88It is a common convention to prefix your subject line with
  89[PATCH].  This lets people easily distinguish patches from other
  90e-mail discussions.
  91
  92"git format-patch" command follows the best current practice to
  93format the body of an e-mail message.  At the beginning of the
  94patch should come your commit message, ending with the
  95Signed-off-by: lines, and a line that consists of three dashes,
  96followed by the diffstat information and the patch itself.  If
  97you are forwarding a patch from somebody else, optionally, at
  98the beginning of the e-mail message just before the commit
  99message starts, you can put a "From: " line to name that person.
 100
 101You often want to add additional explanation about the patch,
 102other than the commit message itself.  Place such "cover letter"
 103material between the three dash lines and the diffstat.
 104
 105Do not attach the patch as a MIME attachment, compressed or not.
 106Do not let your e-mail client send quoted-printable.  Do not let
 107your e-mail client send format=flowed which would destroy
 108whitespaces in your patches. Many
 109popular e-mail applications will not always transmit a MIME
 110attachment as plain text, making it impossible to comment on
 111your code.  A MIME attachment also takes a bit more time to
 112process.  This does not decrease the likelihood of your
 113MIME-attached change being accepted, but it makes it more likely
 114that it will be postponed.
 115
 116Exception:  If your mailer is mangling patches then someone may ask
 117you to re-send them using MIME, that is OK.
 118
 119Do not PGP sign your patch, at least for now.  Most likely, your
 120maintainer or other people on the list would not have your PGP
 121key and would not bother obtaining it anyway.  Your patch is not
 122judged by who you are; a good patch from an unknown origin has a
 123far better chance of being accepted than a patch from a known,
 124respected origin that is done poorly or does incorrect things.
 125
 126If you really really really really want to do a PGP signed
 127patch, format it as "multipart/signed", not a text/plain message
 128that starts with '-----BEGIN PGP SIGNED MESSAGE-----'.  That is
 129not a text/plain, it's something else.
 130
 131Note that your maintainer does not necessarily read everything
 132on the git mailing list.  If your patch is for discussion first,
 133send it "To:" the mailing list, and optionally "cc:" him.  If it
 134is trivially correct or after the list reached a consensus, send
 135it "To:" the maintainer and optionally "cc:" the list.
 136
 137Also note that your maintainer does not actively involve himself in
 138maintaining what are in contrib/ hierarchy.  When you send fixes and
 139enhancements to them, do not forget to "cc: " the person who primarily
 140worked on that hierarchy in contrib/.
 141
 142
 143(4) Sign your work
 144
 145To improve tracking of who did what, we've borrowed the
 146"sign-off" procedure from the Linux kernel project on patches
 147that are being emailed around.  Although core GIT is a lot
 148smaller project it is a good discipline to follow it.
 149
 150The sign-off is a simple line at the end of the explanation for
 151the patch, which certifies that you wrote it or otherwise have
 152the right to pass it on as a open-source patch.  The rules are
 153pretty simple: if you can certify the below:
 154
 155        Developer's Certificate of Origin 1.1
 156
 157        By making a contribution to this project, I certify that:
 158
 159        (a) The contribution was created in whole or in part by me and I
 160            have the right to submit it under the open source license
 161            indicated in the file; or
 162
 163        (b) The contribution is based upon previous work that, to the best
 164            of my knowledge, is covered under an appropriate open source
 165            license and I have the right under that license to submit that
 166            work with modifications, whether created in whole or in part
 167            by me, under the same open source license (unless I am
 168            permitted to submit under a different license), as indicated
 169            in the file; or
 170
 171        (c) The contribution was provided directly to me by some other
 172            person who certified (a), (b) or (c) and I have not modified
 173            it.
 174
 175        (d) I understand and agree that this project and the contribution
 176            are public and that a record of the contribution (including all
 177            personal information I submit with it, including my sign-off) is
 178            maintained indefinitely and may be redistributed consistent with
 179            this project or the open source license(s) involved.
 180
 181then you just add a line saying
 182
 183        Signed-off-by: Random J Developer <random@developer.example.org>
 184
 185This line can be automatically added by git if you run the git-commit
 186command with the -s option.
 187
 188Some people also put extra tags at the end.  They'll just be ignored for
 189now, but you can do this to mark internal company procedures or just
 190point out some special detail about the sign-off.
 191
 192
 193------------------------------------------------
 194MUA specific hints
 195
 196Some of patches I receive or pick up from the list share common
 197patterns of breakage.  Please make sure your MUA is set up
 198properly not to corrupt whitespaces.  Here are two common ones
 199I have seen:
 200
 201* Empty context lines that do not have _any_ whitespace.
 202
 203* Non empty context lines that have one extra whitespace at the
 204  beginning.
 205
 206One test you could do yourself if your MUA is set up correctly is:
 207
 208* Send the patch to yourself, exactly the way you would, except
 209  To: and Cc: lines, which would not contain the list and
 210  maintainer address.
 211
 212* Save that patch to a file in UNIX mailbox format.  Call it say
 213  a.patch.
 214
 215* Try to apply to the tip of the "master" branch from the
 216  git.git public repository:
 217
 218    $ git fetch http://kernel.org/pub/scm/git/git.git master:test-apply
 219    $ git checkout test-apply
 220    $ git reset --hard
 221    $ git applymbox a.patch
 222
 223If it does not apply correctly, there can be various reasons.
 224
 225* Your patch itself does not apply cleanly.  That is _bad_ but
 226  does not have much to do with your MUA.  Please rebase the
 227  patch appropriately.
 228
 229* Your MUA corrupted your patch; applymbox would complain that
 230  the patch does not apply.  Look at .dotest/ subdirectory and
 231  see what 'patch' file contains and check for the common
 232  corruption patterns mentioned above.
 233
 234* While you are at it, check what are in 'info' and
 235  'final-commit' files as well.  If what is in 'final-commit' is
 236  not exactly what you would want to see in the commit log
 237  message, it is very likely that your maintainer would end up
 238  hand editing the log message when he applies your patch.
 239  Things like "Hi, this is my first patch.\n", if you really
 240  want to put in the patch e-mail, should come after the
 241  three-dash line that signals the end of the commit message.
 242
 243
 244Pine
 245----
 246
 247(Johannes Schindelin)
 248
 249I don't know how many people still use pine, but for those poor
 250souls it may be good to mention that the quell-flowed-text is
 251needed for recent versions.
 252
 253... the "no-strip-whitespace-before-send" option, too. AFAIK it
 254was introduced in 4.60.
 255
 256(Linus Torvalds)
 257
 258And 4.58 needs at least this.
 259
 260---
 261diff-tree 8326dd8350be64ac7fc805f6563a1d61ad10d32c (from e886a61f76edf5410573e92e38ce22974f9c40f1)
 262Author: Linus Torvalds <torvalds@g5.osdl.org>
 263Date:   Mon Aug 15 17:23:51 2005 -0700
 264
 265    Fix pine whitespace-corruption bug
 266
 267    There's no excuse for unconditionally removing whitespace from
 268    the pico buffers on close.
 269
 270diff --git a/pico/pico.c b/pico/pico.c
 271--- a/pico/pico.c
 272+++ b/pico/pico.c
 273@@ -219,7 +219,9 @@ PICO *pm;
 274            switch(pico_all_done){      /* prepare for/handle final events */
 275              case COMP_EXIT :          /* already confirmed */
 276                packheader();
 277+#if 0
 278                stripwhitespace();
 279+#endif
 280                c |= COMP_EXIT;
 281                break;
 282 
 283
 284(Daniel Barkalow)
 285
 286> A patch to SubmittingPatches, MUA specific help section for
 287> users of Pine 4.63 would be very much appreciated.
 288
 289Ah, it looks like a recent version changed the default behavior to do the
 290right thing, and inverted the sense of the configuration option. (Either
 291that or Gentoo did it.) So you need to set the
 292"no-strip-whitespace-before-send" option, unless the option you have is
 293"strip-whitespace-before-send", in which case you should avoid checking
 294it.
 295
 296
 297Thunderbird
 298-----------
 299
 300(A Large Angry SCM)
 301
 302Here are some hints on how to successfully submit patches inline using
 303Thunderbird.
 304
 305This recipe appears to work with the current [*1*] Thunderbird from Suse.
 306
 307The following Thunderbird extensions are needed:
 308        AboutConfig 0.5
 309                http://aboutconfig.mozdev.org/
 310        External Editor 0.7.2
 311                http://globs.org/articles.php?lng=en&pg=8
 312
 3131) Prepare the patch as a text file using your method of choice.
 314
 3152) Before opening a compose window, use Edit->Account Settings to
 316uncheck the "Compose messages in HTML format" setting in the
 317"Composition & Addressing" panel of the account to be used to send the
 318patch. [*2*]
 319
 3203) In the main Thunderbird window, _before_ you open the compose window
 321for the patch, use Tools->about:config to set the following to the
 322indicated values:
 323        mailnews.send_plaintext_flowed  => false
 324        mailnews.wraplength             => 0
 325
 3264) Open a compose window and click the external editor icon.
 327
 3285) In the external editor window, read in the patch file and exit the
 329editor normally.
 330
 3316) Back in the compose window: Add whatever other text you wish to the
 332message, complete the addressing and subject fields, and press send.
 333
 3347) Optionally, undo the about:config/account settings changes made in
 335steps 2 & 3.
 336
 337
 338[Footnotes]
 339*1* Version 1.0 (20041207) from the MozillaThunderbird-1.0-5 rpm of Suse
 3409.3 professional updates.
 341
 342*2* It may be possible to do this with about:config and the following
 343settings but I haven't tried, yet.
 344        mail.html_compose                       => false
 345        mail.identity.default.compose_html      => false
 346        mail.identity.id?.compose_html          => false
 347
 348
 349Gnus
 350----
 351
 352'|' in the *Summary* buffer can be used to pipe the current
 353message to an external program, and this is a handy way to drive
 354"git am".  However, if the message is MIME encoded, what is
 355piped into the program is the representation you see in your
 356*Article* buffer after unwrapping MIME.  This is often not what
 357you would want for two reasons.  It tends to screw up non ASCII
 358characters (most notably in people's names), and also
 359whitespaces (fatal in patches).  Running 'C-u g' to display the
 360message in raw form before using '|' to run the pipe can work
 361this problem around.
 362
 363
 364KMail
 365-----
 366
 367This should help you to submit patches inline using KMail.
 368
 3691) Prepare the patch as a text file.
 370
 3712) Click on New Mail.
 372
 3733) Go under "Options" in the Composer window and be sure that
 374"Word wrap" is not set.
 375
 3764) Use Message -> Insert file... and insert the patch.
 377
 3785) Back in the compose window: add whatever other text you wish to the
 379message, complete the addressing and subject fields, and press send.