/ CONTRIBUTING.md
CONTRIBUTING.md
1 Contributing guidelines 2 ======================= 3 4 Contributions are very welcome. When contributing code, please follow these 5 simple guidelines. 6 7 #### Table Of Contents 8 - [Contribution workflow](#contribution-workflow) 9 * [Proposing changes](#proposing-changes) 10 * [Preparing PRs](#preparing-prs) 11 * [Peer review](#peer-review) 12 - [Coding conventions](#coding-conventions) 13 - [Security](#security) 14 - [Testing](#testing) 15 - [Going further](#going-further) 16 17 Overview 18 -------- 19 20 * Before adding any code dependencies, check with the maintainers if this is okay. 21 * Write properly formatted comments: they should be English sentences, eg: 22 23 // Return the current UNIX time. 24 25 * Read the DCO and make sure all commits are signed off, using `git commit -s`. 26 * Follow the guidelines when proposing code changes (see below). 27 * Write properly formatted git commits (see below). 28 * Run the tests with `cargo test --workspace --all-features`. 29 * Make sure you run `rustfmt` on your code (see below details). 30 * Please don't file an issue to ask a question. Each repository - or 31 GitHub organization has a "Discussions" with Q&A section; please post your 32 questions there. You'll get faster results by using this channel. 33 34 Contribution Workflow 35 --------------------- 36 The codebase is maintained using the "contributor workflow" where everyone 37 without exception contributes patch proposals using "pull requests". This 38 facilitates social contribution, easy testing and peer review. 39 40 To contribute a patch, the workflow is a as follows: 41 42 1. Fork Repository 43 2. Create topic branch 44 3. Commit patches 45 46 In general commits should be atomic and diffs should be easy to read. For this 47 reason do not mix any formatting fixes or code moves with actual code changes. 48 Further, each commit, individually, should compile and pass tests, in order to 49 ensure git bisect and other automated tools function properly. 50 51 When adding a new feature thought must be given to the long term technical debt. 52 Every new features should be covered by unit tests. 53 54 When refactoring, structure your PR to make it easy to review and don't hesitate 55 to split it into multiple small, focused PRs. 56 57 Commits should cover both the issue fixed and the solution's rationale. 58 These [guidelines](https://chris.beams.io/posts/git-commit/) should be kept in 59 mind. 60 61 To facilitate communication with other contributors, the project is making use 62 of GitHub's "assignee" field. First check that no one is assigned and then 63 comment suggesting that you're working on it. If someone is already assigned, 64 don't hesitate to ask if the assigned party or previous commenters are still 65 working on it if it has been awhile. 66 67 ### Proposing changes 68 69 When proposing changes via a pull-request or patch: 70 71 * Isolate changes in separate commits to make the review process easier. 72 * Don't make unrelated changes, unless it happens to be an obvious improvement to 73 code you are touching anyway ("boyscout rule"). 74 * Rebase on `master` when needed. 75 * Keep your changesets small, specific and uncontroversial, so that they can be 76 merged more quickly. 77 * If the change is substantial or requires re-architecting certain parts of the 78 codebase, write a proposal in English first, and get consensus on that before 79 proposing the code changes. 80 81 ### Preparing PRs 82 83 The main library development happens in the `master` branch. This branch must 84 always compile without errors (using Travis CI). All external contributions are 85 made within PRs into this branch. 86 87 Prerequisites that a PR must satisfy for merging into the `master` branch: 88 * the tip of any PR branch must compile and pass unit tests with no errors, with 89 every feature combination (including compiling the fuzztests) on MSRV, stable 90 and nightly compilers (this is partially automated with CI, so the rule 91 is that we will not accept commits which do not pass GitHub CI); 92 * contain all necessary tests for the introduced functional (either as a part of 93 commits, or, more preferably, as separate commits, so that it's easy to 94 reorder them during review and check that the new tests fail without the new 95 code); 96 * contain all inline docs for newly introduced API and pass doc tests; 97 * be based on the recent `master` tip from the original repository at. 98 99 NB: reviewers may run more complex test/CI scripts, thus, satisfying all the 100 requirements above is just a preliminary, but not necessary sufficient step for 101 getting the PR accepted as a valid candidate PR for the `master` branch. 102 103 Additionally, to the `master` branch some repositories may have `develop` branch 104 for any experimental developments. This branch may not compile and should not be 105 used by any projects depending on the library. 106 107 ### Writing Git commit messages 108 109 A properly formed git commit subject line should always be able to complete the 110 following sentence: 111 112 If applied, this commit will _____ 113 114 In addition, it should be capitalized and *must not* include a period. 115 116 For example, the following message is well formed: 117 118 Add support for .gif files 119 120 While these ones are **not**: `Adding support for .gif files`, 121 `Added support for .gif files`. 122 123 When it comes to formatting, here's a model git commit message[1]: 124 125 Capitalized, short (50 chars or less) summary 126 127 More detailed explanatory text, if necessary. Wrap it to about 72 128 characters or so. In some contexts, the first line is treated as the 129 subject of an email and the rest of the text as the body. The blank 130 line separating the summary from the body is critical (unless you omit 131 the body entirely); tools like rebase can get confused if you run the 132 two together. 133 134 Write your commit message in the imperative: "Fix bug" and not "Fixed bug" 135 or "Fixes bug." This convention matches up with commit messages generated 136 by commands like git merge and git revert. 137 138 Further paragraphs come after blank lines. 139 140 - Bullet points are okay, too. 141 142 - Typically a hyphen or asterisk is used for the bullet, followed by a 143 single space, with blank lines in between, but conventions vary here. 144 145 - Use a hanging indent. 146 147 ### Peer review 148 149 Anyone may participate in peer review which is expressed by comments in the pull 150 request. Typically reviewers will review the code for obvious errors, as well as 151 test out the patch set and opine on the technical merits of the patch. PR should 152 be reviewed first on the conceptual level before focusing on code style or 153 grammar fixes. 154 155 Coding Conventions 156 ------------------ 157 Our CI enforces [clippy's](https://github.com/rust-lang/rust-clippy) 158 [default linting](https://rust-lang.github.io/rust-clippy/rust-1.52.0/index.html) 159 and [rustfmt](https://github.com/rust-lang/rustfmt) formatting defined by rules 160 in [.rustfmt.toml](./.rustfmt.toml). The linter should be run with current 161 stable rust compiler, while formatter requires nightly version due to the use of 162 unstable formatting parameters. 163 164 If you use rustup, to lint locally you may run the following instructions: 165 166 ```console 167 rustup component add clippy 168 rustup component add fmt 169 cargo +stable clippy --workspace --all-features 170 cargo +nightly fmt --all 171 ``` 172 173 Security 174 -------- 175 Responsible disclosure of security vulnerabilities helps prevent user loss of 176 privacy. If you believe a vulnerability may affect other implementations, please 177 inform them. Guidelines for a responsible disclosure can be found in 178 [SECURITY.md](./SECURITY.md) file in the project root. 179 180 Note that some of our projects are currently considered "pre-production". 181 Such projects can be distinguished by the absence of `SECURITY.md`. In such 182 cases there are no special handling of security issues; please simply open 183 an issue on GitHub. 184 185 Going further 186 ------------- 187 You may be interested in Jon Atack guide on 188 [How to review Bitcoin Core PRs][Review] and [How to make Bitcoin Core PRs][PR]. 189 While there are differences between the projects in terms of context and 190 maturity, many of the suggestions offered apply to this project. 191 192 Overall, have fun :) 193 194 [1]: http://tbaggery.com/2008/04/19/a-note-about-git-commit-messages.html 195 [Review]: https://github.com/jonatack/bitcoin-development/blob/master/how-to-review-bitcoin-core-prs.md 196 [PR]: https://github.com/jonatack/bitcoin-development/blob/master/how-to-make-bitcoin-core-prs.md