| 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 |
| ``` |