sapling/eden/scm
Jun Wu a90c8ea775 bindings: export rust process handling to Python
Summary:
Spawning processes turns out to be tricky.

Python 2:

- "fork & exec" in plain Python is potentially dangerous. See D22855986 (c35b8088ef).
  Disabling GC might have solved it, but still seems fragile.
- "close_fds=True" works on Windows if there is no redirection.
- Does not work well with `disable_standard_handle_inheritability` from `hgmain`.
  We patched it. See `contrib/python2-winbuild/0002-windows-make-subprocess-work-with-non-inheritable-st.patch`.

Python 3:

- "subprocess" uses native code for "fork & exec". It's safer.
- (>= 3.8) "close_fds=True" works on Windows even with redirection.
- "subprocess" exposes options to tweak low-level details on Windows.

Rust:

- No "close_fds=True" support for both Windows and Unix.
- Does not have the `disable_standard_handle_inheritability` issue on Windows.
- Impossible to cleanly support "close_fds=True" on Windows with existing stdlib.
  https://github.com/rust-lang/rust/pull/75551 attempts to add that to stdlib.
  D23124167 provides a short-term solution that can have corner cases.

Mercurial:

- `win32.spawndetached` uses raw Win32 APIs to spawn processes, bypassing
  the `subprocess` Python stdlib.
- Its use of `CreateProcessA` is undesirable. We probably want `CreateProcessW`
  (unless `CreateProcessA` speaks utf-8 natively).

We are still on Python 2 on Windows, and we'd need to spawn processes correctly
from Rust anyway, and D23124167 kind of fills the missing feature of `close_fds=True`
from Python. So let's expose the Rust APIs.

The binding APIs closely match the Rust API. So when we migrate from Python to
Rust, the translation is more straightforward.

Reviewed By: DurhamG

Differential Revision: D23124168

fbshipit-source-id: 94a404f19326e9b4cca7661da07a4b4c55bcc395
2020-08-31 17:34:48 -07:00
..
contrib contrib: remove revlog related perf tests 2020-07-30 20:32:34 -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 util: make gethgcmd more reliable 2020-08-31 17:34:48 -07:00
edenscmnative bindings: export rust process handling to Python 2020-08-31 17:34:48 -07:00
exec re-implement normalize_windows_path 2020-08-25 12:38:07 -07:00
hgcache_size_logger add hgcache size logger 2020-08-26 04:24:50 -07:00
i18n check-code: convert to Python 3 2020-05-07 09:07:50 -07:00
lib spawn-ext: extend Command::spawn to avoid inheriting fds 2020-08-31 17:34:48 -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 histedit: do not show revision numbers 2020-08-31 11:57:53 -07:00
.editorconfig Move fb-mercurial sources into an eden/scm subdirectory. 2019-11-13 16:04:48 -08:00
.flake8 commitcloud: optimize revset for segmented changelog backend 2020-08-21 13:00:45 -07: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 configparser: fix non-fb dependencies (#45) 2020-08-26 16:31:00 -07:00
setup.py configparser: fix non-fb dependencies (#45) 2020-08-26 16:31:00 -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.