# Release cycle
When the code in the `master` branch is considered to be stable, a release can
be made. This is the procedure:

1. Tag the last commit with a version number (in the format `vx`, where x is the
extension's [version number](https://developer.chrome.com/extensions/manifest/version)
for that release) by running `bash tagRelease.bash --version vx`. Note that the
tag must be pushed to Gerrit after being created.
1. Sync the features with the TWPT-server via the `syncfeatures` command. (e.g.
`cat src/common/optionsPrototype.json5 | json5 | syncfeatures --grpcEndpoint __ENTER_ENDPOINT__ --jwt __ENTER_JWT__`).
1. [Build the extension](build.md) for both the stable and beta channels. This
will output a ZIP file for each release channel and each supported browser.

Afterwards, the release should be published in GitHub along with a changelog,
a notice should be published in the private extension Google Group, and the
release/build files must be submitted to the Chrome Web Store and
addons.mozilla.org.

## Create release at GitHub
1. Go to https://github.com/avm99963/infinitegforums/releases.
2. Click the newly created tag and click **Edit tag**.
3. Fill in the description with the changelog. You can use this as a template:
``` md
## Changes

**Complete git changelog:**
https://gerrit.avm99963.com/plugins/gitiles/infinitegforums/+log/refs/tags/{previous_version}..refs/tags/{new_version}?pretty=full

### Summary of changes:

- abcdef0 Commit example 1

  This is a description of the commit, which explains more about what it does.

  Fixes: #42

- 41d1aff Convert dark mode to green mode
- 52dbca8 Introduce lollipops

  **Note:** This feature is not yet ready for launch and not available yet
  inside the options section.
```
4. Upload the Chromium stable and Gecko stable release files (alternatively
upload the Chromium beta and Gecko stable packages and mark the release as a
pre-release if there is no intention of promoting this release to stable in the
future).

## Submitting to the Chrome Web Store
1. [Upload both release files](https://developer.chrome.com/webstore/publish#upload-your-item)
to the Chrome Web Store, one for each release channel.

   You can use the following links: [[stable]](http://go/twpt-cwsd-stable),
   [[beta]](http://go/twpt-cwsd-beta) (internal-only).

2. [Submit both releases](https://developer.chrome.com/webstore/publish#submit-your-item-for-publishing)
to be reviewed by the Chrome Web Store team, but in the case of the stable
channel uncheck the "Publish automatically after it has passed review" option.

## Submitting to addons.mozilla.org
The procedure is similar to the one with the Chrome Web Store, except for the
fact that the stable version is directly uploaded to the store.

You can upload the new version using the following link:
https://addons.mozilla.org/en-US/developers/addon/tw-power-tools/versions/submit/.

In the "notes to reviewer", add the following message:

```
For instructions on how to build the extension:

- Set up your environment: https://gerrit.avm99963.com/plugins/gitiles/infinitegforums/+/HEAD/docs/developers/set_up.md
- Build the extension: https://gerrit.avm99963.com/plugins/gitiles/infinitegforums/+/HEAD/docs/developers/build.md

(These files are also included inside the source code ZIP)
```

## Promoting the beta release to stable
After the beta release is reviewed and approved by Google, the following should
be done:

1. Test again the extension by using the beta channel. Check if the options have
been transfered correctly from version to version, and wait some days (for
instance between 3 and 5 days) to see if other people report issues with the
updated version.
2. If everything goes well, publish the update in the stable channel. The
updated version should have already been reviewed by the Chrome Web Store team
at this time.

If during this process the release wasn't approved by Google or an issue was
found during beta testing, a new release which fixes this should be created and
the previous stable update should be canceled and superseded by the new release.
