blob: 3ca96e784d74830867a89eb7f524b0498a620533 [file] [log] [blame] [view]
Toby Huang5105f812019-08-08 23:47:571# Commit Checklist for Chromium Workflow
2
Toby Huange43e5d682019-10-08 21:26:073Here is a helpful checklist to go through before uploading change lists (CLs) on
Toby Huangacb9beba2020-06-25 20:08:044Gerrit and during the code review process. Gerrit is the code review platform
5for the Chromium project. This checklist is designed to be streamlined. See
Toby Huange43e5d682019-10-08 21:26:076[contributing to Chromium][contributing] for a more thorough reference. The
7intended audience is software engineers who are unfamiliar with contributing to
Toby Huang0a0375c2020-02-21 08:00:288the Chromium project. Feel free to skip steps that are not applicable to the
Toby Huangc9bd85b2020-07-30 22:02:359patchset you're currently uploading.
Toby Huang5105f812019-08-08 23:47:5710
Toby Huangacb9beba2020-06-25 20:08:0411According to the Checklist Manifesto by Atul Gawande, checklists are a marvelous
12tool for ensuring consistent quality in the work you produce. Checklists also
13help you work more efficiently by ensuring you never skip a step or waste brain
14power figuring out the next step to take.
15
Toby Huang5105f812019-08-08 23:47:5716[TOC]
17
Toby Huangacb9beba2020-06-25 20:08:0418## 1. Create a new branch or switch to the correct branch
Toby Huang5105f812019-08-08 23:47:5719
20You should create a new branch before starting any development work. It's
Toby Huang0a0375c2020-02-21 08:00:2821helpful 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 Huang5105f812019-08-08 23:47:5724
Toby Huang0a0375c2020-02-21 08:00:2825You may also want to set another local branch as the upstream branch. You can do
Toby Huangacb9beba2020-06-25 20:08:0426that with `git checkout -b <branch_name> --track <upstream_branch>`. Do this if
27you want to split your work across multiple CLs, but some CLs have dependencies
28on others.
Toby Huang5105f812019-08-08 23:47:5729
Toby Huang5c3c00e2019-10-30 23:29:0530Mark the associated crbug as "started" so that other people know that you have
Toby Huangacb9beba2020-06-25 20:08:0431started working on the bug. Taking this step can avoid duplicated work.
Toby Huang5c3c00e2019-10-30 23:29:0532
Toby Huangacb9beba2020-06-25 20:08:0433If 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
35few things more frustrating than to finish implementing your ideas or feedback,
36and to spend hours debugging some mysterious bug, only to discover that the bug
37was 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
41Suppose you have a downstream branch chained to an upstream branch. If you
42commit changes to the upstream branch, and you want the changes to appear in
43your 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 Huang2c40fc52020-08-10 21:44:4051Expect to fix numerous merge conflicts. Use `git rebase --continue` once you're
52done.
53
Toby Huangacb9beba2020-06-25 20:08:0454## 3. Make your changes
Toby Huangba5bbb42019-09-04 23:23:0755
56Do your thing. There's no further advice here about how to write or fix code.
57
Toby Huangacb9beba2020-06-25 20:08:0458## 4. Make sure the code builds correctly
Toby Huang5105f812019-08-08 23:47:5759
60After making your changes, check that common targets build correctly:
61
62* chrome (for Linux, ChromeOS, etc.)
63* unit_tests
64* browser_tests
65
66It's easy to inadvertently break one of the other builds you're not currently
67working on without realizing it. Even though the Commit Queue should catch any
68build errors, checking locally first can save you some time since the CQ Dry Run
Toby Huangacb9beba2020-06-25 20:08:0469can take a while to run, on the order of a few hours sometimes.
Toby Huang5105f812019-08-08 23:47:5770
Toby Huangacb9beba2020-06-25 20:08:0471## 5. Test your changes
Toby Huang5105f812019-08-08 23:47:5772
Toby Huangacb9beba2020-06-25 20:08:0473Test your changes manually by running the X11 simulator or deploying your
74changes to a test device. Follow the [Simple Chrome][simple-chrome] instructions
75to deploy your changes to a test device. Make sure you hit every code path you
76changed.
Toby Huang5105f812019-08-08 23:47:5777
Toby Huangacb9beba2020-06-25 20:08:0478## 6. Write unit or browser tests for any new code
Toby Huang5105f812019-08-08 23:47:5779
80Consider automating any manual testing you did in the previous step.
81
Toby Huangacb9beba2020-06-25 20:08:0482## 7. Ensure the code is formatted nicely
Toby Huang5105f812019-08-08 23:47:5783
84Run `git cl format --js`. The `--js` option also formats JavaScript changes.
85
Toby Huangacb9beba2020-06-25 20:08:0486## 8. Review your changes
Toby Huang5105f812019-08-08 23:47:5787
Toby Huang0a0375c2020-02-21 08:00:2888Use `git diff` to review all of the changes you've made from the previous
89commit. Use `git upstream-diff` to review all of the changes you've made
90from the upstream branch. The output from `git upstream-diff` is what will
91be uploaded to Gerrit.
Toby Huang5105f812019-08-08 23:47:5792
Toby Huangacb9beba2020-06-25 20:08:0493## 9. Stage relevant files for commit
Toby Huang5105f812019-08-08 23:47:5794
Toby Huang0a0375c2020-02-21 08:00:2895Run `git add <path_to_file>` for all of the files you've modified that you want
96to include in the CL. Unlike other version-control systems such as svn, you have
97to specifically `git add` the files you want to commit before calling
98`git commit`.
Toby Huang5105f812019-08-08 23:47:5799
Toby Huangacb9beba2020-06-25 20:08:04100## 10. Commit your changes
Toby Huang5105f812019-08-08 23:47:57101
Toby Huang0a0375c2020-02-21 08:00:28102Run `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 Huangacb9beba2020-06-25 20:08:04104shortcut for combining steps the previous step and this one is `git commit -a -m
105<commit_message>`.
Toby Huang5105f812019-08-08 23:47:57106
Toby Huangacb9beba2020-06-25 20:08:04107## 11. Squash your commits
Toby Huangba5bbb42019-09-04 23:23:07108
109If you have many commits on your current branch, and you want to avoid some
Toby Huang0a0375c2020-02-21 08:00:28110nasty commit-by-commit merge conflicts in the next step, consider collecting all
111your changes into one commit. Run `git rebase -i @{u}`. The `@{u}` is a
Toby Huangacb9beba2020-06-25 20:08:04112short-hand pointer for the upstream branch, which is usually origin/master, but
113can also be one of your local branches. After running the `git rebase` command,
114you 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"
116to "squash". This will squash each commit into the previous commit, which will
117continue until each commit is squashed into the first commit.
Toby Huangba5bbb42019-09-04 23:23:07118
Toby Huangacb9beba2020-06-25 20:08:04119An alternative way to squash your commits into a single commit is to do `git
120commit --amend` in the previous step.
Toby Huang5105f812019-08-08 23:47:57121
Toby Huangacb9beba2020-06-25 20:08:04122## 12. Rebase your local repository
123
124Rebasing is a neat way to sync changes from the remote repository and resolve
125any merge conflict errors on your CL. Run `git rebase-update`. This command
126updates all of your local branches with remote changes that have landed since
127you started development work, which could've been a while ago. It also deletes
128any branches that match the remote repository, such as after the CL associated
129with that branch has been merged. In summary, `git rebase-update` cleans up your
130local branches.
Toby Huang5105f812019-08-08 23:47:57131
Toby Huang0a0375c2020-02-21 08:00:28132You may run into rebase conflicts. Fix them manually before proceeding with
133`git rebase --continue`. Note that rebasing has the potential to break your
134build, so you might want to try re-building afterwards.
Toby Huang5105f812019-08-08 23:47:57135
Toby Huangacb9beba2020-06-25 20:08:04136## 13. Upload the CL to Gerrit
Toby Huang5105f812019-08-08 23:47:57137
138Run `git cl upload`. Some useful options include:
139
Toby Huangc9bd85b2020-07-30 22:02:35140* `--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 Huange43e5d682019-10-08 21:26:07142* `-r <chromium_username>` will add reviewers.
143* `-b <bug_number>` automatically populates the bug reference line of the
Toby Huangc9bd85b2020-07-30 22:02:35144 commit message. Use `-b None` is there is no relevant crbug.
Toby Huangacb9beba2020-06-25 20:08:04145* `--edit-description` will let you update the commit message.
Toby Huang5105f812019-08-08 23:47:57146
Toby Huangc9bd85b2020-07-30 22:02:35147To help guide your reviewers, it is also recommended to provide a title for each
148patchset summarizing the changes and indicating whose comments the patchset
149addresses. Running `git cl upload` will upload a new patchset and prompt you for
150a brief patchset title. The title defaults to your most recent commit summary,
151so if you tend to squash all your commits into one, try to enter a new summary
152each time you upload. You can also modify the patchset title directly in Gerrit.
153
Toby Huangacb9beba2020-06-25 20:08:04154## 14. Check the CL again in Gerrit
Toby Huang5105f812019-08-08 23:47:57155
156Run `git cl web` to go to the Gerrit URL associated with the current branch.
Toby Huangc9bd85b2020-07-30 22:02:35157Open the latest patchset and verify that all of the uploaded files are correct.
Toby Huange43e5d682019-10-08 21:26:07158Click `Expand All` to check over all of the individual line-by-line changes
Toby Huangacb9beba2020-06-25 20:08:04159again. Basically do a self-review before asking your reviewers for a review.
Toby Huang5105f812019-08-08 23:47:57160
Toby Huangacb9beba2020-06-25 20:08:04161## 15. Make sure all auto-regression tests pass
Toby Huang5105f812019-08-08 23:47:57162
163Click `CQ Dry Run`. Fix any errors because otherwise the CL won't pass the
164commit queue (CQ) checks. Consider waiting for the CQ Dry Run to pass before
165notifying your reviewers, in case the results require major changes in your CL.
166
Toby Huangacb9beba2020-06-25 20:08:04167## 16. Add reviewers to review your code
Toby Huang5105f812019-08-08 23:47:57168
169Click `Find Owners` or run `git cl owners` to find file owners to review your
170code and instruct them about which parts you want them to focus on. Add anyone
Toby Huange43e5d682019-10-08 21:26:07171else you think should review your code. The blame functionality in Code Search
172is a good way to identify reviewers who may be familiar with the parts of code
173your CL touches. For your CL to land, you need an approval from an owner for
174each file you've changed, unless you are an owner of some files, in which case
175you don't need separate owner approval for those files.
Toby Huang5105f812019-08-08 23:47:57176
Toby Huangacb9beba2020-06-25 20:08:04177## 17. Implement feedback from your reviewers
Toby Huang5105f812019-08-08 23:47:57178
179Then go through this commit checklist again. Reply to all comments from the
180reviewers 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
182receive a notification. Doing this signals that your CL is ready for review
183again, since the assumption is that your CL is not ready for review until you
184hit reply.
185
Toby Huangacb9beba2020-06-25 20:08:04186## 18. Land your CL
Toby Huang5105f812019-08-08 23:47:57187
188Once you have obtained a Looks Good To Me (LGTM), which is reflected by a
189Code-Review+1 in Gerrit, from at least one owner for each file, then you have
190the minimum prerequisite to land your changes. It may be helpful to wait for all
191of your reviewers to approve your changes as well, even if they're not owners.
192Click `Submit to CQ` to try your change in the commit queue (CQ), which will
193land it if successful.
194
Toby Huangacb9beba2020-06-25 20:08:04195## 19. Cleanup
Toby Huang5c3c00e2019-10-30 23:29:05196
Toby Huang5105f812019-08-08 23:47:57197After your CL is landed, you can use `git rebase-update` or `git cl archive` to
Toby Huang5c3c00e2019-10-30 23:29:05198clean up your local branches. These commands will automatically delete merged
199branches. Mark the associated crbug as "fixed".
Toby Huang5105f812019-08-08 23:47:57200
201[//]: # (the reference link section should be alphabetically sorted)
202[contributing]: contributing.md
Toby Huangacb9beba2020-06-25 20:08:04203[simple-chrome]: https://chromium.googlesource.com/chromiumos/docs/+/master/simple_chrome_workflow.md
Toby Huang5105f812019-08-08 23:47:57204[uploading-a-change-for-review]: contributing.md#Uploading-a-change-for-review