]> git.cworth.org Git - obsolete/notmuch-wiki/blob - contributing.mdwn
draft: contributing.mdwn
[obsolete/notmuch-wiki] / contributing.mdwn
1 [[!img notmuch-logo.png alt="Notmuch logo" class="left"]]
2 # Contributing to Notmuch
3
4 __This page is a work in progress__
5
6 This is your friendly guide to contributing to Notmuch. In a nutshell, the
7 Notmuch project maintains fairly high standards for code, review, tests, and
8 documentation. It may seem a bit intimidating at first, and you may find it
9 difficult to get your first contributions accepted, but once you get the hang of
10 it, it'll be fun. This page should help you get there. DON'T PANIC.
11
12 The headlines below act as a checklist. Not all of them apply in all situations;
13 use common sense.
14
15 [[!toc levels=2]]
16
17 ## Obtain the Notmuch source code
18
19 The Notmuch source code is maintained in [git](http://git-scm.com/). Get the
20 source code using:
21
22         git clone git://notmuchmail.org/git/notmuch
23
24 This guide assumes a working knowledge of git. There are plenty of resources
25 available on git, such as [Pro Git](http://git-scm.com/book) and the git man
26 pages. Please refer to them as necessary.
27
28 ## Make your changes
29
30 The changes you submit should almost always be based on the current Notmuch git
31 master. There are plenty of ways to work in git, and this is not your git guide,
32 but a typical workflow might start with:
33
34         git fetch origin
35         git checkout -b my-local-branch origin/master
36         # make changes
37         git add ...
38         git commit
39
40 If you're planning big changes, it may be advisable to __not__ polish the patch
41 series according to all the details described below at first. Instead, it may
42 save everyone's time to introduce the idea using draft or work-in-progress
43 patches, and get the design right from the beginning. Add a cover letter
44 exlaining what you want to achieve. You may prefix the subjects of such patches
45 with "RFC" or "DRAFT" if you like.
46
47 ## Pay attention to the Notmuch coding style
48
49 The Notmuch code base follows a fairly uniform coding style. See the existing
50 code around your changes, and read
51 [`devel/STYLE`](http://git.notmuchmail.org/git/notmuch/blob/HEAD:/devel/STYLE)
52 in the Notmuch source. It's not difficult to get it right, and may save you an
53 extra review round.
54
55 ## Split your commits in logical chunks
56
57 Each commit should contain one logical change only. The code should build and
58 work after each commit. Changes to lib, cli, emacs, tests, man pages, or news
59 are usually best kept separate. Also separate cleanups from functional
60 changes. See the Notmuch source history (`git log`) for examples.
61
62 For in-depth discussion on the subject, see 
63 [Software Release Practice HOWTO](http://tldp.org/HOWTO/Software-Release-Practice-HOWTO/) by Eric S. Raymond.
64
65 ## Write meaningful commit messages
66
67 [Quoting Carl](http://article.gmane.org/gmane.mail.notmuch.general/504), "The
68 single line summary is good about saying what the commit does, but I always want
69 to see at least one sentence about the why as well."
70
71 See also [Pro Git](http://git-scm.com/book/en/Distributed-Git-Contributing-to-a-Project#Commit-Guidelines) on commit guidelines, including commit messages.
72
73 It is customary to prefix the subject line with "lib:", "cli:", "emacs:",
74 etc. depending on which part of Notmuch the commit is changing. See `git log`
75 for examples.
76
77 Wrap the lines to about 72 characters.
78
79 If you want to share notes that shall not become part of the commit message when
80 applied to the upstream Notmuch repository, add the notes at the end, after a
81 line containing "---".
82
83 ## Update the test suite
84
85 Notmuch has a test suite with fairly good coverage. At the very least, `make
86 test` must pass after your changes. Therefore you must amend the tests if you
87 make functional changes that have existing test coverage. Preferrably, you
88 should add new tests for any new functionality, and it helps in getting your
89 changes accepted.
90
91 If you're fixing a bug, it is recommended to add a "known broken" test
92 highlighting the issue first, and fixing the the bug after that. This makes it
93 easy to confirm your changes actually fix the issue. Some people use this
94 approach also for adding new features.
95
96 See
97 [`test/README`](http://git.notmuchmail.org/git/notmuch/blob/HEAD:/test/README)
98 in the Notmuch source for further information.
99
100 ## Update the documentation
101
102 If you modify or add new features to the Notmuch command-line tools, you should
103 update the manual pages under the `man` directory of the Notmuch source.
104
105 If you modify or add new features to the Notmuch Emacs UI, you should update the
106 Emacs documentation.
107
108 ## Update NEWS
109
110 If you make user visible changes, you should update the
111 [`NEWS`](http://git.notmuchmail.org/git/notmuch/blob/HEAD:/NEWS) file.
112
113 ## Subscribe to the Notmuch mailing list
114
115 While strictly not required, it is advisable to subscribe to the
116 [Notmuch mailing list](http://notmuchmail.org/mailman/listinfo/notmuch) before
117 submitting patches.
118
119 ## Send your patches to the mailing list
120
121 Changes to Notmuch are contributed as
122 [emailed patches](http://git-scm.com/book/en/Distributed-Git-Contributing-to-a-Project#Public-Large-Project). Once
123 you have your changes ready in your local repository, you need to send them to
124 the Notmuch mailing list. The simplest way is to use `git send-email` to send
125 the patches directly from your repository:
126
127         git send-email --to notmuch@notmuchmail.org origin
128
129 An alternative is to do this in two steps; first generating patch files (using
130 `git format-patch`), and then sending the patch files to the mailing list (using
131 `git send-email` or a mail client):
132
133         git format-patch origin
134         git send-email --to notmuch@notmuchmail.org *.patch
135
136 Either way, using `git send-email` to actually send the patches is
137 recommended. It may be distributed separately from git, typically in a package
138 named `git-email`.
139
140 ## Write a cover letter
141
142 If you are submitting a non-trivial set of patches, or if there's any extra
143 information you want to share that is not really part of the commit messages, it
144 is advisable to write a cover letter to give an overview of your work. See the
145 [Notmuch mailing list archives](http://notmuchmail.org/pipermail/notmuch/) for
146 examples. Use the `--cover-letter` option of `git format-patch`, or `--compose`
147 option of `git send-email`.
148
149 ## Tag your patches in nmbug
150
151 When you're developing an email tool, all the problems start looking like
152 email. This applies to patch and bug tracking as well. The Notmuch project uses
153 [nmbug](http://notmuchmail.org/nmbug/) for tracking. The Notmuch developers will
154 tag your patches too, making them show up in the
155 [nmbug status page](http://nmbug.tethera.net/status/), but requesting access and
156 tagging your patches yourself will be helpful in the long run.
157
158 ## Address review comments, participate in discussion
159
160 Each change to Notmuch must be peer reviewed before it is accepted, usually by
161 one or two developers, depending on the impact of the changes. You are expected
162 to follow up on the review comments you receive, either by discussing the
163 comments and the code, or modifying your patches. Again, see the
164 [Notmuch mailing list archives](http://notmuchmail.org/pipermail/notmuch/) for
165 examples.
166
167 ## Send another round addressing review comments
168
169 If your patches need to be changed based on review (for large patch series they
170 usually do), you need to make the changes and re-submit. `git rebase -i` is your
171 friend in updating your series. Also note that the upstream master may have
172 changed; be sure to rebase your updated changes on top of the current master.
173
174 Once you have the updated series ready, send it to the mailing list again. It
175 will be helpful for others to use the `--subject-prefix="PATCH vN"` option of
176 `git format-patch` to add a version number of the patch series to the subject
177 (replacing vN with v2, v3, etc.) Use a cover letter (or, in the case of a single
178 patch, the notes after a "---" at the end of the commit message) to summarize
179 the main changes since the previous version of the patch series. Also include
180 the message-id reference of the previous version.
181
182 Using the `--in-reply-to` option of `git format-patch` or `git send-email` to
183 send the patch series as a reply to the earlier version is generally
184 discouraged, particularly for large series, but there are no hard rules. Usually
185 the message-id reference to the previous version is sufficient and preferred.
186
187 Tag the old patches obsolete in [nmbug](http://notmuchmail.org/nmbug/) if you
188 have access.
189
190 ## Review other people's work
191
192 You scratch my back and I'll scratch yours. It will be easier to get people to
193 review your patches if you review theirs.
194
195 ## Report bugs
196
197 Send bug reports to the Notmuch mailing list. Preferrably prefix the subject
198 line with "BUG:" or similar. Tag the message as a bug in
199 [nmbug](http://notmuchmail.org/nmbug/).
200
201 Even better, send a patch adding a "known broken" test to the test suite
202 highlighting the issue.
203
204 ## Join the Notmuch IRC channel
205
206 Patch review happens on the Notmuch mailing list, but there is plenty of
207 discussion going on in the #notmuch IRC channel.