]> git.lizzy.rs Git - rust.git/blob - CONTRIBUTING.md
Make all references to @bors or users links
[rust.git] / CONTRIBUTING.md
1 # Contributing to Rust
2 [contributing-to-rust]: #contributing-to-rust
3
4 Thank you for your interest in contributing to Rust! There are many ways to
5 contribute, and we appreciate all of them. This document is a bit long, so here's
6 links to the major sections:
7
8 * [Feature Requests](#feature-requests)
9 * [Bug Reports](#bug-reports)
10 * [The Build System](#the-build-system)
11 * [Pull Requests](#pull-requests)
12 * [Writing Documentation](#writing-documentation)
13 * [Issue Triage](#issue-triage)
14 * [Out-of-tree Contributions](#out-of-tree-contributions)
15 * [Helpful Links and Information](#helpful-links-and-information)
16
17 If you have questions, please make a post on [internals.rust-lang.org][internals] or
18 hop on the [Rust Discord server][rust-discord], [Rust Zulip server][rust-zulip] or [#rust-internals][pound-rust-internals].
19
20 As a reminder, all contributors are expected to follow our [Code of Conduct][coc].
21
22 The [rustc-guide] is your friend! It describes how the compiler works and how
23 to contribute to it in more detail than this document.
24
25 If this is your first time contributing, the [walkthrough] chapter of the guide
26 can give you a good example of how a typical contribution would go.
27
28 [pound-rust-internals]: https://chat.mibbit.com/?server=irc.mozilla.org&channel=%23rust-internals
29 [internals]: https://internals.rust-lang.org
30 [rust-discord]: http://discord.gg/rust-lang
31 [rust-zulip]: https://rust-lang.zulipchat.com
32 [coc]: https://www.rust-lang.org/conduct.html
33 [rustc-guide]: https://rust-lang.github.io/rustc-guide/
34 [walkthrough]: https://rust-lang.github.io/rustc-guide/walkthrough.html
35
36 ## Feature Requests
37 [feature-requests]: #feature-requests
38
39 To request a change to the way the Rust language works, please head over
40 to the [RFCs repository](https://github.com/rust-lang/rfcs) and view the
41 [README](https://github.com/rust-lang/rfcs/blob/master/README.md)
42 for instructions.
43
44 ## Bug Reports
45 [bug-reports]: #bug-reports
46
47 While bugs are unfortunate, they're a reality in software. We can't fix what we
48 don't know about, so please report liberally. If you're not sure if something
49 is a bug or not, feel free to file a bug anyway.
50
51 **If you believe reporting your bug publicly represents a security risk to Rust users,
52 please follow our [instructions for reporting security vulnerabilities](https://www.rust-lang.org/policies/security)**.
53
54 If you have the chance, before reporting a bug, please [search existing
55 issues](https://github.com/rust-lang/rust/search?q=&type=Issues&utf8=%E2%9C%93),
56 as it's possible that someone else has already reported your error. This doesn't
57 always work, and sometimes it's hard to know what to search for, so consider this
58 extra credit. We won't mind if you accidentally file a duplicate report.
59
60 Similarly, to help others who encountered the bug find your issue,
61 consider filing an issue with a descriptive title, which contains information that might be unique to it.
62 This can be the language or compiler feature used, the conditions that trigger the bug,
63 or part of the error message if there is any.
64 An example could be: **"impossible case reached" on lifetime inference for impl Trait in return position**.
65
66 Opening an issue is as easy as following [this
67 link](https://github.com/rust-lang/rust/issues/new) and filling out the fields.
68 Here's a template that you can use to file a bug, though it's not necessary to
69 use it exactly:
70
71     <short summary of the bug>
72
73     I tried this code:
74
75     <code sample that causes the bug>
76
77     I expected to see this happen: <explanation>
78
79     Instead, this happened: <explanation>
80
81     ## Meta
82
83     `rustc --version --verbose`:
84
85     Backtrace:
86
87 All three components are important: what you did, what you expected, what
88 happened instead. Please include the output of `rustc --version --verbose`,
89 which includes important information about what platform you're on, what
90 version of Rust you're using, etc.
91
92 Sometimes, a backtrace is helpful, and so including that is nice. To get
93 a backtrace, set the `RUST_BACKTRACE` environment variable to a value
94 other than `0`. The easiest way
95 to do this is to invoke `rustc` like this:
96
97 ```bash
98 $ RUST_BACKTRACE=1 rustc ...
99 ```
100
101 ## The Build System
102
103 For info on how to configure and build the compiler, please see [this
104 chapter][rustcguidebuild] of the rustc-guide. This chapter contains info for
105 contributions to the compiler and the standard library. It also lists some
106 really useful commands to the build system (`./x.py`), which could save you a
107 lot of time.
108
109 [rustcguidebuild]: https://rust-lang.github.io/rustc-guide/how-to-build-and-run.html
110
111 ## Pull Requests
112 [pull-requests]: #pull-requests
113
114 Pull requests are the primary mechanism we use to change Rust. GitHub itself
115 has some [great documentation][about-pull-requests] on using the Pull Request feature.
116 We use the "fork and pull" model [described here][development-models], where
117 contributors push changes to their personal fork and create pull requests to
118 bring those changes into the source repository.
119
120 [about-pull-requests]: https://help.github.com/articles/about-pull-requests/
121 [development-models]: https://help.github.com/articles/about-collaborative-development-models/
122
123 Please make pull requests against the `master` branch.
124
125 Please make sure your pull request is in compliance with Rust's style
126 guidelines by running
127
128     $ python x.py test src/tools/tidy
129
130 Make this check before every pull request (and every new commit in a pull
131 request); you can add [git hooks](https://git-scm.com/book/en/v2/Customizing-Git-Git-Hooks)
132 before every push to make sure you never forget to make this check.
133
134 All pull requests are reviewed by another person. We have a bot,
135 [@rust-highfive][rust-highfive], that will automatically assign a random person to review your
136 request.
137
138 If you want to request that a specific person reviews your pull request,
139 you can add an `r?` to the message. For example, [Steve][steveklabnik] usually reviews
140 documentation changes. So if you were to make a documentation change, add
141
142     r? @steveklabnik
143
144 to the end of the message, and @rust-highfive will assign [@steveklabnik][steveklabnik] instead
145 of a random person. This is entirely optional.
146
147 After someone has reviewed your pull request, they will leave an annotation
148 on the pull request with an `r+`. It will look something like this:
149
150     @bors r+
151
152 This tells [@bors][bors], our lovable integration bot, that your pull request has
153 been approved. The PR then enters the [merge queue][merge-queue], where [@bors][bors]
154 will run all the tests on every platform we support. If it all works out,
155 [@bors][bors] will merge your code into `master` and close the pull request.
156
157 [rust-highfive]: https://github.com/rust-highfive
158 [steveklabnik]: https://github.com/steveklabnik
159 [bors]: https://github.com/bors
160 [merge-queue]: https://buildbot2.rust-lang.org/homu/queue/rust
161
162 Speaking of tests, Rust has a comprehensive test suite. More information about
163 it can be found [here][rctd].
164
165 ### External Dependencies
166 [external-dependencies]: #external-dependencies
167
168 Currently building Rust will also build the following external projects:
169
170 * [clippy](https://github.com/rust-lang/rust-clippy)
171 * [miri](https://github.com/rust-lang/miri)
172 * [rustfmt](https://github.com/rust-lang/rustfmt)
173 * [rls](https://github.com/rust-lang/rls/)
174
175 We allow breakage of these tools in the nightly channel. Maintainers of these
176 projects will be notified of the breakages and should fix them as soon as
177 possible.
178
179 After the external is fixed, one could add the changes with
180
181 ```sh
182 git add path/to/submodule
183 ```
184
185 outside the submodule.
186
187 In order to prepare your tool-fixing PR, you can run the build locally by doing
188 `./x.py build src/tools/TOOL`. If you will be editing the sources
189 there, you may wish to set `submodules = false` in the `config.toml`
190 to prevent `x.py` from resetting to the original branch.
191
192 Breakage is not allowed in the beta and stable channels, and must be addressed
193 before the PR is merged.
194
195 #### Breaking Tools Built With The Compiler
196 [breaking-tools-built-with-the-compiler]: #breaking-tools-built-with-the-compiler
197
198 Rust's build system builds a number of tools that make use of the
199 internals of the compiler. This includes
200 [Clippy](https://github.com/rust-lang/rust-clippy),
201 [RLS](https://github.com/rust-lang/rls) and
202 [rustfmt](https://github.com/rust-lang/rustfmt). If these tools
203 break because of your changes, you may run into a sort of "chicken and egg"
204 problem. These tools rely on the latest compiler to be built so you can't update
205 them to reflect your changes to the compiler until those changes are merged into
206 the compiler. At the same time, you can't get your changes merged into the compiler
207 because the rust-lang/rust build won't pass until those tools build and pass their
208 tests.
209
210 That means that, in the default state, you can't update the compiler without first
211 fixing rustfmt, rls and the other tools that the compiler builds.
212
213 Luckily, a feature was [added to Rust's build](https://github.com/rust-lang/rust/issues/45861)
214 to make all of this easy to handle. The idea is that we allow these tools to be "broken",
215 so that the rust-lang/rust build passes without trying to build them, then land the change
216 in the compiler, wait for a nightly, and go update the tools that you broke. Once you're done
217 and the tools are working again, you go back in the compiler and update the tools
218 so they can be distributed again.
219
220 This should avoid a bunch of synchronization dances and is also much easier on contributors as
221 there's no need to block on rls/rustfmt/other tools changes going upstream.
222
223 Here are those same steps in detail:
224
225 1. (optional) First, if it doesn't exist already, create a `config.toml` by copying
226    `config.toml.example` in the root directory of the Rust repository.
227    Set `submodules = false` in the `[build]` section. This will prevent `x.py`
228    from resetting to the original branch after you make your changes. If you
229    need to [update any submodules to their latest versions][updating-submodules],
230    see the section of this file about that for more information.
231 2. (optional) Run `./x.py test src/tools/rustfmt` (substituting the submodule
232    that broke for `rustfmt`). Fix any errors in the submodule (and possibly others).
233 3. (optional) Make commits for your changes and send them to upstream repositories as a PR.
234 4. (optional) Maintainers of these submodules will **not** merge the PR. The PR can't be
235    merged because CI will be broken. You'll want to write a message on the PR referencing
236    your change, and how the PR should be merged once your change makes it into a nightly.
237 5. Wait for your PR to merge.
238 6. Wait for a nightly
239 7. (optional) Help land your PR on the upstream repository now that your changes are in nightly.
240 8. (optional) Send a PR to rust-lang/rust updating the submodule.
241
242 #### Updating submodules
243 [updating-submodules]: #updating-submodules
244
245 These instructions are specific to updating `rustfmt`, however they may apply
246 to the other submodules as well. Please help by improving these instructions
247 if you find any discrepancies or special cases that need to be addressed.
248
249 To update the `rustfmt` submodule, start by running the appropriate
250 [`git submodule` command](https://git-scm.com/book/en/v2/Git-Tools-Submodules).
251 For example, to update to the latest commit on the remote master branch,
252 you may want to run:
253 ```
254 git submodule update --remote src/tools/rustfmt
255 ```
256 If you run `./x.py build` now, and you are lucky, it may just work. If you see
257 an error message about patches that did not resolve to any crates, you will need
258 to complete a few more steps which are outlined with their rationale below.
259
260 *(This error may change in the future to include more information.)*
261 ```
262 error: failed to resolve patches for `https://github.com/rust-lang/rustfmt`
263
264 Caused by:
265   patch for `rustfmt-nightly` in `https://github.com/rust-lang/rustfmt` did not resolve to any crates
266 failed to run: ~/rust/build/x86_64-unknown-linux-gnu/stage0/bin/cargo build --manifest-path ~/rust/src/bootstrap/Cargo.toml
267 ```
268
269 If you haven't used the `[patch]`
270 section of `Cargo.toml` before, there is [some relevant documentation about it
271 in the cargo docs](http://doc.crates.io/manifest.html#the-patch-section). In
272 addition to that, you should read the
273 [Overriding dependencies](http://doc.crates.io/specifying-dependencies.html#overriding-dependencies)
274 section of the documentation as well.
275
276 Specifically, the following [section in Overriding dependencies](http://doc.crates.io/specifying-dependencies.html#testing-a-bugfix) reveals what the problem is:
277
278 > Next up we need to ensure that our lock file is updated to use this new version of uuid so our project uses the locally checked out copy instead of one from crates.io. The way [patch] works is that it'll load the dependency at ../path/to/uuid and then whenever crates.io is queried for versions of uuid it'll also return the local version.
279 >
280 > This means that the version number of the local checkout is significant and will affect whether the patch is used. Our manifest declared uuid = "1.0" which means we'll only resolve to >= 1.0.0, < 2.0.0, and Cargo's greedy resolution algorithm also means that we'll resolve to the maximum version within that range. Typically this doesn't matter as the version of the git repository will already be greater or match the maximum version published on crates.io, but it's important to keep this in mind!
281
282 This says that when we updated the submodule, the version number in our
283 `src/tools/rustfmt/Cargo.toml` changed. The new version is different from
284 the version in `Cargo.lock`, so the build can no longer continue.
285
286 To resolve this, we need to update `Cargo.lock`. Luckily, cargo provides a
287 command to do this easily.
288
289 ```
290 $ cargo update -p rustfmt-nightly
291 ```
292
293 This should change the version listed in `Cargo.lock` to the new version you updated
294 the submodule to. Running `./x.py build` should work now.
295
296 ## Writing Documentation
297 [writing-documentation]: #writing-documentation
298
299 Documentation improvements are very welcome. The source of `doc.rust-lang.org`
300 is located in `src/doc` in the tree, and standard API documentation is generated
301 from the source code itself.
302
303 Documentation pull requests function in the same way as other pull requests,
304 though you may see a slightly different form of `r+`:
305
306     @bors r+ rollup
307
308 That additional `rollup` tells [@bors][bors] that this change is eligible for a 'rollup'.
309 To save [@bors][bors] some work, and to get small changes through more quickly, when
310 [@bors][bors] attempts to merge a commit that's rollup-eligible, it will also merge
311 the other rollup-eligible patches too, and they'll get tested and merged at
312 the same time.
313
314 To find documentation-related issues, sort by the [T-doc label][tdoc].
315
316 [tdoc]: https://github.com/rust-lang/rust/issues?q=is%3Aopen%20is%3Aissue%20label%3AT-doc
317
318 You can find documentation style guidelines in [RFC 1574][rfc1574].
319
320 [rfc1574]: https://github.com/rust-lang/rfcs/blob/master/text/1574-more-api-documentation-conventions.md#appendix-a-full-conventions-text
321
322 In many cases, you don't need a full `./x.py doc`. You can use `rustdoc` directly
323 to check small fixes. For example, `rustdoc src/doc/reference.md` will render
324 reference to `doc/reference.html`. The CSS might be messed up, but you can
325 verify that the HTML is right.
326
327 Additionally, contributions to the [rustc-guide] are always welcome. Contributions
328 can be made directly at [the
329 rust-lang/rustc-guide](https://github.com/rust-lang/rustc-guide) repo. The issue
330 tracker in that repo is also a great way to find things that need doing. There
331 are issues for beginners and advanced compiler devs alike!
332
333 ## Issue Triage
334 [issue-triage]: #issue-triage
335
336 Sometimes, an issue will stay open, even though the bug has been fixed. And
337 sometimes, the original bug may go stale because something has changed in the
338 meantime.
339
340 It can be helpful to go through older bug reports and make sure that they are
341 still valid. Load up an older issue, double check that it's still true, and
342 leave a comment letting us know if it is or is not. The [least recently
343 updated sort][lru] is good for finding issues like this.
344
345 Contributors with sufficient permissions on the Rust repo can help by adding
346 labels to triage issues:
347
348 * Yellow, **A**-prefixed labels state which **area** of the project an issue
349   relates to.
350
351 * Magenta, **B**-prefixed labels identify bugs which are **blockers**.
352
353 * Dark blue, **beta-** labels track changes which need to be backported into
354   the beta branches.
355
356 * Light purple, **C**-prefixed labels represent the **category** of an issue.
357
358 * Green, **E**-prefixed labels explain the level of **experience** necessary
359   to fix the issue.
360
361 * The dark blue **final-comment-period** label marks bugs that are using the
362   RFC signoff functionality of [rfcbot][rfcbot] and are currently in the final
363   comment period.
364
365 * Red, **I**-prefixed labels indicate the **importance** of the issue. The
366   [I-nominated][inom] label indicates that an issue has been nominated for
367   prioritizing at the next triage meeting.
368
369 * The purple **metabug** label marks lists of bugs collected by other
370   categories.
371
372 * Purple gray, **O**-prefixed labels are the **operating system** or platform
373   that this issue is specific to.
374
375 * Orange, **P**-prefixed labels indicate a bug's **priority**. These labels
376   are only assigned during triage meetings, and replace the [I-nominated][inom]
377   label.
378
379 * The gray **proposed-final-comment-period** label marks bugs that are using
380   the RFC signoff functionality of [rfcbot][rfcbot] and are currently awaiting
381   signoff of all team members in order to enter the final comment period.
382
383 * Pink, **regression**-prefixed labels track regressions from stable to the
384   release channels.
385
386 * The light orange **relnotes** label marks issues that should be documented in
387   the release notes of the next release.
388
389 * Gray, **S**-prefixed labels are used for tracking the **status** of pull
390   requests.
391
392 * Blue, **T**-prefixed bugs denote which **team** the issue belongs to.
393
394 If you're looking for somewhere to start, check out the [E-easy][eeasy] tag.
395
396 [inom]: https://github.com/rust-lang/rust/issues?q=is%3Aopen+is%3Aissue+label%3AI-nominated
397 [eeasy]: https://github.com/rust-lang/rust/issues?q=is%3Aopen+is%3Aissue+label%3AE-easy
398 [lru]: https://github.com/rust-lang/rust/issues?q=is%3Aissue+is%3Aopen+sort%3Aupdated-asc
399 [rfcbot]: https://github.com/anp/rfcbot-rs/
400
401 ## Out-of-tree Contributions
402 [out-of-tree-contributions]: #out-of-tree-contributions
403
404 There are a number of other ways to contribute to Rust that don't deal with
405 this repository.
406
407 Answer questions in [#rust][pound-rust], or on [users.rust-lang.org][users],
408 or on [StackOverflow][so].
409
410 Participate in the [RFC process](https://github.com/rust-lang/rfcs).
411
412 Find a [requested community library][community-library], build it, and publish
413 it to [Crates.io](http://crates.io). Easier said than done, but very, very
414 valuable!
415
416 [pound-rust]: http://chat.mibbit.com/?server=irc.mozilla.org&channel=%23rust
417 [users]: https://users.rust-lang.org/
418 [so]: http://stackoverflow.com/questions/tagged/rust
419 [community-library]: https://github.com/rust-lang/rfcs/labels/A-community-library
420
421 ## Helpful Links and Information
422 [helpful-info]: #helpful-info
423
424 For people new to Rust, and just starting to contribute, or even for
425 more seasoned developers, some useful places to look for information
426 are:
427
428 * The [rustc guide] contains information about how various parts of the compiler work and how to contribute to the compiler
429 * [Rust Forge][rustforge] contains additional documentation, including write-ups of how to achieve common tasks
430 * The [Rust Internals forum][rif], a place to ask questions and
431   discuss Rust's internals
432 * The [generated documentation for rust's compiler][gdfrustc]
433 * The [rust reference][rr], even though it doesn't specifically talk about Rust's internals, it's a great resource nonetheless
434 * Although out of date, [Tom Lee's great blog article][tlgba] is very helpful
435 * [rustaceans.org][ro] is helpful, but mostly dedicated to IRC
436 * The [Rust Compiler Testing Docs][rctd]
437 * For [@bors][bors], [this cheat sheet][cheatsheet] is helpful (Remember to replace `@homu` with `@bors` in the commands that you use.)
438 * **Google!** ([search only in Rust Documentation][gsearchdocs] to find types, traits, etc. quickly)
439 * Don't be afraid to ask! The Rust community is friendly and helpful.
440
441 [rustc guide]: https://rust-lang.github.io/rustc-guide/about-this-guide.html
442 [gdfrustc]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc/
443 [gsearchdocs]: https://www.google.com/search?q=site:doc.rust-lang.org+your+query+here
444 [rif]: http://internals.rust-lang.org
445 [rr]: https://doc.rust-lang.org/book/README.html
446 [rustforge]: https://forge.rust-lang.org/
447 [tlgba]: http://tomlee.co/2014/04/a-more-detailed-tour-of-the-rust-compiler/
448 [ro]: http://www.rustaceans.org/
449 [rctd]: https://rust-lang.github.io/rustc-guide/tests/intro.html
450 [cheatsheet]: https://buildbot2.rust-lang.org/homu/