about summary refs log tree commit diff
path: root/docs/REVIEWS.md
blob: dd74e23cafe82a9d26fe3f066f9b553453865c91 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
TVL Code Reviews
================

<!-- markdown-toc start - Don't edit this section. Run M-x markdown-toc-refresh-toc -->
**Table of Contents**

- [TVL Code Reviews](#tvl-code-reviews)
    - [Gerrit setup](#gerrit-setup)
    - [Gerrit workflows](#gerrit-workflows)
    - [Review process & approvals](#review-process--approvals)
    - [Registration](#registration)
    - [Submitting changes via email](#submitting-changes-via-email)
    - [Gerrit for Github users](#gerrit-for-github-users)

<!-- markdown-toc end -->


This document describes the TVL code review process & tooling. If you are
looking for general contribution guidelines, please look at the [general
contribution guidelines](./CONTRIBUTING.md).

All changes are tracked at [cl.tvl.fyi](https://cl.tvl.fyi) using Gerrit. See
[Registration](#registration) for information on how to register an account.

## Gerrit setup

Gerrit uses the concept of change IDs to track commits across rebases and other
operations that might change their hashes, and link them to unique changes in
Gerrit.

First, [tell Gerrit][Gerrit SSH] about your SSH keys.

Then, to make using Gerrit smooth for users, the repository should be cloned and
a commit hook should be installed as follows:

```
git clone "ssh://$USER@code.tvl.fyi:29418/depot"
scp -pOP 29418 $USER@code.tvl.fyi:hooks/commit-msg "depot/.git/hooks/"
```

If you have a previous clone of the depot via HTTP you can use `git remote
set-url` to update the origin URL and install the hook in the same way as above.

## Gerrit workflows

The developer workflow on Gerrit is quite different from what GitHub-users are
used to.

The depot does not have branches (other than Gerrit's internal metadata refs)
and all development happens at `HEAD`.

Every time you create a new commit the change hook will insert a unique
`Change-Id` tag into the commit message. Once you are satisfied with the state
of your commit and want to submit it for review, you push it to a git ref called
`refs/for/canon`. This designates the commits as changelists (CLs) targeted for
the `canon` branch.

Sending a change for review is done by pushing to a special target. You can set
this to be the default push target through your git configuration:

```
git config remote.origin.url "ssh://$USER@code.tvl.fyi:29418/depot"
git config remote.origin.push HEAD:refs/for/canon
```

Then, after making your change, push to the default, or to a special target:

```
Example:
git commit -m 'docs(REVIEWS): Fixed all the errors in the reviews docs'
git push origin

# Uploading a work-in-progress CL:
git push origin HEAD:refs/for/canon%wip
```

TIP: Every individual commit will become a separate change. We do not merge
related commits, but instead submit them one by one. Be aware that if you are
expecting a different behaviour and attempt something like an unsquashed subtree
merge, you will produce a *lot* of CLs. This is strongly discouraged.

During your review, the reviewer(s) might ask you to make changes. You can
simply amend your commit(s) and push to the same ref. Gerrit will automatically
update your changes.

Read more about the Gerrit workflow in the [Gerrit walkthrough][].

## Review process & approvals

Each user has the ability to create their own users directory in
`//users/<username>` in which they can submit code without review from other
contributors (they will still need to +2 their own changes, and the initial
check-in of the `OWNERS` file needs to be reviewed).

You can set a directory like this up for yourself by proposing a change similar
to [CL/246](https://cl.tvl.fyi/c/depot/+/246).

For all paths outside of `//users`, code review is required. We have no strict
guidelines about the review process itself, as we're not a megacorp, but we have
formalised checks before submitting:

* At least one person who is [an owner][OWNERS] of the codepath must have given
  a +2 review
* The commit message must conform to our [guidelines][]
* No code review comments must be left unresolved

If all these conditions are fulfilled, the **change author submits their change
themselves**.

## Registration

You may log into Gerrit using a GitHub, StackOverflow or GitLab.com account.

If you would like to have a TVL-specific account on the Gerrit
instance, follow these instructions:

1. Be a member of `#tvl` on [hackint][].
2. Clone the depot locally (via `git clone "https://cl.tvl.fyi/depot"`).
3. Create a user entry in our LDAP server in [ops/users][ops-users].

   We recommend using ARGON2 password hashes, which can be created
   with the `slappasswd` tool if OpenLDAP was compiled with ARGON2
   support.

   For convenience, we provide a wrapper script for this that you can
   build with `nix-build -A tools.hash-password` in a depot checkout.
   Alternatively, if you have `direnv` installed, you can add the
   depot to your allowlist and just run `hash-password` which should
   be added to your `$PATH` by `direnv`.

   You can probably create ARGON2 hashes with other tools, but that is
   your job to figure out.
4. Create a commit adding yourself (see e.g.
   [CL/2671](https://cl.tvl.fyi/c/depot/+/2671))
5. Submit the commit via email (see below).

## Submitting changes via email

You can submit a patch via email to `depot@tvl.su` and it will be
added to Gerrit by a contributor.

Create an appropriate commit locally and send it us using either of these options:

* `git format-patch`: This will create a `.patch` file which you should email to
  us.
* `git send-email`: If configured on your system, this will take care of the
  whole emailing process for you.

The email address is a [public inbox][].

## Gerrit for Github Users

There is a walkthrough that describes [only the parts that differ
from Github][github-diff], although it does not cover [attention
sets][], which are important to understand.

### Attention Sets

The attention set of a CL is somewhat similar to the set of Github
users who have unread notifications for a PR.  The "your turn" list
on the dashboard is similar to your unread notifications list in
Github.  These similarities are only rough approximations, however.

Unfortunately the rules for updating attention sets are very
different and complex.  If you don't read and understand them, you
may end up leaving comments that nobody ever finds out about.  Here
are a few unexpected features:

- Voting on or replying to a CL will remove you from the attention
  set.  You can also do this by clicking on the gray chevron shape
  next to your name.

- If you comment on a merged or abandoned change without marking
  your comment "unresolved", *nobody will be notified of your
  comment*.  If you want to the owner of a merged or abandoned
  change to read your comment, you must mark it as "unresolved" or
  manually add them to the attention set by hovering your mouse over
  their name and clicking "add to attention set"

There are many more [rules][attention-set-rules], which you should
read.


[Gerrit SSH]: https://cl.tvl.fyi/settings/#SSHKeys
[Gerrit walkthrough]: https://gerrit-review.googlesource.com/Documentation/intro-gerrit-walkthrough.html
[OWNERS]: https://cl.tvl.fyi/plugins/owners/Documentation/config.md
[guidelines]: ./CONTRIBUTING.md#commit-messages
[ops-users]: ../ops/users/default.nix
[public inbox]: https://inbox.tvl.su/depot/
[hackint]: https://hackint.org
[github-diff]: https://gerrit.wikimedia.org/r/Documentation/intro-gerrit-walkthrough-github.html
[attention sets]: https://gerrit-review.googlesource.com/Documentation/user-attention-set.html
[attention-set-rules]: https://gerrit-review.googlesource.com/Documentation/user-attention-set.html#_rules