Mercurial > hg
annotate README.rst @ 49000:dd6b67d5c256 stable
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
author | Raphaël Gomès <rgomes@octobus.net> |
---|---|
date | Tue, 05 Apr 2022 10:55:28 +0200 |
parents | c5912e35d06d |
children |
rev | line source |
---|---|
12857
a9f91c844a3b
README: add small introduction
Martin Geisler <mg@lazybytes.net>
parents:
12856
diff
changeset
|
1 Mercurial |
a9f91c844a3b
README: add small introduction
Martin Geisler <mg@lazybytes.net>
parents:
12856
diff
changeset
|
2 ========= |
a9f91c844a3b
README: add small introduction
Martin Geisler <mg@lazybytes.net>
parents:
12856
diff
changeset
|
3 |
a9f91c844a3b
README: add small introduction
Martin Geisler <mg@lazybytes.net>
parents:
12856
diff
changeset
|
4 Mercurial is a fast, easy to use, distributed revision control tool |
a9f91c844a3b
README: add small introduction
Martin Geisler <mg@lazybytes.net>
parents:
12856
diff
changeset
|
5 for software developers. |
a9f91c844a3b
README: add small introduction
Martin Geisler <mg@lazybytes.net>
parents:
12856
diff
changeset
|
6 |
33618
76b171209151
README: make paragraphs before example code end with "::" for reST syntax
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
26421
diff
changeset
|
7 Basic install:: |
0
9117c6561b0b
Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff
changeset
|
8 |
3935 | 9 $ make # see install targets |
10 $ make install # do a system-wide install | |
11 $ hg debuginstall # sanity-check setup | |
12 $ hg # see help | |
205
d255d99a7cbd
README: integrate some changes from Kevin Smith
mpm@selenic.com
parents:
204
diff
changeset
|
13 |
33618
76b171209151
README: make paragraphs before example code end with "::" for reST syntax
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
26421
diff
changeset
|
14 Running without installing:: |
16217
df5ecb813426
readme: mention how to run in-place
Ross Lagerwall <rosslagerwall@gmail.com>
parents:
12857
diff
changeset
|
15 |
df5ecb813426
readme: mention how to run in-place
Ross Lagerwall <rosslagerwall@gmail.com>
parents:
12857
diff
changeset
|
16 $ make local # build for inplace usage |
df5ecb813426
readme: mention how to run in-place
Ross Lagerwall <rosslagerwall@gmail.com>
parents:
12857
diff
changeset
|
17 $ ./hg --version # should show the latest version |
df5ecb813426
readme: mention how to run in-place
Ross Lagerwall <rosslagerwall@gmail.com>
parents:
12857
diff
changeset
|
18 |
26421
4b0fc75f9403
urls: bulk-change primary website URLs
Matt Mackall <mpm@selenic.com>
parents:
16217
diff
changeset
|
19 See https://mercurial-scm.org/ for detailed installation |
3935 | 20 instructions, platform-specific notes, and Mercurial user information. |
46756
c5912e35d06d
README: document requirement for builtin zstd
Joerg Sonnenberger <joerg@bec.de>
parents:
34579
diff
changeset
|
21 |
c5912e35d06d
README: document requirement for builtin zstd
Joerg Sonnenberger <joerg@bec.de>
parents:
34579
diff
changeset
|
22 Notes for packagers |
c5912e35d06d
README: document requirement for builtin zstd
Joerg Sonnenberger <joerg@bec.de>
parents:
34579
diff
changeset
|
23 =================== |
c5912e35d06d
README: document requirement for builtin zstd
Joerg Sonnenberger <joerg@bec.de>
parents:
34579
diff
changeset
|
24 |
c5912e35d06d
README: document requirement for builtin zstd
Joerg Sonnenberger <joerg@bec.de>
parents:
34579
diff
changeset
|
25 Mercurial ships a copy of the python-zstandard sources. This is used to |
c5912e35d06d
README: document requirement for builtin zstd
Joerg Sonnenberger <joerg@bec.de>
parents:
34579
diff
changeset
|
26 provide support for zstd compression and decompression functionality. The |
c5912e35d06d
README: document requirement for builtin zstd
Joerg Sonnenberger <joerg@bec.de>
parents:
34579
diff
changeset
|
27 module is not intended to be replaced by the plain python-zstandard nor |
c5912e35d06d
README: document requirement for builtin zstd
Joerg Sonnenberger <joerg@bec.de>
parents:
34579
diff
changeset
|
28 is it intended to use a system zstd library. Patches can result in hard |
c5912e35d06d
README: document requirement for builtin zstd
Joerg Sonnenberger <joerg@bec.de>
parents:
34579
diff
changeset
|
29 to diagnose errors and are explicitly discouraged as unsupported |
c5912e35d06d
README: document requirement for builtin zstd
Joerg Sonnenberger <joerg@bec.de>
parents:
34579
diff
changeset
|
30 configuration. |