blob: a5357884866459305749064343e011c5b6485bea [file] [log] [blame] [view]
OWNERS File Syntax
==================
Owner approval is based on OWNERS files located in the same
repository and top of the _merge-to_ branch of a patch set.
### Syntax
```java
lines := (SPACE* line? SPACE* EOL)*
line := comment
| noparent
| ownerEmail
| "per-file" SPACE+ globs SPACE* "=" SPACE* owners
| include projectFile
include := "include" SPACE+
| "file:" SPACE*
projectFile := (project SPACE* ":" SPACE*)? filePath
comment := "#" ANYCHAR*
noparent := "set" SPACE+ "noparent"
ownerEmail := email
| "*"
owners := noparent
| "file:" SPACE* projectFile
| ownerEmail (SPACE* "," SPACE* ownerEmail)*
globs := glob (SPACE* "," SPACE* glob)*
glob := [a-zA-Z0-9_-*?.]+
email := [^ @]+@[^ #]+
project := a Gerrit project name without space or colon character
filePath := a file path name without space or colon character
ANYCHAR := any character but EOL
EOL := end of line characters
SPACE := any white space character
```
* An OWNERS file can include another file with the `include filePath`
or `include project:filePath` line.
When the `project:` is not specified, the OWNERS file's project is used.
The included file is given with the `filePath`.
* If the filePath starts with "/", it is an absolute path starting from
the project root directory. Otherwise, the filePath is added a prefix
of the current including file directory and then searched from the
(given) project root directory.
* The `file: ...` statement is similar to `include ...`
* To be compatible to Google's old OWNERS `file:` directive,
the `file: ...` statement ignores the `per-file ...` and
`set noparent` lines in the directly or indirectly included files.
The `include ...` statement takes all statements in the
directly included file.
* The `include ...` statement is more general and should be
used in new OWNERS files.
* Google's `file: <file>` directive only includes files
in the same repository. The syntax does not accept a
"project path" like the `include ...` statement.
* Google's `file: <file>` directive requires the include file
to have a name with the 'OWNERS' substring,
but `include ...` statement can include any file.
* Recursive inclusion (loop) is an error, which is detected
and logged as a run-time error. The inclusion is then ignored.
* Repeated inclusion (non-loop) is allowed but redundant.
The effect is similar to duplicated statements in an OWNERS file.
* An OWNERS file inherits rules in OWNERS files of parent directories
by default, unless `set noparent` is specified.
Note that when a file is included into other files,
it does not inherit rules in its parent directory's OWNERS files.
* A "glob" is UNIX globbing pathname without the directory path.
* `per-file globs = owners` applies `owners` only to files
matching any of the `globs`. Number of globs does not need to be equal
to the number of `ownerEmail` in `owners`.
* `per-file globs = set noparent` is like `set noparent` but applies only to
files matching any of the `globs`. OWNERS files in parent directories
are not considered for files matching those globs. Even default ownerEmails
specified in the current OWNERS file are not included.
* Without the `per-file globs = set noparent`, all non-per-file
ownerEmails also apply to files matching those globs.
* `per-file globs = file: <projectFile>` is equivalent to
`per-file globs = emails`, where the emails are collected
from top-level emails collected from `file: <projectFile>`.
* The email addresses should belong to registered Gerrit users.
A group mailing address can be used as long as it is associated to
a Gerrit user account.
* The `*` is a special ownerEmail meaning that
any user can approve that directory or files.
### Examples
```bash
# A comment starts with # to EOL; leading spaces are ignored.
# Empty lines are ignored.
set noparent # Do not inherit owners defined in parent directories.
# By default, parent directories are searched upwardly, and all
# found OWNERS files are included until a "set noparent" is found.
include P1/P2:/core/OWNERS # include file core/OWNERS of project P1/P2
include ../base/OWNERS # include <this_owner_file_dir>/../base/OWNERS
include /OWNERS # include OWNERS at root directory of this repository
per-file *.c, *.cpp = x@g.com, y@g.com, z@g.com
# x@, y@ and z@ are owners of all *.c or *.cpp files
per-file *.c = c@g.com
# c@, x@, y@ and z@ are owners of all *.c files
per-file *.xml,README=*,x@g.com
# in additional to x@g.com, anyone can be owner for *.xml and README files
abc@g.com # one default owner
xyz@g.com # another default owner
# abc@ and xyz@ are owners for all files in this directory,
# including *.c, *.cpp, *.xml, and README files
per-file *.txt,*.java = set noparent
per-file *.txt,*.java = jj@g.com
# Only jj@g.com is the owner of *.txt and *.java files,
# not even abc@g.com or xyz@g.com
```