sapling/eden/scm
Meyer Jacobs e3b86cf77d debug: introduce binding layer for propagating error metadata to Python
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
2020-07-16 19:30:00 -07:00
..
contrib changelog: use Rust RevlogIndex for descendants 2020-07-15 13:16:47 -07:00
distutils_rust edenscm/hg: add GitHub Actions with CI for HG plus add fixes for getdeps (#25) 2020-07-10 12:07:45 -07:00
doc py3: fix test-help.t 2020-04-09 18:25:54 -07:00
edenscm debug: introduce binding layer for propagating error metadata to Python 2020-07-16 19:30:00 -07:00
edenscmnative debug: introduce binding layer for propagating error metadata to Python 2020-07-16 19:30:00 -07:00
exec if APFS volume name exceeds 127 length, hash it to avoid failure 2020-07-16 09:17:16 -07:00
i18n check-code: convert to Python 3 2020-05-07 09:07:50 -07:00
lib debug: introduce binding layer for propagating error metadata to Python 2020-07-16 19:30:00 -07:00
newdoc newdoc: Add mutation and visibility documentation 2020-03-20 04:09:32 -07:00
pystubs repoview: further remove repoview references 2020-07-06 14:04:27 -07:00
slides Eliminate obsolete since-last-arc-diff flag 2020-04-14 09:09:12 -07:00
tests debug: introduce binding layer for propagating error metadata to Python 2020-07-16 19:30:00 -07:00
.editorconfig Move fb-mercurial sources into an eden/scm subdirectory. 2019-11-13 16:04:48 -08:00
.flake8 Move fb-mercurial sources into an eden/scm subdirectory. 2019-11-13 16:04:48 -08:00
.gitignore run-tests: make output format friendly for adhoc scripts 2020-06-10 19:29:59 -07:00
COPYING Move fb-mercurial sources into an eden/scm subdirectory. 2019-11-13 16:04:48 -08:00
gen_version.py version: a Rust crate providing version information 2020-05-18 09:00:40 -07:00
hgeditor Move fb-mercurial sources into an eden/scm subdirectory. 2019-11-13 16:04:48 -08:00
Makefile add Mononoke integration tests CI (#26) 2020-07-16 12:16:10 -07:00
README.rst Move fb-mercurial sources into an eden/scm subdirectory. 2019-11-13 16:04:48 -08:00
setup3.py edenscm/hg: add GitHub Actions with CI for HG plus add fixes for getdeps (#25) 2020-07-10 12:07:45 -07:00
setup.py edenscm/hg: add GitHub Actions with CI for HG plus add fixes for getdeps (#25) 2020-07-10 12:07:45 -07:00

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.