Mercurial > public > mercurial-scm > hg
annotate rust/hg-core/src/revset.rs @ 50976:4c5f6e95df84
rust: make `Revision` a newtype
This change is the one we've been building towards during this series.
The aim is to make `Revision` mean more than a simple integer, holding
the information that it is valid for a given revlog index.
While this still allows for programmer error, since creating a revision
directly and querying a different index with a "checked" revision are
still possible, the friction created by the newtype will hopefully make
us think twice about which type to use.
Enough of the Rust ecosystem relies on the newtype pattern to be
efficiently optimized away (even compiler in codegen tests?), so I'm not
worried about this being a fundamental problem.
[1] https://github.com/rust-lang/rust/blob/7a70647f195f6b0a0f1ebd72b1542ba91a32f43a/tests/codegen/vec-in-place.rs#L47
author | Rapha?l Gom?s <rgomes@octobus.net> |
---|---|
date | Fri, 18 Aug 2023 14:34:29 +0200 |
parents | 1928b770e3e7 |
children | 652149ed64f0 |
rev | line source |
---|---|
46433
4b381dbbf8b7
rhg: centralize parsing of `--rev` CLI arguments
Simon Sapin <simon.sapin@octobus.net>
parents:
diff
changeset
|
1 //! The revset query language |
4b381dbbf8b7
rhg: centralize parsing of `--rev` CLI arguments
Simon Sapin <simon.sapin@octobus.net>
parents:
diff
changeset
|
2 //! |
4b381dbbf8b7
rhg: centralize parsing of `--rev` CLI arguments
Simon Sapin <simon.sapin@octobus.net>
parents:
diff
changeset
|
3 //! <https://www.mercurial-scm.org/repo/hg/help/revsets> |
4b381dbbf8b7
rhg: centralize parsing of `--rev` CLI arguments
Simon Sapin <simon.sapin@octobus.net>
parents:
diff
changeset
|
4 |
46725
df247f58ecee
rhg: Fall back to Python for unsupported revset syntax
Simon Sapin <simon.sapin@octobus.net>
parents:
46433
diff
changeset
|
5 use crate::errors::HgError; |
46433
4b381dbbf8b7
rhg: centralize parsing of `--rev` CLI arguments
Simon Sapin <simon.sapin@octobus.net>
parents:
diff
changeset
|
6 use crate::repo::Repo; |
4b381dbbf8b7
rhg: centralize parsing of `--rev` CLI arguments
Simon Sapin <simon.sapin@octobus.net>
parents:
diff
changeset
|
7 use crate::revlog::NodePrefix; |
46821
e8ae91b1a63d
rhg: raise wdir specific error for `hg debugdata`
Pulkit Goyal <7895pulkit@gmail.com>
parents:
46725
diff
changeset
|
8 use crate::revlog::{Revision, NULL_REVISION, WORKING_DIRECTORY_HEX}; |
49937
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
49930
diff
changeset
|
9 use crate::revlog::{Revlog, RevlogError}; |
46821
e8ae91b1a63d
rhg: raise wdir specific error for `hg debugdata`
Pulkit Goyal <7895pulkit@gmail.com>
parents:
46725
diff
changeset
|
10 use crate::Node; |
46433
4b381dbbf8b7
rhg: centralize parsing of `--rev` CLI arguments
Simon Sapin <simon.sapin@octobus.net>
parents:
diff
changeset
|
11 |
4b381dbbf8b7
rhg: centralize parsing of `--rev` CLI arguments
Simon Sapin <simon.sapin@octobus.net>
parents:
diff
changeset
|
12 /// Resolve a query string into a single revision. |
4b381dbbf8b7
rhg: centralize parsing of `--rev` CLI arguments
Simon Sapin <simon.sapin@octobus.net>
parents:
diff
changeset
|
13 /// |
4b381dbbf8b7
rhg: centralize parsing of `--rev` CLI arguments
Simon Sapin <simon.sapin@octobus.net>
parents:
diff
changeset
|
14 /// Only some of the revset language is implemented yet. |
4b381dbbf8b7
rhg: centralize parsing of `--rev` CLI arguments
Simon Sapin <simon.sapin@octobus.net>
parents:
diff
changeset
|
15 pub fn resolve_single( |
4b381dbbf8b7
rhg: centralize parsing of `--rev` CLI arguments
Simon Sapin <simon.sapin@octobus.net>
parents:
diff
changeset
|
16 input: &str, |
4b381dbbf8b7
rhg: centralize parsing of `--rev` CLI arguments
Simon Sapin <simon.sapin@octobus.net>
parents:
diff
changeset
|
17 repo: &Repo, |
4b381dbbf8b7
rhg: centralize parsing of `--rev` CLI arguments
Simon Sapin <simon.sapin@octobus.net>
parents:
diff
changeset
|
18 ) -> Result<Revision, RevlogError> { |
47959
21d25e9ee58e
rust: Keep lazily-initialized Changelog and Manifest log on the Repo object
Simon Sapin <simon.sapin@octobus.net>
parents:
46821
diff
changeset
|
19 let changelog = repo.changelog()?; |
46433
4b381dbbf8b7
rhg: centralize parsing of `--rev` CLI arguments
Simon Sapin <simon.sapin@octobus.net>
parents:
diff
changeset
|
20 |
48078
ddde80830aea
rust-revset: add separate match logic for shortcuts
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47968
diff
changeset
|
21 match input { |
48079
3da7bf75fdb2
rust-revset: support explicit `.` revision
Rapha?l Gom?s <rgomes@octobus.net>
parents:
48078
diff
changeset
|
22 "." => { |
3da7bf75fdb2
rust-revset: support explicit `.` revision
Rapha?l Gom?s <rgomes@octobus.net>
parents:
48078
diff
changeset
|
23 let p1 = repo.dirstate_parents()?.p1; |
49930
e98fd81bb151
rust-clippy: fix most warnings in `hg-core`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
48079
diff
changeset
|
24 return changelog.revlog.rev_from_node(p1.into()); |
48079
3da7bf75fdb2
rust-revset: support explicit `.` revision
Rapha?l Gom?s <rgomes@octobus.net>
parents:
48078
diff
changeset
|
25 } |
48078
ddde80830aea
rust-revset: add separate match logic for shortcuts
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47968
diff
changeset
|
26 "null" => return Ok(NULL_REVISION), |
ddde80830aea
rust-revset: add separate match logic for shortcuts
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47968
diff
changeset
|
27 _ => {} |
46433
4b381dbbf8b7
rhg: centralize parsing of `--rev` CLI arguments
Simon Sapin <simon.sapin@octobus.net>
parents:
diff
changeset
|
28 } |
4b381dbbf8b7
rhg: centralize parsing of `--rev` CLI arguments
Simon Sapin <simon.sapin@octobus.net>
parents:
diff
changeset
|
29 |
48078
ddde80830aea
rust-revset: add separate match logic for shortcuts
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47968
diff
changeset
|
30 match resolve_rev_number_or_hex_prefix(input, &changelog.revlog) { |
ddde80830aea
rust-revset: add separate match logic for shortcuts
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47968
diff
changeset
|
31 Err(RevlogError::InvalidRevision) => { |
ddde80830aea
rust-revset: add separate match logic for shortcuts
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47968
diff
changeset
|
32 // TODO: support for the rest of the language here. |
ddde80830aea
rust-revset: add separate match logic for shortcuts
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47968
diff
changeset
|
33 let msg = format!("cannot parse revset '{}'", input); |
ddde80830aea
rust-revset: add separate match logic for shortcuts
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47968
diff
changeset
|
34 Err(HgError::unsupported(msg).into()) |
ddde80830aea
rust-revset: add separate match logic for shortcuts
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47968
diff
changeset
|
35 } |
49930
e98fd81bb151
rust-clippy: fix most warnings in `hg-core`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
48079
diff
changeset
|
36 result => result, |
46433
4b381dbbf8b7
rhg: centralize parsing of `--rev` CLI arguments
Simon Sapin <simon.sapin@octobus.net>
parents:
diff
changeset
|
37 } |
4b381dbbf8b7
rhg: centralize parsing of `--rev` CLI arguments
Simon Sapin <simon.sapin@octobus.net>
parents:
diff
changeset
|
38 } |
4b381dbbf8b7
rhg: centralize parsing of `--rev` CLI arguments
Simon Sapin <simon.sapin@octobus.net>
parents:
diff
changeset
|
39 |
4b381dbbf8b7
rhg: centralize parsing of `--rev` CLI arguments
Simon Sapin <simon.sapin@octobus.net>
parents:
diff
changeset
|
40 /// Resolve the small subset of the language suitable for revlogs other than |
4b381dbbf8b7
rhg: centralize parsing of `--rev` CLI arguments
Simon Sapin <simon.sapin@octobus.net>
parents:
diff
changeset
|
41 /// the changelog, such as in `hg debugdata --manifest` CLI argument. |
4b381dbbf8b7
rhg: centralize parsing of `--rev` CLI arguments
Simon Sapin <simon.sapin@octobus.net>
parents:
diff
changeset
|
42 /// |
4b381dbbf8b7
rhg: centralize parsing of `--rev` CLI arguments
Simon Sapin <simon.sapin@octobus.net>
parents:
diff
changeset
|
43 /// * A non-negative decimal integer for a revision number, or |
4b381dbbf8b7
rhg: centralize parsing of `--rev` CLI arguments
Simon Sapin <simon.sapin@octobus.net>
parents:
diff
changeset
|
44 /// * An hexadecimal string, for the unique node ID that starts with this |
4b381dbbf8b7
rhg: centralize parsing of `--rev` CLI arguments
Simon Sapin <simon.sapin@octobus.net>
parents:
diff
changeset
|
45 /// prefix |
4b381dbbf8b7
rhg: centralize parsing of `--rev` CLI arguments
Simon Sapin <simon.sapin@octobus.net>
parents:
diff
changeset
|
46 pub fn resolve_rev_number_or_hex_prefix( |
4b381dbbf8b7
rhg: centralize parsing of `--rev` CLI arguments
Simon Sapin <simon.sapin@octobus.net>
parents:
diff
changeset
|
47 input: &str, |
4b381dbbf8b7
rhg: centralize parsing of `--rev` CLI arguments
Simon Sapin <simon.sapin@octobus.net>
parents:
diff
changeset
|
48 revlog: &Revlog, |
4b381dbbf8b7
rhg: centralize parsing of `--rev` CLI arguments
Simon Sapin <simon.sapin@octobus.net>
parents:
diff
changeset
|
49 ) -> Result<Revision, RevlogError> { |
47962
8c29af0f6d6e
rhg: Align with Python on some revset parsing corner cases
Simon Sapin <simon.sapin@octobus.net>
parents:
47959
diff
changeset
|
50 // The Python equivalent of this is part of `revsymbol` in |
8c29af0f6d6e
rhg: Align with Python on some revset parsing corner cases
Simon Sapin <simon.sapin@octobus.net>
parents:
47959
diff
changeset
|
51 // `mercurial/scmutil.py` |
8c29af0f6d6e
rhg: Align with Python on some revset parsing corner cases
Simon Sapin <simon.sapin@octobus.net>
parents:
47959
diff
changeset
|
52 |
46433
4b381dbbf8b7
rhg: centralize parsing of `--rev` CLI arguments
Simon Sapin <simon.sapin@octobus.net>
parents:
diff
changeset
|
53 if let Ok(integer) = input.parse::<i32>() { |
47962
8c29af0f6d6e
rhg: Align with Python on some revset parsing corner cases
Simon Sapin <simon.sapin@octobus.net>
parents:
47959
diff
changeset
|
54 if integer.to_string() == input |
8c29af0f6d6e
rhg: Align with Python on some revset parsing corner cases
Simon Sapin <simon.sapin@octobus.net>
parents:
47959
diff
changeset
|
55 && integer >= 0 |
50974
1928b770e3e7
rust: use the new `UncheckedRevision` everywhere applicable
Rapha?l Gom?s <rgomes@octobus.net>
parents:
49937
diff
changeset
|
56 && revlog.has_rev(integer.into()) |
47962
8c29af0f6d6e
rhg: Align with Python on some revset parsing corner cases
Simon Sapin <simon.sapin@octobus.net>
parents:
47959
diff
changeset
|
57 { |
50976
4c5f6e95df84
rust: make `Revision` a newtype
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50974
diff
changeset
|
58 // This is fine because we've just checked that the revision is |
4c5f6e95df84
rust: make `Revision` a newtype
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50974
diff
changeset
|
59 // valid for the given revlog. |
4c5f6e95df84
rust: make `Revision` a newtype
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50974
diff
changeset
|
60 return Ok(Revision(integer)); |
46433
4b381dbbf8b7
rhg: centralize parsing of `--rev` CLI arguments
Simon Sapin <simon.sapin@octobus.net>
parents:
diff
changeset
|
61 } |
4b381dbbf8b7
rhg: centralize parsing of `--rev` CLI arguments
Simon Sapin <simon.sapin@octobus.net>
parents:
diff
changeset
|
62 } |
4b381dbbf8b7
rhg: centralize parsing of `--rev` CLI arguments
Simon Sapin <simon.sapin@octobus.net>
parents:
diff
changeset
|
63 if let Ok(prefix) = NodePrefix::from_hex(input) { |
46821
e8ae91b1a63d
rhg: raise wdir specific error for `hg debugdata`
Pulkit Goyal <7895pulkit@gmail.com>
parents:
46725
diff
changeset
|
64 if prefix.is_prefix_of(&Node::from_hex(WORKING_DIRECTORY_HEX).unwrap()) |
e8ae91b1a63d
rhg: raise wdir specific error for `hg debugdata`
Pulkit Goyal <7895pulkit@gmail.com>
parents:
46725
diff
changeset
|
65 { |
e8ae91b1a63d
rhg: raise wdir specific error for `hg debugdata`
Pulkit Goyal <7895pulkit@gmail.com>
parents:
46725
diff
changeset
|
66 return Err(RevlogError::WDirUnsupported); |
e8ae91b1a63d
rhg: raise wdir specific error for `hg debugdata`
Pulkit Goyal <7895pulkit@gmail.com>
parents:
46725
diff
changeset
|
67 } |
47968
6f579618ea7b
rust: Rename the `Revlog::get_node_rev` method to `rev_from_node`
Simon Sapin <simon.sapin@octobus.net>
parents:
47962
diff
changeset
|
68 return revlog.rev_from_node(prefix); |
46433
4b381dbbf8b7
rhg: centralize parsing of `--rev` CLI arguments
Simon Sapin <simon.sapin@octobus.net>
parents:
diff
changeset
|
69 } |
4b381dbbf8b7
rhg: centralize parsing of `--rev` CLI arguments
Simon Sapin <simon.sapin@octobus.net>
parents:
diff
changeset
|
70 Err(RevlogError::InvalidRevision) |
4b381dbbf8b7
rhg: centralize parsing of `--rev` CLI arguments
Simon Sapin <simon.sapin@octobus.net>
parents:
diff
changeset
|
71 } |