# How to contribute to Dawn

First off, we'd love to get your contributions to Dawn!

Everything helps other folks using Dawn and WebGPU: from small fixes and documentation
improvements to larger features and optimizations.
Please read on to learn about the contribution process.

## One time setup

### Contributor License Agreement

Contributions to this project must be accompanied by a Contributor License
Agreement. You (or your employer) retain the copyright to your contribution.
This simply gives us permission to use and redistribute your contributions as
part of the project. Head over to <https://cla.developers.google.com/> to see
your current agreements on file or to sign a new one.

You generally only need to submit a CLA once, so if you've already submitted one
(even if it was for a different Google project), you probably don't need to do
it again.

### Gerrit setup

Dawn's contributions are submitted and reviewed on [Dawn's Gerrit](https://dawn-review.googlesource.com).

Gerrit works a bit differently than Github (if that's what you're used to):
there are no forks. Instead everyone works on the same repository. Gerrit has
magic branches for various purpose:

 - `refs/for/<branch>` (most commonly `refs/for/main`) is a branch that anyone
can push to that will create or update code reviews (called CLs for ChangeList)
for the commits pushed.
 - `refs/changes/00/<change number>/<patchset>` is a branch that corresponds to
the commits that were pushed for codereview for "change number" at a certain
"patchset" (a new patchset is created each time you push to a CL).

#### Gerrit's .gitcookies

To push commits to Gerrit your `git` command needs to be authenticated. This is
done with `.gitcookies` that will make `git` send authentication information
when connecting to the remote. To get the `.gitcookies`, log-in to [Dawn's Gerrit](https://dawn-review.googlesource.com)
and browse to the [new-password](https://dawn.googlesource.com/new-password)
page that will give you shell/cmd commands to run to update `.gitcookie`.

#### Set up the commit-msg hook

Gerrit associates commits to CLs based on a `Change-Id:` tag in the commit
message. Each push with commits with a `Change-Id:` will update the
corresponding CL.

To add the `commit-msg` hook that will automatically add a `Change-Id:` to your
commit messages, run the following command:

```
f=`git rev-parse --git-dir`/hooks/commit-msg ; mkdir -p $(dirname $f) ; curl -Lo $f https://gerrit-review.googlesource.com/tools/hooks/commit-msg ; chmod +x $f
```

Gerrit helpfully reminds you of that command if you forgot to set up the hook
before pushing commits.

## The code review process

All submissions, including submissions by project members, require review.

### Discuss the change if needed

Some changes are inherently risky, because they have long-term or architectural
consequences, contain a lot of unknowns or other reasons. When that's the case
it is better to discuss it on the [Dawn Matrix Channel](https://matrix.to/#/#webgpu-dawn:matrix.org)
or the [Dawn mailing-list](https://groups.google.com/g/dawn-graphics/members).

### Pushing changes to code review

Before pushing changes to code review, it is better to run `git cl presubmit`
that will check the formatting of files and other small things.

Pushing commits is done with `git push origin HEAD:refs/for/main`. Which means
push to `origin` (i.e. Gerrit) the currently checkout out commit to the
`refs/for/main` magic branch that creates or updates CLs.

In the terminal you will see a URL where code review for this CL will happen.
CLs start in the "Work In Progress" state. To start the code review proper,
click on "Start Review", add reviewers and click "Send and start review". If
you are unsure which reviewers to use, pick one of the reviewers in the
[OWNERS file](../OWNERS) who will review or triage the CL.

When code review asks for changes in the commits, you can amend them any way
you want (small fixup commit and `git rebase -i` are crowd favorites) and run
the same `git push origin HEAD:refs/for/main` command.

### Tracking issues

We usually like to have commits associated with issues in [Dawn's issue tracker](https://bugs.chromium.org/p/dawn/issues/list)
so that commits for the issue can all be found on the same page. This is done
by adding a `Bug: dawn:<issue number>` tag at the end of the commit message. It
is also possible to reference Chromium or Tint issues with
`Bug: tint:<issue number>` or `Bug: chromium:<issue number>`.

Some small fixes (like typo fixes, or some one-off maintenance) don't need a
tracking issue. When that's the case, it's good practice to call it out by
adding a `Bug: None` tag.

It is possible to make issues fixed automatically when the CL is merged by
adding a `Fixed: <project>:<issue number>` tag in the commit message.

### Iterating on code review

Dawn follows the general [Google code review guidelines](https://google.github.io/eng-practices/review/).
Most Dawn changes need reviews from two Dawn committers. Reviewers will set the
"Code Review" CR+1 or CR+2 label once the change looks good to them (although
it could still have comments that need to be addressed first). When addressing
comments, please mark them as "Done" if you just address them, or start a
discussion until they are resolved.

Once you are granted rights (you can ask on your first contribution), you can
add the "Commit Queue" CQ+1 label to run the automated tests for Dawn. Once the
CL has CR+2 you can then add the CQ+2 label to run the automated tests and
submit the commit if they pass.

The "Auto Submit" AS+1 label can be used to make Gerrit automatically set the
CQ+2 label once the CR+2 label is added.
