1 [[!img notmuch-logo.png alt="Notmuch logo" class="left"]]
6 Before you intend to provide patches outside of your local circle
7 you should check the following:
9 1. Run `git log` and examine quite a few commit messages.
11 2. Read mailing list (archives) and follow the discussions on the patches sent.
13 3. Get familiar with coding conventions used.
15 This way you get some insight of the look and feel of the patches sent,
16 both the way code should be written, how to write commit log messages
17 and how to participate patch discussions.
19 ## Committing changes (locally)
21 After you've been editing your changes under cloned notmuch git repository
22 first commit your changes... preferably (to you) to a separate branch;
23 if you forgot to branch before starting you can do it now -- your modified
24 working tree will follow.
26 Enter your commit message in following format:
28 first commit line; one line description, up to 65 chars
30 After one empty line, a detailed description of your changes
31 the description most usually spans over multiple lines.
33 The 65-character (limit) seems to be common among many projects so
34 that is good guideline to follow here too.
36 ## Remember: one patch per email
38 Every patch should (must!) contain only one bugfix or new feature.
40 Eric S. Raymond has written good
41 [Software Release Practice HOWTO](http://tldp.org/HOWTO/Software-Release-Practice-HOWTO/).
42 Check what he has to say about this issue.
44 ### Test Suite Enhancements
46 New features as well as bug fixes should typically come with test suite
47 enhancements. The test suite changes should be done first (tagged as *expected
48 to fail*), and the feature implementation or bug fix should come second
49 (removing the *expected to fail* tag). This way, the test suite specifies the
50 behavior you're trying to implement, be it a new feature or a bug fix. By
51 defining beforehand exactly what you expect to happen, everyone can confirm
52 that your patch achieves what it is meant it to.
54 ## Prepare patches for e-mail submission
56 If you've made just one commit (containing just one bugfix or new feature)
59 git format-patch HEAD^
61 This outputs something like
63 0001-one-line-description.patch
65 This is the file name of your patch with content:
67 From <-40-character-sha1-hexadecimal-string-> Day Mon DD HH:MM:SS YYYY
68 From: user.name <user.email>
69 Date: Day, DD Mon YYYY HH:MM:SS TZOFF
70 Subject: [PATCH] first commit line; one line description, up to 65 chars
72 after one empty line, a detailed description of your patch
73 the description most usually spans over multiple lines.
76 nn files changed, nn insertions(+) nn deletions(-)
78 diff --git a/<1st filename> b/<1st filename>
81 If you have committed more patches, and want to prepare all of those
82 you can check with `git log` a 40-char commit-sha1 of the last commit
83 *since* you want to generate patch files. When you enter
85 git format-patch <commit-sha1(-prefix)>
87 every commit *after* that commit-sha1 will be used to generate
92 ### Using git send-email
94 (This is the preferred way)
96 If you try to execute `git send-email` and you get
98 git: 'send-email' is not a git command. See 'git --help'.
100 Then you're using git installation where send-email command is distributed
101 in separate package. In Debian/Ububtu/RedHat/Fedora the package is named
102 `git-email`. Use the package manager in your distribution to install this
103 package (or ask administrator to do this if you don't have privileges to do so).
105 Playing with `git send-email` is pretty safe. By default it will ask questions,
106 finally whether the email is to be sent or not. In normal cases you may
107 just need to set smtp server (in case local sendmail is not configured to
108 work properly). Check through `git-send-email` manual page and play with it.
110 In case of one-file you might want to use
112 git send-email --annotate 0001-*
114 (other options omitted) to add a 'discussion' part into your
115 email. The `git am` tool which is eventually used to submit the patch
116 will ignore anything after first `---` and before the `diff --git ...`
117 in the mail message (see example content above). In this case be careful
118 you don't break the commit log message or the patch content.
120 In case of multi-patch send, `git send-email --compose 00*.patch` can be
121 used to send an introductory message (as separate email). This also follows
122 the principle of sending only one patch per mail -- by sending each patch
125 After you've played (perhaps with `--dry-run`) a bit, send first test emails
126 to your own email address to see how the messages appear in your mailbox.
127 In this phase you can "streamline" your `git send-email` options for
128 actual patch sending to the mailing list.
130 ### Sending one patch using compatible (emacs) email client.
132 Sometimes using git-send-email is not possible; It is not installed by
133 default and you don't have privileges to install it or you are not
134 able to compile it as it has more build-time requirements as git itself.
136 One alternative way to send your patches is to use, for example, the
137 emacs mail client you've already used to send mails to mailing list.
138 In this case you have to be very careful to keep the patch contents
141 1. Start composing new mail
143 2. Enter notmuch mailing list address into To: field.
145 3. Go to the body part of the email
147 4. Enter `C-x i` (M-x insert-file) and insert the patch file to the buffer
149 5. Replace Subject: line from the Subject line of the patch.
151 6. Remove everything before the description content from the beginning of the body.
153 7. Fill the discussion part after `---` unless you have done so (and there is anything to discuss).
155 8. Check your text once more and then enter `C-c C-c` (message-send-and-exit).
157 When your patches appear on the mailing list read the comments and take part
158 to the discussion and prepare to do adjustments to your patches.