This document outlines processes regarding management of rustfmt.

# Stabilising an Option

In this Section, we describe how to stabilise an option of the rustfmt's configuration.

## Conditions

- Is the default value correct ?
- The design and implementation of the option are sound and clean.
- The option is well tested, both in unit tests and, optimally, in real usage.
- There is no open bug about the option that prevents its use.

## Steps

Open a pull request that closes the tracking issue. The tracking issue is listed beside the option in `Configurations.md`.

- Update the `Config` enum marking the option as stable.
- Update the `Configuration.md` file marking the option as stable.
- Update `CHANGELOG.md` marking the option as stable.

## After the stabilisation

The option should remain backward-compatible with previous parameters of the option. For instance, if the option is an enum `enum Foo { Alice, Bob }` and the variant `Foo::Bob` is removed/renamed, existing use of the `Foo::Bob` variant should map to the new logic. Breaking changes can be applied under the condition they are version-gated.

# Make a Release

## 0. Update CHANGELOG.md

## 1. Update Cargo.toml and Cargo.lock

For example, 1.0.0 -> 1.0.1:

```diff
-version = "1.0.0"
+version = "1.0.1"
```

## 2. Push the commit to the main branch

E.g., https://github.com/rust-lang/rustfmt/commit/5274b49caa1a7db6ac10c76bf1a3d5710ccef569

## 3. Create a release tag

```sh
git tag -s v1.2.3 -m "Release 1.2.3"
```

## 4. Publish to crates.io

`cargo publish`

## 5. Create a PR to rust-lang/rust to update the rustfmt submodule
