Toby Huang | 5105f81 | 2019-08-08 23:47:57 | [diff] [blame] | 1 | # Commit Checklist for Chromium Workflow |
| 2 | |
Toby Huang | e43e5d68 | 2019-10-08 21:26:07 | [diff] [blame] | 3 | Here is a helpful checklist to go through before uploading change lists (CLs) on |
Toby Huang | acb9beba | 2020-06-25 20:08:04 | [diff] [blame] | 4 | Gerrit and during the code review process. Gerrit is the code review platform |
| 5 | for the Chromium project. This checklist is designed to be streamlined. See |
Toby Huang | e43e5d68 | 2019-10-08 21:26:07 | [diff] [blame] | 6 | [contributing to Chromium][contributing] for a more thorough reference. The |
| 7 | intended audience is software engineers who are unfamiliar with contributing to |
Toby Huang | 0a0375c | 2020-02-21 08:00:28 | [diff] [blame] | 8 | the Chromium project. Feel free to skip steps that are not applicable to the |
Toby Huang | c9bd85b | 2020-07-30 22:02:35 | [diff] [blame] | 9 | patchset you're currently uploading. |
Toby Huang | 5105f81 | 2019-08-08 23:47:57 | [diff] [blame] | 10 | |
Toby Huang | acb9beba | 2020-06-25 20:08:04 | [diff] [blame] | 11 | According to the Checklist Manifesto by Atul Gawande, checklists are a marvelous |
| 12 | tool for ensuring consistent quality in the work you produce. Checklists also |
| 13 | help you work more efficiently by ensuring you never skip a step or waste brain |
| 14 | power figuring out the next step to take. |
| 15 | |
Toby Huang | 5105f81 | 2019-08-08 23:47:57 | [diff] [blame] | 16 | [TOC] |
| 17 | |
Toby Huang | acb9beba | 2020-06-25 20:08:04 | [diff] [blame] | 18 | ## 1. Create a new branch or switch to the correct branch |
Toby Huang | 5105f81 | 2019-08-08 23:47:57 | [diff] [blame] | 19 | |
| 20 | You should create a new branch before starting any development work. It's |
Toby Huang | 0a0375c | 2020-02-21 08:00:28 | [diff] [blame] | 21 | helpful to branch early and to branch often in Git. Use the command |
| 22 | `git new-branch <branch_name>`. This is equivalent to |
| 23 | `git checkout -b <branch_name> --track origin/master`. |
Toby Huang | 5105f81 | 2019-08-08 23:47:57 | [diff] [blame] | 24 | |
Toby Huang | 0a0375c | 2020-02-21 08:00:28 | [diff] [blame] | 25 | You may also want to set another local branch as the upstream branch. You can do |
Toby Huang | acb9beba | 2020-06-25 20:08:04 | [diff] [blame] | 26 | that with `git checkout -b <branch_name> --track <upstream_branch>`. Do this if |
| 27 | you want to split your work across multiple CLs, but some CLs have dependencies |
| 28 | on others. |
Toby Huang | 5105f81 | 2019-08-08 23:47:57 | [diff] [blame] | 29 | |
Toby Huang | 5c3c00e | 2019-10-30 23:29:05 | [diff] [blame] | 30 | Mark the associated crbug as "started" so that other people know that you have |
Toby Huang | acb9beba | 2020-06-25 20:08:04 | [diff] [blame] | 31 | started working on the bug. Taking this step can avoid duplicated work. |
Toby Huang | 5c3c00e | 2019-10-30 23:29:05 | [diff] [blame] | 32 | |
Toby Huang | acb9beba | 2020-06-25 20:08:04 | [diff] [blame] | 33 | If you have already created a branch, don't forget to `git checkout |
| 34 | <branch_name>` to the correct branch before resuming development work. There's |
| 35 | few things more frustrating than to finish implementing your ideas or feedback, |
| 36 | and to spend hours debugging some mysterious bug, only to discover that the bug |
| 37 | was caused by working on the wrong branch this whole time. |
| 38 | |
| 39 | ## 2. If there's a local upstream branch, rebase the upstream changes |
| 40 | |
| 41 | Suppose you have a downstream branch chained to an upstream branch. If you |
| 42 | commit changes to the upstream branch, and you want the changes to appear in |
| 43 | your downstream branch, you need to: |
| 44 | |
| 45 | * `git checkout <branch_name>` to the downstream branch. |
| 46 | * Run `git rebase -i @{u}` to pull the upstream changes into the current |
| 47 | branch. |
| 48 | * Run `git rebase -i @{u}` again to rebase the downstream changes onto the |
| 49 | upstream branch. |
| 50 | |
Toby Huang | 2c40fc5 | 2020-08-10 21:44:40 | [diff] [blame^] | 51 | Expect to fix numerous merge conflicts. Use `git rebase --continue` once you're |
| 52 | done. |
| 53 | |
Toby Huang | acb9beba | 2020-06-25 20:08:04 | [diff] [blame] | 54 | ## 3. Make your changes |
Toby Huang | ba5bbb4 | 2019-09-04 23:23:07 | [diff] [blame] | 55 | |
| 56 | Do your thing. There's no further advice here about how to write or fix code. |
| 57 | |
Toby Huang | acb9beba | 2020-06-25 20:08:04 | [diff] [blame] | 58 | ## 4. Make sure the code builds correctly |
Toby Huang | 5105f81 | 2019-08-08 23:47:57 | [diff] [blame] | 59 | |
| 60 | After making your changes, check that common targets build correctly: |
| 61 | |
| 62 | * chrome (for Linux, ChromeOS, etc.) |
| 63 | * unit_tests |
| 64 | * browser_tests |
| 65 | |
| 66 | It's easy to inadvertently break one of the other builds you're not currently |
| 67 | working on without realizing it. Even though the Commit Queue should catch any |
| 68 | build errors, checking locally first can save you some time since the CQ Dry Run |
Toby Huang | acb9beba | 2020-06-25 20:08:04 | [diff] [blame] | 69 | can take a while to run, on the order of a few hours sometimes. |
Toby Huang | 5105f81 | 2019-08-08 23:47:57 | [diff] [blame] | 70 | |
Toby Huang | acb9beba | 2020-06-25 20:08:04 | [diff] [blame] | 71 | ## 5. Test your changes |
Toby Huang | 5105f81 | 2019-08-08 23:47:57 | [diff] [blame] | 72 | |
Toby Huang | acb9beba | 2020-06-25 20:08:04 | [diff] [blame] | 73 | Test your changes manually by running the X11 simulator or deploying your |
| 74 | changes to a test device. Follow the [Simple Chrome][simple-chrome] instructions |
| 75 | to deploy your changes to a test device. Make sure you hit every code path you |
| 76 | changed. |
Toby Huang | 5105f81 | 2019-08-08 23:47:57 | [diff] [blame] | 77 | |
Toby Huang | acb9beba | 2020-06-25 20:08:04 | [diff] [blame] | 78 | ## 6. Write unit or browser tests for any new code |
Toby Huang | 5105f81 | 2019-08-08 23:47:57 | [diff] [blame] | 79 | |
| 80 | Consider automating any manual testing you did in the previous step. |
| 81 | |
Toby Huang | acb9beba | 2020-06-25 20:08:04 | [diff] [blame] | 82 | ## 7. Ensure the code is formatted nicely |
Toby Huang | 5105f81 | 2019-08-08 23:47:57 | [diff] [blame] | 83 | |
| 84 | Run `git cl format --js`. The `--js` option also formats JavaScript changes. |
| 85 | |
Toby Huang | acb9beba | 2020-06-25 20:08:04 | [diff] [blame] | 86 | ## 8. Review your changes |
Toby Huang | 5105f81 | 2019-08-08 23:47:57 | [diff] [blame] | 87 | |
Toby Huang | 0a0375c | 2020-02-21 08:00:28 | [diff] [blame] | 88 | Use `git diff` to review all of the changes you've made from the previous |
| 89 | commit. Use `git upstream-diff` to review all of the changes you've made |
| 90 | from the upstream branch. The output from `git upstream-diff` is what will |
| 91 | be uploaded to Gerrit. |
Toby Huang | 5105f81 | 2019-08-08 23:47:57 | [diff] [blame] | 92 | |
Toby Huang | acb9beba | 2020-06-25 20:08:04 | [diff] [blame] | 93 | ## 9. Stage relevant files for commit |
Toby Huang | 5105f81 | 2019-08-08 23:47:57 | [diff] [blame] | 94 | |
Toby Huang | 0a0375c | 2020-02-21 08:00:28 | [diff] [blame] | 95 | Run `git add <path_to_file>` for all of the files you've modified that you want |
| 96 | to include in the CL. Unlike other version-control systems such as svn, you have |
| 97 | to specifically `git add` the files you want to commit before calling |
| 98 | `git commit`. |
Toby Huang | 5105f81 | 2019-08-08 23:47:57 | [diff] [blame] | 99 | |
Toby Huang | acb9beba | 2020-06-25 20:08:04 | [diff] [blame] | 100 | ## 10. Commit your changes |
Toby Huang | 5105f81 | 2019-08-08 23:47:57 | [diff] [blame] | 101 | |
Toby Huang | 0a0375c | 2020-02-21 08:00:28 | [diff] [blame] | 102 | Run `git commit`. Be sure to write a useful commit message. Here are some |
| 103 | [tips for writing good commit messages][uploading-a-change-for-review]. A |
Toby Huang | acb9beba | 2020-06-25 20:08:04 | [diff] [blame] | 104 | shortcut for combining steps the previous step and this one is `git commit -a -m |
| 105 | <commit_message>`. |
Toby Huang | 5105f81 | 2019-08-08 23:47:57 | [diff] [blame] | 106 | |
Toby Huang | acb9beba | 2020-06-25 20:08:04 | [diff] [blame] | 107 | ## 11. Squash your commits |
Toby Huang | ba5bbb4 | 2019-09-04 23:23:07 | [diff] [blame] | 108 | |
| 109 | If you have many commits on your current branch, and you want to avoid some |
Toby Huang | 0a0375c | 2020-02-21 08:00:28 | [diff] [blame] | 110 | nasty commit-by-commit merge conflicts in the next step, consider collecting all |
| 111 | your changes into one commit. Run `git rebase -i @{u}`. The `@{u}` is a |
Toby Huang | acb9beba | 2020-06-25 20:08:04 | [diff] [blame] | 112 | short-hand pointer for the upstream branch, which is usually origin/master, but |
| 113 | can also be one of your local branches. After running the `git rebase` command, |
| 114 | you should see a list of commits, with each commit starting with the word |
| 115 | "pick". Make sure the first commit says "pick" and change the rest from "pick" |
| 116 | to "squash". This will squash each commit into the previous commit, which will |
| 117 | continue until each commit is squashed into the first commit. |
Toby Huang | ba5bbb4 | 2019-09-04 23:23:07 | [diff] [blame] | 118 | |
Toby Huang | acb9beba | 2020-06-25 20:08:04 | [diff] [blame] | 119 | An alternative way to squash your commits into a single commit is to do `git |
| 120 | commit --amend` in the previous step. |
Toby Huang | 5105f81 | 2019-08-08 23:47:57 | [diff] [blame] | 121 | |
Toby Huang | acb9beba | 2020-06-25 20:08:04 | [diff] [blame] | 122 | ## 12. Rebase your local repository |
| 123 | |
| 124 | Rebasing is a neat way to sync changes from the remote repository and resolve |
| 125 | any merge conflict errors on your CL. Run `git rebase-update`. This command |
| 126 | updates all of your local branches with remote changes that have landed since |
| 127 | you started development work, which could've been a while ago. It also deletes |
| 128 | any branches that match the remote repository, such as after the CL associated |
| 129 | with that branch has been merged. In summary, `git rebase-update` cleans up your |
| 130 | local branches. |
Toby Huang | 5105f81 | 2019-08-08 23:47:57 | [diff] [blame] | 131 | |
Toby Huang | 0a0375c | 2020-02-21 08:00:28 | [diff] [blame] | 132 | You may run into rebase conflicts. Fix them manually before proceeding with |
| 133 | `git rebase --continue`. Note that rebasing has the potential to break your |
| 134 | build, so you might want to try re-building afterwards. |
Toby Huang | 5105f81 | 2019-08-08 23:47:57 | [diff] [blame] | 135 | |
Toby Huang | acb9beba | 2020-06-25 20:08:04 | [diff] [blame] | 136 | ## 13. Upload the CL to Gerrit |
Toby Huang | 5105f81 | 2019-08-08 23:47:57 | [diff] [blame] | 137 | |
| 138 | Run `git cl upload`. Some useful options include: |
| 139 | |
Toby Huang | c9bd85b | 2020-07-30 22:02:35 | [diff] [blame] | 140 | * `--cq-dry-run` (or `-d`) will set the patchset to do a CQ Dry Run. It is a |
| 141 | good idea to run try jobs for each new patchset with significant changes. |
Toby Huang | e43e5d68 | 2019-10-08 21:26:07 | [diff] [blame] | 142 | * `-r <chromium_username>` will add reviewers. |
| 143 | * `-b <bug_number>` automatically populates the bug reference line of the |
Toby Huang | c9bd85b | 2020-07-30 22:02:35 | [diff] [blame] | 144 | commit message. Use `-b None` is there is no relevant crbug. |
Toby Huang | acb9beba | 2020-06-25 20:08:04 | [diff] [blame] | 145 | * `--edit-description` will let you update the commit message. |
Toby Huang | 5105f81 | 2019-08-08 23:47:57 | [diff] [blame] | 146 | |
Toby Huang | c9bd85b | 2020-07-30 22:02:35 | [diff] [blame] | 147 | To help guide your reviewers, it is also recommended to provide a title for each |
| 148 | patchset summarizing the changes and indicating whose comments the patchset |
| 149 | addresses. Running `git cl upload` will upload a new patchset and prompt you for |
| 150 | a brief patchset title. The title defaults to your most recent commit summary, |
| 151 | so if you tend to squash all your commits into one, try to enter a new summary |
| 152 | each time you upload. You can also modify the patchset title directly in Gerrit. |
| 153 | |
Toby Huang | acb9beba | 2020-06-25 20:08:04 | [diff] [blame] | 154 | ## 14. Check the CL again in Gerrit |
Toby Huang | 5105f81 | 2019-08-08 23:47:57 | [diff] [blame] | 155 | |
| 156 | Run `git cl web` to go to the Gerrit URL associated with the current branch. |
Toby Huang | c9bd85b | 2020-07-30 22:02:35 | [diff] [blame] | 157 | Open the latest patchset and verify that all of the uploaded files are correct. |
Toby Huang | e43e5d68 | 2019-10-08 21:26:07 | [diff] [blame] | 158 | Click `Expand All` to check over all of the individual line-by-line changes |
Toby Huang | acb9beba | 2020-06-25 20:08:04 | [diff] [blame] | 159 | again. Basically do a self-review before asking your reviewers for a review. |
Toby Huang | 5105f81 | 2019-08-08 23:47:57 | [diff] [blame] | 160 | |
Toby Huang | acb9beba | 2020-06-25 20:08:04 | [diff] [blame] | 161 | ## 15. Make sure all auto-regression tests pass |
Toby Huang | 5105f81 | 2019-08-08 23:47:57 | [diff] [blame] | 162 | |
| 163 | Click `CQ Dry Run`. Fix any errors because otherwise the CL won't pass the |
| 164 | commit queue (CQ) checks. Consider waiting for the CQ Dry Run to pass before |
| 165 | notifying your reviewers, in case the results require major changes in your CL. |
| 166 | |
Toby Huang | acb9beba | 2020-06-25 20:08:04 | [diff] [blame] | 167 | ## 16. Add reviewers to review your code |
Toby Huang | 5105f81 | 2019-08-08 23:47:57 | [diff] [blame] | 168 | |
| 169 | Click `Find Owners` or run `git cl owners` to find file owners to review your |
| 170 | code and instruct them about which parts you want them to focus on. Add anyone |
Toby Huang | e43e5d68 | 2019-10-08 21:26:07 | [diff] [blame] | 171 | else you think should review your code. The blame functionality in Code Search |
| 172 | is a good way to identify reviewers who may be familiar with the parts of code |
| 173 | your CL touches. For your CL to land, you need an approval from an owner for |
| 174 | each file you've changed, unless you are an owner of some files, in which case |
| 175 | you don't need separate owner approval for those files. |
Toby Huang | 5105f81 | 2019-08-08 23:47:57 | [diff] [blame] | 176 | |
Toby Huang | acb9beba | 2020-06-25 20:08:04 | [diff] [blame] | 177 | ## 17. Implement feedback from your reviewers |
Toby Huang | 5105f81 | 2019-08-08 23:47:57 | [diff] [blame] | 178 | |
| 179 | Then go through this commit checklist again. Reply to all comments from the |
| 180 | reviewers on Gerrit and mark all resolved issues as resolved (clicking `Done` or |
| 181 | `Ack` will do this automatically). Click `Reply` to ensure that your reviewers |
| 182 | receive a notification. Doing this signals that your CL is ready for review |
| 183 | again, since the assumption is that your CL is not ready for review until you |
| 184 | hit reply. |
| 185 | |
Toby Huang | acb9beba | 2020-06-25 20:08:04 | [diff] [blame] | 186 | ## 18. Land your CL |
Toby Huang | 5105f81 | 2019-08-08 23:47:57 | [diff] [blame] | 187 | |
| 188 | Once you have obtained a Looks Good To Me (LGTM), which is reflected by a |
| 189 | Code-Review+1 in Gerrit, from at least one owner for each file, then you have |
| 190 | the minimum prerequisite to land your changes. It may be helpful to wait for all |
| 191 | of your reviewers to approve your changes as well, even if they're not owners. |
| 192 | Click `Submit to CQ` to try your change in the commit queue (CQ), which will |
| 193 | land it if successful. |
| 194 | |
Toby Huang | acb9beba | 2020-06-25 20:08:04 | [diff] [blame] | 195 | ## 19. Cleanup |
Toby Huang | 5c3c00e | 2019-10-30 23:29:05 | [diff] [blame] | 196 | |
Toby Huang | 5105f81 | 2019-08-08 23:47:57 | [diff] [blame] | 197 | After your CL is landed, you can use `git rebase-update` or `git cl archive` to |
Toby Huang | 5c3c00e | 2019-10-30 23:29:05 | [diff] [blame] | 198 | clean up your local branches. These commands will automatically delete merged |
| 199 | branches. Mark the associated crbug as "fixed". |
Toby Huang | 5105f81 | 2019-08-08 23:47:57 | [diff] [blame] | 200 | |
| 201 | [//]: # (the reference link section should be alphabetically sorted) |
| 202 | [contributing]: contributing.md |
Toby Huang | acb9beba | 2020-06-25 20:08:04 | [diff] [blame] | 203 | [simple-chrome]: https://chromium.googlesource.com/chromiumos/docs/+/master/simple_chrome_workflow.md |
Toby Huang | 5105f81 | 2019-08-08 23:47:57 | [diff] [blame] | 204 | [uploading-a-change-for-review]: contributing.md#Uploading-a-change-for-review |