##// END OF EJS Templates
rust: fix unsound `OwningDirstateMap`...
rust: fix unsound `OwningDirstateMap` As per the previous patch, `OwningDirstateMap` is unsound. Self-referential structs are difficult to implement correctly in Rust since the compiler is free to move structs around as much as it wants to. They are also very rarely needed in practice, so the state-of-the-art on how they should be done within the Rust rules is still a bit new. The crate `ouroboros` is an attempt at providing a safe way (in the Rust sense) of declaring self-referential structs. It is getting a lot attention and was improved very quickly when soundness issues were found in the past: rather than relying on our own (limited) review circle, we might as well use the de-facto common crate to fix this problem. This will give us a much better chance of finding issues should any new ones be discovered as well as the benefit of fewer `unsafe` APIs of our own. I was starting to think about how I would present a safe API to the old struct but soon realized that the callback-based approach was already done in `ouroboros`, along with a lot more care towards refusing incorrect structs. In short: we don't return a mutable reference to the `DirstateMap` anymore, we expect users of its API to pass a `FnOnce` that takes the map as an argument. This allows our `OwningDirstateMap` to control the input and output lifetimes of the code that modifies it to prevent such issues. Changing to `ouroboros` meant changing every API with it, but it is relatively low churn in the end. It correctly identified the example buggy modification of `copy_map_insert` outlined in the previous patch as violating the borrow rules. Differential Revision: https://phab.mercurial-scm.org/D12429

File last commit:

r49809:7b98f4f9 default
r49857:c9f44fc9 stable
Show More
Cargo.toml
32 lines | 819 B | application/toml | TOMLLexer
Georges Racinet
rust-cpython: start cpython crate bindings...
r41001 [package]
name = "hg-cpython"
version = "0.1.0"
authors = ["Georges Racinet <gracinet@anybox.fr>"]
Raphaël Gomès
rust: switch hg-core and hg-cpython to rust 2018 edition...
r42828 edition = "2018"
Georges Racinet
rust-cpython: start cpython crate bindings...
r41001
[lib]
name='rusthg'
crate-type = ["cdylib"]
[features]
Simon Sapin
rust: Make the hg-cpython crate default to Python 3...
r48996 default = ["python3"]
Georges Racinet
rust-cpython: start cpython crate bindings...
r41001
Yuya Nishihara
rust-cpython: prepare for writing tests that require libpython...
r43583 # Features to build an extension module:
Yuya Nishihara
rust-cpython: drop direct dependency on python(27|3)_sys...
r43485 python27 = ["cpython/python27-sys", "cpython/extension-module-2-7"]
Yuya Nishihara
rust-cpython: prepare for writing tests that require libpython...
r43583 python3 = ["cpython/python3-sys", "cpython/extension-module"]
Georges Racinet
rust-cpython: build and support for Python3...
r41021
Yuya Nishihara
rust-cpython: prepare for writing tests that require libpython...
r43583 # Enable one of these features to build a test executable linked to libpython:
# e.g. cargo test --no-default-features --features python27-bin
python27-bin = ["cpython/python27-sys"]
python3-bin = ["cpython/python3-sys"]
Georges Racinet
rust-cpython: start cpython crate bindings...
r41001
[dependencies]
Simon Sapin
rust: update the rust-cpython crate to 0.7.0...
r49011 cpython = { version = "0.7.0", default-features = false }
Simon Sapin
copies-rust: move CPU-heavy Rust processing into a child thread...
r47330 crossbeam-channel = "0.4"
Raphaël Gomès
rust-re2: add wrapper for calling Re2 from Rust...
r44786 hg-core = { path = "../hg-core"}
Simon Sapin
dirstate-v2: Replace the 32-bit `mode` field with two bits...
r49009 libc = "0.2"
Raphaël Gomès
rust-status: add trace-level logging for Rust status fallback for debugging...
r45062 log = "0.4.8"
Raphaël Gomès
rust-cpython: switch logging facade from `simple_logger` to `env_logger`...
r46090 env_logger = "0.7.1"
Simon Sapin
rust: Make OwningDirstateMap generic and move it into hg-core...
r48766 stable_deref_trait = "1.2.0"
pacien
rust: add vcsgraph crate as dependency...
r49348 vcsgraph = "0.2.0"