rust/hgcli/README.md
author Martin von Zweigbergk <martinvonz@google.com>
Tue, 03 Nov 2020 20:28:23 -0800
changeset 45820 ee826f43cf4f
parent 44639 bc847878f4c0
child 46819 d4ba4d51f85f
permissions -rw-r--r--
hgweb: don't call sys.exit() in httpservice.run() If I'm reading the code correctly, `mercurial.server.createservice()` can return an hgweb service or one of three types of command server services. The caller then calls `mercurial.server.runservice()`, passing it the returned service's run method. Only the hgweb service was calling `sys.exit()`. It has been that way since 8d44649df03b (refactor ssh server., 2006-06-04). That commit message doesn't provide any explanation. Let's clean up and have the code follow the usual return path into the `dispatch` module. After this patch, there should be no remaining places left where we call `sys.exit()` except for valid uses in the `dispatch` and `worker` modules. Differential Revision: https://phab.mercurial-scm.org/D9272
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
44639
bc847878f4c0 hgcli: customize for Mercurial
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
     1
# Oxidized Mercurial
bc847878f4c0 hgcli: customize for Mercurial
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
     2
bc847878f4c0 hgcli: customize for Mercurial
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
     3
This project provides a Rust implementation of the Mercurial (`hg`)
bc847878f4c0 hgcli: customize for Mercurial
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
     4
version control tool.
bc847878f4c0 hgcli: customize for Mercurial
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
     5
bc847878f4c0 hgcli: customize for Mercurial
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
     6
Under the hood, the project uses
bc847878f4c0 hgcli: customize for Mercurial
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
     7
[PyOxidizer](https://github.com/indygreg/PyOxidizer) to embed a Python
bc847878f4c0 hgcli: customize for Mercurial
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
     8
interpreter in a binary built with Rust. At run-time, the Rust `fn main()`
bc847878f4c0 hgcli: customize for Mercurial
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
     9
is called and Rust code handles initial process startup. An in-process
bc847878f4c0 hgcli: customize for Mercurial
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
    10
Python interpreter is started (if needed) to provide additional
bc847878f4c0 hgcli: customize for Mercurial
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
    11
functionality.
bc847878f4c0 hgcli: customize for Mercurial
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
    12
bc847878f4c0 hgcli: customize for Mercurial
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
    13
# Building
bc847878f4c0 hgcli: customize for Mercurial
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
    14
bc847878f4c0 hgcli: customize for Mercurial
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
    15
This project currently requires an unreleased version of PyOxidizer
bc847878f4c0 hgcli: customize for Mercurial
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
    16
(0.7.0-pre). For best results, build the exact PyOxidizer commit
bc847878f4c0 hgcli: customize for Mercurial
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
    17
as defined in the `pyoxidizer.bzl` file:
bc847878f4c0 hgcli: customize for Mercurial
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
    18
bc847878f4c0 hgcli: customize for Mercurial
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
    19
    $ git clone https://github.com/indygreg/PyOxidizer.git
bc847878f4c0 hgcli: customize for Mercurial
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
    20
    $ cd PyOxidizer
bc847878f4c0 hgcli: customize for Mercurial
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
    21
    $ git checkout <Git commit from pyoxidizer.bzl>
bc847878f4c0 hgcli: customize for Mercurial
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
    22
    $ cargo build --release
bc847878f4c0 hgcli: customize for Mercurial
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
    23
bc847878f4c0 hgcli: customize for Mercurial
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
    24
Then build this Rust project using the built `pyoxidizer` executable::
bc847878f4c0 hgcli: customize for Mercurial
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
    25
bc847878f4c0 hgcli: customize for Mercurial
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
    26
    $ /path/to/pyoxidizer/target/release/pyoxidizer build
bc847878f4c0 hgcli: customize for Mercurial
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
    27
bc847878f4c0 hgcli: customize for Mercurial
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
    28
If all goes according to plan, there should be an assembled application
bc847878f4c0 hgcli: customize for Mercurial
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
    29
under `build/<arch>/debug/app/` with an `hg` executable:
bc847878f4c0 hgcli: customize for Mercurial
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
    30
bc847878f4c0 hgcli: customize for Mercurial
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
    31
    $ build/x86_64-unknown-linux-gnu/debug/app/hg version
bc847878f4c0 hgcli: customize for Mercurial
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
    32
    Mercurial Distributed SCM (version 5.3.1+433-f99cd77d53dc+20200331)
bc847878f4c0 hgcli: customize for Mercurial
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
    33
    (see https://mercurial-scm.org for more information)
bc847878f4c0 hgcli: customize for Mercurial
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
    34
bc847878f4c0 hgcli: customize for Mercurial
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
    35
    Copyright (C) 2005-2020 Matt Mackall and others
bc847878f4c0 hgcli: customize for Mercurial
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
    36
    This is free software; see the source for copying conditions. There is NO
bc847878f4c0 hgcli: customize for Mercurial
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
    37
    warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
bc847878f4c0 hgcli: customize for Mercurial
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
    38
bc847878f4c0 hgcli: customize for Mercurial
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
    39
# Running Tests
bc847878f4c0 hgcli: customize for Mercurial
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
    40
bc847878f4c0 hgcli: customize for Mercurial
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
    41
To run tests with a built `hg` executable, you can use the `--with-hg`
bc847878f4c0 hgcli: customize for Mercurial
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
    42
argument to `run-tests.py`. But there's a wrinkle: many tests run custom
bc847878f4c0 hgcli: customize for Mercurial
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
    43
Python scripts that need to `import` modules provided by Mercurial. Since
bc847878f4c0 hgcli: customize for Mercurial
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
    44
these modules are embedded in the produced `hg` executable, a regular
bc847878f4c0 hgcli: customize for Mercurial
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
    45
Python interpreter can't access them! To work around this, set `PYTHONPATH`
bc847878f4c0 hgcli: customize for Mercurial
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
    46
to the Mercurial source directory. e.g.:
bc847878f4c0 hgcli: customize for Mercurial
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
    47
bc847878f4c0 hgcli: customize for Mercurial
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
    48
    $ cd /path/to/hg/src/tests
bc847878f4c0 hgcli: customize for Mercurial
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
    49
    $ PYTHONPATH=`pwd`/.. python3.7 run-tests.py \
bc847878f4c0 hgcli: customize for Mercurial
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
    50
        --with-hg `pwd`/../rust/hgcli/build/x86_64-unknown-linux-gnu/debug/app/hg