blob: 0eb22643ce2c942e8f27d7365fb9713c151adfe7 [file] [log] [blame] [view]
Configuration
=============
## Table of Contents
* [Example from AOSP](#example-from-aosp)
* [Global vs Project Variables](#global-vs-project-variables)
* [Submit Rules and Filters](#submit-rules-and-filters)
* [Exempt from Owner Approval](#exempt-from-owner-approval)
* [Minimal Owner Code-Review Vote](#minimal-owner-code-review-vote)
* [OWNERS File Name](#owners-file-name)
* [OWNERS Upload Validator](#owners-upload-validator)
* [More Prolog Examples](#more-prolog-examples)
## Example from AOSP
The `find-owners` plugin is used in Android Open Source Project (AOSP).
Here is [one AOSP change](https://android-review.googlesource.com/c/platform/build/+/734949)
that modified multiple OWNERS files.
If you sign in to the AOSP Gerrit server,
you can see and click the `[FIND OWNERS]` button and
it will pop up a window with *owners* of the changed files.
The AOSP Gerrit server and projects are configured with the
following steps:
1. Enable the plugin in Gerrit configuration file `gerrit.config`:
```bash
[plugin "find-owners"]
enable = true
maxCacheAge = 30
maxCacheSize = 2000
```
* **enable = true** enables the plugin for all projects.
* **maxCacheAge** is the number of seconds owners info will stay in
a cache before being refreshed. This reduces repeated access to the same
OWNERS files in a repository. If it is set to 0 (default), there will
be no cache.
* **maxCacheSize** limits the number of owners info stored in the
cache to reduce memory footprint.
1. Enable the upload validator in `project.config` of
the `All-Projects` project, in the `refs/meta/config` branch:
```bash
[plugin "find-owners"]
rejectErrorInOwners = true
```
* The upload validator checks basic syntax of uploaded OWNERS files.
It also checks if all email addresses used in OWNERS files
belong to active Gerrit accounts.
* All other Gerrit projects inherit from `All-Projects`,
so they have the same enabled upload validator.
1. Optionally redefine **OWNERS** file name in `project.config` of
some projects, in the `refs/meta/config` branch:
```bash
[plugin "find-owners"]
ownersFileName = OWNERS.android
```
* The AOSP `platform/external/v8` project keeps a copy of upstream
source from https://github.com/v8/v8.
* The v8 upstream source already has its `OWNERS` files
that do not work with AOSP Gerrit, because the Email addresses
in those files are not all active developers for AOSP.
So we need to use different *owners* files,
with the `OWNERS.android` file name.
1. Call the submit filters in `rules.pl` of `All-Projects`,
in the `refs/meta/config` branch:
```prolog
% Special projects, branches, user accounts can opt out owners review.
% To disable all find_owners rules, add opt_out_find_owners :- true.
opt_out_find_owners :-
gerrit:change_branch('refs/heads/pie-gsi').
% Special projects, branches, user accounts can opt in owners review.
% To default to find_owners rules, add opt_in_find_owners :- true.
opt_in_find_owners :- true.
% If opt_out_find_owners is true, remove all 'Owner-Review-Vote' label;
% else if opt_in_find_owners is true, call find_owners:submit_filter;
% else default to no find_owners filter.
check_find_owners(In, Out) :-
( opt_out_find_owners -> find_owners:remove_need_label(In, Temp)
; opt_in_find_owners -> find_owners:submit_filter(In, Temp)
; In = Temp
),
Temp =.. [submit | A],
change_find_owners_labels(A, B),
Out =.. [submit | B].
submit_filter(In, Out) :-
In =.. [submit | A],
check_drno_review(A, B),
check_api_review(B, C),
check_qualcomm_review(C, D),
Temp =.. [submit | D],
check_find_owners(Temp, Out).
% Remove useless label('Owner-Approved',_) after final filter.
% Change optional label('Owner-Review-Vote', may(_)) to
% label('Owner-Review-Vote', need(_)) to hide the Submit button.
change_find_owners_labels([], []).
change_find_owners_labels([H | T], R) :-
H = label('Owner-Approved', _), !,
change_find_owners_labels(T, R).
change_find_owners_labels([H1 | T], [H2 | R]) :-
H1 = label('Owner-Review-Vote', may(_)), !,
H2 = label('Owner-Review-Vote', need(_)),
change_find_owners_labels(T, R).
change_find_owners_labels([H | T], [H | R]) :-
change_find_owners_labels(T, R).
```
* With [predefined Gerrit Prolog Facts](
https://gerrit-review.googlesource.com/Documentation/prolog-change-facts.html),
any project, branch, or user can be matched
and added to the `opt_out_find_owners`
or `opt_in_find_owners` rules.
* If the `submit_filter` output contains
`label('Owner-Review-Vote', need(_))`,
the Gerrit change cannot be submitted.
* For a simpler configuration without opt-out projects,
just call `find_owners:submit_filter`
and `change_find_owners_labels`.
## Global vs Project Variables
In the AOSP example, we saw that some variables are defined in global
`gerrit.config` and some are defined in project-specific `project.config`
files. The Prolog submit rules are defined in the `rules.pl` files of
each project. The following is a summary of all user-configurable
variables for this plugin.
* Global variables must be defined in `gerrit.config`:
* `enabled` should be true to enable this plugin.
Note that this variable enables the UI `[FIND OWNERS]`
button but not yet the submit rules and upload validator.
* `maxCacheAge` has default value 0, meaning no cache.
All CLs for one Gerrit site share the same cache of
owners info, which will stay in cache for up to `maxCacheAge`
seconds.
* `maxCacheSize` has default value 1000. When `maxCacheAge` is non-zero,
up to `maxCacheSize` owner info objects will be stored in the cache.
* `minOwnerVoteLevel` has default value 1. It means that when owner
approval check is enabled, every changed file needs at least one
owner's `Code-Review` +1 vote. This variable can be defined to 2 to
require owner's +2 `Code-Review` votes.
* `addDebugMsg` has default value false. When it is defined to true,
the find-owners REST API will add extra debug messages by default
in the returned JSON object.
* Project variables should be defined in `project.config`
of the `All-Projects` project and inherited by all other projects,
or they can be defined in each individual project.
* `rejectErrorInOwners` has default value false. When it is true,
an *upload-validator* will check all new and changed OWNERS files
and reject the upload when any syntax error is found. If any owner
email address in an OWNERS file is not found on the Gerrit site,
it will also be considered an error and the upload will be rejected.
* `ownersFileName` has default value "OWNERS". It can be defined to
a different name such as "OWNERS.android" if "OWNERS" files already
exist for another purpose.
## Submit Rules and Filters
To enforce the *owner-approval-before-submit* rule, this plugin provides
**`find_owners:submit_rule/1`** and **`find_owners:submit_filter/2`**
predicates for Gerrit projects.
If a Gerrit project wants to enforce this *owner-approval* policy,
it can add a `submit_rule` to the [`rules.pl` file](
https://gerrit-review.googlesource.com/Documentation/config-project-config.html#file-rules_pl)
in the `refs/meta/config` branch like this:
```prolog
submit_rule(S) :- find_owners:submit_rule(S).
```
If many projects need this *owner-approval* policy,
each of them can have a `submit_rule` defined, or we can simply
define a `submit_filter` in their common parent project's
`rules.pl` file like this:
```prolog
submit_filter(In, Out) :- find_owners:submit_filter(In, Out).
```
As we saw in the AOSP example, it is much easier to use only the `submit_filter`
in the `All-Projects` project to check owner approval for all projects.
If any project or branch need to opt-out of this check, simple Prolog rules can
be defined to skip them, see the `opt_out_find_owners` rule in the AOSP example.
By default the `find_owners:submit_rule` calls `gerrit:default_submit`,
and the `find_owners:submit_filter` passes `In` to `Out`.
They add special labels to the output to indicate if *owner* approval
is needed or missing.
* If a change does not need owner approval, `label('Owner-Approved', may(_))`
is added. This is an *optional* requirement that does not affect
a change's submittability.
* If a change needs owner approval, and all changed files have at least one
*owner* voted +1 and no negative vote,
`label('Owner-Approved', ok(user(1)))` is added.
* If a change needs owner approval, but some changed file has no *owner*
+1 vote or has negative *owner* vote,
`label('Owner-Review-Vote', may(_))` is added.
This will show the label but not disable the Submit button.
When a user clicks on the Submit button,
a window will pop up and ask the user to
(1) add missing *owners* to the reviewers list and/or
ask for owner's +1 Code-Review votes, or
(2) add `Exempt-From-Owner-Approval:` to the commit message.
The **`[FIND OWNERS]`** button is useful in this situation to find
the missing *owners* or +1 votes of any changed files.
When `label('Owner-Approved', may(_))` is added to the submit rule output,
Gerrit displays a grey 'Owner-Approved' label. To avoid confusion,
this `may(_)` state label could be removed by the `submit_filter` of
the root level `All-Projects`.
See the `change_find_owners_labels` rule in the AOSP example.
## Exempt from Owner Approval
A change can be declared as exempt from owner approval in the submit message,
with a special keyword `Exempt-From-Owner-Approval:` followed by some
explanation.
As shown in the AOSP example, special Prolog rules like `opt_out_find_owners`
can be used to skip `find_owners:submit_filter` for any project, branch, or user.
For example, special automerge processes could create changes
that do not need either Code-Review vote or owner approval.
## Minimal Owner Code-Review Vote
When `find_owners:submit_rule(S)` or `find_owners:submit_filter(In,Out)`
are applied, the default requirement is **+1** Code-Review
vote from at least one owner of every changed file.
To change this default level, define the plugin `minOwnerVoteLevel` parameter.
## OWNERS File Name
This plugin finds owners in default OWNERS files.
If a project has already used OWNERS files for other purpose,
the `ownersFileName` parameter can be used to change the default.
If ownersFileName is defined to something other than `OWNERS`,
the project should have such a specified file at the root directory.
Otherwise it would be considered a configuration or Gerrit server error.
## OWNERS Upload Validator
To check syntax of OWNERS files before they are uploaded,
set the following variable in `project.config` files.
```bash
[plugin "find-owners"]
rejectErrorInOwners = true
```
## More Prolog Examples
### Call `submit_filter/2`
The simplest configuration adds to `rules.pl` of the root
`All-Projects` project.
```prolog
submit_filter(In, Out) :- find_owners:submit_filter(In, Out).
```
All projects will need at least +1 Code-Review vote from an owner of every changed files.
### Call `submit_rule/2`
To enabled owner approval requirement only for a project,
add the following to its `rules.pl`.
This example also changes the default and require **+2** owner Code-Review votes.
```prolog
submit_rule(S) :- find_owners:submit_rule(S, 2).
```
### Call `submit_filter/3`
To enabled owner approval requirement only for child projects,
add the following to `rules.pl`.
This example explicitly define the required owner Code-Review vote level to 1.
```prolog
submit_filter(In, Out) :- find_owners:submit_filter(In, Out, 1).
```
### Call `remove_may_label/2`
If a change does not need *owner approval*, the *optional* greyed out
`Owner-Approved` label might cause some confusion.
To remove that label, we can call `remove_may_label` at the end of all
`find_owners` submit filters, in `rules.pl` of the `All-Projects` project.
```prolog
submit_filter(In, Out) :-
find_owners:submit_filter(In, Temp),
find_owners:remove_may_label(Temp, Out).
```
### Call `remove_need_label/2`
To make all changes with some special property,
e.g., from the auto merger, exempt from owner approval,
we can add a special filter to `rules.pl` of the root `All-Projects` project.
```prolog
submit_filter(In, Out) :-
opt_out_find_owners, % define-your-own-rule
find_owners:remove_need_label(In, Out).
```
Please review the AOSP example again for more choices to opt-in or opt-out
of the find-owners submit filter.