]> git.cworth.org Git - obsolete/notmuch-wiki/blobdiff - patchformatting.mdwn
Update news & manpages to notmuch version 0.16
[obsolete/notmuch-wiki] / patchformatting.mdwn
index 6ff103a2421df3010240c1d492024c66cb884fcc..ed15b9f83bf1457ca0cbaf96bb81832061c370a4 100644 (file)
@@ -10,7 +10,9 @@ you should check the following:
 
 2. Read mailing list (archives) and follow the discussions on the patches sent.
 
-3. Get familiar with coding conventions used (in any particular project).
+3. Get familiar with coding conventions used.
+
+4. Read `devel/STYLE` in notmuch source.
 
 This way you get some insight of the look and feel of the patches sent,
 both the way code should be written, how to write commit log messages
@@ -25,13 +27,40 @@ working tree will follow.
 
 Enter your commit message in following format:
 
-      first commit line; one line description, up to 65 chars
+        first commit line; short one line description
       
-      After one empty line, a detailed description of your changes
-      the description most usually spans over multiple lines.
+        After one empty line, a detailed description of your changes
+        the description most usually spans over multiple lines.
+
+Wrap the lines to about __72__ characters or so. On an 80 column terminal,
+if we subtract 4 columns for the indent on the left and 4 more for
+symmetry on the right, we’re left with __72__ columns.
+
+Regarding the commit message body contents,
+Carl [has stated](http://article.gmane.org/gmane.mail.notmuch.general/504):
+
+> The single line summary is good about saying *what* the commit does,
+> but I always want to see at least one sentence about the *why* as well.
+
+### Activating default pre-commit hook
+
+Git provides a default pre-commit hook which, when activated, checks
+(at least) for whitespace errors (trailing whitespace and space before
+tab). It is better to notice this kind of "errors" early than have
+patch reviewers to mention about those.
 
-The 65-character (limit) seems to be common among many projects so
-that is good guideline to follow here too.
+The hook, when activated, is named as .git/hooks/pre-commit and it
+has execute permissions set on. By default, when git tree is cloned
+your hooks dir may have default, inactive pre-commit hook available
+as:
+
+1. .git/hooks/pre-commit  without execute permission set
+
+2. .git/hooks/pre-commit.sample  usually with execute permission set
+
+In case of 2, enter `cp .git/hooks/pre-commit.sample .git/hooks/pre-commit`.
+And, now enter `chmod a+x .git/hooks/pre-commit` in case it does not
+have execute permission set.
 
 ## Remember: one patch per email
 
@@ -41,42 +70,83 @@ Eric S. Raymond has written good
 [Software Release Practice HOWTO](http://tldp.org/HOWTO/Software-Release-Practice-HOWTO/).
 Check what he has to say about this issue. 
 
+### Test Suite Enhancements
+
+New features as well as bug fixes should typically come with test suite
+enhancements.  The test suite changes should be done first (tagged as *expected
+to fail*), and the feature implementation or bug fix should come second
+(removing the *expected to fail* tag).  This way, the test suite specifies the
+behavior you're trying to implement, be it a new feature or a bug fix.  By
+defining beforehand exactly what you expect to happen, everyone can confirm
+that your patch achieves what it is meant it to.
+
 ## Prepare patches for e-mail submission
 
 If you've made just one commit (containing just one bugfix or new feature)
 you can run
 
-      git format-patch HEAD^
+        git format-patch HEAD^
 
 This outputs something like
 
-      0001-one-line-description.patch
+        0001-one-line-description.patch
 
 This is the file name of your patch with content:
 
-      From <-40-character-sha1-hexadecimal-string-> Day Mon DD HH:MM:SS YYYY
-      From: user.name <user.email>
-      Date: Day, DD Mon YYYY HH:MM:SS TZOFF
-      Subject: [PATCH] first commit line; one line description, up to 65 chars
+        From <-40-character-sha1-hexadecimal-string-> Day Mon DD HH:MM:SS YYYY
+        From: user.name <user.email>
+        Date: Day, DD Mon YYYY HH:MM:SS TZOFF
+        Subject: [PATCH] first commit line; one line description, up to 72 chars
 
-      after one empty line, a detailed description of your patch
-      the description most usually spans over multiple lines.
-      ---
-       <diffstat lines>
-       nn files changed, nn insertions(+) nn deletions(-)
+        after one empty line, a detailed description of your patch
+        the description most usually spans over multiple lines.
+        ---
+         <diffstat lines>
+         nn files changed, nn insertions(+) nn deletions(-)
 
-      diff --git a/<1st filename> b/<1st filename>
-      ...
+        diff --git a/<1st filename> b/<1st filename>
+        ...
 
 If you have committed more patches, and want to prepare all of those
 you can check with `git log` a 40-char commit-sha1 of the last commit
 *since* you want to generate patch files. When you enter 
 
-      git format-patch <commit-sha1(-prefix)>
+        git format-patch <commit-sha1(-prefix)>
 
 every commit *after* that commit-sha1 will be used to generate 
 patch files...
 
+### Test-applying your patches
+
+Sometimes you may face a situation with your patches that you are unsure
+whether those patches apply to the origin. Such a cases might be:
+
+* You've taken your patches from a branch that has some other commits on top of origin.
+
+* You have edited the commit message, comments below commit message or the patch content itself in the patch files generated.
+
+To verify that your patches will apply on top of pristine origin you can 
+test-apply your patch files on origin/master:
+
+* Simple case -- no other changes on top of origin/master
+
+            git reset --hard origin/master
+            git pull
+            git am 00*
+
+* A case where working tree is dirty
+
+            git log -1 --format=%H > head_commit
+            git stash save
+            git reset --hard origin/master
+            git pull
+            git am 00*
+            :
+            git reset --hard `cat head_commit`
+            git stash apply
+            rm head_commit
+            git stash drop
+
 ## Sending patches
 
 ### Using git send-email
@@ -85,7 +155,7 @@ patch files...
 
 If you try to execute `git send-email` and you get
 
-      git: 'send-email' is not a git command. See 'git --help'.
+        git: 'send-email' is not a git command. See 'git --help'.
 
 Then you're using git installation where send-email command is distributed
 in separate package. In Debian/Ububtu/RedHat/Fedora the package is named
@@ -99,7 +169,7 @@ work properly). Check through `git-send-email` manual page and play with it.
 
 In case of one-file you might want to use
 
-      git send-email --annotate 0001-* 
+        git send-email --annotate 0001-* 
 
 (other options omitted) to add a 'discussion' part into your
 email. The `git am` tool which is eventually used to submit the patch
@@ -119,6 +189,10 @@ actual patch sending to the mailing list.
 
 ### Sending one patch using compatible (emacs) email client.
 
+Sometimes using git-send-email is not possible; It is not installed by
+default and you don't have privileges to install it or you are not
+able to compile it as it has more build-time requirements as git itself.
+
 One alternative way to send your patches is to use, for example, the
 emacs mail client you've already used to send mails to mailing list.
 In this case you have to be very careful to keep the patch contents