##// END OF EJS Templates
sidedatacopies: fast path data fetching if revision has no sidedata...
sidedatacopies: fast path data fetching if revision has no sidedata When using the side data mode, we know their won't be any copy information sidedata. Skipping revision restoration give an important speed boost. In the future, there will be other user of sidedata, reducing the efficiency of this. We should consider adding a dedicated flag in revlog V2 to preserve this optimisation. The current situation is good enough for now. revision: large amount; added files: large amount; rename small amount; c3b14617fbd7 9ba6ab77fd29 before: ! wall 2.401569 comb 2.400000 user 2.390000 sys 0.010000 (median of 10) after: ! wall 1.429294 comb 1.430000 user 1.410000 sys 0.020000 (median of 10) revision: large amount; added files: small amount; rename small amount; c3b14617fbd7 f650a9b140d2 before: ! wall 3.519140 comb 3.520000 user 3.470000 sys 0.050000 (median of 10) after: ! wall 1.963332 comb 1.960000 user 1.960000 sys 0.000000 (median of 10) revision: large amount; added files: large amount; rename large amount; 08ea3258278e d9fa043f30c0 before: ! wall 0.593880 comb 0.600000 user 0.590000 sys 0.010000 (median of 15) after: ! wall 0.251679 comb 0.250000 user 0.250000 sys 0.000000 (median of 38) revision: small amount; added files: large amount; rename large amount; df6f7a526b60 a83dc6a2d56f before: ! wall 0.013414 comb 0.020000 user 0.020000 sys 0.000000 (median of 220) after: ! wall 0.013222 comb 0.020000 user 0.020000 sys 0.000000 (median of 223) revision: small amount; added files: large amount; rename small amount; 4aa4e1f8e19a 169138063d63 before: ! wall 0.002711 comb 0.000000 user 0.000000 sys 0.000000 (median of 1000) after: ! wall 0.001631 comb 0.000000 user 0.000000 sys 0.000000 (median of 1000) revision: small amount; added files: small amount; rename small amount; 4bc173b045a6 964879152e2e before: ! wall 0.000077 comb 0.000000 user 0.000000 sys 0.000000 (median of 12208) after: ! wall 0.000078 comb 0.000000 user 0.000000 sys 0.000000 (median of 12012) revision: medium amount; added files: large amount; rename medium amount; c95f1ced15f2 2c68e87c3efe before: ! wall 0.410067 comb 0.410000 user 0.410000 sys 0.000000 (median of 23) after: ! wall 0.207786 comb 0.200000 user 0.200000 sys 0.000000 (median of 46) revision: medium amount; added files: medium amount; rename small amount; d343da0c55a8 d7746d32bf9d before: ! wall 0.097004 comb 0.090000 user 0.090000 sys 0.000000 (median of 100) after: ! wall 0.038495 comb 0.030000 user 0.030000 sys 0.000000 (median of 100) Differential Revision: https://phab.mercurial-scm.org/D7074

File last commit:

r35587:96421278 default
r43591:8a292526 default
Show More
README.rst
78 lines | 2.2 KiB | text/x-rst | RstLexer

Mercurial Rust Code

This directory contains various Rust code for the Mercurial project.

The top-level Cargo.toml file defines a workspace containing all primary Mercurial crates.

Building

To build the Rust components:

$ cargo build

If you prefer a non-debug / release configuration:

$ cargo build --release

Features

The following Cargo features are available:

localdev (default)

Produce files that work with an in-source-tree build.

In this mode, the build finds and uses a python2.7 binary from PATH. The hg binary assumes it runs from rust/target/<target>hg and it finds Mercurial files at dirname($0)/../../../.

Build Mechanism

The produced hg binary is bound to a CPython installation. The binary links against and loads a CPython library that is discovered at build time (by a build.rs Cargo build script). The Python standard library defined by this CPython installation is also used.

Finding the appropriate CPython installation to use is done by the python27-sys crate's build.rs. Its search order is:

  1. PYTHON_SYS_EXECUTABLE environment variable.
  2. python executable on PATH
  3. python2 executable on PATH
  4. python2.7 executable on PATH

Additional verification of the found Python will be performed by our build.rs to ensure it meets Mercurial's requirements.

Details about the build-time configured Python are built into the produced hg binary. This means that a built hg binary is only suitable for a specific, well-defined role. These roles are controlled by Cargo features (see above).

Running

The hgcli crate produces an hg binary. You can run this binary via cargo run:

$ cargo run --manifest-path hgcli/Cargo.toml

Or directly:

$ target/debug/hg
$ target/release/hg

You can also run the test harness with this binary:

$ ./run-tests.py --with-hg ../rust/target/debug/hg

Note

Integration with the test harness is still preliminary. Remember to cargo build after changes because the test harness doesn't yet automatically build Rust code.