2015-08-13 16:14:34 +00:00
|
|
|
# Contributing to Node.js
|
2012-12-30 23:36:47 +00:00
|
|
|
|
2015-11-11 15:33:43 +00:00
|
|
|
## Code of Conduct
|
|
|
|
|
2017-05-02 18:30:01 +00:00
|
|
|
Please read the
|
|
|
|
[Code of Conduct](https://github.com/nodejs/TSC/blob/master/CODE_OF_CONDUCT.md)
|
|
|
|
which explains the minimum behavior expectations for Node.js contributors.
|
2015-11-11 15:33:43 +00:00
|
|
|
|
2015-01-02 11:52:50 +00:00
|
|
|
## Issue Contributions
|
2014-12-02 01:31:19 +00:00
|
|
|
|
2017-05-02 18:30:01 +00:00
|
|
|
When opening issues or commenting on existing issues, please make sure
|
|
|
|
discussions are related to concrete technical issues with Node.js.
|
2014-12-02 01:31:19 +00:00
|
|
|
|
2017-05-02 18:30:01 +00:00
|
|
|
* For general help using Node.js, please file an issue at the
|
2015-10-07 05:47:49 +00:00
|
|
|
[Node.js help repository](https://github.com/nodejs/help/issues).
|
|
|
|
|
2017-05-02 18:30:01 +00:00
|
|
|
* Discussion of non-technical topics (such as intellectual property and
|
|
|
|
trademark) should use the
|
|
|
|
[Technical Steering Committee (TSC) repository](https://github.com/nodejs/TSC/issues).
|
2014-12-02 01:31:19 +00:00
|
|
|
|
2015-01-02 11:52:50 +00:00
|
|
|
## Code Contributions
|
2014-12-02 01:31:19 +00:00
|
|
|
|
2017-05-02 18:30:01 +00:00
|
|
|
This section will guide you through the contribution process.
|
2012-12-30 23:36:47 +00:00
|
|
|
|
2015-01-02 11:52:50 +00:00
|
|
|
### Step 1: Fork
|
2012-12-30 23:36:47 +00:00
|
|
|
|
2017-05-02 18:30:01 +00:00
|
|
|
Fork the project [on GitHub](https://github.com/nodejs/node) and clone your fork
|
|
|
|
locally.
|
2012-12-30 23:36:47 +00:00
|
|
|
|
2015-01-02 11:52:50 +00:00
|
|
|
```text
|
2015-08-13 16:14:34 +00:00
|
|
|
$ git clone git@github.com:username/node.git
|
|
|
|
$ cd node
|
2017-06-10 18:36:13 +00:00
|
|
|
$ git remote add upstream https://github.com/nodejs/node.git
|
2012-12-30 23:36:47 +00:00
|
|
|
```
|
|
|
|
|
2015-01-02 11:52:50 +00:00
|
|
|
#### Which branch?
|
|
|
|
|
2015-04-18 18:11:52 +00:00
|
|
|
For developing new features and bug fixes, the `master` branch should be pulled
|
|
|
|
and built upon.
|
2015-01-02 11:52:50 +00:00
|
|
|
|
|
|
|
#### Dependencies
|
|
|
|
|
2015-08-13 16:14:34 +00:00
|
|
|
Node.js has several bundled dependencies in the *deps/* and the *tools/*
|
2017-05-02 18:30:01 +00:00
|
|
|
directories that are not part of the project proper. Changes to files in those
|
|
|
|
directories should be sent to their respective projects. Do not send a patch to
|
|
|
|
Node.js. We cannot accept such patches.
|
2012-12-30 23:36:47 +00:00
|
|
|
|
2015-01-02 11:52:50 +00:00
|
|
|
In case of doubt, open an issue in the
|
2015-08-13 16:14:34 +00:00
|
|
|
[issue tracker](https://github.com/nodejs/node/issues/) or contact one of the
|
|
|
|
[project Collaborators](https://github.com/nodejs/node/#current-project-team-members).
|
2017-05-02 18:30:01 +00:00
|
|
|
Node.js has two IRC channels:
|
2016-12-01 20:03:12 +00:00
|
|
|
[#Node.js](http://webchat.freenode.net/?channels=node.js) for general help and
|
|
|
|
questions, and
|
|
|
|
[#Node-dev](http://webchat.freenode.net/?channels=node-dev) for development of
|
2017-05-02 18:30:01 +00:00
|
|
|
Node.js core specifically.
|
2012-12-30 23:36:47 +00:00
|
|
|
|
2015-01-02 11:52:50 +00:00
|
|
|
### Step 2: Branch
|
2012-12-30 23:36:47 +00:00
|
|
|
|
2016-08-20 04:57:51 +00:00
|
|
|
Create a branch and start hacking:
|
2012-12-30 23:36:47 +00:00
|
|
|
|
2015-01-02 11:52:50 +00:00
|
|
|
```text
|
2016-08-20 04:57:51 +00:00
|
|
|
$ git checkout -b my-branch -t origin/master
|
2012-12-30 23:36:47 +00:00
|
|
|
```
|
|
|
|
|
2017-02-12 09:12:11 +00:00
|
|
|
Any text you write should follow the [Style Guide](doc/STYLE_GUIDE.md),
|
|
|
|
including comments and API documentation.
|
|
|
|
|
2015-01-02 11:52:50 +00:00
|
|
|
### Step 3: Commit
|
2012-12-30 23:36:47 +00:00
|
|
|
|
2015-03-26 19:03:11 +00:00
|
|
|
Make sure git knows your name and email address:
|
2012-12-30 23:36:47 +00:00
|
|
|
|
2015-01-02 11:52:50 +00:00
|
|
|
```text
|
2015-03-26 19:03:11 +00:00
|
|
|
$ git config --global user.name "J. Random User"
|
|
|
|
$ git config --global user.email "j.random.user@example.com"
|
2012-12-30 23:36:47 +00:00
|
|
|
```
|
|
|
|
|
2016-10-19 14:14:14 +00:00
|
|
|
Add and commit:
|
|
|
|
|
|
|
|
```text
|
|
|
|
$ git add my/changed/files
|
|
|
|
$ git commit
|
|
|
|
```
|
|
|
|
|
2017-05-02 18:30:01 +00:00
|
|
|
### Commit message guidelines
|
2017-03-10 19:35:46 +00:00
|
|
|
|
2017-05-02 18:30:01 +00:00
|
|
|
The commit message should describe what changed and why.
|
2012-12-30 23:36:47 +00:00
|
|
|
|
2017-03-07 16:00:27 +00:00
|
|
|
1. The first line should:
|
|
|
|
- contain a short description of the change
|
|
|
|
- be 50 characters or less
|
|
|
|
- be entirely in lowercase with the exception of proper nouns, acronyms, and
|
|
|
|
the words that refer to code, like function/variable names
|
|
|
|
- be prefixed with the name of the changed subsystem and start with an
|
2017-05-02 18:30:01 +00:00
|
|
|
imperative verb. Check the output of `git log --oneline files/you/changed` to
|
|
|
|
find out what subsystems your changes touch.
|
|
|
|
|
|
|
|
Examples:
|
|
|
|
- `net: add localAddress and localPort to Socket`
|
|
|
|
- `src: fix typos in node_lttng_provider.h`
|
|
|
|
|
|
|
|
|
2012-12-30 23:36:47 +00:00
|
|
|
2. Keep the second line blank.
|
|
|
|
3. Wrap all other lines at 72 columns.
|
|
|
|
|
2017-05-02 18:30:01 +00:00
|
|
|
4. If your patch fixes an open issue, you can add a reference to it at the end
|
|
|
|
of the log. Use the `Fixes:` prefix and the full issue URL. For other references
|
|
|
|
use `Refs:`.
|
|
|
|
|
|
|
|
Examples:
|
|
|
|
- `Fixes: https://github.com/nodejs/node/issues/1337`
|
|
|
|
- `Refs: http://eslint.org/docs/rules/space-in-parens.html`
|
|
|
|
- `Refs: https://github.com/nodejs/node/pull/3615`
|
|
|
|
|
|
|
|
Sample complete commit message:
|
2012-12-30 23:36:47 +00:00
|
|
|
|
2016-07-14 09:55:30 +00:00
|
|
|
```txt
|
2016-09-15 12:35:19 +00:00
|
|
|
subsystem: explain the commit in one line
|
2012-12-30 23:36:47 +00:00
|
|
|
|
|
|
|
Body of commit message is a few lines of text, explaining things
|
|
|
|
in more detail, possibly giving some background about the issue
|
2017-01-27 23:43:51 +00:00
|
|
|
being fixed, etc.
|
2012-12-30 23:36:47 +00:00
|
|
|
|
|
|
|
The body of the commit message can be several paragraphs, and
|
|
|
|
please do proper word-wrap and keep columns shorter than about
|
2017-01-27 23:43:51 +00:00
|
|
|
72 characters or so. That way, `git log` will show things
|
2012-12-30 23:36:47 +00:00
|
|
|
nicely even when it is indented.
|
|
|
|
|
2016-06-05 13:25:56 +00:00
|
|
|
Fixes: https://github.com/nodejs/node/issues/1337
|
2017-01-06 22:46:39 +00:00
|
|
|
Refs: http://eslint.org/docs/rules/space-in-parens.html
|
2016-06-05 13:25:56 +00:00
|
|
|
```
|
2012-12-30 23:36:47 +00:00
|
|
|
|
2015-01-02 11:52:50 +00:00
|
|
|
### Step 4: Rebase
|
2012-12-30 23:36:47 +00:00
|
|
|
|
2017-05-02 18:30:01 +00:00
|
|
|
Use `git rebase` (not `git merge`) to synchronize your work with the main
|
|
|
|
repository.
|
2012-12-30 23:36:47 +00:00
|
|
|
|
2015-01-02 11:52:50 +00:00
|
|
|
```text
|
2012-12-30 23:36:47 +00:00
|
|
|
$ git fetch upstream
|
2015-04-18 18:11:52 +00:00
|
|
|
$ git rebase upstream/master
|
2012-12-30 23:36:47 +00:00
|
|
|
```
|
|
|
|
|
2015-01-02 11:52:50 +00:00
|
|
|
### Step 5: Test
|
2012-12-30 23:36:47 +00:00
|
|
|
|
2017-05-02 18:30:01 +00:00
|
|
|
Bug fixes and features should come with tests. Read the
|
|
|
|
[guide for writing tests in Node.js](./doc/guides/writing-tests.md). Looking at
|
|
|
|
other tests to see how they should be structured can also help. Add your
|
|
|
|
tests in the `test/parallel/` directory if you are unsure where to put them.
|
2012-12-30 23:36:47 +00:00
|
|
|
|
2017-05-02 18:30:01 +00:00
|
|
|
To run the tests (including code linting) on Unix / macOS:
|
2016-07-18 15:58:05 +00:00
|
|
|
|
2015-01-02 11:52:50 +00:00
|
|
|
```text
|
2016-12-06 19:08:56 +00:00
|
|
|
$ ./configure && make -j4 test
|
2012-12-30 23:36:47 +00:00
|
|
|
```
|
|
|
|
|
2016-07-18 15:58:05 +00:00
|
|
|
Windows:
|
|
|
|
|
|
|
|
```text
|
2017-01-16 16:25:00 +00:00
|
|
|
> vcbuild test
|
2016-07-18 15:58:05 +00:00
|
|
|
```
|
|
|
|
|
|
|
|
(See the [BUILDING.md](./BUILDING.md) for more details.)
|
|
|
|
|
2017-01-27 23:43:51 +00:00
|
|
|
Make sure the linter does not report any issues and that all tests pass. Please
|
|
|
|
do not submit patches that fail either check.
|
2012-12-30 23:36:47 +00:00
|
|
|
|
2016-07-18 15:58:05 +00:00
|
|
|
If you want to run the linter without running tests, use
|
2017-03-15 03:12:32 +00:00
|
|
|
`make lint`/`vcbuild lint`. It will run both JavaScript linting and
|
2017-02-03 19:18:45 +00:00
|
|
|
C++ linting.
|
2016-07-04 16:42:20 +00:00
|
|
|
|
2017-05-02 18:30:01 +00:00
|
|
|
If you are updating tests and just want to run a single test to check it:
|
2014-05-13 02:30:58 +00:00
|
|
|
|
2015-01-02 11:52:50 +00:00
|
|
|
```text
|
2017-05-04 15:23:18 +00:00
|
|
|
$ python tools/test.py -J --mode=release parallel/test-stream2-transform
|
|
|
|
```
|
|
|
|
|
|
|
|
If you want to check the other options, please refer to the help by using
|
|
|
|
the `--help` option
|
|
|
|
|
|
|
|
```text
|
|
|
|
$ python tools/test.py --help
|
2014-05-13 02:30:58 +00:00
|
|
|
```
|
|
|
|
|
2017-05-02 18:30:01 +00:00
|
|
|
You can usually run tests directly with node:
|
2014-05-13 02:30:58 +00:00
|
|
|
|
2015-01-02 11:52:50 +00:00
|
|
|
```text
|
2015-08-13 16:14:34 +00:00
|
|
|
$ ./node ./test/parallel/test-stream2-transform.js
|
2014-05-13 02:30:58 +00:00
|
|
|
```
|
|
|
|
|
2017-05-02 18:30:01 +00:00
|
|
|
Remember to recompile with `make -j4` in between test runs if you change code in
|
|
|
|
the `lib` or `src` directories.
|
2012-12-30 23:36:47 +00:00
|
|
|
|
2015-01-02 11:52:50 +00:00
|
|
|
### Step 6: Push
|
2012-12-30 23:36:47 +00:00
|
|
|
|
2015-01-02 11:52:50 +00:00
|
|
|
```text
|
2016-08-20 04:57:51 +00:00
|
|
|
$ git push origin my-branch
|
2012-12-30 23:36:47 +00:00
|
|
|
```
|
|
|
|
|
2016-10-19 14:14:14 +00:00
|
|
|
Pull requests are usually reviewed within a few days.
|
|
|
|
|
|
|
|
### Step 7: Discuss and update
|
|
|
|
|
|
|
|
You will probably get feedback or requests for changes to your Pull Request.
|
2017-05-02 18:30:01 +00:00
|
|
|
This is a big part of the submission process so don't be discouraged!
|
2016-10-19 14:14:14 +00:00
|
|
|
|
|
|
|
To make changes to an existing Pull Request, make the changes to your branch.
|
|
|
|
When you push that branch to your fork, GitHub will automatically update the
|
|
|
|
Pull Request.
|
|
|
|
|
|
|
|
You can push more commits to your branch:
|
|
|
|
|
|
|
|
```text
|
|
|
|
$ git add my/changed/files
|
|
|
|
$ git commit
|
|
|
|
$ git push origin my-branch
|
|
|
|
```
|
|
|
|
|
|
|
|
Or you can rebase against master:
|
|
|
|
|
|
|
|
```text
|
|
|
|
$ git fetch --all
|
|
|
|
$ git rebase origin/master
|
|
|
|
$ git push --force-with-lease origin my-branch
|
|
|
|
```
|
|
|
|
|
|
|
|
Or you can amend the last commit (for example if you want to change the commit
|
|
|
|
log).
|
|
|
|
|
|
|
|
```text
|
|
|
|
$ git add any/changed/files
|
|
|
|
$ git commit --amend
|
|
|
|
$ git push --force-with-lease origin my-branch
|
|
|
|
```
|
|
|
|
|
|
|
|
**Important:** The `git push --force-with-lease` command is one of the few ways
|
|
|
|
to delete history in git. Before you use it, make sure you understand the risks.
|
|
|
|
If in doubt, you can always ask for guidance in the Pull Request or on
|
|
|
|
[IRC in the #node-dev channel](https://webchat.freenode.net?channels=node-dev&uio=d4).
|
|
|
|
|
|
|
|
Feel free to post a comment in the Pull Request to ping reviewers if you are
|
2016-12-09 19:11:19 +00:00
|
|
|
awaiting an answer on something. If you encounter words or acronyms that
|
2017-01-27 23:43:51 +00:00
|
|
|
seem unfamiliar, refer to this
|
2016-12-09 19:11:19 +00:00
|
|
|
[glossary](https://sites.google.com/a/chromium.org/dev/glossary).
|
2016-10-19 14:14:14 +00:00
|
|
|
|
2016-12-09 19:11:19 +00:00
|
|
|
Note that multiple commits often get squashed when they are landed (see the
|
|
|
|
notes about [commit squashing](#commit-squashing)).
|
2016-10-19 14:14:14 +00:00
|
|
|
|
|
|
|
### Step 8: Landing
|
|
|
|
|
2017-01-27 23:43:51 +00:00
|
|
|
In order to land, a Pull Request needs to be reviewed and
|
2016-12-09 19:11:19 +00:00
|
|
|
[approved](#getting-approvals-for-your-pull-request) by
|
|
|
|
at least one Node.js Collaborator and pass a
|
|
|
|
[CI (Continuous Integration) test run](#ci-testing).
|
|
|
|
After that, as long as there are no objections
|
|
|
|
from a Collaborator, the Pull Request can be merged. If you find your
|
|
|
|
Pull Request waiting longer than you expect, see the
|
|
|
|
[notes about the waiting time](#waiting-until-the-pull-request-gets-landed).
|
|
|
|
|
|
|
|
When a collaborator lands your Pull Request, they will post
|
|
|
|
a comment to the Pull Request page mentioning the commit(s) it
|
|
|
|
landed as. GitHub often shows the Pull Request as `Closed` at this
|
|
|
|
point, but don't worry. If you look at the branch you raised your
|
|
|
|
Pull Request against (probably `master`), you should see a commit with
|
|
|
|
your name on it. Congratulations and thanks for your contribution!
|
|
|
|
|
|
|
|
## Additional Notes
|
|
|
|
|
|
|
|
### Commit Squashing
|
|
|
|
|
2017-01-27 23:43:51 +00:00
|
|
|
When the commits in your Pull Request land, they will be squashed
|
|
|
|
into one commit per logical change. Metadata will be added to the commit
|
2016-12-09 19:11:19 +00:00
|
|
|
message (including links to the Pull Request, links to relevant issues,
|
|
|
|
and the names of the reviewers). The commit history of your Pull Request,
|
|
|
|
however, will stay intact on the Pull Request page.
|
|
|
|
|
|
|
|
For the size of "one logical change",
|
|
|
|
[0b5191f](https://github.com/nodejs/node/commit/0b5191f15d0f311c804d542b67e2e922d98834f8)
|
|
|
|
can be a good example. It touches the implementation, the documentation,
|
|
|
|
and the tests, but is still one logical change. In general, the tests should
|
|
|
|
always pass when each individual commit lands on the master branch.
|
|
|
|
|
|
|
|
### Getting Approvals for Your Pull Request
|
|
|
|
|
|
|
|
A Pull Request is approved either by saying LGTM, which stands for
|
|
|
|
"Looks Good To Me", or by using GitHub's Approve button.
|
|
|
|
GitHub's Pull Request review feature can be used during the process.
|
|
|
|
For more information, check out
|
|
|
|
[the video tutorial](https://www.youtube.com/watch?v=HW0RPaJqm4g)
|
|
|
|
or [the official documentation](https://help.github.com/articles/reviewing-changes-in-pull-requests/).
|
|
|
|
|
|
|
|
After you push new changes to your branch, you need to get
|
|
|
|
approval for these new changes again, even if GitHub shows "Approved"
|
|
|
|
because the reviewers have hit the buttons before.
|
|
|
|
|
|
|
|
### CI Testing
|
|
|
|
|
|
|
|
Every Pull Request needs to be tested
|
|
|
|
to make sure that it works on the platforms that Node.js
|
|
|
|
supports. This is done by running the code through the CI system.
|
|
|
|
|
2017-01-27 23:43:51 +00:00
|
|
|
Only a Collaborator can start a CI run. Usually one of them will do it
|
2016-12-09 19:11:19 +00:00
|
|
|
for you as approvals for the Pull Request come in.
|
2017-01-27 23:43:51 +00:00
|
|
|
If not, you can ask a Collaborator to start a CI run.
|
2016-12-09 19:11:19 +00:00
|
|
|
|
|
|
|
### Waiting Until the Pull Request Gets Landed
|
|
|
|
|
|
|
|
A Pull Request needs to stay open for at least 48 hours (72 hours on a
|
|
|
|
weekend) from when it is submitted, even after it gets approved and
|
|
|
|
passes the CI. This is to make sure that everyone has a chance to
|
|
|
|
weigh in. If the changes are trivial, collaborators may decide it
|
|
|
|
doesn't need to wait. A Pull Request may well take longer to be
|
|
|
|
merged in. All these precautions are important because Node.js is
|
|
|
|
widely used, so don't be discouraged!
|
|
|
|
|
|
|
|
### Check Out the Collaborator's Guide
|
|
|
|
|
|
|
|
If you want to know more about the code review and the landing process,
|
|
|
|
you can take a look at the
|
|
|
|
[collaborator's guide](https://github.com/nodejs/node/blob/master/COLLABORATOR_GUIDE.md).
|
2012-12-30 23:36:47 +00:00
|
|
|
|
2016-04-18 17:01:51 +00:00
|
|
|
<a id="developers-certificate-of-origin"></a>
|
2016-02-09 22:07:49 +00:00
|
|
|
## Developer's Certificate of Origin 1.1
|
2014-10-01 20:40:32 +00:00
|
|
|
|
|
|
|
By making a contribution to this project, I certify that:
|
|
|
|
|
|
|
|
* (a) The contribution was created in whole or in part by me and I
|
2016-02-09 22:07:49 +00:00
|
|
|
have the right to submit it under the open source license
|
|
|
|
indicated in the file; or
|
|
|
|
|
2014-10-01 20:40:32 +00:00
|
|
|
* (b) The contribution is based upon previous work that, to the best
|
2016-02-09 22:07:49 +00:00
|
|
|
of my knowledge, is covered under an appropriate open source
|
|
|
|
license and I have the right under that license to submit that
|
|
|
|
work with modifications, whether created in whole or in part
|
|
|
|
by me, under the same open source license (unless I am
|
|
|
|
permitted to submit under a different license), as indicated
|
|
|
|
in the file; or
|
|
|
|
|
2014-10-01 20:40:32 +00:00
|
|
|
* (c) The contribution was provided directly to me by some other
|
2016-02-09 22:07:49 +00:00
|
|
|
person who certified (a), (b) or (c) and I have not modified
|
|
|
|
it.
|
|
|
|
|
|
|
|
* (d) I understand and agree that this project and the contribution
|
|
|
|
are public and that a record of the contribution (including all
|
|
|
|
personal information I submit with it, including my sign-off) is
|
|
|
|
maintained indefinitely and may be redistributed consistent with
|
|
|
|
this project or the open source license(s) involved.
|