Rust in Mercurial
"""""""""""""""""

    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.
    
    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.rst` 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.rst` 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.rst`
    in the Mercurial repository.