| # Defining Fuchsia package information with metadata files |
| |
| ## Introduction |
| |
| Fuchsia's Gerrit installation has support for custom structured metadata files. |
| These files are designed to be: |
| |
| * _human-readable_ and provide useful information such as the name, description |
| and canonical URL of a package |
| * _machine-readable_ by having the files be defined using a standard format, and |
| so can be used by automated systems for things like automatically adding |
| reviewers to CLs or find bug components that alerting systems should file |
| issues against |
| |
| Currently, the only automated use for metadata files is for automatically adding |
| reviewers to CLs and emailing notifications when CLs are added/submitted. These |
| are described in the [Presubmits](#presubmits) section. |
| |
| Metadata files only apply to first-party code. |
| |
| ## Format |
| |
| Metadata files are: |
| |
| * named `METADATA.textproto` |
| * specified using [Protocol Buffers version |
| 3](https://protobuf.dev/programming-guides/proto3/) |
| * written using the [Protocol Buffer Text Format Language |
| Specification](https://protobuf.dev/reference/protobuf/textformat-spec/) |
| |
| The metadata message types are as follows: |
| |
| ```proto |
| syntax = "proto3"; |
| |
| // This proto is located at |
| // https://github.com/googleapis/googleapis/blob/master/google/type/date.proto |
| import "google/type/date.proto"; |
| |
| // IssueTracker contains the project configuration for the Google |
| // Issue Tracker. |
| message IssueTracker { |
| int64 component_id = 1; |
| } |
| |
| message Tracker { |
| repeated IssueTracker issue_tracker = 2; |
| // for_automation defines whether this tracker should be used by automated |
| // processes (e.g. alerts). |
| bool for_automation = 3; |
| } |
| |
| message Presubmit { |
| repeated string review_notify = 1; |
| repeated string auto_reviewers = 2; |
| } |
| |
| message Metadata { |
| // name is the name of the API/Package/Program. |
| string name = 1; |
| string description = 2; |
| // url points to some documentation/landing page. |
| string url = 3; |
| // Date this metadata was last reviewed by a human. |
| google.type.Date last_reviewed_date = 4; |
| repeated Tracker trackers = 5; |
| // presubmits are used for defining presubmits. |
| // The field is marked repeated for future expansion, but only |
| // one message should be used. |
| repeated Presubmit presubmits = 6; |
| } |
| ``` |
| |
| Here is a fake example of a metadata file: |
| |
| ``` |
| name: "Fuchsia source code automation" |
| description: "A binary for automating source code gardening tasks" |
| url: "https://fuchsia.dev" |
| last_reviewed_date: { |
| year: 2022 |
| month: 1 |
| day: 23 |
| } |
| trackers: { |
| issue_tracker: { |
| component_id: 1478090 |
| } |
| } |
| |
| presubmits: { |
| auto_reviewers: "frodo@example.com" |
| |
| review_notify: "sauron@example.com" |
| review_notify: "gandalf@example.com" |
| } |
| ``` |
| |
| ## Multiple metadata files |
| |
| To support large repositories that contain multiple distinct projects, multiple |
| `METADATA.textproto` files may be used throughout the file tree. Metadata files |
| apply to their own directory and all the directories below. |
| |
| ## Presubmits |
| |
| The `presubmit` field allows the specification of reviewers who should be |
| automatically added to each changelist as a reviewer (`auto_reviewers`) and |
| those who should be notified via email when a changelist has been |
| uploaded/submitted (`review_notify`). |
| |
| Here is an example hierarchy which contains multiple metadata files: |
| |
| ``` |
| ├── alice |
| │ ├── METADATA.textproto |
| │ └── README.md |
| ├── foo |
| │ └── bar |
| │ ├── baz |
| │ │ └── METADATA.textproto |
| │ │ └── server.go |
| │ └── METADATA.textproto |
| │ └── hello.rs |
| ├── METADATA.textproto |
| └── README.md |
| ``` |
| |
| Reviewers specified in `/METADATA.textproto` are added/notified whenever there |
| is a change to any file in the entire repository. Reviewers in |
| `/foo/bar/METADATA.textproto` apply to anything in the `/foo/bar` directory, as |
| well as the child directory `/foo/bar/baz`. Reviewers in |
| `/foo/bar/baz/METADATA.textproto` only apply to files edited in the |
| `/foo/bar/baz/` directory. |
| |
| ## Relationship to other files |
| |
| Metadata files have no relationship to other files, such as [`OWNERS`](owners.md) (used to specify the owners of directories) or [`README.fuchsia`](third-party-metadata.md) (used for defining metadata for third-party code). |