= Gerrit Code Review - Review Labels

As part of the code review process, reviewers score each change with
values for each label configured for the project.  The label values that
a given user is allowed to set are defined according to the
link:access-control.html#category_review_labels[access controls].  Gerrit
comes pre-configured with the Code-Review label that can be granted to
groups within projects, enabling functionality for that group's members.
Project owners and admins might also need to configure rules which require
labels to be voted before a change can be submittable. See the
link:config-submit-requirements.html[submit requirements] documentation to
configure such rules.

[[sticky_votes]]
== Sticky Votes

Whether votes are sticky when a new patch set is created depends on the
link:#label_copyCondition[copyCondition] of the label. If an approval
matches the configured condition it is copied from the old current
patch set to the new current patch set. Votes that are not copied to
the new patch set, are called `outdated`.

If votes get outdated due to pushing a new patch set the uploader is
informed about this by a message in the git output. In addition,
outdated votes are also listed in the email notification that is sent
for the new patch set (unless this is disabled by a custom email
template). Note, that the uploader only gets this email notification if
they have configured `Every Comment` for `Email notifications` in their
user preferences. With any other email preference the email sender, the
uploader in this case, is not included in the email recipients.

If votes get outdated due to creating a new patch set the user of the
removed vote is added to the attention set of the change, as they need
to re-review the change and renew their vote.

If a vote is applied on an outdated patch set (i.e. a patch set that is
not the current patch set) the vote is copied forward to follow-up
patch sets if possible. A newly added or updated vote on an outdated
patch set is copied to follow-up patch sets if:

* the vote is copyable (i.e. it matches the
link:#label_copyCondition[copyCondition] of the label)
* neither the follow-up patch set nor an intermediate patch set has a
  non-copied vote or a deletion vote (vote with value `0`) that
  overrides the copy vote

If an approval on an outdated patch set is removed or updated to a
value that is not copyable, existing copies of that approval on
follow-up patch sets are removed.

[[label_Code-Review]]
== Label: Code-Review

The Code-Review label is configured upon the creation of a Gerrit
instance.  It may have any meaning the project desires.  It was
originally invented by the Android Open Source Project to mean
'I read the code and it seems reasonably correct'.

The range of values is:

* -2 This shall not be submitted
+
The code is so horribly incorrect/buggy/broken that it must not be
submitted to this project, or to this branch.  This value is valid
across all patch sets in the same change, i.e. the reviewer must
actively change his/her review to something else before the change
is submittable.
+
*Any -2 blocks submit.*

* -1 I would prefer this is not submitted as is
+
The code doesn't look right, or could be done differently, but
the reviewer is willing to live with it as-is if another reviewer
accepts it, perhaps because it is better than what is currently in
the project.  Often this is also used by contributors who don't like
the change, but also aren't responsible for the project long-term
and thus don't have final say on change submission.
+
Does not block submit.

* 0 No score
+
Didn't try to perform the code review task, or glanced over it but
don't have an informed opinion yet.

* +1 Looks good to me, but someone else must approve
+
The code looks right to this reviewer, but the reviewer doesn't
have access to the `+2` value for this category.  Often this is
used by contributors to a project who were able to review the change
and like what it is doing, but don't have final approval over what
gets submitted.

* +2 Looks good to me, approved
+
Basically the same as `+1`, but for those who have final say over
how the project will develop.
+
*Any +2 enables submit.*

For a change to be submittable, the latest patch set must have a
`+2 Looks good to me, approved` in this category, and no
`-2 This shall not be submitted`.  Thus `-2` on any patch set can
block a submit, while `+2` on the latest patch set can enable it.

If a Gerrit installation does not wish to use this label in any project,
the `[label "Code-Review"]` section can be deleted from `project.config`
in `All-Projects`.

If a Gerrit installation or project wants to modify the description text
associated with these label values, the text can be updated in the
`label.Code-Review.value` fields in `project.config`.

Additional entries could be added to `label.Code-Review.value` to
further extend the negative and positive range, but there is likely
little value in doing so as this only expands the middle region.  This
label is a `MaxWithBlock` type, which means that the lowest negative
value if present blocks a submit, while the highest positive value is
required to enable submit.

[[label_Verified]]
== Label: Verified

The Verified label was originally invented by the Android Open Source
Project to mean 'compiles, passes basic unit tests'.  Some CI tools
expect to use the Verified label to vote on a change after running.

During site initialization the administrator may have chosen to
configure the default Verified label for all projects.  In case it is
desired to configure it at a later time, administrators can do this by
adding the following to `project.config` in `All-Projects`:

----
  [label "Verified"]
      function = MaxWithBlock
      value = -1 Fails
      value = 0 No score
      value = +1 Verified
      copyCondition = changekind:NO_CODE_CHANGE
----

The range of values is:

* -1 Fails
+
Tried to compile, but got a compile error, or tried to run tests,
but one or more tests did not pass.
+
*Any -1 blocks submit.*

* 0 No score
+
Didn't try to perform the verification tasks.

* +1 Verified
+
Compiled (and ran tests) successfully.
+
*Any +1 enables submit.*

For a change to be submittable, the change must have a `+1 Verified`
in this label, and no `-1 Fails`.  Thus, `-1 Fails` can block a submit,
while `+1 Verified` enables a submit.

Additional values could also be added to this label, to allow it to
behave more like `Code-Review` (below).  Add -2 and +2 entries to the
`label.Verified.value` fields in `project.config` to get the same
behavior.


[[label_custom]]
== Customized Labels

Site administrators and project owners can define their own labels,
or customize labels inherited from parent projects.

See above for descriptions of how <<label_Verified,`Verified`>>
and <<label_Code-Review,`Code-Review`>> work, and add your own
label to `project.config` to get the same behavior over your own range
of values, for any label you desire.

Just like the built-in labels, users need to be given permissions to
vote on custom labels. Permissions can either be added by manually
editing project.config when adding the labels, or, once the labels are
added, permission categories for those labels will show up in the
permission editor web UI.

Labels may be added to any project's `project.config`; the default
labels are defined in `All-Projects`.

[[label_inheritance]]
=== Inheritance

Labels are inherited from parent projects. A child project may add,
override, or remove labels defined in its parents.

Overriding a label in a child project overrides all its properties and
values. It is not possible to modify an inherited label by adding
properties in the child project's configuration; all properties from
the parent definition must be redefined in the child.

To remove a label in a child project, add an empty label with a single "0"
value, with the same name as in the parent. This will override the parent label
with a label containing the defaults (`function = NoBlock`,
`defaultValue = 0` and no further allowed values)

[[label_layout]]
=== Layout

Labels are laid out in alphabetical order.

[[label_name]]
=== `label.Label-Name`

The name for a label, consisting only of alphanumeric characters and
`-`.

[[label_description]]
=== `label.Label-Name.description`

The label description. This field can provide extra information of what the
label is supposed to do.

[[label_value]]
=== `label.Label-Name.value`

A multi-valued key whose values are of the form `"<#> Value description
text"`. The `<#>` may be any positive or negative number with an
optional leading `+`.


[[label_defaultValue]]
=== `label.Label-Name.defaultValue`

The default value (or score) for the label.  The defaultValue must be
within the range of valid label values.  It is an optional label setting,
if not defined the defaultValue for the label will be 0.  When a
defaultValue is defined, that value will get set in the Reply dialog
by default.

A defaultValue can be set to a score that is outside of the permissible
range for a user.  In that case the score that will get set in the Reply
box will be either the lowest or highest score in the permissible range.


[[label_function]]
=== `label.Label-Name.function (deprecated)`

Label functions dictate the rules for requiring certain label votes before a
change is allowed for submission. Label functions are **deprecated** and updates
that set `function` to a blocking value {`MaxWithBlock`, `MaxNoBlock`,
`AnyWithBlock`} will be rejected. Existing label function definitions can only
be updated to {`NoBlock`, `NoOp`, `PatchSetLock`}. New label definitions should
also explicitly set the `function` attribute to a non-blocking value since the
default is `MaxWithBlock`.

If your project has a
blocking label function, we highly encourage you to change it to `NoBlock` and
add a submit-requirement for the same label. See the
link:config-submit-requirements.html#code-review-example[submit-requirements
documentation] for more details.

The name of a function for evaluating multiple votes for a label.  This
function is only applied if the default submit rule is used for a label.
If you write a link:prolog-cookbook.html#HowToWriteSubmitRules[custom
submit rule] (and do not call the default rule), the function name is
ignored and may be treated as optional.

Valid values are:

[[MaxWithBlock]]
* `MaxWithBlock` (default)
+
The lowest possible negative value, if present, blocks a submit, while
the highest possible positive value is required to enable submit. There
must be at least one positive value, or else submit will never be
enabled. To permit blocking submits, ensure a negative value is defined.

[[AnyWithBlock]]
* `AnyWithBlock`
+
The label is not mandatory but the lowest possible negative value,
if present, blocks a submit. To permit blocking submits, ensure that a
negative value is defined.

[[MaxNoBlock]]
* `MaxNoBlock`
+
The highest possible positive value is required to enable submit, but
the lowest possible negative value will not block the change.

[[NoBlock]]
* `NoBlock`/`NoOp`
+
The label is purely informational and values are not considered when
determining whether a change is submittable.

[[PatchSetLock]]
* `PatchSetLock`
+
The `PatchSetLock` function provides a locking mechanism for patch
sets.  This function's values are not considered when determining
whether a change is submittable. When set, no new patchsets can be
created and rebase and abandon are blocked. This is useful to prevent
updates to a change while (potentially expensive) CI
validation is running.
+
This function is designed to allow overlapping locks, so several lock
accounts could lock the same change.
+
Allowed range of values are 0 (Patch Set Unlocked) to 1 (Patch Set
Locked).

[[label_allowPostSubmit]]
=== `label.Label-Name.allowPostSubmit`

If true, the label may be voted on for changes that have already been
submitted. If false, the label will not appear in the UI and will not
be accepted when reviewing a closed change.

In either case, voting on a label after submission is only permitted if
the new vote is at least as high as the old vote by that user. This
avoids creating the false impression that a post-submit vote can change
the past and affect submission somehow.

Defaults to true.

[[label_copyCondition]]
=== `label.Label-Name.copyCondition`

If set, Gerrit matches patch set approvals against the provided query
string. If the query matches, the approval is copied from one patch set
to the next. The query language is the same as for
link:user-search.html[other queries].

This logic is triggered whenever a new patch set is uploaded.

Gerrit currently supports the following predicates:

[[changekind]]
==== changekind:{NO_CHANGE,NO_CODE_CHANGE,MERGE_FIRST_PARENT_UPDATE,REWORK,TRIVIAL_REBASE,TRIVIAL_REBASE_WITH_MESSAGE_UPDATE}

Matches if the diff between two patch sets was of a certain change kind:

* [[no_change]]`NO_CHANGE`:
+
Matches when a new patch set is uploaded that has the same parent tree,
code delta, and commit message as the previous patch set. This means
that only the patch set SHA-1 is different. This can be used to enable
sticky approvals, reducing turn-around for this special case.
+
It is recommended to leave this enabled for both, the Code-Review and
the Verified labels.
+
`NO_CHANGE` is more trivial than a trivial rebase, no code change and
a first parent update, hence this change kind is also matched by
`changekind:TRIVIAL_REBASE`, `changekind:NO_CODE_CHANGE` and if it's
a merge commit by `changekind:MERGE_FIRST_PARENT_UPDATE`.


* [[no_code_change]]`NO_CODE_CHANGE`:
+
Matches when a new patch set is uploaded that has the same parent tree
as the previous patch set and the same code diff (including context
lines) as the previous patch set. This means only the commit message
may be different; the change hasn't even been rebased. Also matches if
the commit message is not different, which means this includes matching
patch sets that have `NO_CHANGE` as the change kind.
+
This predicate can be used to enable sticky approvals on labels that
only depend on the code, reducing turn-around if only the commit
message is changed prior to submitting a change.
+
For the Verified label that is optionally installed by the
link:pgm-init.html[init] site program this predicate is used by
default.

* [[merge_first_parent_update]]`MERGE_FIRST_PARENT_UPDATE`:
+
Matches when a new patch set is uploaded that is a new merge commit
which only differs from the merge commit in the previous patch set in
its first parent, or has identical parents (aka the change kind of the
merge commit is `NO_CHANGE`).
+
The first parent of the merge commit is part of the change's target
branch, whereas the other parent(s) refer to the feature branch(es) to
be merged.
+
Matching this change kind is useful if you don't want to trigger CI or
human verification again if your target branch moved on but the feature
branch(es) being merged into the target branch did not change.
+
This predicate does not match if the patch set is not a merge commit.

* [[trivial_rebase]]`TRIVIAL_REBASE`:
+
Matches when a new patch set is uploaded that is a trivial rebase. A
new patch set is considered to be trivial rebase if the commit message
is the same as in the previous patch set and if it has the same diff
(including context lines) as the previous patch set. This is the case
if the change was rebased onto a different parent and that rebase did
not require git to perform any conflict resolution, or if the parent
did not change at all (aka the change kind of the commit is
`NO_CHANGE`).
+
This predicate can be used to enable sticky approvals, reducing
turn-around for trivial rebases prior to submitting a change.
+
For the pre-installed Code-Review label this predicate is used by
default.

* [[trivial_rebase_with_message_update]]`TRIVIAL_REBASE_WITH_MESSAGE_UPDATE`:
+
Same as TRIVIAL_REBASE, but commit message can be different.

* [[rework]]`REWORK`:
+
Matches all kind of change kinds because any other change kind
is just a more trivial version of a rework. This means setting
`changekind:REWORK` is equivalent to setting `is:ANY`.

[[is_magic]]
==== is:{MIN,MAX,ANY}

Matches approvals that have a minimal, maximal or any score:

* [[is_min]]`MIN`:
+
Matches approvals that have a minimal score, i.e. the lowest possible
(negative) value for this label.

* [[is_max]]`MAX`:
+
Matches approvals that a maximal score, i.e. the highest possible
(positive) value for this label.

* [[is_any]]`ANY`:
+
Matches any approval when a new patch set is uploaded.

[[is_value]]
==== is:'VALUE'

Matches approvals that have a voting value that is equal to 'VALUE'.

Negative values need to be quoted, e.g.: is:"-1"

[[approverin]]
==== approverin:link:#group-id[\{group-id\}]

Matches votes granted by a user who is a member of
link:#group-id[\{group-id\}].

[[uploaderin]]
==== uploaderin:link:#group-id[\{group-id\}]

Matches all votes if the new patch set was uploaded by a member of
link:#group-id[\{group-id\}].

[[has_unchanged_files]]
==== has:unchanged-files

Matches when the new patch-set has the same list of files as the
previous patch-set.

Votes are not copied in the following cases:

  * If one more files are renamed in the new patch set. These files are counted
  as a deletion of the file at the old path and an addition of the file at the
  new path. This means the list of files did change.
  * If one or more files are reverted to their original content, that is files
  that become same as in the base revision.

This predicate is useful if you don't want to trigger CI or human
verification again if the list of files didn't change.

Note, "unchanged-files" is the only value that is supported for the
"has" operator.

[[group-id]]
==== Group ID

Some predicates (link:#approverin[approverin], link:#uploaderin[uploaderin])
expect a group ID as value. This group ID can be any of the
link:rest-api-groups.html#group-id[group identifiers] that are supported in the
REST API: group UUID, group ID (for Gerrit internal groups only) and group name

It's preferred to reference groups by UUID, rather than name. Referencing
groups by name is not recommended because:

* Groups may be renamed and then the group reference can no longer be resolved.
  If this happens another group with different members can take over the group
  name, so that exemptions which have been granted by this predicate apply to
  the other group. This is a security concern.
* Group names that contain spaces are not supported.
* Ambiguous group names cannot be resolved. This means if another group with
  the same name gets created at a later point in time, the group name can no
  longer be resolved and the predicate breaks.

Using the group UUID has a small drawback though, since it makes the condition
less human-readable.

==== Example

----
copyCondition = is:MIN OR -change-kind:REWORK OR uploaderin:dead...beef
----

[[label_canOverride]]
=== `label.Label-Name.canOverride`

If false, the label cannot be overridden by child projects. Any
configuration for this label in child projects will be ignored. Defaults
to true.

[[label_branch]]
=== `label.Label-Name.branch`

By default a given project's label applicable scope is all changes
on all branches of this project and its child projects.

Label's applicable scope can be branch specific via configuration.
E.g. create a label `Video-Qualify` on parent project and configure
the `branch` as:

----
  [label "Video-Qualify"]
      branch = refs/heads/video-1.0/*
      branch = refs/heads/video-1.1/Kino
----

Then *only* changes in above branch scope of parent project and child
projects will be affected by `Video-Qualify`.

[NOTE]
The `branch` is independent from the branch scope defined in `access`
parts in `project.config` file. That means from the UI a user can always
assign permissions for that label on a branch, but this permission is then
ignored if the label doesn't apply for that branch.
Additionally, the `branch` modifier has no effect when the submit rule
is customized in the rules.pl of the project or inherited from parent projects.
Branch can be a ref pattern similar to what is documented
link:access-control.html#reference[here], but must not contain `${username}` or
`${shardeduserid}`.

[[label_ignoreSelfApproval]]
=== `label.Label-Name.ignoreSelfApproval (deprecated)`

If true, the label may be voted on by the uploader of the latest patch set,
but their approval does not make a change submittable. Instead, a
non-uploader who has the right to vote has to approve the change.

Defaults to false.

The `ignoreSelfApproval` attribute is **deprecated**, favour
using link:config-submit-requirements.html[submit requirements] and
define the `submittableIf` expression with the `label` operator and
the `user=non_uploader` argument. See the
link:config-submit-requirements.html#code-review-example[Code Review] submit
requirement example.

[[label_example]]
=== Example

To define a new 3-valued category that behaves exactly like `Verified`,
but has different names/labels:

----
  [label "Copyright-Check"]
      function = MaxWithBlock
      value = -1 Do not have copyright
      value = 0 No score
      value = +1 Copyright clear
----

The new column will appear at the end of the table, and `-1 Do not have
copyright` will block submit, while `+1 Copyright clear` is required to
enable submit.

=== Default Value Example

This example attempts to describe how a label default value works with the
user permissions.  Assume the configuration below.

----
  [access "refs/heads/*"]
      label-Snarky-Review = -3..+3 group Administrators
      label-Snarky-Review = -2..+2 group Project Owners
      label-Snarky-Review = -1..+1 group Registered Users
  [label "Snarky-Review"]
      value = -3 Ohh, hell no!
      value = -2 Hmm, I'm not a fan
      value = -1 I'm not sure I like this
      value = 0 No score
      value = +1 I like, but need another to like it as well
      value = +2 Hmm, this is pretty nice
      value = +3 Ohh, hell yes!
      defaultValue = -3
----

Upon clicking the Reply button:

* Administrators have all scores (-3..+3) available, -3 is set as the default.
* Project Owners have limited scores (-2..+2) available, -2 is set as the default.
* Registered Users have limited scores (-1..+1) available, -1 is set as the default.

=== Patch Set Lock Example

This example shows how a label can be configured to have a standard patch set lock.

----
  [access "refs/heads/*"]
      label-Patch-Set-Lock = +0..+1 group Administrators
  [label "Patch-Set-Lock"]
      function = PatchSetLock
      value =  0 Patch Set Unlocked
      value = +1 Patch Set Locked
      defaultValue = 0
----

GERRIT
------
Part of link:index.html[Gerrit Code Review]

SEARCHBOX
---------
