client/commands/stop.py (49 lines of code) (raw):
# Copyright (c) Meta Platforms, Inc. and affiliates.
#
# This source code is licensed under the MIT license found in the
# LICENSE file in the root directory of this source tree.
import logging
from pathlib import Path
from .. import configuration as configuration_module
from . import commands, server_connection, start, remote_logging
LOG: logging.Logger = logging.getLogger(__name__)
def stop_server(socket_path: Path) -> None:
with server_connection.connect_in_text_mode(socket_path) as (
input_channel,
output_channel,
):
output_channel.write('["Stop"]\n')
# Wait for the server to shutdown on its side
input_channel.read()
def remove_socket_if_exists(socket_path: Path) -> None:
try:
socket_path.unlink()
except FileNotFoundError:
pass
except OSError as error:
LOG.warning(f"Failed to remove socket file at `{socket_path}`: {error}")
try:
socket_path.with_suffix(socket_path.suffix + ".lock").unlink()
except FileNotFoundError:
pass
except OSError as error:
LOG.warning(f"Failed to remove lock file at `{socket_path}.lock`: {error}")
def run_stop(configuration: configuration_module.Configuration) -> commands.ExitCode:
socket_path = server_connection.get_default_socket_path(
project_root=Path(configuration.project_root),
relative_local_root=Path(configuration.relative_local_root)
if configuration.relative_local_root
else None,
)
try:
LOG.info("Stopping server...")
stop_server(socket_path)
LOG.info(f"Stopped server at `{start.get_server_identifier(configuration)}`\n")
return commands.ExitCode.SUCCESS
except server_connection.ConnectionFailure:
LOG.info("No running Pyre server to stop.\n")
remove_socket_if_exists(socket_path)
return commands.ExitCode.SERVER_NOT_FOUND
@remote_logging.log_usage(command_name="stop")
def run(configuration: configuration_module.Configuration) -> commands.ExitCode:
try:
return run_stop(configuration)
except Exception as error:
raise commands.ClientException(
f"Exception occurred during server stop: {error}"
) from error