test: remove --use-http1 test runner flag
[platform/upstream/nodejs.git] / CONTRIBUTING.md
1 # CONTRIBUTING
2
3 ## ISSUE CONTRIBUTIONS
4
5 When opening new issues or commenting on existing issues on this repository
6 please make sure discussions are related to concrete technical issues with the
7 `iojs` software.
8
9 Discussion of non-technical topics including subjects like intellectual
10 property, trademark and high level project questions should move to the
11 [node-forward discussion repository][] instead.
12
13 ## CODE CONTRIBUTIONS
14
15 The io.js project welcomes new contributors.  This document will guide you
16 through the process.
17
18
19 ### FORK
20
21 Fork the project [on GitHub](https://github.com/iojs/io.js) and check out
22 your copy.
23
24 ```sh
25 $ git clone git@github.com:username/io.js.git
26 $ cd io.js
27 $ git remote add upstream git://github.com/iojs/io.js.git
28 ```
29
30 Now decide if you want your feature or bug fix to go into the master branch
31 or the stable branch.  As a rule of thumb, bug fixes go into the stable branch
32 while new features go into the master branch.
33
34 The stable branch is effectively frozen; patches that change the io.js
35 API/ABI or affect the run-time behavior of applications get rejected.
36
37 The rules for the master branch are less strict; consult the
38 [stability index page][] for details.
39
40 In a nutshell, modules are at varying levels of API stability.  Bug fixes are
41 always welcome but API or behavioral  changes to modules at stability level 3
42 and up are off-limits.
43
44 io.js has several bundled dependencies in the deps/ and the tools/
45 directories that are not part of the project proper.  Any changes to files
46 in those directories or its subdirectories should be sent to their respective
47 projects.  Do not send your patch to us, we cannot accept it.
48
49 In case of doubt, open an issue in the [issue tracker][], post your question
50 to the [node.js mailing list][] or contact one of the [project maintainers][]
51 on [IRC][].
52
53 Especially do so if you plan to work on something big.  Nothing is more
54 frustrating than seeing your hard work go to waste because your vision
55 does not align with that of a project maintainer.
56
57
58 ### BRANCH
59
60 Okay, so you have decided on the proper branch.  Create a feature branch
61 and start hacking:
62
63 ```sh
64 $ git checkout -b my-feature-branch -t origin/v0.12
65 ```
66
67 (Where v0.12 is the latest stable branch as of this writing.)
68
69
70 ### COMMIT
71
72 Make sure git knows your name and email address:
73
74 ```sh
75 $ git config --global user.name "J. Random User"
76 $ git config --global user.email "j.random.user@example.com"
77 ```
78
79 Writing good commit logs is important.  A commit log should describe what
80 changed and why.  Follow these guidelines when writing one:
81
82 1. The first line should be 50 characters or less and contain a short
83    description of the change prefixed with the name of the changed
84    subsystem (e.g. "net: add localAddress and localPort to Socket").
85 2. Keep the second line blank.
86 3. Wrap all other lines at 72 columns.
87
88 A good commit log looks like this:
89
90 ```
91 subsystem: explaining the commit in one line
92
93 Body of commit message is a few lines of text, explaining things
94 in more detail, possibly giving some background about the issue
95 being fixed, etc etc.
96
97 The body of the commit message can be several paragraphs, and
98 please do proper word-wrap and keep columns shorter than about
99 72 characters or so. That way `git log` will show things
100 nicely even when it is indented.
101 ```
102
103 The header line should be meaningful; it is what other people see when they
104 run `git shortlog` or `git log --oneline`.
105
106 Check the output of `git log --oneline files_that_you_changed` to find out
107 what subsystem (or subsystems) your changes touch.
108
109
110 ### REBASE
111
112 Use `git rebase` (not `git merge`) to sync your work from time to time.
113
114 ```sh
115 $ git fetch upstream
116 $ git rebase upstream/v0.12  # or upstream/master
117 ```
118
119
120 ### TEST
121
122 Bug fixes and features should come with tests.  Add your tests in the
123 test/simple/ directory.  Look at other tests to see how they should be
124 structured (license boilerplate, common includes, etc.).
125
126 ```sh
127 $ make jslint test
128 ```
129
130 Make sure the linter is happy and that all tests pass.  Please, do not submit
131 patches that fail either check.
132
133 If you are updating tests and just want to run a single test to check it, you
134 can use this syntax to run it exactly as the test harness would:
135
136 ```
137 python tools/test.py -v --mode=release simple/test-stream2-transform
138 ```
139
140 You can run tests directly with node:
141
142 ```
143 node ./test/simple/test-streams2-transform.js
144 ```
145
146
147 ### PUSH
148
149 ```sh
150 $ git push origin my-feature-branch
151 ```
152
153 Go to https://github.com/username/io.js and select your feature branch.  Click
154 the 'Pull Request' button and fill out the form.
155
156 Pull requests are usually reviewed within a few days.  If there are comments
157 to address, apply your changes in a separate commit and push that to your
158 feature branch.  Post a comment in the pull request afterwards; GitHub does
159 not send out notifications when you add commits.
160
161
162 [stability index page]: https://github.com/joyent/node/blob/master/doc/api/documentation.markdown
163 [issue tracker]: https://github.com/joyent/node/issues
164 [node.js mailing list]: http://groups.google.com/group/nodejs
165 [IRC]: http://webchat.freenode.net/?channels=io.js
166 [project maintainers]: https://github.com/joyent/node/wiki/Project-Organization
167 [node-forward discussion repository]: https://github.com/node-forward/discussions/issues
168
169 # Contribution Policy
170
171 Individuals making significant and valuable contributions are given
172 commit-access to the project. These individuals are identified by the
173 Technical Committee (TC) and discussed during the weekly TC meeting.
174
175 If you make a significant contribution and are not considered for
176 commit-access log an issue and it will be brought up in the next TC
177 meeting.
178
179 Internal pull-requests to solicit feedback are required for any other
180 non-trivial contribution but left to the discretion of the
181 contributor.
182
183 Pull requests may be approved by any committer with sufficient
184 expertise to take full responsibility for the change, according to the
185 "Landing Patches" protocol described below.
186
187 ## Landing Patches
188
189 - All bugfixes require a test case which demonstrates the defect.  The
190   test should *fail* before the change, and *pass* after the change.
191 - Trivial changes (ie, those which fix bugs or improve performance
192   without affecting API or causing other wide-reaching impact) may be
193   landed immediately after review by a committer who did not write the
194   code, provided that no other committers object to the change.
195 - If you are unsure, or if you are the author, have someone else
196   review the change.
197 - For significant changes wait a full 48 hours (72 hours if it spans a
198   weekend) before merging so that active contributors who are
199   distributed throughout the world have a chance to weigh in.
200 - Controversial changes and **very** significant changes should not be
201   merged until they have been discussed by the TC which will make any
202   final decisions.
203 - Always include the `Reviewed-by: Your Name <your-email>` in the
204   commit message.
205 - In commit messages also include `Fixes:` that either includes the
206   **full url** (e.g.  `https://github.com/iojs/io.js/issues/...`),
207   and/or the hash and commit message if the commit fixes a bug in a
208   previous commit.
209 - PR's should include their full `PR-URL:` so it's easy to trace a
210   commit back to the conversation that lead up to that change.
211 - Double check PR's to make sure the person's **full name** and email
212   address are correct before merging.
213 - Except when updating dependencies, all commits should be self
214   contained.  Meaning, every commit should pass all tests. This makes
215   it much easier when bisecting to find a breaking change.
216
217 ### Direct instruction
218
219 (Optional) Ensure that you are not in a borked `am`/`rebase` state
220
221 ```sh
222 git am --abort
223 git rebase --abort
224 ```
225
226 Checkout proper target branch
227
228 ```sh
229 git checkout v0.12
230 ```
231
232 Update the tree
233
234 ```sh
235 git fetch origin
236 git merge --ff-only origin/v0.12
237 ```
238
239 Apply external patches
240
241 ```sh
242 curl https://github.com/iojs/io.js/pull/xxx.patch | git am --whitespace=fix
243 ```
244
245 Check and re-review the changes
246
247 ```sh
248 git diff origin/v0.12
249 ```
250
251 Check number of commits and commit messages
252
253 ```sh
254 git log origin/v0.12...v0.12
255 ```
256
257 If there are multiple commits that relate to the same feature or
258 one with a feature and separate with a test for that feature -
259 you'll need to squash them (or strictly speaking `fixup`).
260
261 ```sh
262 git rebase -i origin/v0.12
263 ```
264
265 This will open a screen like this (in the default shell editor):
266
267 ```sh
268 pick 6928fc1 crypto: add feature A
269 pick 8120c4c add test for feature A
270 pick 51759dc feature B
271 pick 7d6f433 test for feature B
272
273 # Rebase f9456a2..7d6f433 onto f9456a2
274 #
275 # Commands:
276 #  p, pick = use commit
277 #  r, reword = use commit, but edit the commit message
278 #  e, edit = use commit, but stop for amending
279 #  s, squash = use commit, but meld into previous commit
280 #  f, fixup = like "squash", but discard this commit's log message
281 #  x, exec = run command (the rest of the line) using shell
282 #
283 # These lines can be re-ordered; they are executed from top to bottom.
284 #
285 # If you remove a line here THAT COMMIT WILL BE LOST.
286 #
287 # However, if you remove everything, the rebase will be aborted.
288 #
289 # Note that empty commits are commented out
290 ```
291
292 Replace a couple of `pick`s with `fixup` to squash them into a previous commit:
293
294 ```sh
295 pick 6928fc1 crypto: add feature A
296 fixup 8120c4c add test for feature A
297 pick 51759dc feature B
298 fixup 7d6f433 test for feature B
299 ```
300
301 Replace `pick` with `reword` to change the commit message:
302
303 ```sh
304 reword 6928fc1 crypto: add feature A
305 fixup 8120c4c add test for feature A
306 reword 51759dc feature B
307 fixup 7d6f433 test for feature B
308 ```
309
310 Save the file and close the editor, you'll be asked to enter new commit message
311 for that commit, and everything else should go smoothly. Note that this is a
312 good moment to fix incorrect commit logs, ensure that they are properly
313 formatted, and add `Reviewed-By` line.
314
315 Time to push it:
316
317 ```sh
318 git push origin v0.12
319 ```
320
321 # Governance
322
323 This repository is jointly governed by a technical committee, commonly
324 referred to as the "TC."
325
326 The TC has final authority over this project including:
327
328 * Technical direction
329 * Project governance and process (including this policy)
330 * Contribution policy
331 * GitHub repository hosting
332 * Conduct guidelines
333
334 ## Membership
335
336 Initial membership invitations to the TC were given to individuals who
337 had been active contributors to io.js, and who have significant
338 experience with the management of the io.js project.  Membership is
339 expected to evolve over time according to the needs of the project.
340
341 Current membership is:
342
343 ```
344 Ben Noordhuis (@bnoordhuis)
345 Bert Belder (@piscisaureus)
346 Fedor Indutny (@indutny)
347 Isaac Z. Schlueter (@isaacs)
348 Nathan Rajlich (@TooTallNate)
349 TJ Fontaine (@tjfontaine)
350 Trevor Norris (@trevnorris)
351 ```
352
353 TC seats are not time-limited.  There is no fixed size of the TC.
354 However, the expected target is between 6 and 12, to ensure adequate
355 coverage of important areas of expertise, balanced with the ability to
356 make decisions efficiently.
357
358 There is no specific set of requirements or qualifications for TC
359 membership beyond these rules.
360
361 The TC may add contributors to the TC by unanimous consensus.
362
363 A TC member may be removed from the TC by voluntary resignation, or by
364 unanimous consensus of all other TC members.
365
366 Changes to TC membership should be posted in the agenda, and may be
367 suggested as any other agenda item (see "TC Meetings" below).
368
369 If an addition or removal is proposed during a meeting, and the full
370 TC is not in attendance to participate, then the addition or removal
371 is added to the agenda for the subsequent meeting.  This is to ensure
372 that all members are given the opportunity to participate in all
373 membership decisions.  If a TC member is unable to attend a meeting
374 where a planned membership decision is being made, then their consent
375 is assumed.
376
377 No more than 1/3 of the TC members may be affiliated with the same
378 employer.  If removal or resignation of a TC member, or a change of
379 employment by a TC member, creates a situation where more than 1/3 of
380 the TC membership shares an employer, then the situation must be
381 immediately remedied by the resignation or removal of one or more TC
382 members affiliated with the over-represented employer(s).
383
384 ## TC Meetings
385
386 The TC meets weekly on a Google hangout. The meeting is run by a
387 designated moderator, currently `Mikeal Rogers (@mikeal)`. Each
388 meeting should be published to Youtube.
389
390 Items are added to the TC agenda which are considered contentious or
391 are modifications of governance, contribution policy, TC membership,
392 or release process. The intention of the agenda is not to approve or
393 review all patches, that should happen continuously on GitHub (see
394 "Contribution Policy").
395
396 Any community member or contributor can ask that something be added to
397 the next meeting's agenda by logging a GitHub Issue. Any TC member or
398 the moderator can add the item to the agenda by a simple +1. The
399 moderator and the TC cannot veto or remove items.
400
401 Prior to each TC meeting the moderator will email the Agenda to the
402 TC. TC members can add any items they like to the agenda at the
403 beginning of each meeting. The moderator and the TC cannot veto or
404 remove items.
405
406 TC may invite persons or representatives from certain projects to
407 participate in a non-voting capacity. These invitees currently are:
408
409 * A representative from [build](https://github.com/node-forward/build)
410   chosen by that project.
411
412 The moderator is responsible for summarizing the discussion of each
413 agenda item and send it as a pull request after the meeting.
414
415 ## Consensus Seeking Process
416
417 The TC follows a [Consensus
418 Seeking](http://en.wikipedia.org/wiki/Consensus-seeking_decision-making)
419 decision making model.
420
421 When an agenda item has appeared to reach a consensus the moderator
422 will ask "Does anyone object?" as a final call for dissent from the
423 consensus.
424
425 If an agenda item cannot reach a consensus a TC member can call for
426 either a closing vote or a vote to table the issue to the next
427 meeting. The call for a vote must be seconded by a majority of the TC
428 or else the discussion will continue. Simple majority wins.
429
430 Note that changes to TC membership require unanimous consensus.  See
431 "Membership" above.
432
433 ## Caine's requirements
434
435 Hello!
436
437 I am pleased to see your valuable contribution to this project. Would you
438 please mind answering a couple of questions to help me classify this submission
439 and/or gather required information for the core team members?
440
441 ### Questions:
442
443 * _Issue-only_ Does this issue happen in core, or in some user-space
444   module from npm or other source? Please ensure that the test case
445   that reproduces this problem is not using any external dependencies.
446   If the error is not reproducible with just core modules - it is most
447   likely not a io.js problem. _Expected: `yes`_
448 * Which part of core do you think it might be related to?
449   _One of: `debugger, http, assert, buffer, child_process, cluster, crypto,
450   dgram, dns, domain, events, fs, http, https, module, net, os, path,
451   querystring, readline, repl, smalloc, stream, timers, tls, url, util, vm,
452   zlib, c++, docs, other`_ (_label_)
453 * Which versions of io.js do you think are affected by this?
454   _One of: `v0.10, v0.12, v1.0.0`_ (_label_)
455 * _PR-only_ Does `make test` pass after applying this Pull Request.
456   _Expected: `yes`_
457 * _PR-only_ Is the commit message properly formatted? (See
458   CONTRIBUTING.md for more information)
459   _Expected: `yes`_
460
461 Please provide the answers in an ordered list like this:
462
463 1. Answer for the first question
464 2. Answer for the second question
465 3. ...
466
467 Note that I am just a bot with a limited human-reply parsing abilities,
468 so please be very careful with numbers and don't skip the questions!
469
470 _In case of success I will say:_ `...summoning the core team devs!`.
471
472 _In case of validation problem I will say:_ `Sorry, but something is not right
473 here:`.
474
475 Truly yours,
476 Caine.
477
478 ### Responsibilities
479
480 * indutny: crypto, tls, https, child_process, c++
481 * trevnorris: buffer, http, https, smalloc
482 * bnoordhuis: http, cluster, child_process, dgram