<!--
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->

# Committer Guide

This guide is for
[committers](https://www.apache.org/foundation/how-it-works.html#committers)
and covers Beam's guidelines for reviewing and merging code.

## Pull request review objectives

The review process aims for:

 - Review iterations should be efficient, timely and of quality (avoid tiny or
   out-of-context changes or huge mega-changes)
 - Support efficiency of authoring (don't want to wait on a review for a tiny
   bit because GitHub makes it very hard to stack up reviews in sequence /
   don't want to have major changes blocked because of difficulty of review)
 - Ease of first-time contribution (encourage to follow [contribution
   guildelines](/contribute/#contributing-code) but committer may absorb some
   extra effort for new contributors)
 - Pull requests and commit messages establish a clear history with purpose and
   origin of changes
 - Ability to perform a granular rollback, if necessary (also see
   [policies](/contribute/postcommits-policies/))

Granularity of changes:

 - We prefer small independent, incremental PRs with descriptive, isolated
   commits. Each commit is a single clear change
 - It is OK to keep separate commits for different logical pieces of the code,
   if they make reviewing and revisiting code easier
 - Making commits isolated is a good practice, authors should be able to
   relatively easily split the PR upon reviewer's request
 - Generally, every commit should compile and pass tests.
 - Avoid keeping in history formatting messages such as checkstyle or spotless
   fixes.  Squash such commits with previous one.

## Always get to LGTM ("Looks good to me!")

After a pull request goes through rounds of reviews and revisions, it will
become ready for merge. A reviewer signals their approval either by GitHub
"approval" or by a comment such as "Looks good to me!" (LGTM).

 - If the author of the pull request is not a committer, a committer must be
   the one to approve the change.
 - If the author of the pull request is a committer, approval from their chosen
   reviewer is enough. A committer is trusted to choose an appropriate
   reviewer, even if the reviewer is not a committer.

Once a pull request is approved, any committer can merge it.

Exceptions to this rule are rare and made on a case-by-case basis. A committer
may use their discretion for situations such as when the build is broken on the
main branch, blocking all code contributions. In this case, you should still
seek a review on the pull request!  A common acronym you may see is "TBR" --
"to be reviewed".

**Always go through a pull request, even if you won’t wait for the code
review.** Committers should never commit anything without going through a pull
request, even when it is an urgent fix or rollback due to build breakage.
Skipping pull request bypasses test coverage and could potentially cause the
build to fail, or fail to fix breakage.  In addition, pull requests ensure that
changes are communicated properly and potential flaws or improvements can be
spotted, even after the merge happens.

## Contributor License Agreement

If you are merging a larger contribution, please make sure that the contributor
has an ICLA on file with the Apache Secretary. You can view the list of
committers [here](https://home.apache.org/phonebook.html?unix=committers), as
well as [ICLA-signers who aren’t yet
committers](https://home.apache.org/unlistedclas.html).

For smaller contributions, however, this is not required. In this case, we rely
on [clause five](https://www.apache.org/licenses/LICENSE-2.0#contributions) of
the Apache License, Version 2.0, describing licensing of intentionally
submitted contributions.

## Tests

Before merging, please make sure that Jenkins tests pass, as visible in the
GitHub pull request. Do not merge the pull request if there are test failures.

If the pull request contains changes that call for extra test coverage, you can
ask Jenkins to run an extended test suite. For example, if the pull request
modifies a runner, you can run the full `ValidatesRunner` suite with a comment
such as "Run Spark ValidatesRunner". You can run the examples and some IO
integration tests with "Run Java PostCommit".

## Finishing touches

At some point in the review process, the change to the codebase will be
complete. However, the pull request may have a collection of review-related
commits that are not meaningful to preserve in the history. The reviewer should
give the LGTM and then request that the author of the pull request rebase,
squash, split, etc, the commits, so that the history is most useful:

 - Favor commits that do just one thing. The commit is the smallest unit of
   easy rollback; it is easy to roll back many commits, or a whole pull
   request, but harder to roll back part of a commit.
 - Commit messages should be descriptive and should reference the issue number
   that they address.  It should later not be necessary to find a merge commit or
   first PR commit to find out what caused a change.
 - Pull request descriptions should contain a link to the issue being addressed by the changes.
 - `CHANGES.md` file should be updated with noteworthy changes (e.g. new features, backward
   incompatible changes, dependency changes, etc.).
 - Squash the "Fixup!", "Address comments" type of commits that resulted from review iterations.

## Merging it!

While it is preferred that authors squash commits after review is complete,
there may be situations where it is more practical for the committer to handle
this (such as when the action to be taken is obvious or the author isn't
available).  The committer may use the "Squash and merge" option in Github (or
modify the PR commits in other ways).  The committer is ultimately responsible
and we "trust the committer's judgment"!

After all the tests pass, there should be a green merge button at the bottom of
the pull request. There are multiple choices. Unless you want to squash commits
as part of the merge (see above) you should choose "Merge pull request" and
ensure "Create a merge commit" is selected from the drop down.  This preserves
the commit history and adds a merge commit, so be sure the commit history has
been curated appropriately.

Do _not_ use the default GitHub commit message, which looks like this:

    Merge pull request #1234 from some_user/transient_branch_name

    [BEAM-7873] Fix the foo bizzle bazzle

Instead, pull it all into the subject line:

    Merge pull request #1234: [BEAM-7873] Fix the foo bizzle bazzle

If you have comments to add, put them in the body of the commit message.
