mirror of
https://github.com/facebook/sapling.git
synced 2024-10-10 08:47:12 +03:00
e3b86cf77d
Summary: Implements based Rust-Python binding layer for error metadata propagation. We introduce a new type, `TaggedExceptionData`, which carries CommonMetadata and the original (without metadata) error message for a Rust Anyhow error. This class is passed to RustError and can be accessed in Python (somewhat awkwardly) via indexing: ``` except error.RustError as e: fault = e.args[0].fault() typename = e.args[0].typename() message = e.args[0].message() ``` As far as I can tell, due to limitations in cpython-rs, this can't be made more ergonomic without introducing a Python shim around the Rust binding layer, which could adapt the cpython-rs classes to use whatever API we'd like. Currently, anyhow errors that are not otherwise special-cased will be converted into RustError, with both the original error message and any attached metadata printed as shown below ``` abort: intentional error for debugging with message 'intentional_error' error has type name taggederror::IntentionalError and fault None ``` We can of course re-raise the error if desired to maintain the previous behavior for handling a RustError. If we'd like other, specialized Rust Python Exception types to carry metadata (such as `IndexedLogError`), we'll need to modify them to accept a `TaggedExceptionData` like `RustError`. Renamed the "cause an error in pure rust command" function to `debugcauserusterror`, and instead used the name `debugthrowrustexception` for a command which causes an error in rust which is converted to a Python exception across the binding layer. Introduced a simple integration test which exercises `debugthrowrustexception`. Added a basic handler for RustError to scmutil.py Reviewed By: DurhamG Differential Revision: D22517796 fbshipit-source-id: 0409489243fe739a26958aad48f608890eb93aa0 |
||
---|---|---|
.. | ||
contrib | ||
distutils_rust | ||
doc | ||
edenscm | ||
edenscmnative | ||
exec | ||
i18n | ||
lib | ||
newdoc | ||
pystubs | ||
slides | ||
tests | ||
.editorconfig | ||
.flake8 | ||
.gitignore | ||
COPYING | ||
gen_version.py | ||
hgeditor | ||
Makefile | ||
README.rst | ||
setup3.py | ||
setup.py |
Mercurial ========= Mercurial is a fast, easy to use, distributed revision control tool for software developers. Basic install:: $ make # see install targets $ make install # do a system-wide install $ hg debuginstall # sanity-check setup $ hg # see help Running without installing:: $ make local # build for inplace usage $ ./hg --version # should show the latest version See https://mercurial-scm.org/ for detailed installation instructions, platform-specific notes, and Mercurial user information.