270 lines
9.7 KiB
Markdown
270 lines
9.7 KiB
Markdown
# Contributing to Matter (formerly Project CHIP)
|
||
|
||
Want to contribute? Great! First, read this page (including the small print at
|
||
the end). By submitting a pull request, you represent that you have the right to
|
||
license your contribution to the Connectivity Standards Alliance and the
|
||
community, and agree by submitting the patch that your contributions are
|
||
licensed under the [Apache 2.0 license](./LICENSE). Before submitting the pull
|
||
request, please make sure you have tested your changes and that they follow the
|
||
project guidelines for contributing code.
|
||
|
||
# Contributing as an Open Source Contributor
|
||
|
||
As an open source contributor you can report bugs and request features in the
|
||
[Issue Tracker](https://github.com/project-chip/connectedhomeip/issues), as well
|
||
as contribute bug fixes and features that do not impact Matter specification as
|
||
a pull request. For example: ports of Matter to add APIs to alternative
|
||
programming languages (e.g. Java, JS), hardware ports, or an optimized
|
||
implementation of existing functionality. For features that impact the
|
||
specification, please join Matter work group within the Connectivity Standards
|
||
Alliance. The requirements to become an open source contributor of the
|
||
[Matter Repository](https://github.com/project-chip/connectedhomeip) are:
|
||
|
||
- Agree to the [Code of Conduct](./CODE_OF_CONDUCT.md)
|
||
- Agree to the [License](./LICENSE)
|
||
- Have signed the
|
||
[Matter Working Group CLA](https://gist.github.com/clapre/65aa9fc63981da765039e0bb7e8701be)
|
||
|
||
# Contributing as a Connectivity Standards Alliance Matter Working Group Member
|
||
|
||
As a participant of the Connectivity Standards Alliance Matter Working Group,
|
||
you can attend Working Group meetings, propose changes to the Matter
|
||
specification, and contribute code for approved updates to the specification.
|
||
The requirements to become a member of the
|
||
[Matter Repository](https://github.com/project-chip/connectedhomeip) are:
|
||
|
||
- Must be a [Participant member](http://www.zigbeealliance.org/join) or higher
|
||
of the Connectivity Standards Alliance
|
||
- Must be a Matter Working Group member
|
||
- Have signed the Alliance Matter Working Group CLA
|
||
- Have approval from your company's official approver
|
||
|
||
# Bugs
|
||
|
||
If you find a bug in the source code, you can help us by
|
||
[submitting a GitHub Issue](https://github.com/project-chip/connectedhomeip/issues/new).
|
||
The best bug reports provide a detailed description of the issue and
|
||
step-by-step instructions for predictably reproducing the issue. Even better,
|
||
you can
|
||
[submit a Pull Request](https://github.com/project-chip/connectedhomeip/blob/master/CONTRIBUTING.md#submitting-a-pull-request)
|
||
with a fix.
|
||
|
||
# New Features
|
||
|
||
You can request a new feature by
|
||
[submitting a GitHub Issue](https://github.com/project-chip/connectedhomeip/issues/new).
|
||
If you would like to implement a new feature, please consider the scope of the
|
||
new feature:
|
||
|
||
- _Large feature_: first
|
||
[submit a GitHub Issue](https://github.com/project-chip/connectedhomeip/issues/new)
|
||
and communicate your proposal so that the community can review and provide
|
||
feedback. Getting early feedback will help ensure your implementation work
|
||
is accepted by the community. This will also allow us to better coordinate
|
||
our efforts and minimize duplicated effort.
|
||
- _Small feature_: can be implemented and directly
|
||
[submitted as a Pull Request](https://github.com/project-chip/connectedhomeip/blob/master/CONTRIBUTING.md#submitting-a-pull-request).
|
||
|
||
# Contributing Code
|
||
|
||
Matter follows the "Fork-and-Pull" model for accepting contributions.
|
||
|
||
### Initial Setup
|
||
|
||
Setup your GitHub fork and continuous-integration services:
|
||
|
||
1. Fork the [Matter repository](https://github.com/project-chip/connectedhomeip)
|
||
by clicking "Fork" on the web UI.
|
||
|
||
2. All contributions must pass all checks and reviews to be accepted.
|
||
|
||
Setup your local development environment:
|
||
|
||
```bash
|
||
# Clone your fork
|
||
git clone git@github.com:<username>/connectedhomeip.git
|
||
|
||
# Configure upstream alias
|
||
git remote add upstream git@github.com:project-chip/connectedhomeip.git
|
||
```
|
||
|
||
### Submitting a Pull Request
|
||
|
||
#### Branch
|
||
|
||
For each new feature, create a working branch:
|
||
|
||
```bash
|
||
# Create a working branch for your new feature
|
||
git branch --track <branch-name> origin/master
|
||
|
||
# Checkout the branch
|
||
git checkout <branch-name>
|
||
```
|
||
|
||
#### Create Commits
|
||
|
||
```bash
|
||
# Add each modified file you'd like to include in the commit
|
||
git add <file1> <file2>
|
||
|
||
# Create a commit
|
||
git commit
|
||
```
|
||
|
||
This will open up a text editor where you can craft your commit message.
|
||
|
||
#### Upstream Sync and Clean Up
|
||
|
||
Prior to submitting your pull request, you might want to do a few things to
|
||
clean up your branch and make it as simple as possible for the original
|
||
repository's maintainer to test, accept, and merge your work.
|
||
|
||
If any commits have been made to the upstream master branch, you should rebase
|
||
your development branch so that merging it will be a simple fast-forward that
|
||
won't require any conflict resolution work.
|
||
|
||
```bash
|
||
# Fetch upstream master and merge with your repository's master branch
|
||
git checkout master
|
||
git pull upstream master
|
||
|
||
# If there were any new commits, rebase your development branch
|
||
git checkout <branch-name>
|
||
git rebase master
|
||
```
|
||
|
||
Now, it may be desirable to squash some of your smaller commits down into a
|
||
small number of larger more cohesive commits. You can do this with an
|
||
interactive rebase:
|
||
|
||
```bash
|
||
# Rebase all commits on your development branch
|
||
git checkout <branch-name>
|
||
git rebase -i master
|
||
```
|
||
|
||
This will open up a text editor where you can specify which commits to squash.
|
||
|
||
#### Push and Test
|
||
|
||
```bash
|
||
# Checkout your branch
|
||
git checkout <branch-name>
|
||
|
||
# Push to your GitHub fork:
|
||
git push origin <branch-name>
|
||
```
|
||
|
||
This will trigger the continuous-integration checks. You can view the results in
|
||
the respective services. Note that the integration checks will report failures
|
||
on occasion.
|
||
|
||
### Review Requirements
|
||
|
||
#### Documentation Best Practices
|
||
|
||
Matter uses Doxygen to markup (or markdown) all C, C++, Objective C, Objective
|
||
C++, Perl, Python, and Java code. Read our
|
||
[Doxygen Best Practices, Conventions, and Style](https://github.com/project-chip/connectedhomeip/blob/master/docs/style/DOXYGEN.adoc)
|
||
|
||
#### Submit Pull Request
|
||
|
||
Once you've validated the CI results, go to the page for your fork on GitHub,
|
||
select your development branch, and click the pull request button. If you need
|
||
to make any adjustments to your pull request, just push the updates to GitHub.
|
||
Your pull request will automatically track the changes on your development
|
||
branch and update.
|
||
|
||
#### Merge Requirements
|
||
|
||
- Github Workflows pass
|
||
- Builds pass
|
||
- Tests pass
|
||
- Linting passes
|
||
- Code style passes
|
||
|
||
When can I merge? After these have been satisfied, a reviewer will merge the PR
|
||
into master
|
||
|
||
#### Documentation
|
||
|
||
Documentation undergoes the same review process as code See the
|
||
[Documentation Style Guide](https://github.com/project-chip/connectedhomeip/blob/master/docs/STYLE_GUIDE.md)
|
||
for more information on how to author and format documentation for contribution.
|
||
|
||
## Merge Processes
|
||
|
||
Merges require at least 3 approvals from unique require-reviewers lists, and all
|
||
CI tests passing.
|
||
|
||
### Shorter Reviews
|
||
|
||
Development Lead & Vice Leads can merge a change with fewer then the required
|
||
approvals have been submitted.
|
||
|
||
A separate "fast track" label will be created that will only require a single
|
||
checkbox to be set, this label shall only be set by the Development Lead, and/or
|
||
Vice Lead (unless they’re both unavailable, in which case a replacement can be
|
||
temporarily appointed)
|
||
|
||
"Day" here means "business day" (i.e. PRs on friday do not get fast-tracked
|
||
faster).
|
||
|
||
### Fast track types
|
||
|
||
### Trivial changes
|
||
|
||
Small changes or changes that do not affect the main functionality of the code
|
||
can be fast tracked immediately. Examples:
|
||
|
||
- Adding/removing documentation (.md files)
|
||
- Adding tests (may include small reorganization/method adding/changes to
|
||
enable testability):
|
||
- certification tests
|
||
- stability tests
|
||
- integration tests
|
||
- functional tests
|
||
- Test scripts
|
||
- Additional tests following a pattern (e.g. YAML tests)
|
||
- Adding/updating/fixing tooling to aid in development
|
||
- Re-running code generation
|
||
- Code readability refactors:
|
||
- renaming enum/classes/structure members
|
||
- moving constant header location
|
||
- Obviously trivial build rule changes (e.g. adding missing files to build
|
||
rules)
|
||
- Changing comments
|
||
- Adding/removing includes (include what you need and only what you need
|
||
rules)
|
||
- Pulling new third-party repo files
|
||
- Platform vendors/maintainers adding platform features/logic/bug fixes to
|
||
their own platforms
|
||
- Most changes to existing docker files (pulling new versions, reorganizing)
|
||
- Most changes to new dockerfile version in workflows
|
||
|
||
#### Fast track changes
|
||
|
||
Larger functionality changes are allowed to be fast tracked with these
|
||
requirements/restrictions:
|
||
|
||
- Require at least 1 day to have passed since the creation of the PR
|
||
- Require at least 1 checkmark from someone familiar with the code or problem
|
||
space
|
||
- This requirement shall be dropped after a PR is 3 days old with stale or
|
||
no feedback.
|
||
- Code is sufficiently covered by automated tests (or impossible to
|
||
automatically test with a very solid reason for this - e.g. changes to BLE
|
||
parameters cannot be automatically tested, but should have been manually
|
||
verified)
|
||
|
||
Fast tracking these changes will involve resolving any obviously 'resolved'
|
||
comments (judgment call here: were they replied to or addressed) and merging the
|
||
change.
|
||
|
||
Any "request for changes" marker will always be respected unless obviously
|
||
resolved (i.e. author marked "requesting changes because of X and X was done in
|
||
the PR")
|
||
|
||
- This requirement shall be dropped after a PR is 3 days old with stale or no
|
||
feedback.
|