# Code Reviews

Code reviews are a central part of developing high-quality code for Chromium.
All changes must be reviewed.

The bigger patch-upload-and-land process is covered in more detail the
[contributing code](https://www.chromium.org/developers/contributing-code)
page.

# Code review policies

Ideally the reviewer is someone who is familiar with the area of code you are
touching. Any committer can review code, but an owner must provide a review
for each directory you are touching. If you have doubts, look at the git blame
for the file and the `OWNERS` files (see below).

To indicate a positive review, the reviewer provides a "Code-Review +1" in
Gerrit, also known as an LGTM ("Looks Good To Me"). A score of "-1" indicates
the change should not be submitted as-is.

If you have multiple reviewers, provide a message indicating what you expect
from each reviewer. Otherwise people might assume their input is not required
or waste time with redundant reviews.

Please also read [Respectful Changes](cl_respect.md) and
[Respectful Code Reviews](cr_respect.md).

#### Expectations for all reviewers

  * Aim to provide some kind of actionable response within 24 hours of receipt
    (not counting weekends and holidays). This doesn't mean you have to do a
    complete review, but you should be able to give some initial feedback,
    request more time, or suggest another reviewer.

  * Use the status field in Gerrit settings to indicate if you're away and when
    you'll be back.

  * Don't generally discourage people from sending you code reviews. This
    includes using a blanket "slow" in your status field.

## OWNERS files

In various directories there are files named `OWNERS` that list the email
addresses of people qualified to review changes in that directory. You must
get a positive review from an owner of each directory your change touches.

Owners files are recursive, so each file also applies to its subdirectories.
It's generally best to pick more specific owners. People listed in higher-level
directories may have less experience with the code in question. For example,
the reviewers in the `//chrome/browser/component_name/OWNERS` file will likely
be more familiar with code in `//chrome/browser/component_name/sub_component`
than reviewers in the higher-level `//chrome/OWNERS` file.

More detail on the owners file format is provided in the "More information"
section below.

*Tip:* The `git cl owners` command can help find owners.

While owners must approve all patches, any committer can contribute to the
review. In some directories the owners can be overloaded or there might be
people not listed as owners who are more familiar with the low-level code in
question. In these cases it's common to request a low-level review from an
appropriate person, and then request a high-level owner review once that's
complete. As always, be clear what you expect of each reviewer to avoid
duplicated work.

Owners do not have to pick other owners for reviews. Since they should already
be familiar with the code in question, a thorough review from any appropriate
committer is sufficient.

#### Expectations of owners

The existing owners of a directory approve additions to the list. It is
preferable to have many directories, each with a smaller number of specific
owners rather than large directories with many owners. Owners should:

  * Demonstrate excellent judgment, teamwork and ability to uphold Chrome
    development principles.

  * Be already acting as an owner, providing high-quality reviews and design
    feedback.

  * Be a Chromium project member with full commit access of at least three
    months tenure.

  * Have submitted a substantial number of non-trivial changes to the affected
    directory.

  * Have committed or reviewed substantial work to the affected directory
    within the last ninety days.

  * Have the bandwidth to contribute to reviews in a timely manner. If the load
    is unsustainable, work to expand the number of owners. Don't try to
    discourage people from sending reviews, including writing "slow" or
    "emeritus" after your name.

The above are guidelines more than they are hard rules, and exceptions are
okay as long as there is a consensus by the existing owners for them.
For example, seldom-updated directories may have exceptions to the
"substantiality" and "recency" requirements. Directories in `third_party`
should list those most familiar with the library, regardless of how often
the code is updated.

### OWNERS file details

Refer to the [source code](https://chromium.googlesource.com/chromium/tools/depot_tools/+/master/owners.py)
for all details on the file format.

This example indicates that two people are owners, in addition to any owners
from the parent directory. `git cl owners` will list the comment after an
owner address, so this is a good place to include restrictions or special
instructions.
```
# You can include comments like this.
a@chromium.org
b@chromium.org  # Only for the frobinator.
```

A `*` indicates that all committers are owners:
```
*
```

The text `set noparent` will stop owner propagation from parent directories.
This should be rarely used. If you want to use `set noparent` except for IPC
related files, please first reach out to chrome-eng-review@google.com.

In this example, only the two listed people are owners:
```
set noparent
a@chromium.org
b@chromium.org
```

The `per-file` directive allows owners to be added that apply only to files
matching a pattern. In this example, owners from the parent directory
apply, plus one person for some classes of files, and all committers are
owners for the readme:
```
per-file foo_bar.cc=a@chromium.org
per-file foo.*=a@chromium.org

per-file readme.txt=*
```

Note that `per-file` directives cannot directly specify subdirectories, e.g:
```
per-file foo/bar.cc=a@chromium.org
```

is not OK; instead, place a `per-file` directive in `foo/OWNERS`.

Other `OWNERS` files can be included by reference by listing the path to the
file with `file://...`. This example indicates that only the people listed in
`//ipc/SECURITY_OWNERS` can review the messages files:
```
per-file *_messages*.h=set noparent
per-file *_messages*.h=file://ipc/SECURITY_OWNERS
```

## TBR ("To Be Reviewed")

"TBR" is our mechanism for post-commit review. It should be used rarely and
only in cases where a normal review is unnecessary, as described under
"When to TBR", below.

TBR does not mean "no review." A reviewer TBR-ed on a change should still
review the change. If there are comments after landing, the author is obligated
to address them in a followup patch.

Do not use TBR just because a change is urgent or the reviewer is being slow.
Contact the reviewer directly or find somebody else to review your change.

### How to TBR

To send a change TBR, annotate the description and send email like normal.
Otherwise the reviewer won't know to review the patch.

  * Add the reviewer's email address in the code review tool's reviewer field
    like normal.

  * Add a line "TBR=<reviewer's email>" to the bottom of the change list
    description. e.g. `TBR=reviewer1@chromium.org,reviewer2@chromium.org`

  * Type a message so that the owners in the TBR list can understand who is
    responsible for reviewing what, as part of their post-commit review
    responsibility. e.g.
    ```
    TBRing reviewers:
    reviewer1: Please review changes to foo/
    reviewer2: Please review changes to bar/
    ```

### When to TBR

#### Reverts and relands

The most common use of TBR is to revert patches that broke the build. Clean
reverts of recent patches may be submitted TBR. However, TBR should not be used
if the revert required non-trivial conflict resolution, or if the patch being
reverted is older than a few days.

A developer relanding a patch can TBR the OWNERS for changes which are identical
to the original (reverted) patch.  If the reland patch contains any new changes
(such as bug fixes) on top of the original, those changes should go through the
normal review process.

When creating a reland patch, you should first upload an up-to-date patchset
with the exact content of the original (reverted) patch, and then upload the
patchset to be relanded. This is important for the reviewers to understand what
the fix for relanding was.

#### Mechanical changes

You can use TBR with certain mechanical changes that affect many callers in
different directories. For example, adding a parameter to a common function in
`//base`, with callers in `//chrome/browser/foo`, `//net/bar`, and many other
directories. If the updates to the callers is mechanical, you can:

  1. Get a normal owner of the lower-level code you're changing (in this
     example, the function in `//base`) to do a proper review of those changes.

  2. Get _somebody_ to review the downstream changes made to the callers as a
     result of the `//base` change. This is often the same person from the
     previous step but could be somebody else.

  3. TBR the owner of the lower-level code you're changing (in this example,
     `//base`), after they've LGTM'ed the API change, to bypass owners review of
     the API consumers incurring trivial side-effects.

This process ensures that all code is reviewed prior to checkin and that the
concept of the change is reviewed by a qualified person, without having to ping
many owners with little say in the trivial side-effects they incur.

**Note:** The above policy is only viable for strictly mechanical changes. For
large-scale scripted changes you should:

  1. Have an owner of the core change review the script.

  2. Use `git cl split` to shard the large change into many small CLs with a
     clear description of what each reviewer is expected to verify
     ([example](https://chromium-review.googlesource.com/1191225)).

#### Documentation updates

You can TBR documentation updates. Documentation means markdown files, text
documents, and high-level comments in code. At finer levels of detail, comments
in source files become more like code and should be reviewed normally (not
using TBR). Non-TBR-able stuff includes things like function contracts and most
comments inside functions.

  * Use good judgement. If you're changing something very important, tricky,
    or something you may not be very familiar with, ask for the code review
    up-front.

  * Don't TBR changes to policy documents like the style guide or this document.

  * Don't mix unrelated documentation updates with code changes.

  * Be sure to actually send out the email for the code review. If you get one,
    please actually read the changes.

