# Backends

The following code owner backends are supported:

* [find-owners](backend-find-owners.html):
  Code owner backend that supports the syntax of the
  [find-owners](https://gerrit-review.googlesource.com/admin/repos/plugins/find-owners)
  plugin.
* [proto](backend-proto.html):
  Code owner backend that supports a proto-based syntax. The proto syntax is not
  final yet and backwards incompatible changes are likely to happen. This is why
  this backend is experimental for now and should not be used in production.

Which backend is used can be
[configured](setup-guide.html#configureCodeOwnersBackend) globally, per
repository or per branch.

## <a id="codeOwnerConfigFiles">Code owner config files

Code owner config files are stored in the source tree of the repository and
define the [code owners](user-guide.html#codeOwners) for a path.

The code owners that are defined in a code owner config file apply to the
directory that contains the code owner config file, and all its subdirectories
(except if a subdirectory contains a code owner config file that disables the
inheritance of code owners from the parent directories).

In which files code owners are defined depends on the configured code owner
backend:

| Backend       | Primary code owner config files |
| ------------- | ------------------------------- |
| `find-owners` | `OWNERS`                        |
| `proto`       | `OWNERS_METADATA`               |

In addition, there can be secondary code owner config files, which may be
imported into other code owner config files. These files have no effect on their
own, but only when they are directly or indirectly imported into a primary code
owner config file.

| Backend       | Secondary code owner config files                         |
| ------------- | --------------------------------------------------------- |
| `find-owners` | `<prefix>_OWNERS`, `OWNERS_<extension>`                   |
| `proto`       | `<prefix>_OWNERS_METADATA`, `OWNERS_METADATA_<extension>` |

For "`<prefix>`" and "`<extension>`" only strings are allowed that match with
"`([A-Za-z0-9_-])+`".

Primary and secondary code owner config files are [validated](validation.html)
by the `@PLUGIN@` plugin when they are changed to ensure that they are always
parsable and valid.

By configuring a [file extension](config.html#codeOwnersFileExtension) for code
owner config files it is possible to use **a different set of code owner config
files**:

| Backend       | Primary code owner config files | Secondary code owner config files |
| ------------- | ------------------------------- | --------------------------------- |
| `find-owners` | `OWNERS.<configured-file-extension>` | `<prefix>_OWNERS.<configured-file-extension>`, `OWNERS_<extension>.<configured-file-extension>` |
| `proto`       | `OWNERS_METADATA.<configured-file-extension>` | `<prefix>_OWNERS_METADATA.<configured-file-extension>`, `OWNERS_METADATA_<extension>.<configured-file-extension>` |

In this case only the primary and secondary code owner config files with the
configured file extension are considered as code owner config files. This means
code owner config files without file extension or with other file extensions are
not interpreted and also not validated.

Configuring a file extension for code owner config files is useful if a
repository is forked and the fork should use a different set of code owner
config files than the upstream repository. For this use case it is important
that the code owner config files from the upstream repository are not validated,
as they may use a different syntax or reference non-resolvable accounts, and
hence would always be detected as invalid.

As some projects want to allow arbitrary file extensions for code owner config
files, it is possible to enable arbitrary file extensions for code owner config
files by [configuration](config.html#codeOwnersEnableCodeOwnerConfigFilesWithFileExtensions).
If arbitrary file extensions are enabled, the following files are consideres as
secondary code owner config files **in addition** to the once described above:

| Backend       | Additional secondary code owner config files              |
| ------------- | --------------------------------------------------------- |
| `find-owners` | `OWNERS.<arbitrary-file-extension>`                       |
| `proto`       | `OWNERS_METADATA.<arbitrary-file-extension>`              |

With this setup code owner config files with any file extension are validated.

**NOTE:** Enabling arbitrary file extensions for code owner config files
conflicts with configuring a certain file extension for code owner config files
in order to ignore upstream code owner config files, as in this case the
upstream code owner config files should not be validated. This is why arbitrary
file extensions should not be enabled if a certain file extension for code owner
config files was already configured.

**NOTE:** Code owner config files can only import other code owner config files,
but not arbitrary files. This ensures that code owner config files only import
files that have gone through validation and hence are known to be valid. If
arbitrary files could be imported, the imported files may not be parsable since
they were not validated. As a result of this, looking up code owners could
break, which would block submission of all changes for which the invalid file is
relevant. This would likely be considered as a serious outage, hence importing
arbitrary files is disallow so that this cannot happen.

---

Back to [@PLUGIN@ documentation index](index.html)

Part of [Gerrit Code Review](../../../Documentation/index.html)
