# Rust in Mercurial

Contents

- Word of Caution
- Compatibility
- Features
- Checking for Rust
- Installing
  - Using pip
  - Using pipx
  - Using uv tool
  - From your distribution
  - From source
- MSRV
- rhg
- Contributing

Mercurial can be augmented with Rust extensions for speeding up certain operations.

# Word of Caution

Using the Rust extension might result in the use of various repository formats that are not supported by non-Rust mercurial. When using a Mercurial without Rust support on the same repositories, you might need to downgrade your repository formats and/or activate cripplingly slow paths for compatibility. For details, see:

> - `hg help config.format.use-persistent-nodemap`
> - `hg help config.format.use-dirstate-v2`

In addition, while the tests are run with the Rust code, there might be subtle undetected divergences from the historical non-Rust code. So keep your eyes open and report any oddity. Rust is not considered a first class citizen to the project yet.

# Compatibility

Though the Rust extensions are only tested by the project under Linux, users of MacOS, FreeBSD and other UNIX-likes have been using the Rust extensions. Your mileage may vary, but by all means do give us feedback or signal your interest for better support.

For compatibility with non-Rust version of Mercurial check the previous "Word of Caution" section.

No Rust extensions are available for Windows at this time.

# Features

The following operations are sped up when using Rust:

> - discovery of differences between repositories (pull/push)
> - nodemap (see `hg help config.format.use-persistent-nodemap`)
> - all commands using the dirstate (status, commit, diff, add, update, etc.)
> - dirstate-v2 (see `hg help config.format.use-dirstate-v2`)
> - iteration over ancestors in a graph

More features are in the works, and improvements on the above listed are still in progress. For more experimental work see the "rhg" section.

# Checking for Rust

You may already have the Rust extensions depending on how you install Mercurial:

    $ hg debuginstall | grep -i rust
    checking Rust extensions (installed)
    checking module policy (rust+c-allow)

If those lines don't even exist, you're using an old version of hg which does not have any Rust extensions yet.

# Installing

You will need cargo to be in your $PATH. See the "MSRV" section for which version to use.

## Using pip

Users of pip can install the Rust extensions with the following commands:

    $ pip cache remove mercurial
    $ pip install mercurial -v \
          --config-settings --global-option=--rust \
          --no-binary mercurial --force

pip cache remove and --no-binary are there to tell pip to not use the pre-compiled wheels that are missing rust support. This might take a couple of minutes because you're compiling everything.

See the "Checking for Rust" section to see if the install succeeded.

## Using pipx

Using pipx is an efficient way to get an isolated installation of mercurial available for a user or globally.

> $ pipx install mercurial
>   --pip-args '--no-cache-dir --config-settings --global-option=--rust --no-binary=mercurial'

You can then add extensions to that install using

> $ pipx inject mercurial hg-foo

## Using uv tool

Using uv tool is another efficient way to get an isolated installation of mercurial available for a user or globally.

> $ uv tool install mercurial
>   --no-binary=mercurial --no-cache --config-setting=--build-option=--rust

You can bring extensions along using the --with flag. For example

> $ uv tool install mercurial --with hg-evolve [...]

## From your distribution

Some distributions are shipping Mercurial with Rust extensions enabled and pre-compiled (meaning you won't have to install cargo), or allow you to specify an install flag. Check with your specific distribution for how to do that, or ask their team to add support for hg+Rust!

## From source

Please refer to the rust/README.md file in the Mercurial repository for instructions on how to install from source.

# MSRV

The minimum supported Rust version is defined in rust/clippy.toml. The project's policy is to keep it at or below the version from Debian testing, to make the distributions' job easier.

# rhg

There exists an experimental pure-Rust version of Mercurial called rhg with a fallback mechanism for unsupported invocations. It allows for much faster execution of certain commands while adding no discernable overhead for the rest.

The only way of trying it out is by building it from source. Please refer to rust/README.md in the Mercurial repository.

See hg help config.rhg for configuration options.

# Contributing

If you would like to help the Rust endeavor, please refer to rust/README.md in the Mercurial repository.