

# Commit message style

Commit message bodies and summaries are limited to 72 characters wide to
improve readability, and should be prefixed with the name of the module that the
commit is affecting. The commits should describe what is changed, and why. When
writing long commit messages, consider whether the content should go in the
documentation or code comments instead. For example:

```
rust/bt-gatt: Short capitalized description
Details about the change here. Include a summary of what changed, and a clear
description of why the change is needed. Consider what parts of the commit
message are better suited for documentation or code.
 - Add foo to fix issue bar
 - Improve speed of qux
 - Refactor and extended qux's test suite
```

# Include both "what" and "why"

It is important to include a "why" component in most commits. Sometimes, why is
evident - for example, reducing memory usage, optimizing, or fixing a bug.
Otherwise, err on the side of over-explaining why, not under-explaining why.
When adding the "why" to a commit, also consider if that "why" content should go
into the documentation or code comments.

```
rust/bt-common: Add debug formatting
 Print the services in a human-readable format.
 This makes debugging and handling the services much easier, and will allow
 for quick glancing.
 Though this costs performance, several bugs that went unnoticed would have
 been caught by turning this on earlier. Take the small hit by default to
 better catch issues going forward; see extended docs for details.
```
# Present imperative

Use present imperative style instead of passive descriptive.

```
rust/bt-vcs: Add volume changed event
```
instead of
```
rust/bt-vcs: Adds volume changed event
```

# Documentation instead of commit content

Consider whether any of the commit message content should go in the
documentation or code comments and have the commit message reference it.
Documentation and code comments are durable and discoverable; commit messages
are rarely read after the change lands.

# Lists instead of paragraphs

Use bulleted lists when multiple changes are in a single CL. Ideally, try to
create smaller CLs so this isn't needed, but larger CLs are a practical reality.

```
rust/bt-pacs: Add more capablities

Add the suite of capabilities added in the new spec.
 - Foo capability
 - Bar format
```

# Subject line

The subject line (first line of the commit) should take the form ``<module>:
Short description``. The module should not be capitalized, but the description
should (unless the first word is an identifier).
It should not include a trailing period.

## Multiple modules

Sometimes it is necessary to change code across multiple modules.
 1. **2-5 modules**: Use ``{}`` syntax shown below
 1. **>5 modules changed** - Omit the module names entirely
 1. **Changes mostly in one module** - If the commit mostly changes the
   code in a single module with some small changes elsewhere, only list the
   module receiving most of the content

For example, for 2 modules:
```
bt-{gatt, vcs}: Update names
```

# Footer

We encourage a number of [git footers](https://commondatastorage.googleapis.com/chrome-infra-docs/flat/depot_tools/docs/html/git-footers.html)
in the commit message, such as `Bug:
123` in the message below:

```
bt-gatt: Add foo and bar functions

Bug: 123
```

The footer syntax is described in the [git documentation]
(https://git-scm.com/docs/git-interpret-trailers). Note in particular that
multi-line footers are supported.

You are encouraged to use the following footers when appropriate:
* **`Bug`**: Associates this commit with a bug (issue in our bug tracker).
* **`Fixed`** or **`Fixes`**: Like `Bug`, but may automatically close the bug
  when submitted.
* **`Test`**: The author can use this field to tell the reviewer how the change
  was tested. Typically, this will be some combination of writing new automated
  tests, running automated tests, and manual testing.
  Note: descriptions of manual testing procedures belong in module
  documentation, not in the commit message. Use the `Test` field to attest
  that tests were carried out, not to describe the procedures in detail.

