misc: Updated git description length policy to 72 chars
[gem5.git] / CONTRIBUTING.md
1 If you've made changes to gem5 that might benefit others, we strongly encourage
2 you to contribute those changes to the public gem5 repository. There are
3 several reasons to do this:
4 * Share your work with others, so that they can benefit from new functionality.
5 * Support the scientific principle by enabling others to evaluate your
6 suggestions without having to guess what you did.
7 * Once your changes are part of the main repo, you no longer have to merge
8 them back in every time you update your local repo. This can be a huge time
9 saving!
10 * Once your code is in the main repo, other people have to make their changes
11 work with your code, and not the other way around.
12 * Others may build on your contributions to make them even better, or extend
13 them in ways you did not have time to do.
14 * You will have the satisfaction of contributing back to the community.
15
16 The main method for contributing code to gem5 is via our code review website:
17 https://gem5-review.googlesource.com/. This documents describes the details of
18 how to create code changes, upload your changes, have your changes
19 reviewed, and finally push your changes to gem5. More information can be found
20 from the following sources:
21 * http://gem5.org/contributing
22 * https://gerrit-review.googlesource.com/Documentation/index.html
23 * https://git-scm.com/book
24
25
26 High-level flow for submitting changes
27 ======================================
28
29 +-------------+
30 | Make change |
31 +------+------+
32 |
33 |
34 v
35 +-------------+
36 | Run tests |<--------------+
37 +------+------+ |
38 | |
39 | |
40 v |
41 +------+------+ |
42 | Post review | |
43 +------+------+ |
44 | |
45 v |
46 +--------+---------+ |
47 | Wait for reviews | |
48 +--------+---------+ |
49 | |
50 | |
51 v |
52 +----+----+ No +------+------+
53 |Reviewers+--------->+ Update code |
54 |happy? | +------+------+
55 +----+----+ ^
56 | |
57 | Yes |
58 v |
59 +----+-----+ No |
60 |Maintainer+----------------+
61 |happy? |
62 +----+-----+
63 |
64 | Yes
65 v
66 +------+------+
67 | Submit code |
68 +-------------+
69
70 After creating your change to gem5, you can post a review on our Gerrit
71 code-review site: https://gem5-review.googlesource.com. Before being able to
72 submit your code to the mainline of gem5, the code is reviewed by others in the
73 community. Additionally, the maintainer for that part of the code must sign off
74 on it.
75
76 Cloning the gem5 repo to contribute
77 ===================================
78
79 If you plan on contributing, it is strongly encouraged for you to clone the
80 repository directly, and checkout the `develop` branch from our gerrit instance
81 at https://gem5.googlesource.com/.
82
83 To clone the gem5 repository:
84
85 ```
86 git clone https://gem5.googlesource.com/public/gem5
87 ```
88
89 By default, the master branch is checked out. The master branch is stable,
90 containing the latest released version of gem5. To obtain code still
91 under-development (and which contributions can be made):
92
93 ```
94 cd gem5
95 git checkout --track origin/develop
96 ```
97
98 Changes should be made to this develop branch. Changes to the master branch
99 will be blocked. Once a change on the develop branch is properly incorporated
100 into the gem5 repo it will be merged into the master Branch upon the next
101 release of gem5. New releases of gem5 occur three times a year. Ergo, changes
102 made to the develop branch should appear on the master branch within three to
103 four months as part of a stable release.
104
105 Other gem5 repositories
106 -----------------------
107
108 There are a few repositories other than the main gem5 development repository.
109
110 * public/m5threads: The code for a pthreads implementation that works with
111 gem5's syscall emulation mode.
112
113
114 Making changes to gem5
115 ======================
116
117 It is strongly encouraged to use git branches when making changes to gem5.
118 Additionally, keeping changes small and concise and only have a single logical
119 change per commit.
120
121 Unlike our previous flow with Mercurial and patch queues, when using git, you
122 will be committing changes to your local branch. By using separate branches in
123 git, you will be able to pull in and merge changes from mainline and simply
124 keep up with upstream changes.
125
126 Requirements for change descriptions
127 ------------------------------------
128 To help reviewers and future contributors more easily understand and track
129 changes, we require all change descriptions be strictly formatted.
130
131 A canonical commit message consists of three parts:
132 * A short summary line describing the change. This line starts with one or
133 more keywords (found in the MAINTAINERS file) separated by commas followed
134 by a colon and a description of the change. This line should be no more than
135 65 characters long since version control systems usually add a prefix that
136 causes line-wrapping for longer lines.
137 * (Optional, but highly recommended) A detailed description. This describes
138 what you have done and why. If the change isn't obvious, you might want to
139 motivate why it is needed. Lines need to be wrapped to 72 characters or
140 less.
141 * Tags describing patch metadata. You are highly recommended to use
142 tags to acknowledge reviewers for their work. Gerrit will automatically add
143 most tags.
144
145 Tags are an optional mechanism to store additional metadata about a patch and
146 acknowledge people who reported a bug or reviewed that patch. Tags are
147 generally appended to the end of the commit message in the order they happen.
148 We currently use the following tags:
149 * Signed-off-by: Added by the author and the submitter (if different).
150 This tag is a statement saying that you believe the patch to be correct and
151 have the right to submit the patch according to the license in the affected
152 files. Similarly, if you commit someone else's patch, this tells the rest
153 of the world that you have have the right to forward it to the main
154 repository. If you need to make any changes at all to submit the change,
155 these should be described within hard brackets just before your
156 Signed-off-by tag. By adding this line, the contributor certifies the
157 contribution is made under the terms of the Developer Certificate of Origin
158 (DCO) [https://developercertificate.org/].
159 * Reviewed-by: Used to acknowledge patch reviewers. It's generally considered
160 good form to add these. Added automatically.
161 * Reported-by: Used to acknowledge someone for finding and reporting a bug.
162 * Reviewed-on: Link to the review request corresponding to this patch. Added
163 automatically.
164 * Change-Id: Used by Gerrit to track changes across rebases. Added
165 automatically with a commit hook by git.
166 * Tested-by: Used to acknowledge people who tested a patch. Sometimes added
167 automatically by review systems that integrate with CI systems.
168
169 Other than the "Signed-off-by", "Reported-by", and "Tested-by" tags, you
170 generally don't need to add these manually as they are added automatically by
171 Gerrit.
172
173 It is encouraged for the author of the patch and the submitter to add a
174 Signed-off-by tag to the commit message. By adding this line, the contributor
175 certifies the contribution is made under the terms of the Developer Certificate
176 of Origin (DCO) [https://developercertificate.org/].
177
178 If your change relates to a [Jira Issue](https://gem5.atlassian.net), it is
179 advised that you provide a link to the issue in the commit message (or messages
180 if the Jira Issue relates to multiple commits). Though optional, doing this
181 can help reviewers understand the context of a change.
182
183 It is imperative that you use your real name and your real email address in
184 both tags and in the author field of the changeset.
185
186 For significant changes, authors are encouraged to add copyright information
187 and their names at the beginning of the file. The main purpose of the author
188 names on the file is to track who is most knowledgeable about the file (e.g.,
189 who has contributed a significant amount of code to the file).
190
191 Note: If you do not follow these guidelines, the gerrit review site will
192 automatically reject your patch.
193 If this happens, update your changeset descriptions to match the required style
194 and resubmit. The following is a useful git command to update the most recent
195 commit (HEAD).
196
197 ```
198 git commit --amend
199 ```
200
201 Running tests
202 =============
203
204 Before posting a change to the code review site, you should always run the
205 quick tests!
206 See TESTING.md for more information.
207
208 Posting a review
209 ================
210
211 If you have not signed up for an account on the Gerrit review site
212 (https://gem5-review.googlesource.com), you first have to create an account.
213
214 Setting up an account
215 ---------------------
216 1. Go to https://gem5.googlesource.com/
217 2. Click "Sign In" in the upper right corner. Note: You will need a Google
218 account to contribute.
219 3. After signing in, click "Generate Password" and follow the instructions.
220
221 Submitting a change
222 -------------------
223
224 In gerrit, to submit a review request, you can simply push your git commits to
225 a special named branch. For more information on git push see
226 https://git-scm.com/docs/git-push.
227
228 There are three ways to push your changes to gerrit.
229
230 Push change to gerrit review
231 ----------------------------
232
233 ```
234 git push origin HEAD:refs/for/develop
235 ```
236
237 Assuming origin is https://gem5.googlesource.com/public/gem5 and you want to
238 push the changeset at HEAD, this will create a new review request on top of the
239 develop branch. More generally,
240
241 ```
242 git push <gem5 gerrit instance> <changeset>:refs/for/<branch>
243 ```
244
245 See https://gerrit-review.googlesource.com/Documentation/user-upload.html for
246 more information.
247
248 Pushing your first change
249 --------------------------
250 The first time you push a change you may get the following error:
251
252 ```
253 remote: ERROR: [fb1366b] missing Change-Id in commit message footer
254 ...
255 ```
256
257 Within the error message, there is a command line you should run. For every new
258 clone of the git repo, you need to run the following command to automatically
259 insert the change id in the the commit (all on one line).
260
261 ```
262 curl -Lo `git rev-parse --git-dir`/hooks/commit-msg \
263 https://gerrit-review.googlesource.com/tools/hooks/commit-msg ; \
264 chmod +x `git rev-parse --git-dir`/hooks/commit-msg
265 ```
266
267 If you receive the above error, simply run this command and then amend your
268 changeset.
269
270 ```
271 git commit --amend
272 ```
273
274 Push change to gerrit as a Work In Progress
275 -------------------------------------------
276
277 It is acceptable to push commits as "Work In Progress" (WIP) changes within
278 gerrit. WIP changes are publicly visible though no one will be able to review
279 the changes or be directly notified they have been submitted. WIP changes can
280 be useful for backing up code currently under-development or for sharing
281 incomplete code with the wider community (i.e., the link to the gerrit change
282 may be shared, and others may download the change, comment on it, and track
283 alterations over time).
284
285 See https://gerrit-review.googlesource.com/Documentation/intro-user.html#wip
286 for details on WIP gerrit changes.
287
288 To push a change as a WIP:
289
290 ```
291 git push origin HEAD:refs/for/develop%wip
292 ```
293
294 Once you have pushed your change as a WIP, you can log onto [gerrit](
295 https://gem5-review.googlesource.com) and view it. Once you're happy with the
296 change you can add reviewers which shall move your change from WIP status
297 to be considered for submission by the wider gem5 community. Switching from a
298 WIP to a regular change does not notify the gem5 community, via the gem5-dev
299 mailing-list, that a change has been submitted (as would occur if a change were
300 submitted directly for review). It is therefore important to include reviewers
301 and CC those who you wish to view the change (they will be notified
302 automatically via email).
303
304 Push change bypassing gerrit
305 -----------------------------
306
307 Only maintainers can bypass gerrit review. This should very rarely be used.
308
309 ```
310 git push origin HEAD:refs/heads/develop
311 ```
312
313 Other gerrit push options
314 -------------------------
315
316 There are a number of options you can specify when uploading your changes to
317 gerrit (e.g., reviewers, labels). The gerrit documentation has more
318 information.
319 https://gerrit-review.googlesource.com/Documentation/user-upload.html
320
321 Branches
322 ========
323
324 By default, contributions to gem5 should be made on the develop branch. The
325 master branch is maintained as a stable release branch (i.e., it can be pulled
326 to obtain the latest official release of gem5). Creation of additional branches
327 is generally discouraged due to their tendency to bloat git repositories with
328 abandoned code. However, the creation of new branches is permitted for
329 development of a specific feature or improvement if one or more of the
330 following criteria are met:
331
332 1. The feature/improvement is likely to be of a large size, consisting of many
333 commits, with little logic in these commits being contributed separately.
334 2. The feature/improvement will be developed over a long period of time.
335 3. There is sufficient reason that a feature/improvement should not be part
336 of the next gem5 release (e.g., the change should be held within a feature
337 branch until ready for the next release, at which point it will be merged
338 into the develop branch).
339
340 If a branch is required it can only be created by a project maintainer.
341 Therefore, if a gem5 contributor desires a separate branch for their work, they
342 should request one from the maintainer of the component the work relates to
343 (see MAINTAINERS for the list of maintainers and the components they are
344 responsible for). **The maintainer shall use their discretion to determine
345 whether the creation of a branch is necessary**. If approved, the maintainer
346 shall create the branch which the contributor may then use.
347
348 Development on a branch within Gerrit functions in exactly the same way as
349 contributing to the develop branch. When contributors to a branch are
350 satisfied, they should create a merge commit into the develop branch. The
351 maintainer should then be notified that the branch they created can now be
352 deleted.
353
354 **Abandonment of changes within branches may result in these branches being
355 removed from the repository. All branches within a repo should be under active
356 development.**
357
358 Reviewing patches
359 =================
360
361 Reviewing patches is done on our gerrit instance at
362 https://gem5-review.googlesource.com/.
363
364 After logging in with your Google account, you will be able to comment, review,
365 and push your own patches as well as review others' patches. All gem5 users are
366 encouraged to review patches. The only requirement to review patches is to be
367 polite and respectful of others.
368
369 There are multiple labels in Gerrit that can be applied to each review detailed
370 below.
371 * Code-review: This is used by any gem5 user to review patches. When reviewing
372 a patch you can give it a score of -2 to +2 with the following semantics.
373 * -2: This blocks the patch. You believe that this patch should never be
374 committed. This label should be very rarely used.
375 * -1: You would prefer this is not merged as is
376 * 0: No score
377 * +1: This patch seems good, but you aren't 100% confident that it should be
378 pushed.
379 * +2: This is a good patch and should be pushed as is.
380 * Maintainer: Currently only PMC members are maintainers. At least one
381 maintainer must review your patch and give it a +1 before it can be merged.
382 * Verified: This is automatically generated from the continuous integrated
383 (CI) tests. Each patch must receive at least a +1 from the CI tests before
384 the patch can be merged. The patch will receive a +1 if gem5 builds and
385 runs, and it will receive a +2 if the stats match.
386 * Style-Check: This is automatically generated and tests the patch against the
387 gem5 code style
388 (http://www.gem5.org/documentation/general_docs/development/coding_style/).
389 The patch must receive a +1 from the style checker to be pushed.
390
391 Note: Whenever the patch creator updates the patch all reviewers must re-review
392 the patch. There is no longer a "Fix it, then Ship It" option.
393
394 Once you have received reviews for your patch, you will likely need to make
395 changes. To do this, you should update the original git changeset. Then, you
396 can simply push the changeset again to the same Gerrit branch to update the
397 review request.
398
399 ```
400 git push origin HEAD:refs/for/develop
401 ```
402
403 Committing changes
404 ==================
405
406 Each patch must meet the following criteria to be merged:
407 * At least one review with +2
408 * At least one maintainer with +1
409 * At least +1 from the CI tests (gem5 must build and run)
410 * At least +1 from the style checker
411
412 Once a patch meets the above criteria, the submitter of the patch will be able
413 to merge the patch by pressing the "Submit" button on Gerrit. When the patch is
414 submitted, it is merged into the public gem5 branch.
415
416 Review moderation and guidelines
417 --------------------------------
418
419 Once a change is submitted, reviewers shall review the change. This may require
420 several iterations before a merge. Comments from reviewers may include
421 questions, and requests for alterations to the change prior to merging. The
422 overarching philosophy in managing this process is that there should be
423 politeness and clear communication between all parties at all times, and,
424 whenever possible, permission should be asked before doing anything that may
425 inconvenience another party. Included below are some guidelines we expect
426 contributors and reviewers to follow.
427
428 * In all forms of communication, contributors and reviewers must be polite.
429 Comments seen as being needlessly hostile or dismissive will not be
430 tolerated.
431 * Change contributors should respond to, or act upon, each item of feedback
432 given by reviewers. If there is disagreement with a piece of
433 feedback, a sufficiently detailed reason for this disagreement should
434 be given. Polite discussion, and sharing of information and expertise
435 is strongly encouraged.
436 * Contributors are advised to assign reviewers when submitting a change.
437 Anyone who contributes to gem5 can be assigned as a reviewer. However,
438 all changes must be accepted by at least one maintainer prior to a
439 merge, ergo assigning of at least one maintainer as a reviewer is
440 strongly recommended. Please see MAINTAINERS for a breakdown of
441 gem5 maintainers and which components they claim responsibility for.
442 Maintainers should be chosen based on which components the change is
443 targeting. Assigning of reviewers is not strictly enforced, though not
444 assigning reviewers may slow the time in which a change is reviewed.
445 * If a contributor posts a change and does not receive any reviews after two
446 working days (excluding regional holidays), it is acceptable to "prod"
447 reviewers. This can be done by adding a reply to the changeset review
448 (e.g., "Would it be possible for someone to review my change?"). If the
449 contributor has yet to assign reviewers, they are strongly advised to do so.
450 Reviewers will get notified when assigned to referee a change.
451 * By default, the original contributor is assumed to own a change. I.e.,
452 they are assumed to be the sole party to submit patchsets. If someone
453 other than the original contributor wishes to submit patchsets to a
454 change on the original contributor's behalf, they should first ask
455 permission. If two working days pass without a response, a patchset may be
456 submitted without permission. Permission does not need to be asked to submit
457 a patchset consisting of minor, inoffensive, changes such a typo and format
458 fixes.
459 * Once a change is ready to merge, it enters a "Ready to Submit" state. The
460 original contributor should merge their change at this point, assuming they
461 are content with the commit in its present form. After two working days, a
462 reviewer may message a contributor to remind them of the change being in a
463 "Ready to Submit" state and ask if they can merge the change on the
464 contributors behalf. If a further two working days elapse without a
465 response, the reviewer may merge without permission. A contributor may keep
466 a change open for whatever reason though this should be communicated to the
467 reviewer when asked.
468 * After a month of inactivity from a contributor on an active change, a
469 reviewer may post a message on the change reminding the submitter, and
470 anyone else watching the change, of its active status and ask if they are
471 still interested in eventually merging the change. After two weeks of no
472 response the reviewer reserves the right to abandon the change under the
473 assumption there is no longer interest.
474 * The final arbiter in any dispute between reviewers and/or contributors
475 is the PMC (PMC members are highlighted in MAINTAINERS). Disputes requiring
476 intervention by the PMC are undesirable. Attempts should be made to resolve
477 disagreements via respectful and polite discourse before being escalated to
478 this level.
479
480 Releases
481 ========
482
483 gem5 releases occur 3 times per year. The procedure for releasing gem5 is as
484 follows:
485
486 1. Developers will be notified, via the gem5-dev mailing list, that a new
487 release of gem5 will occur. This should be no sooner than 2 weeks prior to the
488 creation of the staging branch (the first step in releasing a new version of
489 gem5). This gives time for developers to ensure their changes for the next
490 release are submitted to the develop branch.
491 2. When a release is ready, a new staging branch shall be created by a project
492 maintainer, from develop, with the name "release-staging-{VERSION}". The
493 gem5-dev mailing list will be notified that the staging branch will be merged
494 into the master branch after two weeks, thus marking the new release.
495 3. The staging branch will have the full suite of gem5 tests run on it to
496 ensure all tests pass and the to-be-released code is in a decent state.
497 4. If a user submits a changeset to the staging branch, it will be considered
498 and undergo the standard Gerrit review process. However, only alterations that
499 cannot wait until the following release will be accepted for submission into
500 the branch (i.e., submissions to the staging branch for "last minute"
501 inclusions to the release should be of a high priority, such as a critical bug
502 fix). The project maintainers will use their discretion in deciding whether a
503 change may be submitted directly to the staging branch. All other submissions
504 to gem5 will continue to be made to the develop branch. Patches submitted
505 into the staging branch do not need to be re-added to the develop branch.
506 5. Once signed off by members of the PMC the staging branch shall be merged
507 into the master and develop branch. The staging branch will then be deleted.
508 6. The master branch shall be tagged with the correct version number for that
509 release. gem5 conforms to a "v{YY}.{MAJOR}.{MINOR}.{HOTFIX}" versioning system.
510 E.g., the first major release of 2022 will be "v22.0.0.0", followed by
511 "v22.1.0.0". All the releases (with the exception of hotfixes) are considered
512 major releases. For the meantime, there are no minor releases though we keep
513 the minor release numbers in case this policy changes in the future.
514 7. The gem5-dev and gem5-user mailing lists shall be notified of the new gem5
515 release.
516
517 Hotfixes
518 --------
519
520 There may be circumstances in which a change to gem5 is deemed critical and
521 cannot wait for an official release (e.g., a high-priority bug fix). In these
522 circumstances a hotfix shall be made.
523
524 First, if a developer suspects a hotfix may be necessary then the issue
525 should be discussed on the gem5-dev mailing list. The community will decide
526 whether the issue is worthy of a hotfix, and the final decision should be
527 made by members of the PMC if there is no consensus. Assuming the hotfix is
528 permitted, the following steps will be taken:
529
530 1. A new branch with the prefix "hotfix-" will be created from the master
531 branch. Only gem5 maintainers can create branches. If a non-maintainer requires
532 the creation of a hotfix branch then they should contact a gem5 maintainer.
533 2. The change shall be submitted to the hotfix branch via gerrit. Full review,
534 as with any other change, will be required.
535 3. Once fully submitted, the hotfix branch shall be merged into both the
536 develop and the master branch by a gem5 maintainer.
537 4. The master branch will be tagged with the new version number; the same as
538 the last but with an incremented hotfix number (e.g., "v20.2.0.0" would
539 transition to "v20.2.0.1").
540 4. The hotfix branch will then be deleted.
541 5. The gem5-dev and the gem5-user mailing lists shall be notified of this
542 hotfix.