view mercurial/testing/ps_util.py @ 52783:07740bd86fd9

rust-pyo3: reviving test-rust-revlog.py This test file was removed in 7346f93be7a4. Adaptation to the new `InnerRevlog` / `RustIndexProxy` structure was as easy as redefining the `parserustindex()` method to use `RustIndexProxy`. As we did before with `test-rust-ancestors.py`, we are preparing a mixin class that will contain tests for both bindings. Existing tests will migrate from `RustInnerRevlogTest` (the one for `hg-cpython`) to the mixin.
author Georges Racinet <georges.racinet@cloudcrane.io>
date Sun, 22 Dec 2024 20:26:57 +0100
parents d4e30c15626d
children
line wrap: on
line source

# This python code can be imported into tests in order to terminate a process
# with signal.SIGKILL on posix, or a roughly equivalent procedure on Windows.

from __future__ import annotations

import os
import signal
import subprocess
import sys
import tempfile

from .. import (
    encoding,
    pycompat,
)

from ..utils import procutil


def kill_nt(pid: int, exit_code: int):
    fd, pidfile = tempfile.mkstemp(
        prefix=b"sigkill-", dir=encoding.environ[b"HGTMP"], text=False
    )
    try:
        os.write(fd, b'%d\n' % pid)
    finally:
        os.close(fd)

    env = dict(encoding.environ)
    env[b"DAEMON_EXITCODE"] = b"%d" % exit_code

    # Simulate the message written to stderr for this process on non-Windows
    # platforms, for test consistency.
    print("Killed!", file=sys.stderr)

    subprocess.run(
        [
            encoding.environ[b"PYTHON"],
            b"%s/killdaemons.py"
            % encoding.environ[b'RUNTESTDIR_FORWARD_SLASH'],
            pidfile,
        ],
        env=procutil.tonativeenv(env),
    )


def kill(pid: int):
    """Kill the process with the given PID with SIGKILL or equivalent."""
    if pycompat.iswindows:
        exit_code = 128 + 9
        kill_nt(pid, exit_code)
    else:
        os.kill(pid, signal.SIGKILL)