annotate rust/hg-cpython/src/dirstate/status.rs @ 52216:fa58f4f97337 stable tip

ci: shard the test run on mac os X This should comes with some benefit: - spread the load across more runner, - reduce the real-time CI run, - reduce the "retry" run when we need them. We start with the Mac jobs, but that would be tremendously useful for Windows too. For linux, we need to reduce the startup overhead for this to be worth it. Building smaller image and speeding up clone should help with that.
author Pierre-Yves David <pierre-yves.david@octobus.net>
date Fri, 08 Nov 2024 17:08:11 +0100
parents aa23b19e6da4
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
43273
478d0b1bf0c5 rust-dirstate-status: rust-cpython bindings for `dirstate.status`
Raphaël Gomès <rgomes@octobus.net>
parents:
diff changeset
1 // status.rs
478d0b1bf0c5 rust-dirstate-status: rust-cpython bindings for `dirstate.status`
Raphaël Gomès <rgomes@octobus.net>
parents:
diff changeset
2 //
478d0b1bf0c5 rust-dirstate-status: rust-cpython bindings for `dirstate.status`
Raphaël Gomès <rgomes@octobus.net>
parents:
diff changeset
3 // Copyright 2019, Raphaël Gomès <rgomes@octobus.net>
478d0b1bf0c5 rust-dirstate-status: rust-cpython bindings for `dirstate.status`
Raphaël Gomès <rgomes@octobus.net>
parents:
diff changeset
4 //
478d0b1bf0c5 rust-dirstate-status: rust-cpython bindings for `dirstate.status`
Raphaël Gomès <rgomes@octobus.net>
parents:
diff changeset
5 // This software may be used and distributed according to the terms of the
478d0b1bf0c5 rust-dirstate-status: rust-cpython bindings for `dirstate.status`
Raphaël Gomès <rgomes@octobus.net>
parents:
diff changeset
6 // GNU General Public License version 2 or any later version.
478d0b1bf0c5 rust-dirstate-status: rust-cpython bindings for `dirstate.status`
Raphaël Gomès <rgomes@octobus.net>
parents:
diff changeset
7
478d0b1bf0c5 rust-dirstate-status: rust-cpython bindings for `dirstate.status`
Raphaël Gomès <rgomes@octobus.net>
parents:
diff changeset
8 //! Bindings for the `hg::status` module provided by the
43431
21a1b2094649 rust-cpython: run cargo fmt
Yuya Nishihara <yuya@tcha.org>
parents: 43273
diff changeset
9 //! `hg-core` crate. From Python, this will be seen as
21a1b2094649 rust-cpython: run cargo fmt
Yuya Nishihara <yuya@tcha.org>
parents: 43273
diff changeset
10 //! `rustext.dirstate.status`.
43273
478d0b1bf0c5 rust-dirstate-status: rust-cpython bindings for `dirstate.status`
Raphaël Gomès <rgomes@octobus.net>
parents:
diff changeset
11
44529
f96b28aa4b79 rust-status: update rust-cpython bridge to account for the changes in core
Raphaël Gomès <rgomes@octobus.net>
parents: 44525
diff changeset
12 use crate::{dirstate::DirstateMap, exceptions::FallbackError};
43273
478d0b1bf0c5 rust-dirstate-status: rust-cpython bindings for `dirstate.status`
Raphaël Gomès <rgomes@octobus.net>
parents:
diff changeset
13 use cpython::{
51602
68929cf3c0c6 match: avoid rust fast path if the matcher was tampered with
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51120
diff changeset
14 exc::ValueError, ObjectProtocol, PyBool, PyBytes, PyErr, PyList, PyObject,
44529
f96b28aa4b79 rust-status: update rust-cpython bridge to account for the changes in core
Raphaël Gomès <rgomes@octobus.net>
parents: 44525
diff changeset
15 PyResult, PyTuple, Python, PythonObject, ToPyObject,
43273
478d0b1bf0c5 rust-dirstate-status: rust-cpython bindings for `dirstate.status`
Raphaël Gomès <rgomes@octobus.net>
parents:
diff changeset
16 };
48454
473af5cbc209 rhg: Add support for `rhg status --copies`
Simon Sapin <simon.sapin@octobus.net>
parents: 48391
diff changeset
17 use hg::dirstate::status::StatusPath;
49479
6193e846cb65 rust-status: expose DifferenceMatcher from Rust to Python
Raphaël Gomès <rgomes@octobus.net>
parents: 49351
diff changeset
18 use hg::matchers::{
6193e846cb65 rust-status: expose DifferenceMatcher from Rust to Python
Raphaël Gomès <rgomes@octobus.net>
parents: 49351
diff changeset
19 DifferenceMatcher, IntersectionMatcher, Matcher, NeverMatcher,
51603
a2afa35641c9 matchers: support patternmatcher in rust
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51602
diff changeset
20 PatternMatcher, UnionMatcher,
49479
6193e846cb65 rust-status: expose DifferenceMatcher from Rust to Python
Raphaël Gomès <rgomes@octobus.net>
parents: 49351
diff changeset
21 };
43916
6a88ced33c40 rust-dirstate-status: update bridge for new rust version of `dirstate.status`
Raphaël Gomès <rgomes@octobus.net>
parents: 43915
diff changeset
22 use hg::{
44529
f96b28aa4b79 rust-status: update rust-cpython bridge to account for the changes in core
Raphaël Gomès <rgomes@octobus.net>
parents: 44525
diff changeset
23 matchers::{AlwaysMatcher, FileMatcher, IncludeMatcher},
51605
e4b9f8a74d5f match: simplify the rust-side file pattern kind parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51604
diff changeset
24 parse_pattern_syntax_kind,
44529
f96b28aa4b79 rust-status: update rust-cpython bridge to account for the changes in core
Raphaël Gomès <rgomes@octobus.net>
parents: 44525
diff changeset
25 utils::{
f96b28aa4b79 rust-status: update rust-cpython bridge to account for the changes in core
Raphaël Gomès <rgomes@octobus.net>
parents: 44525
diff changeset
26 files::{get_bytes_from_path, get_path_from_bytes},
f96b28aa4b79 rust-status: update rust-cpython bridge to account for the changes in core
Raphaël Gomès <rgomes@octobus.net>
parents: 44525
diff changeset
27 hg_path::{HgPath, HgPathBuf},
f96b28aa4b79 rust-status: update rust-cpython bridge to account for the changes in core
Raphaël Gomès <rgomes@octobus.net>
parents: 44525
diff changeset
28 },
51602
68929cf3c0c6 match: avoid rust fast path if the matcher was tampered with
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51120
diff changeset
29 BadMatch, DirstateStatus, IgnorePattern, PatternError, PatternFileWarning,
68929cf3c0c6 match: avoid rust fast path if the matcher was tampered with
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51120
diff changeset
30 StatusError, StatusOptions,
43916
6a88ced33c40 rust-dirstate-status: update bridge for new rust version of `dirstate.status`
Raphaël Gomès <rgomes@octobus.net>
parents: 43915
diff changeset
31 };
47110
9c6b458a08e1 rust: Move "lookup" a.k.a. "unsure" paths into `DirstateStatus` struct
Simon Sapin <simon.sapin@octobus.net>
parents: 47093
diff changeset
32 use std::borrow::Borrow;
43273
478d0b1bf0c5 rust-dirstate-status: rust-cpython bindings for `dirstate.status`
Raphaël Gomès <rgomes@octobus.net>
parents:
diff changeset
33
48454
473af5cbc209 rhg: Add support for `rhg status --copies`
Simon Sapin <simon.sapin@octobus.net>
parents: 48391
diff changeset
34 fn collect_status_path_list(py: Python, paths: &[StatusPath<'_>]) -> PyList {
473af5cbc209 rhg: Add support for `rhg status --copies`
Simon Sapin <simon.sapin@octobus.net>
parents: 48391
diff changeset
35 collect_pybytes_list(py, paths.iter().map(|item| &*item.path))
473af5cbc209 rhg: Add support for `rhg status --copies`
Simon Sapin <simon.sapin@octobus.net>
parents: 48391
diff changeset
36 }
473af5cbc209 rhg: Add support for `rhg status --copies`
Simon Sapin <simon.sapin@octobus.net>
parents: 48391
diff changeset
37
43273
478d0b1bf0c5 rust-dirstate-status: rust-cpython bindings for `dirstate.status`
Raphaël Gomès <rgomes@octobus.net>
parents:
diff changeset
38 /// This will be useless once trait impls for collection are added to `PyBytes`
478d0b1bf0c5 rust-dirstate-status: rust-cpython bindings for `dirstate.status`
Raphaël Gomès <rgomes@octobus.net>
parents:
diff changeset
39 /// upstream.
44529
f96b28aa4b79 rust-status: update rust-cpython bridge to account for the changes in core
Raphaël Gomès <rgomes@octobus.net>
parents: 44525
diff changeset
40 fn collect_pybytes_list(
43273
478d0b1bf0c5 rust-dirstate-status: rust-cpython bindings for `dirstate.status`
Raphaël Gomès <rgomes@octobus.net>
parents:
diff changeset
41 py: Python,
48454
473af5cbc209 rhg: Add support for `rhg status --copies`
Simon Sapin <simon.sapin@octobus.net>
parents: 48391
diff changeset
42 iter: impl Iterator<Item = impl AsRef<HgPath>>,
43273
478d0b1bf0c5 rust-dirstate-status: rust-cpython bindings for `dirstate.status`
Raphaël Gomès <rgomes@octobus.net>
parents:
diff changeset
43 ) -> PyList {
478d0b1bf0c5 rust-dirstate-status: rust-cpython bindings for `dirstate.status`
Raphaël Gomès <rgomes@octobus.net>
parents:
diff changeset
44 let list = PyList::new(py, &[]);
478d0b1bf0c5 rust-dirstate-status: rust-cpython bindings for `dirstate.status`
Raphaël Gomès <rgomes@octobus.net>
parents:
diff changeset
45
48454
473af5cbc209 rhg: Add support for `rhg status --copies`
Simon Sapin <simon.sapin@octobus.net>
parents: 48391
diff changeset
46 for path in iter {
44529
f96b28aa4b79 rust-status: update rust-cpython bridge to account for the changes in core
Raphaël Gomès <rgomes@octobus.net>
parents: 44525
diff changeset
47 list.append(
43273
478d0b1bf0c5 rust-dirstate-status: rust-cpython bindings for `dirstate.status`
Raphaël Gomès <rgomes@octobus.net>
parents:
diff changeset
48 py,
478d0b1bf0c5 rust-dirstate-status: rust-cpython bindings for `dirstate.status`
Raphaël Gomès <rgomes@octobus.net>
parents:
diff changeset
49 PyBytes::new(py, path.as_ref().as_bytes()).into_object(),
478d0b1bf0c5 rust-dirstate-status: rust-cpython bindings for `dirstate.status`
Raphaël Gomès <rgomes@octobus.net>
parents:
diff changeset
50 )
478d0b1bf0c5 rust-dirstate-status: rust-cpython bindings for `dirstate.status`
Raphaël Gomès <rgomes@octobus.net>
parents:
diff changeset
51 }
478d0b1bf0c5 rust-dirstate-status: rust-cpython bindings for `dirstate.status`
Raphaël Gomès <rgomes@octobus.net>
parents:
diff changeset
52
478d0b1bf0c5 rust-dirstate-status: rust-cpython bindings for `dirstate.status`
Raphaël Gomès <rgomes@octobus.net>
parents:
diff changeset
53 list
478d0b1bf0c5 rust-dirstate-status: rust-cpython bindings for `dirstate.status`
Raphaël Gomès <rgomes@octobus.net>
parents:
diff changeset
54 }
478d0b1bf0c5 rust-dirstate-status: rust-cpython bindings for `dirstate.status`
Raphaël Gomès <rgomes@octobus.net>
parents:
diff changeset
55
44529
f96b28aa4b79 rust-status: update rust-cpython bridge to account for the changes in core
Raphaël Gomès <rgomes@octobus.net>
parents: 44525
diff changeset
56 fn collect_bad_matches(
f96b28aa4b79 rust-status: update rust-cpython bridge to account for the changes in core
Raphaël Gomès <rgomes@octobus.net>
parents: 44525
diff changeset
57 py: Python,
f96b28aa4b79 rust-status: update rust-cpython bridge to account for the changes in core
Raphaël Gomès <rgomes@octobus.net>
parents: 44525
diff changeset
58 collection: &[(impl AsRef<HgPath>, BadMatch)],
f96b28aa4b79 rust-status: update rust-cpython bridge to account for the changes in core
Raphaël Gomès <rgomes@octobus.net>
parents: 44525
diff changeset
59 ) -> PyResult<PyList> {
f96b28aa4b79 rust-status: update rust-cpython bridge to account for the changes in core
Raphaël Gomès <rgomes@octobus.net>
parents: 44525
diff changeset
60 let list = PyList::new(py, &[]);
f96b28aa4b79 rust-status: update rust-cpython bridge to account for the changes in core
Raphaël Gomès <rgomes@octobus.net>
parents: 44525
diff changeset
61
f96b28aa4b79 rust-status: update rust-cpython bridge to account for the changes in core
Raphaël Gomès <rgomes@octobus.net>
parents: 44525
diff changeset
62 let os = py.import("os")?;
f96b28aa4b79 rust-status: update rust-cpython bridge to account for the changes in core
Raphaël Gomès <rgomes@octobus.net>
parents: 44525
diff changeset
63 let get_error_message = |code: i32| -> PyResult<_> {
f96b28aa4b79 rust-status: update rust-cpython bridge to account for the changes in core
Raphaël Gomès <rgomes@octobus.net>
parents: 44525
diff changeset
64 os.call(
f96b28aa4b79 rust-status: update rust-cpython bridge to account for the changes in core
Raphaël Gomès <rgomes@octobus.net>
parents: 44525
diff changeset
65 py,
f96b28aa4b79 rust-status: update rust-cpython bridge to account for the changes in core
Raphaël Gomès <rgomes@octobus.net>
parents: 44525
diff changeset
66 "strerror",
f96b28aa4b79 rust-status: update rust-cpython bridge to account for the changes in core
Raphaël Gomès <rgomes@octobus.net>
parents: 44525
diff changeset
67 PyTuple::new(py, &[code.to_py_object(py).into_object()]),
f96b28aa4b79 rust-status: update rust-cpython bridge to account for the changes in core
Raphaël Gomès <rgomes@octobus.net>
parents: 44525
diff changeset
68 None,
f96b28aa4b79 rust-status: update rust-cpython bridge to account for the changes in core
Raphaël Gomès <rgomes@octobus.net>
parents: 44525
diff changeset
69 )
f96b28aa4b79 rust-status: update rust-cpython bridge to account for the changes in core
Raphaël Gomès <rgomes@octobus.net>
parents: 44525
diff changeset
70 };
f96b28aa4b79 rust-status: update rust-cpython bridge to account for the changes in core
Raphaël Gomès <rgomes@octobus.net>
parents: 44525
diff changeset
71
f96b28aa4b79 rust-status: update rust-cpython bridge to account for the changes in core
Raphaël Gomès <rgomes@octobus.net>
parents: 44525
diff changeset
72 for (path, bad_match) in collection.iter() {
f96b28aa4b79 rust-status: update rust-cpython bridge to account for the changes in core
Raphaël Gomès <rgomes@octobus.net>
parents: 44525
diff changeset
73 let message = match bad_match {
f96b28aa4b79 rust-status: update rust-cpython bridge to account for the changes in core
Raphaël Gomès <rgomes@octobus.net>
parents: 44525
diff changeset
74 BadMatch::OsError(code) => get_error_message(*code)?,
49914
58074252db3c rust: run `cargo clippy`
Raphaël Gomès <rgomes@octobus.net>
parents: 49479
diff changeset
75 BadMatch::BadType(bad_type) => {
58074252db3c rust: run `cargo clippy`
Raphaël Gomès <rgomes@octobus.net>
parents: 49479
diff changeset
76 format!("unsupported file type (type is {})", bad_type)
58074252db3c rust: run `cargo clippy`
Raphaël Gomès <rgomes@octobus.net>
parents: 49479
diff changeset
77 .to_py_object(py)
58074252db3c rust: run `cargo clippy`
Raphaël Gomès <rgomes@octobus.net>
parents: 49479
diff changeset
78 .into_object()
58074252db3c rust: run `cargo clippy`
Raphaël Gomès <rgomes@octobus.net>
parents: 49479
diff changeset
79 }
44529
f96b28aa4b79 rust-status: update rust-cpython bridge to account for the changes in core
Raphaël Gomès <rgomes@octobus.net>
parents: 44525
diff changeset
80 };
f96b28aa4b79 rust-status: update rust-cpython bridge to account for the changes in core
Raphaël Gomès <rgomes@octobus.net>
parents: 44525
diff changeset
81 list.append(
f96b28aa4b79 rust-status: update rust-cpython bridge to account for the changes in core
Raphaël Gomès <rgomes@octobus.net>
parents: 44525
diff changeset
82 py,
f96b28aa4b79 rust-status: update rust-cpython bridge to account for the changes in core
Raphaël Gomès <rgomes@octobus.net>
parents: 44525
diff changeset
83 (PyBytes::new(py, path.as_ref().as_bytes()), message)
f96b28aa4b79 rust-status: update rust-cpython bridge to account for the changes in core
Raphaël Gomès <rgomes@octobus.net>
parents: 44525
diff changeset
84 .to_py_object(py)
f96b28aa4b79 rust-status: update rust-cpython bridge to account for the changes in core
Raphaël Gomès <rgomes@octobus.net>
parents: 44525
diff changeset
85 .into_object(),
f96b28aa4b79 rust-status: update rust-cpython bridge to account for the changes in core
Raphaël Gomès <rgomes@octobus.net>
parents: 44525
diff changeset
86 )
f96b28aa4b79 rust-status: update rust-cpython bridge to account for the changes in core
Raphaël Gomès <rgomes@octobus.net>
parents: 44525
diff changeset
87 }
f96b28aa4b79 rust-status: update rust-cpython bridge to account for the changes in core
Raphaël Gomès <rgomes@octobus.net>
parents: 44525
diff changeset
88
f96b28aa4b79 rust-status: update rust-cpython bridge to account for the changes in core
Raphaël Gomès <rgomes@octobus.net>
parents: 44525
diff changeset
89 Ok(list)
f96b28aa4b79 rust-status: update rust-cpython bridge to account for the changes in core
Raphaël Gomès <rgomes@octobus.net>
parents: 44525
diff changeset
90 }
f96b28aa4b79 rust-status: update rust-cpython bridge to account for the changes in core
Raphaël Gomès <rgomes@octobus.net>
parents: 44525
diff changeset
91
f96b28aa4b79 rust-status: update rust-cpython bridge to account for the changes in core
Raphaël Gomès <rgomes@octobus.net>
parents: 44525
diff changeset
92 fn handle_fallback(py: Python, err: StatusError) -> PyErr {
f96b28aa4b79 rust-status: update rust-cpython bridge to account for the changes in core
Raphaël Gomès <rgomes@octobus.net>
parents: 44525
diff changeset
93 match err {
f96b28aa4b79 rust-status: update rust-cpython bridge to account for the changes in core
Raphaël Gomès <rgomes@octobus.net>
parents: 44525
diff changeset
94 StatusError::Pattern(e) => {
44572
245aec57d76a rust-status: add trace-level logging for Rust status fallback for debugging
Raphaël Gomès <rgomes@octobus.net>
parents: 44529
diff changeset
95 let as_string = e.to_string();
245aec57d76a rust-status: add trace-level logging for Rust status fallback for debugging
Raphaël Gomès <rgomes@octobus.net>
parents: 44529
diff changeset
96 log::trace!("Rust status fallback: `{}`", &as_string);
245aec57d76a rust-status: add trace-level logging for Rust status fallback for debugging
Raphaël Gomès <rgomes@octobus.net>
parents: 44529
diff changeset
97
245aec57d76a rust-status: add trace-level logging for Rust status fallback for debugging
Raphaël Gomès <rgomes@octobus.net>
parents: 44529
diff changeset
98 PyErr::new::<FallbackError, _>(py, &as_string)
44529
f96b28aa4b79 rust-status: update rust-cpython bridge to account for the changes in core
Raphaël Gomès <rgomes@octobus.net>
parents: 44525
diff changeset
99 }
f96b28aa4b79 rust-status: update rust-cpython bridge to account for the changes in core
Raphaël Gomès <rgomes@octobus.net>
parents: 44525
diff changeset
100 e => PyErr::new::<ValueError, _>(py, e.to_string()),
f96b28aa4b79 rust-status: update rust-cpython bridge to account for the changes in core
Raphaël Gomès <rgomes@octobus.net>
parents: 44525
diff changeset
101 }
f96b28aa4b79 rust-status: update rust-cpython bridge to account for the changes in core
Raphaël Gomès <rgomes@octobus.net>
parents: 44525
diff changeset
102 }
f96b28aa4b79 rust-status: update rust-cpython bridge to account for the changes in core
Raphaël Gomès <rgomes@octobus.net>
parents: 44525
diff changeset
103
43273
478d0b1bf0c5 rust-dirstate-status: rust-cpython bindings for `dirstate.status`
Raphaël Gomès <rgomes@octobus.net>
parents:
diff changeset
104 pub fn status_wrapper(
478d0b1bf0c5 rust-dirstate-status: rust-cpython bindings for `dirstate.status`
Raphaël Gomès <rgomes@octobus.net>
parents:
diff changeset
105 py: Python,
478d0b1bf0c5 rust-dirstate-status: rust-cpython bindings for `dirstate.status`
Raphaël Gomès <rgomes@octobus.net>
parents:
diff changeset
106 dmap: DirstateMap,
43916
6a88ced33c40 rust-dirstate-status: update bridge for new rust version of `dirstate.status`
Raphaël Gomès <rgomes@octobus.net>
parents: 43915
diff changeset
107 matcher: PyObject,
43273
478d0b1bf0c5 rust-dirstate-status: rust-cpython bindings for `dirstate.status`
Raphaël Gomès <rgomes@octobus.net>
parents:
diff changeset
108 root_dir: PyObject,
44529
f96b28aa4b79 rust-status: update rust-cpython bridge to account for the changes in core
Raphaël Gomès <rgomes@octobus.net>
parents: 44525
diff changeset
109 ignore_files: PyList,
f96b28aa4b79 rust-status: update rust-cpython bridge to account for the changes in core
Raphaël Gomès <rgomes@octobus.net>
parents: 44525
diff changeset
110 check_exec: bool,
f96b28aa4b79 rust-status: update rust-cpython bridge to account for the changes in core
Raphaël Gomès <rgomes@octobus.net>
parents: 44525
diff changeset
111 list_clean: bool,
f96b28aa4b79 rust-status: update rust-cpython bridge to account for the changes in core
Raphaël Gomès <rgomes@octobus.net>
parents: 44525
diff changeset
112 list_ignored: bool,
f96b28aa4b79 rust-status: update rust-cpython bridge to account for the changes in core
Raphaël Gomès <rgomes@octobus.net>
parents: 44525
diff changeset
113 list_unknown: bool,
44839
01afda7e7d6c rust-hg-cpython: update status bridge with the new `traversedir` support
Raphaël Gomès <rgomes@octobus.net>
parents: 44597
diff changeset
114 collect_traversed_dirs: bool,
44529
f96b28aa4b79 rust-status: update rust-cpython bridge to account for the changes in core
Raphaël Gomès <rgomes@octobus.net>
parents: 44525
diff changeset
115 ) -> PyResult<PyTuple> {
43273
478d0b1bf0c5 rust-dirstate-status: rust-cpython bindings for `dirstate.status`
Raphaël Gomès <rgomes@octobus.net>
parents:
diff changeset
116 let bytes = root_dir.extract::<PyBytes>(py)?;
478d0b1bf0c5 rust-dirstate-status: rust-cpython bindings for `dirstate.status`
Raphaël Gomès <rgomes@octobus.net>
parents:
diff changeset
117 let root_dir = get_path_from_bytes(bytes.data(py));
478d0b1bf0c5 rust-dirstate-status: rust-cpython bindings for `dirstate.status`
Raphaël Gomès <rgomes@octobus.net>
parents:
diff changeset
118
478d0b1bf0c5 rust-dirstate-status: rust-cpython bindings for `dirstate.status`
Raphaël Gomès <rgomes@octobus.net>
parents:
diff changeset
119 let dmap: DirstateMap = dmap.to_py_object(py);
47112
d5956136d19d dirstate-tree: Give to `status()` mutable access to the `DirstateMap`
Simon Sapin <simon.sapin@octobus.net>
parents: 47110
diff changeset
120 let mut dmap = dmap.get_inner_mut(py);
43273
478d0b1bf0c5 rust-dirstate-status: rust-cpython bindings for `dirstate.status`
Raphaël Gomès <rgomes@octobus.net>
parents:
diff changeset
121
44529
f96b28aa4b79 rust-status: update rust-cpython bridge to account for the changes in core
Raphaël Gomès <rgomes@octobus.net>
parents: 44525
diff changeset
122 let ignore_files: PyResult<Vec<_>> = ignore_files
f96b28aa4b79 rust-status: update rust-cpython bridge to account for the changes in core
Raphaël Gomès <rgomes@octobus.net>
parents: 44525
diff changeset
123 .iter(py)
f96b28aa4b79 rust-status: update rust-cpython bridge to account for the changes in core
Raphaël Gomès <rgomes@octobus.net>
parents: 44525
diff changeset
124 .map(|b| {
f96b28aa4b79 rust-status: update rust-cpython bridge to account for the changes in core
Raphaël Gomès <rgomes@octobus.net>
parents: 44525
diff changeset
125 let file = b.extract::<PyBytes>(py)?;
f96b28aa4b79 rust-status: update rust-cpython bridge to account for the changes in core
Raphaël Gomès <rgomes@octobus.net>
parents: 44525
diff changeset
126 Ok(get_path_from_bytes(file.data(py)).to_owned())
f96b28aa4b79 rust-status: update rust-cpython bridge to account for the changes in core
Raphaël Gomès <rgomes@octobus.net>
parents: 44525
diff changeset
127 })
f96b28aa4b79 rust-status: update rust-cpython bridge to account for the changes in core
Raphaël Gomès <rgomes@octobus.net>
parents: 44525
diff changeset
128 .collect();
f96b28aa4b79 rust-status: update rust-cpython bridge to account for the changes in core
Raphaël Gomès <rgomes@octobus.net>
parents: 44525
diff changeset
129 let ignore_files = ignore_files?;
48454
473af5cbc209 rhg: Add support for `rhg status --copies`
Simon Sapin <simon.sapin@octobus.net>
parents: 48391
diff changeset
130 // The caller may call `copymap.items()` separately
473af5cbc209 rhg: Add support for `rhg status --copies`
Simon Sapin <simon.sapin@octobus.net>
parents: 48391
diff changeset
131 let list_copies = false;
44529
f96b28aa4b79 rust-status: update rust-cpython bridge to account for the changes in core
Raphaël Gomès <rgomes@octobus.net>
parents: 44525
diff changeset
132
49000
dd6b67d5c256 rust: fix unsound `OwningDirstateMap`
Raphaël Gomès <rgomes@octobus.net>
parents: 48744
diff changeset
133 let after_status = |res: Result<(DirstateStatus<'_>, _), StatusError>| {
dd6b67d5c256 rust: fix unsound `OwningDirstateMap`
Raphaël Gomès <rgomes@octobus.net>
parents: 48744
diff changeset
134 let (status_res, warnings) =
dd6b67d5c256 rust: fix unsound `OwningDirstateMap`
Raphaël Gomès <rgomes@octobus.net>
parents: 48744
diff changeset
135 res.map_err(|e| handle_fallback(py, e))?;
dd6b67d5c256 rust: fix unsound `OwningDirstateMap`
Raphaël Gomès <rgomes@octobus.net>
parents: 48744
diff changeset
136 build_response(py, status_res, warnings)
dd6b67d5c256 rust: fix unsound `OwningDirstateMap`
Raphaël Gomès <rgomes@octobus.net>
parents: 48744
diff changeset
137 };
dd6b67d5c256 rust: fix unsound `OwningDirstateMap`
Raphaël Gomès <rgomes@octobus.net>
parents: 48744
diff changeset
138
49346
75119bbee3d1 hg-cpython: refactor matcher transformation logic
Raphaël Gomès <rgomes@octobus.net>
parents: 49345
diff changeset
139 let matcher = extract_matcher(py, matcher)?;
75119bbee3d1 hg-cpython: refactor matcher transformation logic
Raphaël Gomès <rgomes@octobus.net>
parents: 49345
diff changeset
140 dmap.with_status(
75119bbee3d1 hg-cpython: refactor matcher transformation logic
Raphaël Gomès <rgomes@octobus.net>
parents: 49345
diff changeset
141 &*matcher,
75119bbee3d1 hg-cpython: refactor matcher transformation logic
Raphaël Gomès <rgomes@octobus.net>
parents: 49345
diff changeset
142 root_dir.to_path_buf(),
75119bbee3d1 hg-cpython: refactor matcher transformation logic
Raphaël Gomès <rgomes@octobus.net>
parents: 49345
diff changeset
143 ignore_files,
75119bbee3d1 hg-cpython: refactor matcher transformation logic
Raphaël Gomès <rgomes@octobus.net>
parents: 49345
diff changeset
144 StatusOptions {
75119bbee3d1 hg-cpython: refactor matcher transformation logic
Raphaël Gomès <rgomes@octobus.net>
parents: 49345
diff changeset
145 check_exec,
75119bbee3d1 hg-cpython: refactor matcher transformation logic
Raphaël Gomès <rgomes@octobus.net>
parents: 49345
diff changeset
146 list_clean,
75119bbee3d1 hg-cpython: refactor matcher transformation logic
Raphaël Gomès <rgomes@octobus.net>
parents: 49345
diff changeset
147 list_ignored,
75119bbee3d1 hg-cpython: refactor matcher transformation logic
Raphaël Gomès <rgomes@octobus.net>
parents: 49345
diff changeset
148 list_unknown,
75119bbee3d1 hg-cpython: refactor matcher transformation logic
Raphaël Gomès <rgomes@octobus.net>
parents: 49345
diff changeset
149 list_copies,
75119bbee3d1 hg-cpython: refactor matcher transformation logic
Raphaël Gomès <rgomes@octobus.net>
parents: 49345
diff changeset
150 collect_traversed_dirs,
75119bbee3d1 hg-cpython: refactor matcher transformation logic
Raphaël Gomès <rgomes@octobus.net>
parents: 49345
diff changeset
151 },
75119bbee3d1 hg-cpython: refactor matcher transformation logic
Raphaël Gomès <rgomes@octobus.net>
parents: 49345
diff changeset
152 after_status,
75119bbee3d1 hg-cpython: refactor matcher transformation logic
Raphaël Gomès <rgomes@octobus.net>
parents: 49345
diff changeset
153 )
75119bbee3d1 hg-cpython: refactor matcher transformation logic
Raphaël Gomès <rgomes@octobus.net>
parents: 49345
diff changeset
154 }
75119bbee3d1 hg-cpython: refactor matcher transformation logic
Raphaël Gomès <rgomes@octobus.net>
parents: 49345
diff changeset
155
51604
32ba01b5669d match: share code between includematcher and patternmatcher
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51603
diff changeset
156 fn collect_kindpats(
32ba01b5669d match: share code between includematcher and patternmatcher
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51603
diff changeset
157 py: Python,
32ba01b5669d match: share code between includematcher and patternmatcher
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51603
diff changeset
158 matcher: PyObject,
32ba01b5669d match: share code between includematcher and patternmatcher
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51603
diff changeset
159 ) -> PyResult<Vec<IgnorePattern>> {
32ba01b5669d match: share code between includematcher and patternmatcher
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51603
diff changeset
160 matcher
32ba01b5669d match: share code between includematcher and patternmatcher
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51603
diff changeset
161 .getattr(py, "_kindpats")?
32ba01b5669d match: share code between includematcher and patternmatcher
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51603
diff changeset
162 .iter(py)?
32ba01b5669d match: share code between includematcher and patternmatcher
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51603
diff changeset
163 .map(|k| {
32ba01b5669d match: share code between includematcher and patternmatcher
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51603
diff changeset
164 let k = k?;
51605
e4b9f8a74d5f match: simplify the rust-side file pattern kind parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51604
diff changeset
165 let syntax = parse_pattern_syntax_kind(
e4b9f8a74d5f match: simplify the rust-side file pattern kind parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51604
diff changeset
166 k.get_item(py, 0)?.extract::<PyBytes>(py)?.data(py),
51604
32ba01b5669d match: share code between includematcher and patternmatcher
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51603
diff changeset
167 )
32ba01b5669d match: share code between includematcher and patternmatcher
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51603
diff changeset
168 .map_err(|e| handle_fallback(py, StatusError::Pattern(e)))?;
32ba01b5669d match: share code between includematcher and patternmatcher
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51603
diff changeset
169 let pattern = k.get_item(py, 1)?.extract::<PyBytes>(py)?;
32ba01b5669d match: share code between includematcher and patternmatcher
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51603
diff changeset
170 let pattern = pattern.data(py);
32ba01b5669d match: share code between includematcher and patternmatcher
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51603
diff changeset
171 let source = k.get_item(py, 2)?.extract::<PyBytes>(py)?;
32ba01b5669d match: share code between includematcher and patternmatcher
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51603
diff changeset
172 let source = get_path_from_bytes(source.data(py));
32ba01b5669d match: share code between includematcher and patternmatcher
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51603
diff changeset
173 let new = IgnorePattern::new(syntax, pattern, source);
32ba01b5669d match: share code between includematcher and patternmatcher
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51603
diff changeset
174 Ok(new)
32ba01b5669d match: share code between includematcher and patternmatcher
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51603
diff changeset
175 })
32ba01b5669d match: share code between includematcher and patternmatcher
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51603
diff changeset
176 .collect()
32ba01b5669d match: share code between includematcher and patternmatcher
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51603
diff changeset
177 }
32ba01b5669d match: share code between includematcher and patternmatcher
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51603
diff changeset
178
49346
75119bbee3d1 hg-cpython: refactor matcher transformation logic
Raphaël Gomès <rgomes@octobus.net>
parents: 49345
diff changeset
179 /// Transform a Python matcher into a Rust matcher.
75119bbee3d1 hg-cpython: refactor matcher transformation logic
Raphaël Gomès <rgomes@octobus.net>
parents: 49345
diff changeset
180 fn extract_matcher(
75119bbee3d1 hg-cpython: refactor matcher transformation logic
Raphaël Gomès <rgomes@octobus.net>
parents: 49345
diff changeset
181 py: Python,
75119bbee3d1 hg-cpython: refactor matcher transformation logic
Raphaël Gomès <rgomes@octobus.net>
parents: 49345
diff changeset
182 matcher: PyObject,
75119bbee3d1 hg-cpython: refactor matcher transformation logic
Raphaël Gomès <rgomes@octobus.net>
parents: 49345
diff changeset
183 ) -> PyResult<Box<dyn Matcher + Sync>> {
51602
68929cf3c0c6 match: avoid rust fast path if the matcher was tampered with
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51120
diff changeset
184 let tampered = matcher
51625
aa23b19e6da4 match: make `was_tampered_with` work recursively
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51605
diff changeset
185 .call_method(py, "was_tampered_with_nonrec", PyTuple::empty(py), None)?
51602
68929cf3c0c6 match: avoid rust fast path if the matcher was tampered with
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51120
diff changeset
186 .extract::<PyBool>(py)?
68929cf3c0c6 match: avoid rust fast path if the matcher was tampered with
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51120
diff changeset
187 .is_true();
68929cf3c0c6 match: avoid rust fast path if the matcher was tampered with
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51120
diff changeset
188 if tampered {
68929cf3c0c6 match: avoid rust fast path if the matcher was tampered with
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51120
diff changeset
189 return Err(handle_fallback(
68929cf3c0c6 match: avoid rust fast path if the matcher was tampered with
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51120
diff changeset
190 py,
68929cf3c0c6 match: avoid rust fast path if the matcher was tampered with
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51120
diff changeset
191 StatusError::Pattern(PatternError::UnsupportedSyntax(
68929cf3c0c6 match: avoid rust fast path if the matcher was tampered with
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51120
diff changeset
192 "Pattern matcher was tampered with!".to_string(),
68929cf3c0c6 match: avoid rust fast path if the matcher was tampered with
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51120
diff changeset
193 )),
68929cf3c0c6 match: avoid rust fast path if the matcher was tampered with
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51120
diff changeset
194 ));
68929cf3c0c6 match: avoid rust fast path if the matcher was tampered with
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51120
diff changeset
195 };
43916
6a88ced33c40 rust-dirstate-status: update bridge for new rust version of `dirstate.status`
Raphaël Gomès <rgomes@octobus.net>
parents: 43915
diff changeset
196 match matcher.get_type(py).name(py).borrow() {
49346
75119bbee3d1 hg-cpython: refactor matcher transformation logic
Raphaël Gomès <rgomes@octobus.net>
parents: 49345
diff changeset
197 "alwaysmatcher" => Ok(Box::new(AlwaysMatcher)),
49351
97dcd6906e6f rust-dirstate: add support for nevermatcher
Raphaël Gomès <rgomes@octobus.net>
parents: 49350
diff changeset
198 "nevermatcher" => Ok(Box::new(NeverMatcher)),
43916
6a88ced33c40 rust-dirstate-status: update bridge for new rust version of `dirstate.status`
Raphaël Gomès <rgomes@octobus.net>
parents: 43915
diff changeset
199 "exactmatcher" => {
6a88ced33c40 rust-dirstate-status: update bridge for new rust version of `dirstate.status`
Raphaël Gomès <rgomes@octobus.net>
parents: 43915
diff changeset
200 let files = matcher.call_method(
6a88ced33c40 rust-dirstate-status: update bridge for new rust version of `dirstate.status`
Raphaël Gomès <rgomes@octobus.net>
parents: 43915
diff changeset
201 py,
6a88ced33c40 rust-dirstate-status: update bridge for new rust version of `dirstate.status`
Raphaël Gomès <rgomes@octobus.net>
parents: 43915
diff changeset
202 "files",
6a88ced33c40 rust-dirstate-status: update bridge for new rust version of `dirstate.status`
Raphaël Gomès <rgomes@octobus.net>
parents: 43915
diff changeset
203 PyTuple::new(py, &[]),
6a88ced33c40 rust-dirstate-status: update bridge for new rust version of `dirstate.status`
Raphaël Gomès <rgomes@octobus.net>
parents: 43915
diff changeset
204 None,
6a88ced33c40 rust-dirstate-status: update bridge for new rust version of `dirstate.status`
Raphaël Gomès <rgomes@octobus.net>
parents: 43915
diff changeset
205 )?;
6a88ced33c40 rust-dirstate-status: update bridge for new rust version of `dirstate.status`
Raphaël Gomès <rgomes@octobus.net>
parents: 43915
diff changeset
206 let files: PyList = files.cast_into(py)?;
6a88ced33c40 rust-dirstate-status: update bridge for new rust version of `dirstate.status`
Raphaël Gomès <rgomes@octobus.net>
parents: 43915
diff changeset
207 let files: PyResult<Vec<HgPathBuf>> = files
6a88ced33c40 rust-dirstate-status: update bridge for new rust version of `dirstate.status`
Raphaël Gomès <rgomes@octobus.net>
parents: 43915
diff changeset
208 .iter(py)
6a88ced33c40 rust-dirstate-status: update bridge for new rust version of `dirstate.status`
Raphaël Gomès <rgomes@octobus.net>
parents: 43915
diff changeset
209 .map(|f| {
6a88ced33c40 rust-dirstate-status: update bridge for new rust version of `dirstate.status`
Raphaël Gomès <rgomes@octobus.net>
parents: 43915
diff changeset
210 Ok(HgPathBuf::from_bytes(
6a88ced33c40 rust-dirstate-status: update bridge for new rust version of `dirstate.status`
Raphaël Gomès <rgomes@octobus.net>
parents: 43915
diff changeset
211 f.extract::<PyBytes>(py)?.data(py),
6a88ced33c40 rust-dirstate-status: update bridge for new rust version of `dirstate.status`
Raphaël Gomès <rgomes@octobus.net>
parents: 43915
diff changeset
212 ))
6a88ced33c40 rust-dirstate-status: update bridge for new rust version of `dirstate.status`
Raphaël Gomès <rgomes@octobus.net>
parents: 43915
diff changeset
213 })
6a88ced33c40 rust-dirstate-status: update bridge for new rust version of `dirstate.status`
Raphaël Gomès <rgomes@octobus.net>
parents: 43915
diff changeset
214 .collect();
43915
8c77826116f7 rust-dirstate-status: add `walk_explicit` implementation, use `Matcher` trait
Raphaël Gomès <rgomes@octobus.net>
parents: 43818
diff changeset
215
43916
6a88ced33c40 rust-dirstate-status: update bridge for new rust version of `dirstate.status`
Raphaël Gomès <rgomes@octobus.net>
parents: 43915
diff changeset
216 let files = files?;
49346
75119bbee3d1 hg-cpython: refactor matcher transformation logic
Raphaël Gomès <rgomes@octobus.net>
parents: 49345
diff changeset
217 let file_matcher = FileMatcher::new(files)
43916
6a88ced33c40 rust-dirstate-status: update bridge for new rust version of `dirstate.status`
Raphaël Gomès <rgomes@octobus.net>
parents: 43915
diff changeset
218 .map_err(|e| PyErr::new::<ValueError, _>(py, e.to_string()))?;
49346
75119bbee3d1 hg-cpython: refactor matcher transformation logic
Raphaël Gomès <rgomes@octobus.net>
parents: 49345
diff changeset
219 Ok(Box::new(file_matcher))
44529
f96b28aa4b79 rust-status: update rust-cpython bridge to account for the changes in core
Raphaël Gomès <rgomes@octobus.net>
parents: 44525
diff changeset
220 }
f96b28aa4b79 rust-status: update rust-cpython bridge to account for the changes in core
Raphaël Gomès <rgomes@octobus.net>
parents: 44525
diff changeset
221 "includematcher" => {
f96b28aa4b79 rust-status: update rust-cpython bridge to account for the changes in core
Raphaël Gomès <rgomes@octobus.net>
parents: 44525
diff changeset
222 // Get the patterns from Python even though most of them are
f96b28aa4b79 rust-status: update rust-cpython bridge to account for the changes in core
Raphaël Gomès <rgomes@octobus.net>
parents: 44525
diff changeset
223 // redundant with those we will parse later on, as they include
f96b28aa4b79 rust-status: update rust-cpython bridge to account for the changes in core
Raphaël Gomès <rgomes@octobus.net>
parents: 44525
diff changeset
224 // those passed from the command line.
51604
32ba01b5669d match: share code between includematcher and patternmatcher
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51603
diff changeset
225 let ignore_patterns = collect_kindpats(py, matcher)?;
44529
f96b28aa4b79 rust-status: update rust-cpython bridge to account for the changes in core
Raphaël Gomès <rgomes@octobus.net>
parents: 44525
diff changeset
226
47379
f6bb181c75f8 rust: Parse "subinclude"d files along the way, not later
Simon Sapin <simon.sapin@octobus.net>
parents: 47350
diff changeset
227 let matcher = IncludeMatcher::new(ignore_patterns)
f6bb181c75f8 rust: Parse "subinclude"d files along the way, not later
Simon Sapin <simon.sapin@octobus.net>
parents: 47350
diff changeset
228 .map_err(|e| handle_fallback(py, e.into()))?;
44529
f96b28aa4b79 rust-status: update rust-cpython bridge to account for the changes in core
Raphaël Gomès <rgomes@octobus.net>
parents: 44525
diff changeset
229
49346
75119bbee3d1 hg-cpython: refactor matcher transformation logic
Raphaël Gomès <rgomes@octobus.net>
parents: 49345
diff changeset
230 Ok(Box::new(matcher))
43916
6a88ced33c40 rust-dirstate-status: update bridge for new rust version of `dirstate.status`
Raphaël Gomès <rgomes@octobus.net>
parents: 43915
diff changeset
231 }
49348
0043c7aa3250 rust-dirstate: add `unionmatcher` to the allowed matchers
Raphaël Gomès <rgomes@octobus.net>
parents: 49346
diff changeset
232 "unionmatcher" => {
0043c7aa3250 rust-dirstate: add `unionmatcher` to the allowed matchers
Raphaël Gomès <rgomes@octobus.net>
parents: 49346
diff changeset
233 let matchers: PyResult<Vec<_>> = matcher
0043c7aa3250 rust-dirstate: add `unionmatcher` to the allowed matchers
Raphaël Gomès <rgomes@octobus.net>
parents: 49346
diff changeset
234 .getattr(py, "_matchers")?
0043c7aa3250 rust-dirstate: add `unionmatcher` to the allowed matchers
Raphaël Gomès <rgomes@octobus.net>
parents: 49346
diff changeset
235 .iter(py)?
0043c7aa3250 rust-dirstate: add `unionmatcher` to the allowed matchers
Raphaël Gomès <rgomes@octobus.net>
parents: 49346
diff changeset
236 .map(|py_matcher| extract_matcher(py, py_matcher?))
0043c7aa3250 rust-dirstate: add `unionmatcher` to the allowed matchers
Raphaël Gomès <rgomes@octobus.net>
parents: 49346
diff changeset
237 .collect();
0043c7aa3250 rust-dirstate: add `unionmatcher` to the allowed matchers
Raphaël Gomès <rgomes@octobus.net>
parents: 49346
diff changeset
238
0043c7aa3250 rust-dirstate: add `unionmatcher` to the allowed matchers
Raphaël Gomès <rgomes@octobus.net>
parents: 49346
diff changeset
239 Ok(Box::new(UnionMatcher::new(matchers?)))
0043c7aa3250 rust-dirstate: add `unionmatcher` to the allowed matchers
Raphaël Gomès <rgomes@octobus.net>
parents: 49346
diff changeset
240 }
49350
0b00998e336a rust-dirstate: add `intersectionmatcher` to the allowed matchers
Raphaël Gomès <rgomes@octobus.net>
parents: 49348
diff changeset
241 "intersectionmatcher" => {
0b00998e336a rust-dirstate: add `intersectionmatcher` to the allowed matchers
Raphaël Gomès <rgomes@octobus.net>
parents: 49348
diff changeset
242 let m1 = extract_matcher(py, matcher.getattr(py, "_m1")?)?;
0b00998e336a rust-dirstate: add `intersectionmatcher` to the allowed matchers
Raphaël Gomès <rgomes@octobus.net>
parents: 49348
diff changeset
243 let m2 = extract_matcher(py, matcher.getattr(py, "_m2")?)?;
0b00998e336a rust-dirstate: add `intersectionmatcher` to the allowed matchers
Raphaël Gomès <rgomes@octobus.net>
parents: 49348
diff changeset
244
0b00998e336a rust-dirstate: add `intersectionmatcher` to the allowed matchers
Raphaël Gomès <rgomes@octobus.net>
parents: 49348
diff changeset
245 Ok(Box::new(IntersectionMatcher::new(m1, m2)))
0b00998e336a rust-dirstate: add `intersectionmatcher` to the allowed matchers
Raphaël Gomès <rgomes@octobus.net>
parents: 49348
diff changeset
246 }
49479
6193e846cb65 rust-status: expose DifferenceMatcher from Rust to Python
Raphaël Gomès <rgomes@octobus.net>
parents: 49351
diff changeset
247 "differencematcher" => {
6193e846cb65 rust-status: expose DifferenceMatcher from Rust to Python
Raphaël Gomès <rgomes@octobus.net>
parents: 49351
diff changeset
248 let m1 = extract_matcher(py, matcher.getattr(py, "_m1")?)?;
6193e846cb65 rust-status: expose DifferenceMatcher from Rust to Python
Raphaël Gomès <rgomes@octobus.net>
parents: 49351
diff changeset
249 let m2 = extract_matcher(py, matcher.getattr(py, "_m2")?)?;
6193e846cb65 rust-status: expose DifferenceMatcher from Rust to Python
Raphaël Gomès <rgomes@octobus.net>
parents: 49351
diff changeset
250
6193e846cb65 rust-status: expose DifferenceMatcher from Rust to Python
Raphaël Gomès <rgomes@octobus.net>
parents: 49351
diff changeset
251 Ok(Box::new(DifferenceMatcher::new(m1, m2)))
6193e846cb65 rust-status: expose DifferenceMatcher from Rust to Python
Raphaël Gomès <rgomes@octobus.net>
parents: 49351
diff changeset
252 }
51603
a2afa35641c9 matchers: support patternmatcher in rust
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51602
diff changeset
253 "patternmatcher" => {
51604
32ba01b5669d match: share code between includematcher and patternmatcher
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51603
diff changeset
254 let patterns = collect_kindpats(py, matcher)?;
51603
a2afa35641c9 matchers: support patternmatcher in rust
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51602
diff changeset
255
51604
32ba01b5669d match: share code between includematcher and patternmatcher
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51603
diff changeset
256 let matcher = PatternMatcher::new(patterns)
51603
a2afa35641c9 matchers: support patternmatcher in rust
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51602
diff changeset
257 .map_err(|e| handle_fallback(py, e.into()))?;
a2afa35641c9 matchers: support patternmatcher in rust
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51602
diff changeset
258
a2afa35641c9 matchers: support patternmatcher in rust
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51602
diff changeset
259 Ok(Box::new(matcher))
a2afa35641c9 matchers: support patternmatcher in rust
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 51602
diff changeset
260 }
49344
44319aa4a2a4 hg-cpython: fallback when encountering an unknown matcher
Raphaël Gomès <rgomes@octobus.net>
parents: 49000
diff changeset
261 e => Err(PyErr::new::<FallbackError, _>(
44973
26114bd6ec60 rust: do a clippy pass
Raphaël Gomès <rgomes@octobus.net>
parents: 44839
diff changeset
262 py,
26114bd6ec60 rust: do a clippy pass
Raphaël Gomès <rgomes@octobus.net>
parents: 44839
diff changeset
263 format!("Unsupported matcher {}", e),
26114bd6ec60 rust: do a clippy pass
Raphaël Gomès <rgomes@octobus.net>
parents: 44839
diff changeset
264 )),
43916
6a88ced33c40 rust-dirstate-status: update bridge for new rust version of `dirstate.status`
Raphaël Gomès <rgomes@octobus.net>
parents: 43915
diff changeset
265 }
6a88ced33c40 rust-dirstate-status: update bridge for new rust version of `dirstate.status`
Raphaël Gomès <rgomes@octobus.net>
parents: 43915
diff changeset
266 }
43273
478d0b1bf0c5 rust-dirstate-status: rust-cpython bindings for `dirstate.status`
Raphaël Gomès <rgomes@octobus.net>
parents:
diff changeset
267
43916
6a88ced33c40 rust-dirstate-status: update bridge for new rust version of `dirstate.status`
Raphaël Gomès <rgomes@octobus.net>
parents: 43915
diff changeset
268 fn build_response(
44529
f96b28aa4b79 rust-status: update rust-cpython bridge to account for the changes in core
Raphaël Gomès <rgomes@octobus.net>
parents: 44525
diff changeset
269 py: Python,
44525
f13d19549efd rust-status: rename `StatusResult` to `DirstateStatus`
Raphaël Gomès <rgomes@octobus.net>
parents: 44232
diff changeset
270 status_res: DirstateStatus,
44529
f96b28aa4b79 rust-status: update rust-cpython bridge to account for the changes in core
Raphaël Gomès <rgomes@octobus.net>
parents: 44525
diff changeset
271 warnings: Vec<PatternFileWarning>,
f96b28aa4b79 rust-status: update rust-cpython bridge to account for the changes in core
Raphaël Gomès <rgomes@octobus.net>
parents: 44525
diff changeset
272 ) -> PyResult<PyTuple> {
48454
473af5cbc209 rhg: Add support for `rhg status --copies`
Simon Sapin <simon.sapin@octobus.net>
parents: 48391
diff changeset
273 let modified = collect_status_path_list(py, &status_res.modified);
473af5cbc209 rhg: Add support for `rhg status --copies`
Simon Sapin <simon.sapin@octobus.net>
parents: 48391
diff changeset
274 let added = collect_status_path_list(py, &status_res.added);
473af5cbc209 rhg: Add support for `rhg status --copies`
Simon Sapin <simon.sapin@octobus.net>
parents: 48391
diff changeset
275 let removed = collect_status_path_list(py, &status_res.removed);
473af5cbc209 rhg: Add support for `rhg status --copies`
Simon Sapin <simon.sapin@octobus.net>
parents: 48391
diff changeset
276 let deleted = collect_status_path_list(py, &status_res.deleted);
473af5cbc209 rhg: Add support for `rhg status --copies`
Simon Sapin <simon.sapin@octobus.net>
parents: 48391
diff changeset
277 let clean = collect_status_path_list(py, &status_res.clean);
473af5cbc209 rhg: Add support for `rhg status --copies`
Simon Sapin <simon.sapin@octobus.net>
parents: 48391
diff changeset
278 let ignored = collect_status_path_list(py, &status_res.ignored);
473af5cbc209 rhg: Add support for `rhg status --copies`
Simon Sapin <simon.sapin@octobus.net>
parents: 48391
diff changeset
279 let unknown = collect_status_path_list(py, &status_res.unknown);
473af5cbc209 rhg: Add support for `rhg status --copies`
Simon Sapin <simon.sapin@octobus.net>
parents: 48391
diff changeset
280 let unsure = collect_status_path_list(py, &status_res.unsure);
473af5cbc209 rhg: Add support for `rhg status --copies`
Simon Sapin <simon.sapin@octobus.net>
parents: 48391
diff changeset
281 let bad = collect_bad_matches(py, &status_res.bad)?;
473af5cbc209 rhg: Add support for `rhg status --copies`
Simon Sapin <simon.sapin@octobus.net>
parents: 48391
diff changeset
282 let traversed = collect_pybytes_list(py, status_res.traversed.iter());
47350
04d1f17f49e7 dirstate-v2: Write .hg/dirstate back to disk on directory cache changes
Simon Sapin <simon.sapin@octobus.net>
parents: 47112
diff changeset
283 let dirty = status_res.dirty.to_py_object(py);
44529
f96b28aa4b79 rust-status: update rust-cpython bridge to account for the changes in core
Raphaël Gomès <rgomes@octobus.net>
parents: 44525
diff changeset
284 let py_warnings = PyList::new(py, &[]);
f96b28aa4b79 rust-status: update rust-cpython bridge to account for the changes in core
Raphaël Gomès <rgomes@octobus.net>
parents: 44525
diff changeset
285 for warning in warnings.iter() {
f96b28aa4b79 rust-status: update rust-cpython bridge to account for the changes in core
Raphaël Gomès <rgomes@octobus.net>
parents: 44525
diff changeset
286 // We use duck-typing on the Python side for dispatch, good enough for
f96b28aa4b79 rust-status: update rust-cpython bridge to account for the changes in core
Raphaël Gomès <rgomes@octobus.net>
parents: 44525
diff changeset
287 // now.
f96b28aa4b79 rust-status: update rust-cpython bridge to account for the changes in core
Raphaël Gomès <rgomes@octobus.net>
parents: 44525
diff changeset
288 match warning {
f96b28aa4b79 rust-status: update rust-cpython bridge to account for the changes in core
Raphaël Gomès <rgomes@octobus.net>
parents: 44525
diff changeset
289 PatternFileWarning::InvalidSyntax(file, syn) => {
f96b28aa4b79 rust-status: update rust-cpython bridge to account for the changes in core
Raphaël Gomès <rgomes@octobus.net>
parents: 44525
diff changeset
290 py_warnings.append(
f96b28aa4b79 rust-status: update rust-cpython bridge to account for the changes in core
Raphaël Gomès <rgomes@octobus.net>
parents: 44525
diff changeset
291 py,
f96b28aa4b79 rust-status: update rust-cpython bridge to account for the changes in core
Raphaël Gomès <rgomes@octobus.net>
parents: 44525
diff changeset
292 (
51120
532e74ad3ff6 rust: run a clippy pass with the latest stable version
Raphaël Gomès <rgomes@octobus.net>
parents: 49914
diff changeset
293 PyBytes::new(py, &get_bytes_from_path(file)),
44529
f96b28aa4b79 rust-status: update rust-cpython bridge to account for the changes in core
Raphaël Gomès <rgomes@octobus.net>
parents: 44525
diff changeset
294 PyBytes::new(py, syn),
f96b28aa4b79 rust-status: update rust-cpython bridge to account for the changes in core
Raphaël Gomès <rgomes@octobus.net>
parents: 44525
diff changeset
295 )
f96b28aa4b79 rust-status: update rust-cpython bridge to account for the changes in core
Raphaël Gomès <rgomes@octobus.net>
parents: 44525
diff changeset
296 .to_py_object(py)
f96b28aa4b79 rust-status: update rust-cpython bridge to account for the changes in core
Raphaël Gomès <rgomes@octobus.net>
parents: 44525
diff changeset
297 .into_object(),
f96b28aa4b79 rust-status: update rust-cpython bridge to account for the changes in core
Raphaël Gomès <rgomes@octobus.net>
parents: 44525
diff changeset
298 );
f96b28aa4b79 rust-status: update rust-cpython bridge to account for the changes in core
Raphaël Gomès <rgomes@octobus.net>
parents: 44525
diff changeset
299 }
f96b28aa4b79 rust-status: update rust-cpython bridge to account for the changes in core
Raphaël Gomès <rgomes@octobus.net>
parents: 44525
diff changeset
300 PatternFileWarning::NoSuchFile(file) => py_warnings.append(
f96b28aa4b79 rust-status: update rust-cpython bridge to account for the changes in core
Raphaël Gomès <rgomes@octobus.net>
parents: 44525
diff changeset
301 py,
51120
532e74ad3ff6 rust: run a clippy pass with the latest stable version
Raphaël Gomès <rgomes@octobus.net>
parents: 49914
diff changeset
302 PyBytes::new(py, &get_bytes_from_path(file)).into_object(),
44529
f96b28aa4b79 rust-status: update rust-cpython bridge to account for the changes in core
Raphaël Gomès <rgomes@octobus.net>
parents: 44525
diff changeset
303 ),
f96b28aa4b79 rust-status: update rust-cpython bridge to account for the changes in core
Raphaël Gomès <rgomes@octobus.net>
parents: 44525
diff changeset
304 }
f96b28aa4b79 rust-status: update rust-cpython bridge to account for the changes in core
Raphaël Gomès <rgomes@octobus.net>
parents: 44525
diff changeset
305 }
43273
478d0b1bf0c5 rust-dirstate-status: rust-cpython bindings for `dirstate.status`
Raphaël Gomès <rgomes@octobus.net>
parents:
diff changeset
306
44529
f96b28aa4b79 rust-status: update rust-cpython bridge to account for the changes in core
Raphaël Gomès <rgomes@octobus.net>
parents: 44525
diff changeset
307 Ok(PyTuple::new(
f96b28aa4b79 rust-status: update rust-cpython bridge to account for the changes in core
Raphaël Gomès <rgomes@octobus.net>
parents: 44525
diff changeset
308 py,
f96b28aa4b79 rust-status: update rust-cpython bridge to account for the changes in core
Raphaël Gomès <rgomes@octobus.net>
parents: 44525
diff changeset
309 &[
47110
9c6b458a08e1 rust: Move "lookup" a.k.a. "unsure" paths into `DirstateStatus` struct
Simon Sapin <simon.sapin@octobus.net>
parents: 47093
diff changeset
310 unsure.into_object(),
44529
f96b28aa4b79 rust-status: update rust-cpython bridge to account for the changes in core
Raphaël Gomès <rgomes@octobus.net>
parents: 44525
diff changeset
311 modified.into_object(),
f96b28aa4b79 rust-status: update rust-cpython bridge to account for the changes in core
Raphaël Gomès <rgomes@octobus.net>
parents: 44525
diff changeset
312 added.into_object(),
f96b28aa4b79 rust-status: update rust-cpython bridge to account for the changes in core
Raphaël Gomès <rgomes@octobus.net>
parents: 44525
diff changeset
313 removed.into_object(),
f96b28aa4b79 rust-status: update rust-cpython bridge to account for the changes in core
Raphaël Gomès <rgomes@octobus.net>
parents: 44525
diff changeset
314 deleted.into_object(),
f96b28aa4b79 rust-status: update rust-cpython bridge to account for the changes in core
Raphaël Gomès <rgomes@octobus.net>
parents: 44525
diff changeset
315 clean.into_object(),
f96b28aa4b79 rust-status: update rust-cpython bridge to account for the changes in core
Raphaël Gomès <rgomes@octobus.net>
parents: 44525
diff changeset
316 ignored.into_object(),
f96b28aa4b79 rust-status: update rust-cpython bridge to account for the changes in core
Raphaël Gomès <rgomes@octobus.net>
parents: 44525
diff changeset
317 unknown.into_object(),
f96b28aa4b79 rust-status: update rust-cpython bridge to account for the changes in core
Raphaël Gomès <rgomes@octobus.net>
parents: 44525
diff changeset
318 py_warnings.into_object(),
f96b28aa4b79 rust-status: update rust-cpython bridge to account for the changes in core
Raphaël Gomès <rgomes@octobus.net>
parents: 44525
diff changeset
319 bad.into_object(),
44839
01afda7e7d6c rust-hg-cpython: update status bridge with the new `traversedir` support
Raphaël Gomès <rgomes@octobus.net>
parents: 44597
diff changeset
320 traversed.into_object(),
47350
04d1f17f49e7 dirstate-v2: Write .hg/dirstate back to disk on directory cache changes
Simon Sapin <simon.sapin@octobus.net>
parents: 47112
diff changeset
321 dirty.into_object(),
44529
f96b28aa4b79 rust-status: update rust-cpython bridge to account for the changes in core
Raphaël Gomès <rgomes@octobus.net>
parents: 44525
diff changeset
322 ][..],
f96b28aa4b79 rust-status: update rust-cpython bridge to account for the changes in core
Raphaël Gomès <rgomes@octobus.net>
parents: 44525
diff changeset
323 ))
43273
478d0b1bf0c5 rust-dirstate-status: rust-cpython bindings for `dirstate.status`
Raphaël Gomès <rgomes@octobus.net>
parents:
diff changeset
324 }